aboutsummaryrefslogtreecommitdiff
path: root/catapult/telemetry/telemetry/internal/util/external_modules.py
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/telemetry/telemetry/internal/util/external_modules.py')
-rw-r--r--catapult/telemetry/telemetry/internal/util/external_modules.py56
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