diff options
author | Jamie Lennox <jamielennox@gmail.com> | 2015-11-30 14:32:01 +1100 |
---|---|---|
committer | Jamie Lennox <jamielennox@gmail.com> | 2015-11-30 14:37:12 +1100 |
commit | 01b446c1fa317fd75db950bb7bcc840e6b0a2225 (patch) | |
tree | 51a05204dd8736ed27ff91e97f3c255c7f15202a | |
parent | bb73a14d2419239133e21673754a6994e885e2a0 (diff) | |
download | stevedore-01b446c1fa317fd75db950bb7bcc840e6b0a2225.tar.gz |
Use Stevedore exceptions for finding extensions1.10.0
When there are no extensions or multiple extensions found for a
namespace stevedore raises RuntimeErrors. This means that consuming
applications must catch RuntimeErrors when loading plugins which may
mask errors coming from the plugin itself.
Instead have stevedore raise an error specific to the failure case that
can be handled from an application.
Change-Id: I0ab0556a589453bd8631d77f42506100b278a83d
Closes-Bug: #1501324
-rw-r--r-- | stevedore/dispatch.py | 3 | ||||
-rw-r--r-- | stevedore/driver.py | 9 | ||||
-rw-r--r-- | stevedore/exception.py | 10 | ||||
-rw-r--r-- | stevedore/extension.py | 3 | ||||
-rw-r--r-- | stevedore/tests/test_driver.py | 5 | ||||
-rw-r--r-- | stevedore/tests/test_extension.py | 3 |
6 files changed, 24 insertions, 9 deletions
diff --git a/stevedore/dispatch.py b/stevedore/dispatch.py index 226d3ae..424d39b 100644 --- a/stevedore/dispatch.py +++ b/stevedore/dispatch.py @@ -1,6 +1,7 @@ import logging from .enabled import EnabledExtensionManager +from .exception import NoMatches LOG = logging.getLogger(__name__) @@ -66,7 +67,7 @@ class DispatchExtensionManager(EnabledExtensionManager): """ if not self.extensions: # FIXME: Use a more specific exception class here. - raise RuntimeError('No %s extensions found' % self.namespace) + raise NoMatches('No %s extensions found' % self.namespace) response = [] for e in self.extensions: if filter_func(e, *args, **kwds): diff --git a/stevedore/driver.py b/stevedore/driver.py index fedc359..a2825aa 100644 --- a/stevedore/driver.py +++ b/stevedore/driver.py @@ -1,3 +1,4 @@ +from .exception import NoMatches, MultipleMatches from .named import NamedExtensionManager @@ -93,14 +94,14 @@ class DriverManager(NamedExtensionManager): if not self.extensions: name = self._names[0] - raise RuntimeError('No %r driver found, looking for %r' % - (self.namespace, name)) + raise NoMatches('No %r driver found, looking for %r' % + (self.namespace, name)) if len(self.extensions) > 1: discovered_drivers = ','.join(e.entry_point_target for e in self.extensions) - raise RuntimeError('Multiple %r drivers found: %s' % - (self.namespace, discovered_drivers)) + raise MultipleMatches('Multiple %r drivers found: %s' % + (self.namespace, discovered_drivers)) def __call__(self, func, *args, **kwds): """Invokes func() for the single loaded extension. diff --git a/stevedore/exception.py b/stevedore/exception.py new file mode 100644 index 0000000..10c5cc2 --- /dev/null +++ b/stevedore/exception.py @@ -0,0 +1,10 @@ +class NoUniqueMatch(RuntimeError): + """There was more that one on no extensions matching the query.""" + + +class NoMatches(NoUniqueMatch): + """There were no extensions with the diver name found.""" + + +class MultipleMatches(NoUniqueMatch): + """There were multiple matches for the given name.""" diff --git a/stevedore/extension.py b/stevedore/extension.py index 5da97c5..d240988 100644 --- a/stevedore/extension.py +++ b/stevedore/extension.py @@ -5,6 +5,7 @@ import pkg_resources import logging +from .exception import NoMatches LOG = logging.getLogger(__name__) @@ -218,7 +219,7 @@ class ExtensionManager(object): """ if not self.extensions: # FIXME: Use a more specific exception class here. - raise RuntimeError('No %s extensions found' % self.namespace) + raise NoMatches('No %s extensions found' % self.namespace) response = [] for e in self.extensions: self._invoke_one_plugin(response.append, func, e, args, kwds) diff --git a/stevedore/tests/test_driver.py b/stevedore/tests/test_driver.py index ff9c3ea..0a919cf 100644 --- a/stevedore/tests/test_driver.py +++ b/stevedore/tests/test_driver.py @@ -4,6 +4,7 @@ import pkg_resources from stevedore import driver +from stevedore import exception from stevedore import extension from stevedore.tests import test_extension from stevedore.tests import utils @@ -37,7 +38,7 @@ class TestCallback(utils.TestCase): def test_no_drivers(self): try: driver.DriverManager('stevedore.test.extension.none', 't1') - except RuntimeError as err: + except exception.NoMatches as err: self.assertIn("No 'stevedore.test.extension.none' driver found", str(err)) @@ -70,7 +71,7 @@ class TestCallback(utils.TestCase): dm = driver.DriverManager.make_test_instance(extensions[0]) # Call the initialization code that verifies the extension dm._init_plugins(extensions) - except RuntimeError as err: + except exception.MultipleMatches as err: self.assertIn("Multiple", str(err)) else: self.fail('Should have had an error') diff --git a/stevedore/tests/test_extension.py b/stevedore/tests/test_extension.py index b05b377..1fe0242 100644 --- a/stevedore/tests/test_extension.py +++ b/stevedore/tests/test_extension.py @@ -3,6 +3,7 @@ import mock +from stevedore import exception from stevedore import extension from stevedore.tests import utils @@ -159,7 +160,7 @@ class TestCallback(utils.TestCase): ) try: em.map(mapped, 1, 2, a='A', b='B') - except RuntimeError as err: + except exception.NoMatches as err: self.assertEqual(expected_str, str(err)) def test_map_method(self): |