From 5f3577fca84f6c45110214880854bc9332f634f0 Mon Sep 17 00:00:00 2001 From: Ian Cordasco Date: Tue, 25 Oct 2016 18:21:50 -0500 Subject: [PATCH 1/2] Add an example plugin project to source tree --- example-plugin/setup.py | 32 +++++++++++++++++++ .../src/flake8_example_plugin/__init__.py | 9 ++++++ .../flake8_example_plugin/off_by_default.py | 17 ++++++++++ .../flake8_example_plugin/on_by_default.py | 15 +++++++++ 4 files changed, 73 insertions(+) create mode 100644 example-plugin/setup.py create mode 100644 example-plugin/src/flake8_example_plugin/__init__.py create mode 100644 example-plugin/src/flake8_example_plugin/off_by_default.py create mode 100644 example-plugin/src/flake8_example_plugin/on_by_default.py diff --git a/example-plugin/setup.py b/example-plugin/setup.py new file mode 100644 index 0000000..2da68f6 --- /dev/null +++ b/example-plugin/setup.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +import setuptools + +setuptools.setup( + name='flake8-example-plugin', + license='MIT', + version='1.0.0', + description='Example plugin to Flake8', + author='Ian Cordasco', + author_email='graffatcolmingov@gmail.com', + url='https://gitlab.com/pycqa/flake8', + package_dir={'': 'src/'}, + packages=['flake8_example_plugin'], + entry_points={ + 'flake8.extension': [ + 'X1 = flake8_example_plugin:ExampleOne', + 'X2 = flake8_example_plugin:ExampleTwo', + ], + }, + classifiers=[ + 'Framework :: Flake8', + 'License :: OSI Approved :: MIT License', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: Software Development :: Quality Assurance', + ], +) diff --git a/example-plugin/src/flake8_example_plugin/__init__.py b/example-plugin/src/flake8_example_plugin/__init__.py new file mode 100644 index 0000000..33d76f3 --- /dev/null +++ b/example-plugin/src/flake8_example_plugin/__init__.py @@ -0,0 +1,9 @@ +"""Module for an example Flake8 plugin.""" + +from .on_by_default import ExampleOne +from .off_by_default import ExampleTwo + +__all__ = ( + 'ExampleOne', + 'ExampleTwo', +) diff --git a/example-plugin/src/flake8_example_plugin/off_by_default.py b/example-plugin/src/flake8_example_plugin/off_by_default.py new file mode 100644 index 0000000..d768328 --- /dev/null +++ b/example-plugin/src/flake8_example_plugin/off_by_default.py @@ -0,0 +1,17 @@ +"""Our first example plugin.""" + + +class ExampleTwo(object): + """Second Example Plugin.""" + name = 'off-by-default-example-plugin' + version = '1.0.0' + + off_by_default = True + + def __init__(self, tree): + self.tree = tree + + def run(self): + """Do nothing.""" + yield (1, 0, 'X200 The off-by-default plugin was enabled', + 'OffByDefaultPlugin') diff --git a/example-plugin/src/flake8_example_plugin/on_by_default.py b/example-plugin/src/flake8_example_plugin/on_by_default.py new file mode 100644 index 0000000..a324297 --- /dev/null +++ b/example-plugin/src/flake8_example_plugin/on_by_default.py @@ -0,0 +1,15 @@ +"""Our first example plugin.""" + + +class ExampleOne(object): + """First Example Plugin.""" + name = 'on-by-default-example-plugin' + version = '1.0.0' + + def __init__(self, tree): + self.tree = tree + + def run(self): + """Do nothing.""" + for message in []: + yield message From 68a273144e5bd24a8f88cbf61070ab020be00498 Mon Sep 17 00:00:00 2001 From: Ian Cordasco Date: Tue, 25 Oct 2016 19:28:52 -0500 Subject: [PATCH 2/2] Fix bug with --enable-extensions We went through an iteration where we supported --enable-extensions and then didn't. This adds back our support for --enable-extensions. Closes #239 --- src/flake8/style_guide.py | 5 +++-- tests/unit/test_style_guide.py | 27 +++++++++++++++++---------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/flake8/style_guide.py b/src/flake8/style_guide.py index 4d8950c..739edd8 100644 --- a/src/flake8/style_guide.py +++ b/src/flake8/style_guide.py @@ -65,6 +65,7 @@ class StyleGuide(object): self._selected = tuple(options.select) self._extended_selected = tuple(options.extended_default_select) self._ignored = tuple(options.ignore) + self._enabled_extensions = tuple(options.enable_extensions) self._decision_cache = {} self._parsed_diff = {} @@ -81,10 +82,10 @@ class StyleGuide(object): Ignored.Implicitly if the selected list is not empty but no match was found. """ - if not self._selected: + if not (self._selected or self._enabled_extensions): return Selected.Implicitly - if code.startswith(self._selected): + if code.startswith(self._selected + self._enabled_extensions): return Selected.Explicitly # If it was not explicitly selected, it may have been implicitly diff --git a/tests/unit/test_style_guide.py b/tests/unit/test_style_guide.py index 8e714b7..f642820 100644 --- a/tests/unit/test_style_guide.py +++ b/tests/unit/test_style_guide.py @@ -15,6 +15,7 @@ def create_options(**kwargs): kwargs.setdefault('extended_default_select', []) kwargs.setdefault('ignore', []) kwargs.setdefault('disable_noqa', False) + kwargs.setdefault('enable_extensions', []) return optparse.Values(kwargs) @@ -50,18 +51,24 @@ def test_is_user_ignored_implicitly_selects_errors(ignore_list, error_code): assert guide.is_user_ignored(error_code) is style_guide.Selected.Implicitly -@pytest.mark.parametrize('select_list,error_code', [ - (['E111', 'E121'], 'E111'), - (['E111', 'E121'], 'E121'), - (['E11', 'E12'], 'E121'), - (['E2', 'E12'], 'E121'), - (['E2', 'E12'], 'E211'), +@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_is_user_selected_selects_errors(select_list, error_code): +def test_is_user_selected_selects_errors(select_list, enable_extensions, + error_code): """Verify we detect users explicitly selecting an error.""" - guide = style_guide.StyleGuide(create_options(select=select_list), - listener_trie=None, - formatter=None) + guide = style_guide.StyleGuide( + options=create_options(select=select_list, + enable_extensions=enable_extensions), + listener_trie=None, + formatter=None, + ) assert (guide.is_user_selected(error_code) is style_guide.Selected.Explicitly)