From 5b7dc3927aa4000091847cf15dc641adc7503d74 Mon Sep 17 00:00:00 2001 From: Ian Cordasco Date: Mon, 24 Aug 2015 22:18:35 -0500 Subject: [PATCH 1/2] Remove enabled extensions from `options.select` When taking advantage of the --select flag for off-by-default extensions, we neglected to take into account the fact that leaving the extension names in the select list would cause different behaviour in pep8. This should remedy this. Related to GitLab bug #67 --- flake8/engine.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/flake8/engine.py b/flake8/engine.py index 0f440c1..4763b5a 100644 --- a/flake8/engine.py +++ b/flake8/engine.py @@ -168,9 +168,16 @@ class StyleGuide(object): def _disable_extensions(parser, options): ignored_extensions = set(getattr(parser, 'ignored_extensions', [])) + select = set(options.select) + + enabled_extensions = ignored_extensions.intersection(select) # Remove any of the selected extensions from the extensions ignored by # default. - ignored_extensions -= set(options.select) + ignored_extensions -= select + + for extension in enabled_extensions: + options.select.remove(extension) + # Whatever is left afterwards should be unioned with options.ignore and # options.ignore should be updated with that. options.ignore = tuple(ignored_extensions.union(options.ignore)) From 96cb23e2e786ca1afa171c3e20692dedefbf2944 Mon Sep 17 00:00:00 2001 From: Ian Cordasco Date: Sun, 27 Sep 2015 09:45:35 -0500 Subject: [PATCH 2/2] Add --enable-extensions flag to Flake8 This new flag is added so that off-by-default extensions can be enabled without using --select which (currently) causes several problems with pep8's rule engine. This also adds support to the --enable-extensions flag to be specified as a multi-line config option in an appropriate config file. Closes GitLab #67 --- flake8/engine.py | 31 +++++++++++++++++++++++++------ flake8/tests/test_engine.py | 12 ++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/flake8/engine.py b/flake8/engine.py index 4763b5a..095f6d2 100644 --- a/flake8/engine.py +++ b/flake8/engine.py @@ -78,6 +78,11 @@ def get_parser(): help='Redirect report to a file.', type='string', nargs=1, action='callback', callback=callbacks.redirect_stdout) + parser.add_option('--enable-extensions', default='', + dest='enabled_extensions', + help='Enable plugins and extensions that are disabled ' + 'by default', + type='string') parser.ignored_extensions = ignored return parser, options_hooks @@ -166,17 +171,31 @@ class StyleGuide(object): ) +def _parse_multi_options(options, split_token=','): + r"""Split and strip and discard empties. + + Turns the following: + + A, + B, + + into ["A", "B"]. + + Credit: Kristian Glass as contributed to pep8 + """ + if options: + return [o.strip() for o in options.split(split_token) if o.strip()] + else: + return options + + def _disable_extensions(parser, options): ignored_extensions = set(getattr(parser, 'ignored_extensions', [])) - select = set(options.select) + enabled = set(_parse_multi_options(options.enabled_extensions)) - enabled_extensions = ignored_extensions.intersection(select) # Remove any of the selected extensions from the extensions ignored by # default. - ignored_extensions -= select - - for extension in enabled_extensions: - options.select.remove(extension) + ignored_extensions -= enabled # Whatever is left afterwards should be unioned with options.ignore and # options.ignore should be updated with that. diff --git a/flake8/tests/test_engine.py b/flake8/tests/test_engine.py index a6faab5..d7a5dc7 100644 --- a/flake8/tests/test_engine.py +++ b/flake8/tests/test_engine.py @@ -56,6 +56,18 @@ class TestEngine(unittest.TestCase): self.assertTrue(isinstance(i, list)) self.assertTrue(register_check.called) + def test_disable_extensions(self): + parser = mock.MagicMock() + options = mock.MagicMock() + + parser.ignored_extensions = ['I123', 'I345', 'I678', 'I910'] + + options.enabled_extensions = 'I345,\nI678,I910' + options.ignore = ('E121', 'E123') + + engine._disable_extensions(parser, options) + self.assertEqual(set(options.ignore), set(['E121', 'E123', 'I123'])) + def test_get_parser(self): # setup re = self.start_patch('flake8.engine._register_extensions')