summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Cordasco <graffatcolmingov@gmail.com>2016-01-16 07:04:28 -0600
committerIan Cordasco <graffatcolmingov@gmail.com>2016-01-16 07:04:28 -0600
commit4d86e44992291487a5303d5d65d5e0c84fcf393a (patch)
tree7678af8bb34e39b0f8478fbde507ee933eb902dd
parent45d470927c85a680fcc4a4f902fe7da7f6e7606d (diff)
downloadflake8-4d86e44992291487a5303d5d65d5e0c84fcf393a.tar.gz
Add pyflakes shim from previous flake8
Modify the shim plugin to work with new flake8
-rw-r--r--flake8/plugins/pyflakes.py130
1 files changed, 130 insertions, 0 deletions
diff --git a/flake8/plugins/pyflakes.py b/flake8/plugins/pyflakes.py
new file mode 100644
index 0000000..c801e54
--- /dev/null
+++ b/flake8/plugins/pyflakes.py
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+try:
+ # The 'demandimport' breaks pyflakes and flake8.plugins.pyflakes
+ from mercurial import demandimport
+except ImportError:
+ pass
+else:
+ demandimport.disable()
+import os
+
+import pyflakes
+import pyflakes.checker
+
+from flake8 import utils
+
+
+def patch_pyflakes():
+ """Add error codes to Pyflakes messages."""
+ codes = dict([line.split()[::-1] for line in (
+ 'F401 UnusedImport',
+ 'F402 ImportShadowedByLoopVar',
+ 'F403 ImportStarUsed',
+ 'F404 LateFutureImport',
+ 'F810 Redefined', # XXX Obsolete?
+ 'F811 RedefinedWhileUnused',
+ 'F812 RedefinedInListComp',
+ 'F821 UndefinedName',
+ 'F822 UndefinedExport',
+ 'F823 UndefinedLocal',
+ 'F831 DuplicateArgument',
+ 'F841 UnusedVariable',
+ )])
+
+ for name, obj in vars(pyflakes.messages).items():
+ if name[0].isupper() and obj.message:
+ obj.flake8_msg = '%s %s' % (codes.get(name, 'F999'), obj.message)
+patch_pyflakes()
+
+
+class FlakesChecker(pyflakes.checker.Checker):
+ """Subclass the Pyflakes checker to conform with the flake8 API."""
+ name = 'pyflakes'
+ version = pyflakes.__version__
+
+ def __init__(self, tree, filename):
+ filename = utils.normalize_paths(filename)[0]
+ withDoctest = self.withDoctest
+ included_by = [include for include in self.include_in_doctest
+ if include != '' and filename.startswith(include)]
+ if included_by:
+ withDoctest = True
+
+ for exclude in self.exclude_from_doctest:
+ if exclude != '' and filename.startswith(exclude):
+ withDoctest = False
+ overlaped_by = [include for include in included_by
+ if include.startswith(exclude)]
+
+ if overlaped_by:
+ withDoctest = True
+
+ super(FlakesChecker, self).__init__(tree, filename,
+ withDoctest=withDoctest)
+
+ @classmethod
+ def add_options(cls, parser):
+ parser.add_option(
+ '--builtins', parse_from_config=True, comma_separated_list=True,
+ help="define more built-ins, comma separated",
+ )
+ parser.add_option(
+ '--doctests', default=False, action='store_true',
+ parse_from_config=True,
+ help="check syntax of the doctests",
+ )
+ parser.add_option(
+ '--include-in-doctest', default='',
+ dest='include_in_doctest', parse_from_config=True,
+ comma_separated_list=True, normalize_paths=True,
+ help='Run doctests only on these files',
+ type='string',
+ )
+ parser.add_option(
+ '--exclude-from-doctest', default='',
+ dest='exclude_from_doctest', parse_from_config=True,
+ comma_separated_list=True, normalize_paths=True,
+ help='Skip these files when running doctests',
+ type='string',
+ )
+
+ @classmethod
+ def parse_options(cls, options):
+ if options.builtins:
+ cls.builtIns = cls.builtIns.union(options.builtins.split(','))
+ cls.withDoctest = options.doctests
+
+ included_files = []
+ for included_file in options.include_in_doctest:
+ if included_file == '':
+ continue
+ if not included_file.startswith((os.sep, './', '~/')):
+ included_files.append('./' + included_file)
+ else:
+ included_files.append(included_file)
+ cls.include_in_doctest = utils.normalize_paths(included_files)
+
+ excluded_files = []
+ for excluded_file in options.exclude_from_doctest.split(','):
+ if excluded_file == '':
+ continue
+ if not excluded_file.startswith((os.sep, './', '~/')):
+ excluded_files.append('./' + excluded_file)
+ else:
+ excluded_files.append(excluded_file)
+ cls.exclude_from_doctest = utils.normalize_paths(excluded_files)
+
+ inc_exc = set(cls.include_in_doctest).intersection(
+ cls.exclude_from_doctest
+ )
+ if inc_exc:
+ raise ValueError('"%s" was specified in both the '
+ 'include-in-doctest and exclude-from-doctest '
+ 'options. You are not allowed to specify it in '
+ 'both for doctesting.' % inc_exc)
+
+ def run(self):
+ for m in self.messages:
+ col = getattr(m, 'col', 0)
+ yield m.lineno, col, (m.flake8_msg % m.message_args), m.__class__