diff options
Diffstat (limited to 'catapult/telemetry/telemetry/internal/util/external_modules.py')
-rw-r--r-- | catapult/telemetry/telemetry/internal/util/external_modules.py | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/catapult/telemetry/telemetry/internal/util/external_modules.py b/catapult/telemetry/telemetry/internal/util/external_modules.py new file mode 100644 index 00000000..92faf593 --- /dev/null +++ b/catapult/telemetry/telemetry/internal/util/external_modules.py @@ -0,0 +1,56 @@ +# Copyright 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import importlib + +from distutils import version + +MODULES = { + 'cv2': (version.StrictVersion('2.4.8'), version.StrictVersion('3.0.0')), + 'numpy': (version.StrictVersion('1.6.1'), None), + 'psutil': (version.StrictVersion('0.5.0'), None), +} + +def ImportRequiredModule(module): + """Tries to import the desired module. + + Returns: + The module on success, raises error on failure. + Raises: + ImportError: The import failed.""" + versions = MODULES.get(module) + if versions is None: + raise NotImplementedError('Please teach telemetry about module %s.' % + module) + min_version, max_version = versions + + module = importlib.import_module(module) + try: + if ((min_version is not None and + version.StrictVersion(module.__version__) < min_version) or + (max_version is not None and + version.StrictVersion(module.__version__) >= max_version)): + raise ImportError(('Incorrect {0} version found, expected {1} <= version ' + '< {2}, found version {3}').format( + module, min_version, max_version, module.__version__)) + except ValueError as e: + # This error is raised when a module returns and incorrectly formatted + # version string. ex. '$build 1456a' + if 'invalid version number' in str(e): + raise ImportError(('Incorrectly formatted {0} version found, expected ' + '{1} <= version < {2}, found version {3}').format( + module, min_version, max_version, module.__version__)) + else: + raise + return module + +def ImportOptionalModule(module): + """Tries to import the desired module. + + Returns: + The module if successful, None if not.""" + try: + return ImportRequiredModule(module) + except ImportError: + return None |