From ebdc935ffc44bbfaae863b3b07bc165c601dd88c Mon Sep 17 00:00:00 2001 From: Ian Cordasco Date: Sun, 24 Jan 2016 15:13:58 -0600 Subject: [PATCH] Refactor NotifierBuilder into its own mixin This allows for easier unit testing --- flake8/plugins/manager.py | 24 +++++++++++++--------- tests/unit/test_plugin_type_manager.py | 28 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/flake8/plugins/manager.py b/flake8/plugins/manager.py index 8d5d12c..f73d006 100644 --- a/flake8/plugins/manager.py +++ b/flake8/plugins/manager.py @@ -253,16 +253,8 @@ class PluginTypeManager(object): list(self.manager.map(call_provide_options)) -class Checkers(PluginTypeManager): - """All of the checkers registered through entry-ponits.""" - - namespace = 'flake8.extension' - - -class Listeners(PluginTypeManager): - """All of the listeners registered through entry-points.""" - - namespace = 'flake8.listen' +class NotifierBuilder(object): + """Mixin class that builds a Notifier from a PluginManager.""" def build_notifier(self): """Build a Notifier for our Listeners. @@ -279,6 +271,18 @@ class Listeners(PluginTypeManager): return notifier_trie +class Checkers(PluginTypeManager): + """All of the checkers registered through entry-ponits.""" + + namespace = 'flake8.extension' + + +class Listeners(PluginTypeManager, NotifierBuilder): + """All of the listeners registered through entry-points.""" + + namespace = 'flake8.listen' + + class ReportFormatters(PluginTypeManager): """All of the report formatters registered through entry-points.""" diff --git a/tests/unit/test_plugin_type_manager.py b/tests/unit/test_plugin_type_manager.py index cb121c6..2735dec 100644 --- a/tests/unit/test_plugin_type_manager.py +++ b/tests/unit/test_plugin_type_manager.py @@ -165,3 +165,31 @@ def test_provide_options(PluginManager): plugin.provide_options.assert_called_with(optmanager, options, extra_args) + + +class FakePluginTypeManager(manager.NotifierBuilder): + """Provide an easy way to test the NotifierBuilder.""" + + def __init__(self, manager): + """Initialize with our fake manager.""" + self.names = sorted(manager.keys()) + self.manager = manager + + +@pytest.fixture +def notifier_builder(): + """Create a fake plugin type manager.""" + return FakePluginTypeManager(manager={ + 'T100': object(), + 'T101': object(), + 'T110': object(), + }) + + +def test_build_notifier(notifier_builder): + """Verify we properly build a Notifier object.""" + notifier = notifier_builder.build_notifier() + for name in ('T100', 'T101', 'T110'): + assert list(notifier.listeners_for(name)) == [ + notifier_builder.manager[name] + ]