Skip to content

Commit

Permalink
Merge branch 'extend-ignore' into 'master'
Browse files Browse the repository at this point in the history
Implement --extend-ignore

See merge request pycqa/flake8!233
  • Loading branch information
sigmavirus24 committed May 20, 2018
2 parents 5221014 + e8e35ea commit 30b0e45
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 45 deletions.
4 changes: 4 additions & 0 deletions docs/source/user/invocation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ And you should see something like:
--ignore=errors Comma-separated list of errors and warnings to ignore
(or skip). For example, ``--ignore=E4,E51,W234``.
(Default: E121,E123,E126,E226,E24,E704)
--extend-ignore=errors
Comma-separated list of errors and warnings to add to
the list of ignored ones. For example, ``--extend-
ignore=E4,E51,W234``.
--max-line-length=n Maximum allowed line length for the entirety of this
run. (Default: 79)
--select=errors Comma-separated list of errors and warnings to enable.
Expand Down
33 changes: 33 additions & 0 deletions docs/source/user/options.rst
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ Index of Options

- :option:`flake8 --ignore`

- :option:`flake8 --extend-ignore`

- :option:`flake8 --max-line-length`

- :option:`flake8 --select`
Expand Down Expand Up @@ -416,6 +418,37 @@ Options and their Descriptions
ignore = E121,E123
.. option:: --extend-ignore=<errors>

:ref:`Go back to index <top>`

Specify a list of codes to add to the list of ignored ones. Similar
considerations as in :option:`--ignore` apply here with regard to the
value.

The difference to the :option:`--ignore` option is, that this option can be
used to selectively add individual codes without overriding the default
list entirely.

Command-line example:

.. prompt:: bash

flake8 --extend-ignore=E4,E51,W234 dir/

This **can** be specified in config files.

Example config file usage:

.. code-block:: ini
extend-ignore =
E4,
E51,
W234
extend-ignore = E4,E51,W234
.. option:: --max-line-length=<n>

:ref:`Go back to index <top>`
Expand Down
8 changes: 8 additions & 0 deletions src/flake8/main/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ def register_default_options(option_manager):
- ``--format``
- ``--hang-closing``
- ``--ignore``
- ``--extend-ignore``
- ``--max-line-length``
- ``--select``
- ``--disable-noqa``
Expand Down Expand Up @@ -108,6 +109,13 @@ def register_default_options(option_manager):
' For example, ``--ignore=E4,E51,W234``. (Default: %default)',
)

add_option(
'--extend-ignore', metavar='errors', default='',
parse_from_config=True, comma_separated_list=True,
help='Comma-separated list of errors and warnings to add to the list'
' of ignored ones. For example, ``--extend-ignore=E4,E51,W234``.',
)

add_option(
'--max-line-length', type='int', metavar='n',
default=defaults.MAX_LINE_LENGTH, parse_from_config=True,
Expand Down
6 changes: 5 additions & 1 deletion src/flake8/style_guide.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import contextlib
import enum
import functools
import itertools
import linecache
import logging

Expand Down Expand Up @@ -166,7 +167,10 @@ def __init__(self, options):
self.selected + self.enabled_extensions,
reverse=True,
))
self.ignored = tuple(sorted(options.ignore, reverse=True))
self.ignored = tuple(sorted(
itertools.chain(options.ignore, options.extend_ignore),
reverse=True,
))
self.using_default_ignore = set(self.ignored) == set(defaults.IGNORE)
self.using_default_select = (
set(self.selected) == set(defaults.SELECT)
Expand Down
106 changes: 62 additions & 44 deletions tests/unit/test_decision_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,35 +12,42 @@ def create_options(**kwargs):
kwargs.setdefault('select', [])
kwargs.setdefault('extended_default_select', [])
kwargs.setdefault('ignore', [])
kwargs.setdefault('extend_ignore', [])
kwargs.setdefault('disable_noqa', False)
kwargs.setdefault('enable_extensions', [])
return optparse.Values(kwargs)


@pytest.mark.parametrize('ignore_list,error_code', [
(['E111', 'E121'], 'E111'),
(['E111', 'E121'], 'E121'),
(['E11', 'E12'], 'E121'),
(['E2', 'E12'], 'E121'),
(['E2', 'E12'], 'E211'),
@pytest.mark.parametrize('ignore_list,extend_ignore,error_code', [
(['E111', 'E121'], [], 'E111'),
(['E111', 'E121'], [], 'E121'),
(['E111'], ['E121'], 'E121'),
(['E11', 'E12'], [], 'E121'),
(['E2', 'E12'], [], 'E121'),
(['E2', 'E12'], [], 'E211'),
(['E2', 'E3'], ['E12'], 'E211'),
])
def test_was_ignored_ignores_errors(ignore_list, error_code):
def test_was_ignored_ignores_errors(ignore_list, extend_ignore, error_code):
"""Verify we detect users explicitly ignoring an error."""
decider = style_guide.DecisionEngine(create_options(ignore=ignore_list))
decider = style_guide.DecisionEngine(
create_options(ignore=ignore_list, extend_ignore=extend_ignore))

assert decider.was_ignored(error_code) is style_guide.Ignored.Explicitly


@pytest.mark.parametrize('ignore_list,error_code', [
(['E111', 'E121'], 'E112'),
(['E111', 'E121'], 'E122'),
(['E11', 'E12'], 'W121'),
(['E2', 'E12'], 'E112'),
(['E2', 'E12'], 'E111'),
@pytest.mark.parametrize('ignore_list,extend_ignore,error_code', [
(['E111', 'E121'], [], 'E112'),
(['E111', 'E121'], [], 'E122'),
(['E11', 'E12'], ['E121'], 'W121'),
(['E2', 'E12'], [], 'E112'),
(['E2', 'E12'], [], 'E111'),
(['E2', 'E12'], ['W11', 'E3'], 'E111'),
])
def test_was_ignored_implicitly_selects_errors(ignore_list, error_code):
def test_was_ignored_implicitly_selects_errors(ignore_list, extend_ignore,
error_code):
"""Verify we detect users does not explicitly ignore an error."""
decider = style_guide.DecisionEngine(create_options(ignore=ignore_list))
decider = style_guide.DecisionEngine(
create_options(ignore=ignore_list, extend_ignore=extend_ignore))

assert decider.was_ignored(error_code) is style_guide.Selected.Implicitly

Expand Down Expand Up @@ -93,35 +100,46 @@ def test_was_selected_excludes_errors(select_list, error_code):
assert decider.was_selected(error_code) is style_guide.Ignored.Implicitly


@pytest.mark.parametrize('select_list,ignore_list,error_code,expected', [
(['E111', 'E121'], [], 'E111', style_guide.Decision.Selected),
(['E111', 'E121'], [], 'E112', style_guide.Decision.Ignored),
(['E111', 'E121'], [], 'E121', style_guide.Decision.Selected),
(['E111', 'E121'], [], 'E122', style_guide.Decision.Ignored),
(['E11', 'E12'], [], 'E132', style_guide.Decision.Ignored),
(['E2', 'E12'], [], 'E321', style_guide.Decision.Ignored),
(['E2', 'E12'], [], 'E410', style_guide.Decision.Ignored),
(['E11', 'E121'], ['E1'], 'E112', style_guide.Decision.Selected),
(['E111', 'E121'], ['E2'], 'E122', style_guide.Decision.Ignored),
(['E11', 'E12'], ['E13'], 'E132', style_guide.Decision.Ignored),
(['E1', 'E3'], ['E32'], 'E321', style_guide.Decision.Ignored),
([], ['E2', 'E12'], 'E410', style_guide.Decision.Ignored),
(['E4'], ['E2', 'E12', 'E41'], 'E410', style_guide.Decision.Ignored),
(['E41'], ['E2', 'E12', 'E4'], 'E410', style_guide.Decision.Selected),
(['E'], ['F'], 'E410', style_guide.Decision.Selected),
(['F'], [], 'E410', style_guide.Decision.Ignored),
(['E'], defaults.IGNORE, 'E126', style_guide.Decision.Selected),
(['W'], defaults.IGNORE, 'E126', style_guide.Decision.Ignored),
(['E'], defaults.IGNORE, 'W391', style_guide.Decision.Ignored),
(['E', 'W'], ['E13'], 'E131', style_guide.Decision.Ignored),
(defaults.SELECT, ['E13'], 'E131', style_guide.Decision.Ignored),
(defaults.SELECT, defaults.IGNORE, 'E126', style_guide.Decision.Ignored),
(defaults.SELECT, defaults.IGNORE, 'W391', style_guide.Decision.Selected),
])
def test_decision_for(select_list, ignore_list, error_code, expected):
@pytest.mark.parametrize(
'select_list,ignore_list,extend_ignore,error_code,expected', [
(['E111', 'E121'], [], [], 'E111', style_guide.Decision.Selected),
(['E111', 'E121'], [], [], 'E112', style_guide.Decision.Ignored),
(['E111', 'E121'], [], [], 'E121', style_guide.Decision.Selected),
(['E111', 'E121'], [], [], 'E122', style_guide.Decision.Ignored),
(['E11', 'E12'], [], [], 'E132', style_guide.Decision.Ignored),
(['E2', 'E12'], [], [], 'E321', style_guide.Decision.Ignored),
(['E2', 'E12'], [], [], 'E410', style_guide.Decision.Ignored),
(['E11', 'E121'], ['E1'], [], 'E112', style_guide.Decision.Selected),
(['E11', 'E121'], [], ['E1'], 'E112', style_guide.Decision.Selected),
(['E111', 'E121'], ['E2'], ['E3'], 'E122',
style_guide.Decision.Ignored),
(['E11', 'E12'], ['E13'], [], 'E132', style_guide.Decision.Ignored),
(['E1', 'E3'], ['E32'], [], 'E321', style_guide.Decision.Ignored),
([], ['E2', 'E12'], [], 'E410', style_guide.Decision.Ignored),
(['E4'], ['E2', 'E12', 'E41'], [], 'E410',
style_guide.Decision.Ignored),
(['E41'], ['E2', 'E12', 'E4'], [], 'E410',
style_guide.Decision.Selected),
(['E'], ['F'], [], 'E410', style_guide.Decision.Selected),
(['F'], [], [], 'E410', style_guide.Decision.Ignored),
(['E'], defaults.IGNORE, [], 'E126', style_guide.Decision.Selected),
(['W'], defaults.IGNORE, [], 'E126', style_guide.Decision.Ignored),
(['E'], defaults.IGNORE, [], 'W391', style_guide.Decision.Ignored),
(['E', 'W'], ['E13'], [], 'E131', style_guide.Decision.Ignored),
(defaults.SELECT, ['E13'], [], 'E131', style_guide.Decision.Ignored),
(defaults.SELECT, defaults.IGNORE, ['W391'], 'E126',
style_guide.Decision.Ignored),
(defaults.SELECT, defaults.IGNORE, [], 'W391',
style_guide.Decision.Selected),
]
)
def test_decision_for(select_list, ignore_list, extend_ignore, error_code,
expected):
"""Verify we decide when to report an error."""
decider = style_guide.DecisionEngine(create_options(select=select_list,
ignore=ignore_list))
decider = style_guide.DecisionEngine(
create_options(select=select_list,
ignore=ignore_list,
extend_ignore=extend_ignore))

assert decider.decision_for(error_code) is expected

Expand Down
1 change: 1 addition & 0 deletions tests/unit/test_style_guide.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ def create_options(**kwargs):
kwargs.setdefault('select', [])
kwargs.setdefault('extended_default_select', [])
kwargs.setdefault('ignore', [])
kwargs.setdefault('extend_ignore', [])
kwargs.setdefault('disable_noqa', False)
kwargs.setdefault('enable_extensions', [])
return optparse.Values(kwargs)
Expand Down

0 comments on commit 30b0e45

Please sign in to comment.