Coverage for /usr/local/lib/python3.11/dist-packages/pyrocko/has_paths.py: 68%
63 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# http://pyrocko.org - GPLv3
2#
3# The Pyrocko Developers, 21st Century
4# ---|P------/S----------~Lg----------
6'''
7Support for relative paths in :py:mod:`~pyrocko.guts`-based configuration
8files.
9'''
11from .guts import Object, String
12import os.path as op
14guts_prefix = 'pf'
17def xjoin(basepath, path):
18 if path is None and basepath is not None:
19 return basepath
20 elif op.isabs(path) or basepath is None:
21 return path
22 else:
23 return op.join(basepath, path)
26def xrelpath(path, start):
27 if op.isabs(path):
28 return path
29 else:
30 return op.relpath(path, start)
33class Path(String):
34 pass
37class HasPaths(Object):
38 path_prefix = Path.T(optional=True)
40 def __init__(self, *args, **kwargs):
41 Object.__init__(self, *args, **kwargs)
42 self._basepath = None
43 self._parent_path_prefix = None
45 def ichildren(self):
46 for (prop, val) in self.T.ipropvals(self):
47 if isinstance(val, HasPaths):
48 yield val
50 elif prop.multivalued and val is not None:
51 for ele in val:
52 if isinstance(ele, HasPaths):
53 yield ele
55 def effective_path_prefix(self):
56 return self.path_prefix or self._parent_path_prefix
58 def set_basepath(self, basepath, parent_path_prefix=None):
59 self._basepath = basepath
60 self._parent_path_prefix = parent_path_prefix
61 for val in self.ichildren():
62 val.set_basepath(
63 basepath, self.effective_path_prefix())
65 def set_basepath_from(self, other):
66 self.set_basepath(other.get_basepath(), other.effective_path_prefix())
68 def get_basepath(self):
69 assert self._basepath is not None
71 return self._basepath
73 def change_basepath(self, new_basepath, parent_path_prefix=None):
74 assert self._basepath is not None
76 self._parent_path_prefix = parent_path_prefix
77 if self.path_prefix or not self._parent_path_prefix:
79 self.path_prefix = op.normpath(xjoin(xrelpath(
80 self._basepath, new_basepath), self.path_prefix))
82 for val in self.ichildren():
83 val.change_basepath(new_basepath, self.effective_path_prefix())
85 self._basepath = new_basepath
87 def expand_path(self, path, extra=None):
88 assert self._basepath is not None
90 if extra is None:
91 def extra(path):
92 return path
94 path_prefix = self.effective_path_prefix()
96 if path is None:
97 return None
99 elif isinstance(path, str):
100 return extra(
101 op.normpath(xjoin(self._basepath, xjoin(path_prefix, path))))
102 else:
103 return [
104 extra(
105 op.normpath(xjoin(self._basepath, xjoin(path_prefix, p))))
106 for p in path]
108 def rel_path(self, path):
109 return xrelpath(path, self.get_basepath())