Coverage for /usr/local/lib/python3.11/dist-packages/pyrocko/deps.py: 24%
80 statements
« prev ^ index » next coverage.py v6.5.0, created at 2023-10-04 09:52 +0000
« prev ^ index » next coverage.py v6.5.0, created at 2023-10-04 09:52 +0000
1# https://pyrocko.org - GPLv3
2#
3# The Pyrocko Developers, 21st Century
4# ---|P------/S----------~Lg----------
6'''
7Library dependency checkup utilities.
8'''
10import sys
11import os.path as op
12from importlib import import_module
13import logging
15logger = logging.getLogger('pyrocko.deps')
18_pyrocko_deps = {
19 'required': [
20 ('python', 'sys', lambda x: '.'.join(map(str, x.version_info[:3]))),
21 ('pyyaml', 'yaml', '__version__'),
22 ('numpy', 'numpy', '__version__'),
23 ('scipy', 'scipy', '__version__'),
24 ('matplotlib', 'matplotlib', '__version__'),
25 ('requests', 'requests', '__version__'),
26 ],
27 'optional': [
28 ('PyQt5', 'PyQt5.Qt', 'PYQT_VERSION_STR'),
29 ('PyQtWebEngine', 'PyQt5.QtWebEngine', 'PYQT_WEBENGINE_VERSION_STR'),
30 ('vtk', 'vtk', 'VTK_VERSION'),
31 ('pyserial', 'serial', '__version__'),
32 ('kite', 'kite', '__version__'),
33 ],
34}
37_module_to_package_name = dict(
38 (module_name, package_name)
39 for (package_name, module_name, _)
40 in _pyrocko_deps['required'] + _pyrocko_deps['optional'])
43def dependencies(group):
45 d = {}
46 for (package_name, module_name, version_attr) in _pyrocko_deps[group]:
47 try:
48 mod = import_module(module_name)
49 d[package_name] = getattr(mod, version_attr) \
50 if isinstance(version_attr, str) \
51 else version_attr(mod)
52 except ImportError:
53 d[package_name] = None
55 return d
58def str_dependencies():
59 lines = []
60 lines.append('dependencies:')
61 for group in ['required', 'optional']:
62 lines.append(' %s:' % group)
64 for package, version in dependencies(group).items():
65 lines.append(' %s: %s' % (
66 package,
67 version or 'N/A'))
69 return '\n'.join(lines)
72def print_dependencies():
73 print(str_dependencies())
76class MissingPyrockoDependency(ImportError):
77 pass
80def require(module_name):
81 try:
82 return import_module(module_name)
83 except ImportError as e:
84 package_name = _module_to_package_name[module_name]
86 raise MissingPyrockoDependency('''
88Missing Pyrocko requirement: %s
90The Python package '%s' is required to run this program, but it doesn't seem to
91be available or an error occured while importing it. Use your package manager
92of choice (apt / yum / conda / pip) to install it. To verify that '%s' is
93available in your Python environment, check that "python -c \'import %s\'"
94exits without error. The original error was:
96 %s
97''' % (
98 package_name,
99 package_name,
100 package_name,
101 module_name,
102 str(e))) from None
105def import_optional(module_name, needed_for):
106 try:
107 return import_module(module_name)
108 except ImportError as e:
109 package_name = _module_to_package_name[module_name]
111 logger.info(
112 'Optional Pyrocko dependency "%s" is not available '
113 '(needed for %s): %s' % (
114 package_name,
115 needed_for,
116 str(e)))
118 return None
121def require_all(group):
122 for (_, module_name, _) in _pyrocko_deps[group]:
123 require(module_name)
126def find_pyrocko_installations():
127 found = []
128 seen = set()
129 orig_sys_path = list(sys.path)
130 while sys.path:
132 try:
133 import pyrocko
134 dpath = op.dirname(op.abspath(pyrocko.__file__))
135 if dpath not in seen:
136 x = (pyrocko.installed_date, dpath,
137 pyrocko.long_version,
138 pyrocko.src_path if hasattr(pyrocko, 'src_path') else '?')
140 found.append(x)
141 seen.add(dpath)
143 del sys.modules['pyrocko']
144 del sys.modules['pyrocko.info']
145 except (ImportError, AttributeError):
146 pass
148 sys.path.pop(0)
150 sys.path = orig_sys_path
151 return found
154def str_installations(found):
155 lines = [
156 'Python library path (sys.path): \n %s\n' % '\n '.join(sys.path)]
158 dates = sorted([xx[0] for xx in found])
159 i = 1
161 for (installed_date, installed_path, long_version, src_path) in found:
162 oldnew = ''
163 if len(dates) >= 2:
164 if installed_date == dates[0]:
165 oldnew = ' (oldest)'
167 if installed_date == dates[-1]:
168 oldnew = ' (newest)'
170 lines.append('''Pyrocko installation #%i %s:
171 date installed: %s%s
172 version: %s
173 path: %s
174 src path: %s
175''' % (
176 i, '(used)' if i == 1 else '(not used)',
177 installed_date,
178 oldnew,
179 long_version,
180 installed_path,
181 src_path))
183 i += 1
185 return '\n'.join(lines)
188def print_installations():
189 found = find_pyrocko_installations()
190 print(str_installations(found))
193if __name__ == '__main__':
194 print_dependencies()
195 print()
196 print_installations()