Commit a7766c12 authored by Ondřej Nový's avatar Ondřej Nový

Import python-flake8_3.0.4+dfsg1.orig.tar.gz

parent 7551f2be
Metadata-Version: 1.1
Name: flake8
Version: 3.0.3
Version: 3.0.4
Summary: the modular source code checker: pep8, pyflakes and co
Home-page: https://gitlab.com/pycqa/flake8
Author: Ian Cordasco
......
......@@ -54,6 +54,12 @@ which is not supplied as a parameter of
:class:`~flake8.processor.FileProcessor`, which will be a parsed abstract
syntax tree. It is used by plugins like PyFlakes and McCabe.
When the plugin is run depends on the first parameter, not counting ``self``.
It can be either ``physical_line``, ``logical_line`` or ``tree``. If the
parameter is ``tree``, it is run once per file, otherwise once per physical
line or logical line respectively. If the plugin is using neither of them it
won't be run at all.
Registering Options
===================
......
3.0.4 -- 2016-08-08
-------------------
- Side-step a Pickling Error when using Flake8 with multiprocessing on Unix
systems. (See also `GitLab#164`_)
- Fix an Attribute Error raised when dealing with Invalid Syntax. (See also
`GitLab#203`_)
- Fix an unhandled Syntax Error when tokenizing files. (See also
`GitLab#205`_)
.. links
.. _GitLab#164:
https://gitlab.com/pycqa/flake8/issues/164
.. _GitLab#203:
https://gitlab.com/pycqa/flake8/issues/203
.. _GitLab#205:
https://gitlab.com/pycqa/flake8/issues/205
......@@ -6,6 +6,7 @@ All of the release notes that have been recorded for Flake8 are organized here
with the newest releases first.
.. toctree::
3.0.4
3.0.3
3.0.2
3.0.1
......
=========================
Error / Violation Codes
=========================
Flake8 and its plugins assign a code to each message that we refer to as a
:term:`error code` (or :term:`violation`). Most plugins will list their error
codes in their documentation or README.
Flake8 installs ``pycodestyle``, ``pyflakes``, and ``mccabe`` by default and
generates its own :term:`error code`\ s for ``pyflakes``:
+------+---------------------------------------------------------------------+
| Code | Example Message |
+======+=====================================================================+
| F401 | ``module`` imported but unused |
+------+---------------------------------------------------------------------+
| F402 | import ``module`` from line ``N`` shadowed by loop variable |
+------+---------------------------------------------------------------------+
| F403 | 'from ``module`` import \*' used; unable to detect undefined names |
+------+---------------------------------------------------------------------+
| F404 | future import(s) ``name`` after other statements |
+------+---------------------------------------------------------------------+
| F405 | ``name`` may be undefined, or defined from star imports: ``module`` |
+------+---------------------------------------------------------------------+
+------+---------------------------------------------------------------------+
| F811 | redefinition of unused ``name`` from line ``N`` |
+------+---------------------------------------------------------------------+
| F812 | list comprehension redefines ``name`` from line ``N`` |
+------+---------------------------------------------------------------------+
| F821 | undefined name ``name`` |
+------+---------------------------------------------------------------------+
| F822 | undefined name ``name`` in __all__ |
+------+---------------------------------------------------------------------+
| F823 | local variable ``name`` ... referenced before assignment |
+------+---------------------------------------------------------------------+
| F831 | duplicate argument ``name`` in function definition |
+------+---------------------------------------------------------------------+
| F841 | local variable ``name`` is assigned to but never used |
+------+---------------------------------------------------------------------+
``mccabe`` only ever reports one :term:`violation` - ``C901`` based on the
complexity value provided by the user.
Users should also reference `pycodestyle's list of error codes`_.
.. links
.. _pycodestyle's list of error codes:
https://pycodestyle.readthedocs.io/en/latest/intro.html#error-codes
......@@ -23,6 +23,7 @@ This guide will cover all of these and the nuances for using |Flake8|.
invocation
configuration
options
error-codes
ignoring-errors
using-plugins
python-api
......
Metadata-Version: 1.1
Name: flake8
Version: 3.0.3
Version: 3.0.4
Summary: the modular source code checker: pep8, pyflakes and co
Home-page: https://gitlab.com/pycqa/flake8
Author: Ian Cordasco
......
......@@ -313,9 +313,11 @@ docs/source/release-notes/3.0.0.rst
docs/source/release-notes/3.0.1.rst
docs/source/release-notes/3.0.2.rst
docs/source/release-notes/3.0.3.rst
docs/source/release-notes/3.0.4.rst
docs/source/release-notes/index.rst
docs/source/user/.keep
docs/source/user/configuration.rst
docs/source/user/error-codes.rst
docs/source/user/ignoring-errors.rst
docs/source/user/index.rst
docs/source/user/invocation.rst
......
......@@ -27,7 +27,7 @@ LOG.addHandler(NullHandler())
# Clean up after LOG config
del NullHandler
__version__ = '3.0.3'
__version__ = '3.0.4'
__version_info__ = tuple(int(i) for i in __version__.split('.') if i.isdigit())
......
......@@ -38,21 +38,6 @@ SERIAL_RETRY_ERRNOS = set([
])
def _run_checks_from_queue(process_queue, results_queue, statistics_queue):
LOG.info('Running checks in parallel')
try:
for checker in iter(process_queue.get, 'DONE'):
LOG.info('Checking "%s"', checker.filename)
checker.run_checks(results_queue, statistics_queue)
except exceptions.PluginRequestedUnknownParameters as exc:
print(str(exc))
except Exception as exc:
LOG.error('Unhandled exception occurred')
raise
finally:
results_queue.put('DONE')
class Manager(object):
"""Manage the parallelism and checker instances for each plugin and file.
......@@ -284,8 +269,9 @@ class Manager(object):
file_exists = os.path.exists(filename)
return (file_exists and matches_filename_patterns) or is_stdin
checks = self.checks.to_dictionary()
self.checkers = [
FileChecker(filename, self.checks, self.options)
FileChecker(filename, checks, self.options)
for argument in paths
for filename in utils.filenames_from(argument,
self.is_path_excluded)
......@@ -405,7 +391,7 @@ class FileChecker(object):
:param checks:
The plugins registered to check the file.
:type checks:
flake8.plugins.manager.Checkers
dict
:param options:
Parsed option values from config and command-line.
:type options:
......@@ -458,14 +444,17 @@ class FileChecker(object):
"""Run the check in a single plugin."""
LOG.debug('Running %r with %r', plugin, arguments)
try:
self.processor.keyword_arguments_for(plugin.parameters, arguments)
self.processor.keyword_arguments_for(
plugin['parameters'],
arguments,
)
except AttributeError as ae:
LOG.error('Plugin requested unknown parameters.')
raise exceptions.PluginRequestedUnknownParameters(
plugin=plugin,
exception=ae,
)
return plugin.execute(**arguments)
return plugin['plugin'](**arguments)
def run_ast_checks(self):
"""Run all checks expecting an abstract syntax tree."""
......@@ -484,7 +473,7 @@ class FileChecker(object):
(exc_type.__name__, exception.args[0]))
return
for plugin in self.checks.ast_plugins:
for plugin in self.checks['ast_plugins']:
checker = self.run_check(plugin, tree=ast)
# If the plugin uses a class, call the run method of it, otherwise
# the call should return something iterable itself
......@@ -509,7 +498,7 @@ class FileChecker(object):
LOG.debug('Logical line: "%s"', logical_line.rstrip())
for plugin in self.checks.logical_line_plugins:
for plugin in self.checks['logical_line_plugins']:
self.processor.update_checker_state_for(plugin)
results = self.run_check(plugin, logical_line=logical_line) or ()
for offset, text in results:
......@@ -526,7 +515,7 @@ class FileChecker(object):
def run_physical_checks(self, physical_line, override_error_line=None):
"""Run all checks for a given physical line."""
for plugin in self.checks.physical_line_plugins:
for plugin in self.checks['physical_line_plugins']:
self.processor.update_checker_state_for(plugin)
result = self.run_check(plugin, physical_line=physical_line)
if result is not None:
......@@ -636,6 +625,21 @@ class FileChecker(object):
override_error_line=token[4])
def _run_checks_from_queue(process_queue, results_queue, statistics_queue):
LOG.info('Running checks in parallel')
try:
for checker in iter(process_queue.get, 'DONE'):
LOG.info('Checking "%s"', checker.filename)
checker.run_checks(results_queue, statistics_queue)
except exceptions.PluginRequestedUnknownParameters as exc:
print(str(exc))
except Exception as exc:
LOG.error('Unhandled exception occurred')
raise
finally:
results_queue.put('DONE')
def find_offset(offset, mapping):
"""Find the offset tuple for a single offset."""
if isinstance(offset, tuple):
......
......@@ -36,17 +36,20 @@ class InvalidSyntax(Flake8Exception):
def __init__(self, *args, **kwargs):
"""Initialize our InvalidSyntax exception."""
self.original_exception = kwargs.pop('exception')
exception = kwargs.pop('exception', None)
self.original_exception = exception
self.error_message = '{0}: {1}'.format(
exception.__class__.__name__,
exception.args[0],
)
self.error_code = 'E902'
self.line_number = 1
self.column_number = 0
try:
self.error_message = self.original_exception.message
except AttributeError:
# On Python 3, the IOError is an OSError which has a
# strerror attribute instead of a message attribute
self.error_message = self.original_exception.strerror
super(InvalidSyntax, self).__init__(*args, **kwargs)
super(InvalidSyntax, self).__init__(
self.error_message,
*args,
**kwargs
)
class PluginRequestedUnknownParameters(Flake8Exception):
......@@ -65,7 +68,7 @@ class PluginRequestedUnknownParameters(Flake8Exception):
def __str__(self):
"""Format our exception message."""
return self.FORMAT % {'name': self.plugin.plugin_name,
return self.FORMAT % {'name': self.plugin['plugin_name'],
'exc': self.original_exception}
......
......@@ -49,6 +49,16 @@ class Plugin(object):
self.name, self.entry_point
)
def to_dictionary(self):
"""Convert this plugin to a dictionary."""
return {
'name': self.name,
'parameters': self.parameters,
'parameter_names': self.parameter_names,
'plugin': self.plugin,
'plugin_name': self.plugin_name,
}
def is_in_a_group(self):
"""Determine if this plugin is in a group.
......@@ -433,6 +443,20 @@ class Checkers(PluginTypeManager):
if argument_name == plugin.parameter_names[0]:
yield plugin
def to_dictionary(self):
"""Return a dictionary of AST and line-based plugins."""
return {
'ast_plugins': [
plugin.to_dictionary() for plugin in self.ast_plugins
],
'logical_line_plugins': [
plugin.to_dictionary() for plugin in self.logical_line_plugins
],
'physical_line_plugins': [
plugin.to_dictionary() for plugin in self.physical_line_plugins
],
}
def register_options(self, optmanager):
"""Register all of the checkers' options to the OptionManager.
......
......@@ -46,6 +46,9 @@ class FlakesChecker(pyflakes.checker.Checker):
name = 'pyflakes'
version = pyflakes.__version__
with_doctest = False
include_in_doctest = []
exclude_from_doctest = []
def __init__(self, tree, filename):
"""Initialize the PyFlakes plugin with an AST tree and filename."""
......
......@@ -129,9 +129,9 @@ class FileProcessor(object):
def update_checker_state_for(self, plugin):
"""Update the checker_state attribute for the plugin."""
if 'checker_state' in plugin.parameters:
if 'checker_state' in plugin['parameters']:
self.checker_state = self._checker_states.setdefault(
plugin.name, {}
plugin['name'], {}
)
def next_logical_line(self):
......@@ -240,14 +240,8 @@ class FileProcessor(object):
break
self.tokens.append(token)
yield token
# NOTE(sigmavirus24): pycodestyle was catching both a SyntaxError
# and a tokenize.TokenError. In looking a the source on Python 2 and
# Python 3, the SyntaxError should never arise from generate_tokens.
# If we were using tokenize.tokenize, we would have to catch that. Of
# course, I'm going to be unsurprised to be proven wrong at a later
# date.
except tokenize.TokenError as exc:
raise exceptions.InvalidSyntax(exc.message, exception=exc)
except (tokenize.TokenError, SyntaxError) as exc:
raise exceptions.InvalidSyntax(exception=exc)
def line_for(self, line_number):
"""Retrieve the physical line at the specified line number."""
......
......@@ -63,7 +63,11 @@ def test_handle_file_plugins(plugin_target):
# Prevent it from reading lines from stdin or somewhere else
with mock.patch('flake8.processor.FileProcessor.read_lines',
return_value=['Line 1']):
file_checker = checker.FileChecker('-', checks, mock.MagicMock())
file_checker = checker.FileChecker(
'-',
checks.to_dictionary(),
mock.MagicMock()
)
# Do not actually build an AST
file_checker.processor.build_ast = lambda: True
......
......@@ -47,8 +47,14 @@ def test_make_checkers():
"""Verify that we create a list of FileChecker instances."""
style_guide = style_guide_mock()
files = ['file1', 'file2']
checkplugins = mock.Mock()
checkplugins.to_dictionary.return_value = {
'ast_plugins': [],
'logical_line_plugins': [],
'physical_line_plugins': [],
}
with mock.patch('flake8.checker.multiprocessing', None):
manager = checker.Manager(style_guide, files, [])
manager = checker.Manager(style_guide, files, checkplugins)
with mock.patch('flake8.utils.filenames_from') as filenames_from:
filenames_from.side_effect = [['file1'], ['file2']]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment