From 367c810f0ebbca39146a037d3b6f82f139c9ebab Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Fri, 24 Jun 2022 17:55:41 -0400 Subject: [PATCH] don't consider default codes as explicitly selected unless listed --- src/flake8/style_guide.py | 38 ++++++++++++++++++------------ tests/unit/test_decision_engine.py | 17 +++++++++++++ 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/flake8/style_guide.py b/src/flake8/style_guide.py index d9f6dbc..0504413 100644 --- a/src/flake8/style_guide.py +++ b/src/flake8/style_guide.py @@ -47,6 +47,15 @@ class Decision(enum.Enum): Selected = "selected error" +def _explicitly_chosen( + *, + option: Optional[List[str]], + extend: Optional[List[str]], +) -> Tuple[str, ...]: + ret = [*(option or []), *(extend or [])] + return tuple(sorted(ret, reverse=True)) + + def _select_ignore( *, option: Optional[List[str]], @@ -73,11 +82,13 @@ class DecisionEngine: """Initialize the engine.""" self.cache: Dict[str, Decision] = {} - self.using_default_select = ( - options.select is None and options.extend_select is None + self.selected_explicitly = _explicitly_chosen( + option=options.select, + extend=options.extend_select, ) - self.using_default_ignore = ( - options.ignore is None and options.extend_ignore is None + self.ignored_explicitly = _explicitly_chosen( + option=options.ignore, + extend=options.extend_ignore, ) self.selected = _select_ignore( @@ -86,7 +97,6 @@ class DecisionEngine: extended_default=options.extended_default_select, extend=options.extend_select, ) - self.ignored = _select_ignore( option=options.ignore, default=defaults.IGNORE, @@ -105,11 +115,10 @@ class DecisionEngine: Ignored.Implicitly if the selected list is not empty but no match was found. """ - if code.startswith(self.selected): - if self.using_default_select: - return Selected.Implicitly - else: - return Selected.Explicitly + if code.startswith(self.selected_explicitly): + return Selected.Explicitly + elif code.startswith(self.selected): + return Selected.Implicitly else: return Ignored.Implicitly @@ -125,11 +134,10 @@ class DecisionEngine: Selected.Implicitly if the ignored list is not empty but no match was found. """ - if code.startswith(self.ignored): - if self.using_default_ignore: - return Ignored.Implicitly - else: - return Ignored.Explicitly + if code.startswith(self.ignored_explicitly): + return Ignored.Explicitly + elif code.startswith(self.ignored): + return Ignored.Implicitly else: return Selected.Implicitly diff --git a/tests/unit/test_decision_engine.py b/tests/unit/test_decision_engine.py index 1280385..59c372a 100644 --- a/tests/unit/test_decision_engine.py +++ b/tests/unit/test_decision_engine.py @@ -224,3 +224,20 @@ def test_user_can_extend_select_to_enable_plugin_default_ignored(): ) assert decider.decision_for("P002") is style_guide.Decision.Selected + + +def test_plugin_extends_default_ignore_but_extend_selected(): + decider = style_guide.DecisionEngine( + create_options( + # user options --extend-select P002 --extend-ignore E501 + select=None, + ignore=None, + extend_select=["P002"], + extend_ignore=["E501"], + # a plugin is installed and extends default ignore + extended_default_select=["P"], + extended_default_ignore=["P002"], + ), + ) + + assert decider.decision_for("P002") is style_guide.Decision.Selected