From b8e1c16cf5155d2f5d6c4b790616e67d90ffe5ff Mon Sep 17 00:00:00 2001 From: Daniel Watkins Date: Thu, 10 Aug 2017 12:01:07 -0400 Subject: [PATCH] Add an ExtensionManager.items() method The ExtensionManager.items() method is analogous to the Mapping.items() method. (This also refactors the _extensions_by_name generation logic out of __getitem__.) Change-Id: Iad3a58aec7908eb3a829892bbea567705ab2dd97 --- stevedore/extension.py | 24 ++++++++++++++++++------ stevedore/tests/test_extension.py | 5 +++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/stevedore/extension.py b/stevedore/extension.py index 55cb22c..f5c2292 100644 --- a/stevedore/extension.py +++ b/stevedore/extension.py @@ -153,7 +153,16 @@ class ExtensionManager(object): def _init_plugins(self, extensions): self.extensions = extensions - self._extensions_by_name = None + self._extensions_by_name_cache = None + + @property + def _extensions_by_name(self): + if self._extensions_by_name_cache is None: + d = {} + for e in self.extensions: + d[e.name] = e + self._extensions_by_name_cache = d + return self._extensions_by_name_cache ENTRY_POINT_CACHE = {} @@ -291,6 +300,14 @@ class ExtensionManager(object): LOG.error('error calling %r: %s', e.name, err) LOG.exception(err) + def items(self): + """ + Return an iterator of tuples of the form (name, extension). + + This is analogous to the Mapping.items() method. + """ + return self._extensions_by_name.items() + def __iter__(self): """Produce iterator for the manager. @@ -306,11 +323,6 @@ class ExtensionManager(object): produces the :class:`Extension` instance with the specified name. """ - if self._extensions_by_name is None: - d = {} - for e in self.extensions: - d[e.name] = e - self._extensions_by_name = d return self._extensions_by_name[name] def __contains__(self, name): diff --git a/stevedore/tests/test_extension.py b/stevedore/tests/test_extension.py index 4e91429..17f270f 100644 --- a/stevedore/tests/test_extension.py +++ b/stevedore/tests/test_extension.py @@ -198,6 +198,11 @@ class TestCallback(utils.TestCase): result = em.map_method('get_args_and_data', 42) self.assertEqual(set(r[2] for r in result), set([42])) + def test_items(self): + em = extension.ExtensionManager('stevedore.test.extension') + expected_output = set([(name, em[name]) for name in ALL_NAMES]) + self.assertEqual(expected_output, set(em.items())) + class TestLoadRequirementsNewSetuptools(utils.TestCase): # setuptools 11.3 and later