extension: expose _find_entry_points as list_entry_points

Having the ability to list the entry points without loading them can be quite
useful. Expose the internal method externally to help with that.

Change-Id: Id675f335957a95fcfce61934dfbfbb2c64af761a
This commit is contained in:
Julien Danjou 2017-01-13 15:42:27 +01:00
parent 04f5e154e5
commit eb04fc4a3e
2 changed files with 21 additions and 6 deletions

View File

@ -156,16 +156,22 @@ class ExtensionManager(object):
ENTRY_POINT_CACHE = {} ENTRY_POINT_CACHE = {}
def _find_entry_points(self, namespace): def list_entry_points(self):
if namespace not in self.ENTRY_POINT_CACHE: """Return the list of entry points for this namespace.
eps = list(pkg_resources.iter_entry_points(namespace))
self.ENTRY_POINT_CACHE[namespace] = eps The entry points are not actually loaded, their list is just read and
return self.ENTRY_POINT_CACHE[namespace] returned.
"""
if self.namespace not in self.ENTRY_POINT_CACHE:
eps = list(pkg_resources.iter_entry_points(self.namespace))
self.ENTRY_POINT_CACHE[self.namespace] = eps
return self.ENTRY_POINT_CACHE[self.namespace]
def _load_plugins(self, invoke_on_load, invoke_args, invoke_kwds, def _load_plugins(self, invoke_on_load, invoke_args, invoke_kwds,
verify_requirements): verify_requirements):
extensions = [] extensions = []
for ep in self._find_entry_points(self.namespace): for ep in self.list_entry_points():
LOG.debug('found extension %r', ep) LOG.debug('found extension %r', ep)
try: try:
ext = self._load_one_plugin(ep, ext = self._load_one_plugin(ep,

View File

@ -13,6 +13,8 @@
"""Tests for stevedore.extension """Tests for stevedore.extension
""" """
import operator
import mock import mock
from stevedore import exception from stevedore import exception
@ -49,6 +51,13 @@ class TestCallback(utils.TestCase):
e = em['t1'] e = em['t1']
self.assertEqual(e.name, 't1') self.assertEqual(e.name, 't1')
def test_list_entry_points(self):
em = extension.ExtensionManager('stevedore.test.extension')
n = em.list_entry_points()
self.assertEqual(set(['e1', 'e2', 't1', 't2']),
set(map(operator.attrgetter("name"), n)))
self.assertEqual(4, len(n))
def test_contains_by_name(self): def test_contains_by_name(self):
em = extension.ExtensionManager('stevedore.test.extension') em = extension.ExtensionManager('stevedore.test.extension')
self.assertEqual('t1' in em, True) self.assertEqual('t1' in em, True)