diff --git a/docs/source/user/invocation.rst b/docs/source/user/invocation.rst index cddfab4..170a62a 100644 --- a/docs/source/user/invocation.rst +++ b/docs/source/user/invocation.rst @@ -115,6 +115,10 @@ And you should see something like: run. (Default: 79) --select=errors Comma-separated list of errors and warnings to enable. For example, ``--select=E4,E51,W234``. (Default: ) + --extend-select errors + Comma-separated list of errors and warnings to add to + the list of selected ones. For example, ``--extend- + select=E4,E51,W234``. --disable-noqa Disable the effect of "# noqa". This will report errors on lines with "# noqa" at the end. --show-source Show the source generate each error or warning. diff --git a/docs/source/user/options.rst b/docs/source/user/options.rst index 885bb02..7141e7a 100644 --- a/docs/source/user/options.rst +++ b/docs/source/user/options.rst @@ -68,6 +68,8 @@ Index of Options - :option:`flake8 --select` +- :option:`flake8 --extend-select` + - :option:`flake8 --disable-noqa` - :option:`flake8 --show-source` @@ -632,6 +634,38 @@ Options and their Descriptions F +.. option:: --extend-select= + + :ref:`Go back to index ` + + .. versionadded:: 4.0.0 + + Specify a list of codes to add to the list of selected ones. Similar + considerations as in :option:`--select` apply here with regard to the + value. + + The difference to the :option:`--select` 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-select=E4,E51,W234 dir/ + + This **can** be specified in config files. + + Example config file usage: + + .. code-block:: ini + + extend-select = + E4, + E51, + W234 + + .. option:: --disable-noqa :ref:`Go back to index ` diff --git a/src/flake8/main/options.py b/src/flake8/main/options.py index 3dfb482..6f44768 100644 --- a/src/flake8/main/options.py +++ b/src/flake8/main/options.py @@ -105,6 +105,7 @@ def register_default_options(option_manager): - ``--max-doc-length`` - ``--indent-size`` - ``--select`` + - ``--extend-select`` - ``--disable-noqa`` - ``--show-source`` - ``--statistics`` @@ -272,6 +273,18 @@ def register_default_options(option_manager): " For example, ``--select=E4,E51,W234``. (Default: %(default)s)", ) + add_option( + "--extend-select", + 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 selected ones. For example, ``--extend-select=E4,E51,W234``." + ), + ) + add_option( "--disable-noqa", default=False, diff --git a/src/flake8/style_guide.py b/src/flake8/style_guide.py index 5c91be8..a34afd7 100644 --- a/src/flake8/style_guide.py +++ b/src/flake8/style_guide.py @@ -162,7 +162,14 @@ class DecisionEngine: ) self.enabled_extensions = tuple(options.enable_extensions) self.all_selected = tuple( - sorted(self.selected + self.enabled_extensions, reverse=True) + sorted( + itertools.chain( + self.selected, + options.extend_select, + self.enabled_extensions, + ), + reverse=True, + ) ) self.ignored = tuple( sorted( diff --git a/tests/unit/test_decision_engine.py b/tests/unit/test_decision_engine.py index 7d92309..9b5a00e 100644 --- a/tests/unit/test_decision_engine.py +++ b/tests/unit/test_decision_engine.py @@ -11,6 +11,7 @@ def create_options(**kwargs): """Create and return an instance of argparse.Namespace.""" kwargs.setdefault('select', []) kwargs.setdefault('extended_default_select', []) + kwargs.setdefault('extend_select', []) kwargs.setdefault('ignore', []) kwargs.setdefault('extend_ignore', []) kwargs.setdefault('disable_noqa', False) @@ -52,20 +53,27 @@ def test_was_ignored_implicitly_selects_errors(ignore_list, extend_ignore, assert decider.was_ignored(error_code) is style_guide.Selected.Implicitly -@pytest.mark.parametrize('select_list,enable_extensions,error_code', [ - (['E111', 'E121'], [], 'E111'), - (['E111', 'E121'], [], 'E121'), - (['E11', 'E12'], [], 'E121'), - (['E2', 'E12'], [], 'E121'), - (['E2', 'E12'], [], 'E211'), - (['E1'], ['E2'], 'E211'), - ([], ['E2'], 'E211'), -]) -def test_was_selected_selects_errors(select_list, enable_extensions, - error_code): +@pytest.mark.parametrize( + 'select_list,extend_select,enable_extensions,error_code', [ + (['E111', 'E121'], [], [], 'E111'), + (['E111', 'E121'], [], [], 'E121'), + (['E11', 'E12'], [], [], 'E121'), + (['E2', 'E12'], [], [], 'E121'), + (['E2', 'E12'], [], [], 'E211'), + (['E1'], ['E2'], [], 'E211'), + (['E1'], [], ['E2'], 'E211'), + ([], ['E2'], [], 'E211'), + ([], [], ['E2'], 'E211'), + (['E1'], ['E2'], [], 'E211'), + (['E111'], ['E121'], ['E2'], 'E121'), + ] +) +def test_was_selected_selects_errors(select_list, extend_select, + enable_extensions, error_code): """Verify we detect users explicitly selecting an error.""" decider = style_guide.DecisionEngine( options=create_options(select=select_list, + extend_select=extend_select, enable_extensions=enable_extensions), ) @@ -144,7 +152,8 @@ def test_decision_for(select_list, ignore_list, extend_ignore, error_code, @pytest.mark.parametrize( - 'select,ignore,extend_select,enabled_extensions,error_code,expected', [ + 'select,ignore,extended_default_select,' + 'enabled_extensions,error_code,expected', [ (defaults.SELECT, [], ['I1'], [], 'I100', style_guide.Decision.Selected), (defaults.SELECT, [], ['I1'], [], 'I201', @@ -185,14 +194,14 @@ def test_decision_for(select_list, ignore_list, extend_ignore, error_code, # 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_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_select=extend_select, + extended_default_select=extended_default_select, enable_extensions=enabled_extensions, ), ) diff --git a/tests/unit/test_style_guide.py b/tests/unit/test_style_guide.py index ac781f3..bd5d9c7 100644 --- a/tests/unit/test_style_guide.py +++ b/tests/unit/test_style_guide.py @@ -14,6 +14,7 @@ def create_options(**kwargs): """Create and return an instance of argparse.Namespace.""" kwargs.setdefault('select', []) kwargs.setdefault('extended_default_select', []) + kwargs.setdefault('extend_select', []) kwargs.setdefault('ignore', []) kwargs.setdefault('extend_ignore', []) kwargs.setdefault('disable_noqa', False)