diff --git a/docs/source/release-notes/3.4.0.rst b/docs/source/release-notes/3.4.0.rst index e1c42ea..8c08160 100644 --- a/docs/source/release-notes/3.4.0.rst +++ b/docs/source/release-notes/3.4.0.rst @@ -3,6 +3,9 @@ You can view the `3.4.0 milestone`_ on GitLab for more details. +- Refine logic around ``--select`` and ``--ignore`` when combined with the + default values for each. (See also `GitLab#318`_) + - Handle spaces as an alternate separate for error codes, e.g., ``--ignore 'E123 E234'``. (See also `GitLab#329`_) @@ -14,6 +17,8 @@ You can view the `3.4.0 milestone`_ on GitLab for more details. https://gitlab.com/pycqa/flake8/milestones/18 .. issue links +.. _GitLab#318: + https://gitlab.com/pycqa/flake8/issues/318 .. _GitLab#329: https://gitlab.com/pycqa/flake8/issues/329 .. _GitLab#330: diff --git a/src/flake8/style_guide.py b/src/flake8/style_guide.py index fb0df3a..ebc01ed 100644 --- a/src/flake8/style_guide.py +++ b/src/flake8/style_guide.py @@ -74,6 +74,10 @@ class StyleGuide(object): reverse=True, )) self._ignored = tuple(sorted(options.ignore, reverse=True)) + self._using_default_ignore = set(self._ignored) == set(defaults.IGNORE) + self._using_default_select = ( + set(self._selected) == set(defaults.SELECT) + ) self._decision_cache = {} self._parsed_diff = {} @@ -135,14 +139,15 @@ class StyleGuide(object): ignore = find_first_match(code, self._ignored) if select and ignore: + if self._using_default_ignore and not self._using_default_select: + return Decision.Selected return find_more_specific(select, ignore) if extra_select and ignore: return find_more_specific(extra_select, ignore) - if select or (extra_select and self._selected == defaults.SELECT): + if select or (extra_select and self._using_default_select): return Decision.Selected - if select is None and extra_select is None and ignore is not None: - return Decision.Ignored - if self._selected != defaults.SELECT and select is None: + if (select is None and + (extra_select is None or not self._using_default_ignore)): return Decision.Ignored return Decision.Selected diff --git a/tests/unit/test_style_guide.py b/tests/unit/test_style_guide.py index 7357b25..5c24048 100644 --- a/tests/unit/test_style_guide.py +++ b/tests/unit/test_style_guide.py @@ -125,6 +125,13 @@ def test_is_user_selected_excludes_errors(select_list, error_code): (['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_should_report_error(select_list, ignore_list, error_code, expected): """Verify we decide when to report an error.""" @@ -141,7 +148,7 @@ def test_should_report_error(select_list, ignore_list, error_code, expected): (defaults.SELECT, [], ['I1'], [], 'I100', style_guide.Decision.Selected), (defaults.SELECT, [], ['I1'], [], 'I201', - style_guide.Decision.Selected), + style_guide.Decision.Ignored), (defaults.SELECT, ['I2'], ['I1'], [], 'I101', style_guide.Decision.Selected), (defaults.SELECT, ['I2'], ['I1'], [], 'I201', @@ -156,10 +163,22 @@ def test_should_report_error(select_list, ignore_list, error_code, expected): style_guide.Decision.Ignored), (defaults.SELECT, ['U401'], [], ['U4'], 'U402', style_guide.Decision.Selected), + (['E', 'W'], ['E13'], [], [], 'E131', style_guide.Decision.Ignored), + (['E', 'W'], ['E13'], [], [], 'E126', style_guide.Decision.Selected), (['E2'], ['E21'], [], [], 'E221', style_guide.Decision.Selected), (['E2'], ['E21'], [], [], 'E212', style_guide.Decision.Ignored), (['F', 'W'], ['C90'], ['I1'], [], 'C901', style_guide.Decision.Ignored), + (['E', 'W'], ['C'], [], [], 'E131', + style_guide.Decision.Selected), + (defaults.SELECT, defaults.IGNORE, [], ['I'], 'I101', + style_guide.Decision.Selected), + (defaults.SELECT, defaults.IGNORE, ['G'], ['I'], 'G101', + style_guide.Decision.Selected), + (defaults.SELECT, ['G1'], ['G'], ['I'], 'G101', + style_guide.Decision.Ignored), + (defaults.SELECT, ['E126'], [], ['I'], 'I101', + style_guide.Decision.Selected), ] ) def test_decision_for_logic(select, ignore, extend_select, enabled_extensions, diff --git a/tox.ini b/tox.ini index ba2e43b..69d01e6 100644 --- a/tox.ini +++ b/tox.ini @@ -25,7 +25,7 @@ deps = wheel commands = python setup.py -qq bdist_wheel - pip install --pre --find-links ./dist/ flake8 + pip install -U --pre --find-links ./dist/ flake8 flake8 --version flake8 src/flake8/ tests/ setup.py