From 9e28e81216c7d81e3319eeb49134bb6c2de5646d Mon Sep 17 00:00:00 2001 From: Ronald Bradford Date: Wed, 23 Mar 2016 10:17:23 -0400 Subject: [PATCH] Add importutils.import_any method Method refactored from several dashboard projects including solum, cerberus and sticks. Inclusion in oslo.utils.importutils will enable remove the duplicated code and entire class in projects that only include this one method. Replaced original RuntimeError exception with ImportError to be consistent with current oslo.utils library. Change-Id: I85cb9cc0d9d58bc248cce3048b730bd387f48936 --- oslo_utils/importutils.py | 18 ++++++++++++++++++ oslo_utils/tests/test_importutils.py | 8 ++++++++ 2 files changed, 26 insertions(+) diff --git a/oslo_utils/importutils.py b/oslo_utils/importutils.py index 3ddcfde..5156cab 100644 --- a/oslo_utils/importutils.py +++ b/oslo_utils/importutils.py @@ -91,3 +91,21 @@ def try_import(import_str, default=None): return import_module(import_str) except ImportError: return default + + +def import_any(module, *modules): + """Try to import a module from a list of modules. + + :param modules: A list of modules to try and import + :returns: The first module found that can be imported + :raises ImportError: If no modules can be imported from list + + .. versionadded:: 3.8 + """ + for module_name in (module,) + modules: + imported_module = try_import(module_name) + if imported_module: + return imported_module + + raise ImportError('Unable to import any modules from the list %s' % + str(modules)) diff --git a/oslo_utils/tests/test_importutils.py b/oslo_utils/tests/test_importutils.py index 05551ef..dde97fb 100644 --- a/oslo_utils/tests/test_importutils.py +++ b/oslo_utils/tests/test_importutils.py @@ -123,3 +123,11 @@ class ImportUtilsTest(test_base.BaseTestCase): def test_try_import_returns_default(self): foo = importutils.try_import('foo.bar') self.assertIsNone(foo) + + def test_import_any_none_found(self): + self.assertRaises(ImportError, importutils.import_any, + 'foo.bar', 'foo.foo.bar') + + def test_import_any_found(self): + dt = importutils.import_any('foo.bar', 'datetime') + self.assertEqual(sys.modules['datetime'], dt)