diff --git a/docs/source/history.rst b/docs/source/history.rst index bacc4ea..0e87365 100644 --- a/docs/source/history.rst +++ b/docs/source/history.rst @@ -2,6 +2,11 @@ History ========= +0.5 + + - Add :class:`~stevedore.tests.manager.TestExtensionManager` for + writing tests for classes that use extension managers. + 0.4 - Removed the ``name`` argument to plugin constructors. diff --git a/docs/source/managers.rst b/docs/source/managers.rst index db86985..2b0b527 100644 --- a/docs/source/managers.rst +++ b/docs/source/managers.rst @@ -63,3 +63,9 @@ Extension :members: :show-inheritance: +TestExtensionManager +==================== + +.. autoclass:: stevedore.tests.manager.TestExtensionManager + :members: + :show-inheritance: diff --git a/stevedore/extension.py b/stevedore/extension.py index b42c9ca..b083220 100644 --- a/stevedore/extension.py +++ b/stevedore/extension.py @@ -52,7 +52,12 @@ class ExtensionManager(object): invoke_args=(), invoke_kwds={}): self.namespace = namespace - self.extensions = [] + self.extensions = self._load_plugins(invoke_on_load, + invoke_args, + invoke_kwds) + + def _load_plugins(self, invoke_on_load, invoke_args, invoke_kwds): + extensions = [] for ep in pkg_resources.iter_entry_points(self.namespace): LOG.debug('found extension %r', ep) try: @@ -62,13 +67,13 @@ class ExtensionManager(object): invoke_kwds, ) if ext: - self.extensions.append(ext) + extensions.append(ext) except KeyboardInterrupt: raise except Exception as err: LOG.error('Could not load %r: %s', ep.name, err) LOG.exception(err) - return + return extensions def _load_one_plugin(self, ep, invoke_on_load, invoke_args, invoke_kwds): plugin = ep.load() diff --git a/stevedore/tests/manager.py b/stevedore/tests/manager.py new file mode 100644 index 0000000..ed2ccc6 --- /dev/null +++ b/stevedore/tests/manager.py @@ -0,0 +1,50 @@ +"""TestExtensionManager + +Extension manager used only for testing. +""" + +import logging + +from stevedore import extension + + +LOG = logging.getLogger(__name__) + + +class TestExtensionManager(extension.ExtensionManager): + """ExtensionManager that is explicitly initialized for tests. + + :param extensions: Pre-configured Extension instances to use + instead of loading them from entry points. + :type extensions: list of :class:`~stevedore.extension.Extension` + :param namespace: The namespace for the entry points. + :type namespace: str + :param invoke_on_load: Boolean controlling whether to invoke the + object returned by the entry point after the driver is loaded. + :type invoke_on_load: bool + :param invoke_args: Positional arguments to pass when invoking + the object returned by the entry point. Only used if invoke_on_load + is True. + :type invoke_args: tuple + :param invoke_kwds: Named arguments to pass when invoking + the object returned by the entry point. Only used if invoke_on_load + is True. + :type invoke_kwds: dict + """ + + def __init__(self, extensions, + namespace='test', + invoke_on_load=False, + invoke_args=(), + invoke_kwds={}): + super(TestExtensionManager, self).__init__(namespace, + invoke_on_load, + invoke_args, + invoke_kwds, + ) + self.extensions = extensions + + def _load_plugins(self, invoke_on_load, + invoke_args, + invoke_kwds): + return []