diff --git a/docs/source/history.rst b/docs/source/history.rst index 78f803d..107cec3 100644 --- a/docs/source/history.rst +++ b/docs/source/history.rst @@ -2,6 +2,11 @@ History ========= +dev + +- Fixes an exception when reporting on an error where multiple drivers + have the same name (:issue:`25`, solution provided by clayg). + 0.11 - Fixes logging configuration under Python 2.6 with a NullHandler. diff --git a/stevedore/driver.py b/stevedore/driver.py index e70a23e..ea2e122 100644 --- a/stevedore/driver.py +++ b/stevedore/driver.py @@ -36,7 +36,8 @@ class DriverManager(NamedExtensionManager): if len(self.extensions) > 1: raise RuntimeError('Multiple %r drivers found: %s' % (namespace, - ','.join('%s:%s' % (e.module_name, e.attrs[0]) + ','.join('%s:%s' % (e.entry_point.module_name, + e.entry_point.attrs[0]) for e in self.extensions)) ) diff --git a/stevedore/tests/test_driver.py b/stevedore/tests/test_driver.py index e388576..70ec54c 100644 --- a/stevedore/tests/test_driver.py +++ b/stevedore/tests/test_driver.py @@ -1,6 +1,9 @@ """Tests for stevedore.extension """ +import mock +import pkg_resources + from stevedore import driver from stevedore.tests import test_extension @@ -38,3 +41,21 @@ def test_no_drivers(): driver.DriverManager('stevedore.test.extension.none', 't1') except RuntimeError as err: assert "No 'stevedore.test.extension.none' driver found" in str(err) + + +def test_multiple_drivers(): + # The idea for this test was contributed by clayg: + # https://gist.github.com/clayg/6311348 + fep_name = 'stevedore.extension.ExtensionManager._find_entry_points' + with mock.patch(fep_name) as fep: + fep.return_value = [ + pkg_resources.EntryPoint.parse('backend = pkg1:driver'), + pkg_resources.EntryPoint.parse('backend = pkg2:driver'), + ] + for ep in fep.return_value: + ep.load = lambda: 'pkg backend' + try: + driver.DriverManager('stevedore.test.multiple_drivers', 'backend') + except RuntimeError as err: + assert "Multiple" in str(err), str(err) + fep.assert_called_with('stevedore.test.multiple_drivers')