From e3313e0949472c1c3e9a6618615c9dc0c46291b2 Mon Sep 17 00:00:00 2001 From: Ian Stapleton Cordasco Date: Thu, 15 Apr 2021 09:12:25 -0500 Subject: [PATCH 1/2] Fix bug for plugins using extend_default_ignore Since Flake8 3.0 we've had the ability for plugins to use `extend_default_ignore` to register codes they want disabled by default. This, however, was a permanent disabling unfortunately. Our code didn't have a way of understanding that this new set of `ignore` codes was actually the 'default' set for that run. Much like the extended_select_list, we now attach extended_ignore_list to be able to confidently determine if the ignore we get in the DecisionEngine is actually the Default Ignore list and what plugins what us to ignore by default. Refs https://github.com/PyCQA/pep8-naming/pull/157 --- src/flake8/options/aggregator.py | 4 ++ src/flake8/style_guide.py | 4 +- tests/unit/test_decision_engine.py | 87 +++++++++++++++++++++--------- tests/unit/test_style_guide.py | 1 + 4 files changed, 71 insertions(+), 25 deletions(-) diff --git a/src/flake8/options/aggregator.py b/src/flake8/options/aggregator.py index bdcd6a3..31adf9d 100644 --- a/src/flake8/options/aggregator.py +++ b/src/flake8/options/aggregator.py @@ -47,6 +47,10 @@ def aggregate_options( # Extend the default ignore value with the extended default ignore list, # registered by plugins. extended_default_ignore = manager.extended_default_ignore.copy() + # Let's store our extended default ignore for use by the decision engine + default_values.extended_default_ignore = ( + manager.extended_default_ignore.copy() + ) LOG.debug( "Extended default ignore list: %s", list(extended_default_ignore) ) diff --git a/src/flake8/style_guide.py b/src/flake8/style_guide.py index 9be0fe8..91d21ab 100644 --- a/src/flake8/style_guide.py +++ b/src/flake8/style_guide.py @@ -166,7 +166,9 @@ class DecisionEngine(object): reverse=True, ) ) - self.using_default_ignore = set(self.ignored) == set(defaults.IGNORE) + self.using_default_ignore = set(self.ignored) == set( + defaults.IGNORE + ).union(options.extended_default_ignore) self.using_default_select = set(self.selected) == set(defaults.SELECT) def _in_all_selected(self, code): # type: (str) -> bool diff --git a/tests/unit/test_decision_engine.py b/tests/unit/test_decision_engine.py index 7d92309..ef77324 100644 --- a/tests/unit/test_decision_engine.py +++ b/tests/unit/test_decision_engine.py @@ -10,6 +10,7 @@ from flake8 import style_guide def create_options(**kwargs): """Create and return an instance of argparse.Namespace.""" kwargs.setdefault('select', []) + kwargs.setdefault('extended_default_ignore', []) kwargs.setdefault('extended_default_select', []) kwargs.setdefault('ignore', []) kwargs.setdefault('extend_ignore', []) @@ -144,54 +145,92 @@ def test_decision_for(select_list, ignore_list, extend_ignore, error_code, @pytest.mark.parametrize( - 'select,ignore,extend_select,enabled_extensions,error_code,expected', [ - (defaults.SELECT, [], ['I1'], [], 'I100', + 'select,ignore,extended_default_ignore,extend_select,enabled_extensions,' + 'error_code,expected', [ + (defaults.SELECT, [], [], ['I1'], [], 'I100', style_guide.Decision.Selected), - (defaults.SELECT, [], ['I1'], [], 'I201', + (defaults.SELECT, [], [], ['I1'], [], 'I201', style_guide.Decision.Ignored), - (defaults.SELECT, ['I2'], ['I1'], [], 'I101', + (defaults.SELECT, ['I2'], [], ['I1'], [], 'I101', style_guide.Decision.Selected), - (defaults.SELECT, ['I2'], ['I1'], [], 'I201', + (defaults.SELECT, ['I2'], [], ['I1'], [], 'I201', style_guide.Decision.Ignored), - (defaults.SELECT, ['I1'], ['I10'], [], 'I101', + (defaults.SELECT, ['I1'], [], ['I10'], [], 'I101', style_guide.Decision.Selected), - (defaults.SELECT, ['I10'], ['I1'], [], 'I101', + (defaults.SELECT, ['I10'], [], ['I1'], [], 'I101', style_guide.Decision.Ignored), - (defaults.SELECT, [], [], ['U4'], 'U401', + (defaults.SELECT, [], [], [], ['U4'], 'U401', style_guide.Decision.Selected), - (defaults.SELECT, ['U401'], [], ['U4'], 'U401', + (defaults.SELECT, ['U401'], [], [], ['U4'], 'U401', style_guide.Decision.Ignored), - (defaults.SELECT, ['U401'], [], ['U4'], 'U402', + (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', + ( + ['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', + (['E', 'W'], ['C'], [], [], [], 'E131', style_guide.Decision.Selected), - (defaults.SELECT, defaults.IGNORE, [], ['I'], 'I101', + (defaults.SELECT, defaults.IGNORE, [], [], ['I'], 'I101', style_guide.Decision.Selected), - (defaults.SELECT, defaults.IGNORE, ['G'], ['I'], 'G101', + (defaults.SELECT, defaults.IGNORE, [], ['G'], ['I'], 'G101', style_guide.Decision.Selected), - (defaults.SELECT, ['G1'], ['G'], ['I'], 'G101', + (defaults.SELECT, ['G1'], [], ['G'], ['I'], 'G101', style_guide.Decision.Ignored), - (defaults.SELECT, ['E126'], [], ['I'], 'I101', + (defaults.SELECT, ['E126'], [], [], ['I'], 'I101', style_guide.Decision.Selected), - (['E', 'W'], defaults.IGNORE, ['I'], [], 'I101', + (['E', 'W'], defaults.IGNORE, [], ['I'], [], 'I101', style_guide.Decision.Ignored), + ( + ["E", "W", "I101"], + defaults.IGNORE + ("I101",), + ["I101"], + [], + [], + "I101", + style_guide.Decision.Selected, + ), + ( + ["E", "W"], + defaults.IGNORE + ("I101",), + ["I101"], + [], + [], + "I101", + style_guide.Decision.Ignored, + ), # TODO(sigmavirus24) Figure out how to exercise the final catch-all # return statement ] ) -def test_more_specific_decision_for_logic(select, ignore, extend_select, - enabled_extensions, error_code, - expected): +def test_more_specific_decision_for_logic( + select, ignore, extended_default_ignore, extend_select, + enabled_extensions, error_code, + expected, +): """Verify the logic of DecisionEngine.more_specific_decision_for.""" decider = style_guide.DecisionEngine( create_options( select=select, ignore=ignore, + extended_default_ignore=extended_default_ignore, extended_default_select=extend_select, enable_extensions=enabled_extensions, ), diff --git a/tests/unit/test_style_guide.py b/tests/unit/test_style_guide.py index 5503d7e..c24472a 100644 --- a/tests/unit/test_style_guide.py +++ b/tests/unit/test_style_guide.py @@ -13,6 +13,7 @@ from flake8.formatting import base def create_options(**kwargs): """Create and return an instance of argparse.Namespace.""" kwargs.setdefault('select', []) + kwargs.setdefault('extended_default_ignore', []) kwargs.setdefault('extended_default_select', []) kwargs.setdefault('ignore', []) kwargs.setdefault('extend_ignore', []) From f7bda9296329cd0ad22cc38fe51b9fd679eed296 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Thu, 15 Apr 2021 20:49:00 -0700 Subject: [PATCH 2/2] Release 3.9.1 --- docs/source/conf.py | 6 ++++++ docs/source/release-notes/3.9.1.rst | 15 +++++++++++++++ docs/source/release-notes/index.rst | 1 + src/flake8/__init__.py | 2 +- 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 docs/source/release-notes/3.9.1.rst diff --git a/docs/source/conf.py b/docs/source/conf.py index dd2003f..8dfe578 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -31,6 +31,7 @@ needs_sphinx = '1.3' extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.doctest', + 'sphinx.ext.extlinks', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', @@ -298,3 +299,8 @@ texinfo_documents = [ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'python': ('https://docs.python.org/3/', None)} + +extlinks = { + "issue": ("https://github.com/pycqa/flake8/issues/%s", "#"), + "pull": ("https://github.com/pycqa/flake8/pull/%s", "#"), +} diff --git a/docs/source/release-notes/3.9.1.rst b/docs/source/release-notes/3.9.1.rst new file mode 100644 index 0000000..55bccdc --- /dev/null +++ b/docs/source/release-notes/3.9.1.rst @@ -0,0 +1,15 @@ +3.9.1 -- 2021-04-15 +------------------- + +You can view the `3.9.1 milestone`_ on GitHub for more details. + +Bugs Fixed +~~~~~~~~~~ + +- Fix codes being ignored by plugins utilizing ``extend_default_ignore`` (See + also :pull:`1317`) + + +.. all links +.. _3.9.1 milestone: + https://github.com/PyCQA/flake8/milestone/38 diff --git a/docs/source/release-notes/index.rst b/docs/source/release-notes/index.rst index 33b6faa..9fcdb85 100644 --- a/docs/source/release-notes/index.rst +++ b/docs/source/release-notes/index.rst @@ -9,6 +9,7 @@ with the newest releases first. ================== .. toctree:: + 3.9.1 3.9.0 3.8.4 3.8.3 diff --git a/src/flake8/__init__.py b/src/flake8/__init__.py index ea2f541..3c7f082 100644 --- a/src/flake8/__init__.py +++ b/src/flake8/__init__.py @@ -18,7 +18,7 @@ if False: # `typing.TYPE_CHECKING` was introduced in 3.5.2 LOG = logging.getLogger(__name__) LOG.addHandler(logging.NullHandler()) -__version__ = "3.9.0" +__version__ = "3.9.1" __version_info__ = tuple( int(i) for i in __version__.split(".") if i.isdigit() )