summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Danjou <julien@danjou.info>2014-04-24 15:57:19 +0200
committerJulien Danjou <julien@danjou.info>2014-04-25 14:51:45 +0200
commit3668de2513053f05cec068d12cc7b9cfb642b298 (patch)
tree031966a5f657ef229b5fd7fde2b302e550b2abe2
parentcde4b1d032b43746cfbb939ff6844d8d5fd6477f (diff)
downloadstevedore-3668de2513053f05cec068d12cc7b9cfb642b298.tar.gz
driver: raise by default on import failure
When using the DriverManager class, if the driver fails to load, it's actually better by default to re-raise the exception. It's not something possible when loading multiple extension, but it's safe to do so with drivers. This just changes the default behaviour, and it can still be overridden. The upside of that change is that when you try to load a driver that cannot be loaded because of missing dependency, you actually get the ImportError backtrace on your screen rather than the useless: RuntimeError: No 'foo' driver found, looking for 'bar' which doesn't help at all. And the default mechanism that logs via LOG.error() doesn't print anything at the screen if the application didn't configure the logging subsystem. Change-Id: I67d9e13a07c822c54dd16ac9ae7716747a24dd73
-rw-r--r--setup.cfg1
-rw-r--r--stevedore/driver.py6
-rw-r--r--stevedore/tests/extension_unimportable.py0
-rw-r--r--stevedore/tests/test_callback.py8
-rw-r--r--stevedore/tests/test_driver.py9
5 files changed, 20 insertions, 4 deletions
diff --git a/setup.cfg b/setup.cfg
index 8cae156..571fa9b 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -35,6 +35,7 @@ stevedore.test.extension =
t1 = stevedore.tests.test_extension:FauxExtension
t2 = stevedore.tests.test_extension:FauxExtension
e1 = stevedore.tests.test_extension:BrokenExtension
+ e2 = stevedore.tests.notfound:UnimportableExtension
[build_sphinx]
diff --git a/stevedore/driver.py b/stevedore/driver.py
index 47273d0..85a2ae2 100644
--- a/stevedore/driver.py
+++ b/stevedore/driver.py
@@ -33,6 +33,8 @@ class DriverManager(NamedExtensionManager):
invoke_on_load=False, invoke_args=(), invoke_kwds={},
on_load_failure_callback=None,
verify_requirements=False):
+ on_load_failure_callback = on_load_failure_callback \
+ or self._default_on_load_failure
super(DriverManager, self).__init__(
namespace=namespace,
names=[name],
@@ -43,6 +45,10 @@ class DriverManager(NamedExtensionManager):
verify_requirements=verify_requirements,
)
+ @staticmethod
+ def _default_on_load_failure(drivermanager, ep, err):
+ raise err
+
@classmethod
def make_test_instance(cls, extension, namespace='TESTING',
propagate_map_exceptions=False,
diff --git a/stevedore/tests/extension_unimportable.py b/stevedore/tests/extension_unimportable.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/stevedore/tests/extension_unimportable.py
diff --git a/stevedore/tests/test_callback.py b/stevedore/tests/test_callback.py
index d80c7f2..47ea262 100644
--- a/stevedore/tests/test_callback.py
+++ b/stevedore/tests/test_callback.py
@@ -15,7 +15,7 @@ def test_extension_failure_custom_callback():
on_load_failure_callback=failure_callback)
extensions = list(em.extensions)
assert len(extensions) > 0
- assert len(errors) == 1
- (manager, entrypoint, error) = errors[0]
- assert manager is em
- assert isinstance(error, IOError)
+ assert len(errors) == 2
+ for manager, entrypoint, error in errors:
+ assert manager is em
+ assert isinstance(error, (IOError, ImportError))
diff --git a/stevedore/tests/test_driver.py b/stevedore/tests/test_driver.py
index e56d2c5..f81cd8b 100644
--- a/stevedore/tests/test_driver.py
+++ b/stevedore/tests/test_driver.py
@@ -43,6 +43,15 @@ def test_no_drivers():
assert "No 'stevedore.test.extension.none' driver found" in str(err)
+def test_bad_driver():
+ try:
+ driver.DriverManager('stevedore.test.extension', 'e2')
+ except ImportError:
+ pass
+ else:
+ assert False, "No error raised"
+
+
def test_multiple_drivers():
# The idea for this test was contributed by clayg:
# https://gist.github.com/clayg/6311348