Merge pull request #3 from dhellmann/feature/cache-entry-points

Cache the entry points discovered within a namespace
This commit is contained in:
markmcclain 2012-11-26 09:26:21 -08:00
commit 2106ab5e26
2 changed files with 44 additions and 1 deletions

View File

@ -56,9 +56,17 @@ class ExtensionManager(object):
invoke_args,
invoke_kwds)
ENTRY_POINT_CACHE = {}
def _find_entry_points(self, namespace):
if namespace not in self.ENTRY_POINT_CACHE:
eps = list(pkg_resources.iter_entry_points(namespace))
self.ENTRY_POINT_CACHE[namespace] = eps
return self.ENTRY_POINT_CACHE[namespace]
def _load_plugins(self, invoke_on_load, invoke_args, invoke_kwds):
extensions = []
for ep in pkg_resources.iter_entry_points(self.namespace):
for ep in self._find_entry_points(self.namespace):
LOG.debug('found extension %r', ep)
try:
ext = self._load_one_plugin(ep,

View File

@ -1,6 +1,8 @@
"""Tests for stevedore.extension
"""
import mock
from stevedore import extension
@ -16,6 +18,39 @@ def test_detect_plugins():
assert names == ['t1', 't2']
def test_load_multiple_times_entry_points():
# We expect to get the same EntryPoint object because we save them
# in the cache.
em1 = extension.ExtensionManager('stevedore.test.extension')
eps1 = [ext.entry_point for ext in em1]
em2 = extension.ExtensionManager('stevedore.test.extension')
eps2 = [ext.entry_point for ext in em2]
assert eps1[0] is eps2[0]
def test_load_multiple_times_plugins():
# We expect to get the same plugin object (module or class)
# because the underlying import machinery will cache the values.
em1 = extension.ExtensionManager('stevedore.test.extension')
plugins1 = [ext.plugin for ext in em1]
em2 = extension.ExtensionManager('stevedore.test.extension')
plugins2 = [ext.plugin for ext in em2]
assert plugins1[0] is plugins2[0]
def test_use_cache():
# If we insert something into the cache of entry points,
# the manager should not have to call into pkg_resources
# to find the plugins.
cache = extension.ExtensionManager.ENTRY_POINT_CACHE
cache['stevedore.test.faux'] = []
with mock.patch('pkg_resources.iter_entry_points',
side_effect=AssertionError('called iter_entry_points')):
em = extension.ExtensionManager('stevedore.test.faux')
names = em.names()
assert names == []
def test_iterable():
em = extension.ExtensionManager('stevedore.test.extension')
names = sorted(e.name for e in em)