omlish 0.0.0.dev399__py3-none-any.whl → 0.0.0.dev401__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omlish/__about__.py +2 -2
- omlish/codecs/registry.py +3 -3
- omlish/collections/__init__.py +136 -149
- omlish/configs/formats.py +6 -2
- omlish/diag/lsof.py +4 -3
- omlish/funcs/builders.py +2 -1
- omlish/lang/contextmanagers.py +1 -0
- omlish/lang/imports/proxyinit.py +6 -2
- omlish/lang/imports/traversal.py +18 -8
- omlish/lite/imports.py +1 -1
- omlish/lite/reprs.py +2 -1
- omlish/manifests/base.py +2 -1
- omlish/manifests/globals.py +60 -3
- omlish/manifests/loading.py +205 -69
- omlish/os/pidfiles/pinning.py +2 -1
- {omlish-0.0.0.dev399.dist-info → omlish-0.0.0.dev401.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev399.dist-info → omlish-0.0.0.dev401.dist-info}/RECORD +21 -21
- {omlish-0.0.0.dev399.dist-info → omlish-0.0.0.dev401.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev399.dist-info → omlish-0.0.0.dev401.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev399.dist-info → omlish-0.0.0.dev401.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev399.dist-info → omlish-0.0.0.dev401.dist-info}/top_level.txt +0 -0
omlish/__about__.py
CHANGED
omlish/codecs/registry.py
CHANGED
@@ -102,10 +102,10 @@ def _install_standard_codecs(registry: CodecRegistry) -> None:
|
|
102
102
|
|
103
103
|
@cached.function
|
104
104
|
def _build_manifest_lazy_loaded_codecs() -> ta.Sequence[LazyLoadedCodec]:
|
105
|
-
ldr = manifest_globals.
|
106
|
-
pkgs = {__package__.split('.')[0], *ldr.
|
105
|
+
ldr = manifest_globals.GlobalManifestLoader.instance()
|
106
|
+
pkgs = {__package__.split('.')[0], *ldr.discover_packages()}
|
107
107
|
mns = ldr.load(*pkgs, only=[LazyLoadedCodec])
|
108
|
-
return [m.value for m in mns]
|
108
|
+
return [m.value() for m in mns]
|
109
109
|
|
110
110
|
|
111
111
|
def _install_manifest_lazy_loaded_codecs(registry: CodecRegistry) -> None:
|
omlish/collections/__init__.py
CHANGED
@@ -1,165 +1,152 @@
|
|
1
|
+
# fmt: off
|
1
2
|
# ruff: noqa: I001
|
2
|
-
import typing as _ta
|
3
|
-
|
4
3
|
from .. import lang as _lang
|
5
4
|
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
from .mappings import ( # noqa
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
)
|
74
|
-
|
75
|
-
from .multimaps import ( # noqa
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
)
|
93
|
-
|
94
|
-
from .ordered import ( # noqa
|
95
|
-
|
96
|
-
|
97
|
-
)
|
98
|
-
|
99
|
-
from .persistent.persistent import ( # noqa
|
100
|
-
|
101
|
-
|
102
|
-
)
|
103
|
-
|
104
|
-
if _ta.TYPE_CHECKING:
|
6
|
+
with _lang.auto_proxy_init(globals()):
|
7
|
+
##
|
8
|
+
|
9
|
+
from .bimap import ( # noqa
|
10
|
+
BiMap,
|
11
|
+
|
12
|
+
make_bi_map,
|
13
|
+
)
|
14
|
+
|
15
|
+
from .coerce import ( # noqa
|
16
|
+
abs_set,
|
17
|
+
abs_set_of,
|
18
|
+
abs_set_of_or_none,
|
19
|
+
abs_set_or_none,
|
20
|
+
frozenset_,
|
21
|
+
frozenset_of,
|
22
|
+
frozenset_of_or_none,
|
23
|
+
frozenset_or_none,
|
24
|
+
map, # noqa
|
25
|
+
map_of,
|
26
|
+
map_of_or_none,
|
27
|
+
map_or_none,
|
28
|
+
opt_abs_set,
|
29
|
+
opt_abs_set_of,
|
30
|
+
opt_frozenset,
|
31
|
+
opt_frozenset_of,
|
32
|
+
opt_map,
|
33
|
+
opt_map_of,
|
34
|
+
opt_seq,
|
35
|
+
opt_seq_of,
|
36
|
+
seq,
|
37
|
+
seq_of,
|
38
|
+
seq_of_or_none,
|
39
|
+
seq_or_none,
|
40
|
+
)
|
41
|
+
|
42
|
+
from .frozen import ( # noqa
|
43
|
+
Frozen,
|
44
|
+
FrozenDict,
|
45
|
+
FrozenList,
|
46
|
+
frozendict,
|
47
|
+
frozenlist,
|
48
|
+
)
|
49
|
+
|
50
|
+
from .hasheq import ( # noqa
|
51
|
+
HashEq,
|
52
|
+
HashEqMap,
|
53
|
+
HashEq_,
|
54
|
+
hash_eq,
|
55
|
+
)
|
56
|
+
|
57
|
+
from .identity import ( # noqa
|
58
|
+
IdentityKeyDict,
|
59
|
+
IdentitySet,
|
60
|
+
IdentityWeakKeyDictionary,
|
61
|
+
IdentityWeakSet,
|
62
|
+
)
|
63
|
+
|
64
|
+
from . import kv # noqa
|
65
|
+
|
66
|
+
from .mappings import ( # noqa
|
67
|
+
MissingDict,
|
68
|
+
TypeMap,
|
69
|
+
DynamicTypeMap,
|
70
|
+
guarded_map_update,
|
71
|
+
multikey_dict,
|
72
|
+
)
|
73
|
+
|
74
|
+
from .multimaps import ( # noqa
|
75
|
+
MultiMap,
|
76
|
+
|
77
|
+
SequenceMultiMap,
|
78
|
+
AbstractSetMultiMap,
|
79
|
+
|
80
|
+
BiMultiMap,
|
81
|
+
InverseBiMultiMap,
|
82
|
+
|
83
|
+
SequenceBiMultiMap,
|
84
|
+
AbstractSetBiMultiMap,
|
85
|
+
|
86
|
+
TupleBiMultiMap,
|
87
|
+
seq_bi_multi_map,
|
88
|
+
|
89
|
+
FrozensetBiMultiMap,
|
90
|
+
abs_set_bi_multi_map,
|
91
|
+
)
|
92
|
+
|
93
|
+
from .ordered import ( # noqa
|
94
|
+
OrderedFrozenSet,
|
95
|
+
OrderedSet,
|
96
|
+
)
|
97
|
+
|
98
|
+
from .persistent.persistent import ( # noqa
|
99
|
+
PersistentMap,
|
100
|
+
PersistentMapping,
|
101
|
+
)
|
102
|
+
|
105
103
|
from .persistent.treapmap import ( # noqa
|
106
104
|
TreapDict,
|
107
105
|
TreapMap,
|
108
106
|
new_treap_dict,
|
109
107
|
new_treap_map,
|
110
108
|
)
|
111
|
-
else:
|
112
|
-
_lang.proxy_init(globals(), '.persistent.treapmap', [
|
113
|
-
'TreapMap',
|
114
|
-
'new_treap_map',
|
115
|
-
])
|
116
109
|
|
117
|
-
from .ranked import ( # noqa
|
118
|
-
|
119
|
-
|
120
|
-
)
|
110
|
+
from .ranked import ( # noqa
|
111
|
+
RankedSeq,
|
112
|
+
RankedSetSeq,
|
113
|
+
)
|
121
114
|
|
122
|
-
if _ta.TYPE_CHECKING:
|
123
115
|
from .sorted.skiplist import ( # noqa
|
124
116
|
SkipList,
|
125
117
|
SkipListDict,
|
126
118
|
)
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
multi_map,
|
162
|
-
multi_map_by,
|
163
|
-
partition,
|
164
|
-
unique,
|
165
|
-
)
|
119
|
+
|
120
|
+
from .sorted.sorted import ( # noqa
|
121
|
+
SortedCollection,
|
122
|
+
SortedItems,
|
123
|
+
SortedIter,
|
124
|
+
SortedListDict,
|
125
|
+
SortedMapping,
|
126
|
+
SortedMutableMapping,
|
127
|
+
)
|
128
|
+
|
129
|
+
from .trie import ( # noqa
|
130
|
+
Trie,
|
131
|
+
)
|
132
|
+
|
133
|
+
from .unmodifiable import ( # noqa
|
134
|
+
Unmodifiable,
|
135
|
+
UnmodifiableMapping,
|
136
|
+
UnmodifiableSequence,
|
137
|
+
UnmodifiableSet,
|
138
|
+
)
|
139
|
+
|
140
|
+
from .utils import ( # noqa
|
141
|
+
PartitionResult,
|
142
|
+
all_equal,
|
143
|
+
all_not_equal,
|
144
|
+
indexes,
|
145
|
+
key_cmp,
|
146
|
+
make_map,
|
147
|
+
make_map_by,
|
148
|
+
multi_map,
|
149
|
+
multi_map_by,
|
150
|
+
partition,
|
151
|
+
unique,
|
152
|
+
)
|
omlish/configs/formats.py
CHANGED
@@ -150,14 +150,18 @@ class YamlConfigLoader(ConfigLoader[YamlConfigData]):
|
|
150
150
|
file_exts = ('yaml', 'yml')
|
151
151
|
|
152
152
|
def load_str(self, s: str) -> YamlConfigData:
|
153
|
-
|
153
|
+
import yaml # noqa
|
154
|
+
|
155
|
+
return YamlConfigData(yaml.safe_load(s))
|
154
156
|
|
155
157
|
|
156
158
|
class YamlConfigRenderer(ConfigRenderer[YamlConfigData]):
|
157
159
|
data_cls = YamlConfigData
|
158
160
|
|
159
161
|
def render(self, d: YamlConfigData) -> str:
|
160
|
-
|
162
|
+
import yaml # noqa
|
163
|
+
|
164
|
+
return yaml.safe_dump(d.obj)
|
161
165
|
|
162
166
|
|
163
167
|
##
|
omlish/diag/lsof.py
CHANGED
@@ -243,20 +243,21 @@ class LsofCommand(SubprocessRunnable[ta.List[LsofItem]]):
|
|
243
243
|
|
244
244
|
if __name__ == '__main__':
|
245
245
|
def _main() -> None:
|
246
|
-
argparse
|
246
|
+
import argparse # noqa
|
247
|
+
import importlib # noqa
|
248
|
+
import json # noqa
|
249
|
+
|
247
250
|
parser = argparse.ArgumentParser()
|
248
251
|
parser.add_argument('--pid', '-p', type=int)
|
249
252
|
parser.add_argument('file', nargs='?')
|
250
253
|
args = parser.parse_args()
|
251
254
|
|
252
|
-
importlib = __import__('importlib')
|
253
255
|
subprocesses = importlib.import_module('..subprocesses.sync', package=__package__).subprocesses
|
254
256
|
items = LsofCommand(
|
255
257
|
pid=args.pid,
|
256
258
|
file=args.file,
|
257
259
|
).run(subprocesses)
|
258
260
|
|
259
|
-
json = __import__('json')
|
260
261
|
marshal_obj = importlib.import_module('..lite.marshal', package=__package__).marshal_obj
|
261
262
|
print(json.dumps(marshal_obj(items), indent=2))
|
262
263
|
|
omlish/funcs/builders.py
CHANGED
@@ -70,7 +70,8 @@ class DebugFnBuilder(FnBuilder):
|
|
70
70
|
if self._given_src_dir is not None:
|
71
71
|
return self._given_src_dir
|
72
72
|
else:
|
73
|
-
|
73
|
+
import tempfile # noqa
|
74
|
+
return tempfile.mkdtemp(prefix=f'_{self.__class__.__name__}_{os.getpid()}__') # noqa
|
74
75
|
|
75
76
|
@cached_nullary
|
76
77
|
def _install_sys_path(self) -> None:
|
omlish/lang/contextmanagers.py
CHANGED
omlish/lang/imports/proxyinit.py
CHANGED
@@ -69,6 +69,9 @@ class _ProxyInit:
|
|
69
69
|
self._imps_by_attr[attr] = self._Import(package, imp_attr)
|
70
70
|
self._lazy_globals.set_fn(attr, functools.partial(self.get, attr))
|
71
71
|
|
72
|
+
def _import_module(self, name: str) -> ta.Any:
|
73
|
+
return importlib.import_module(name, package=self._name_package.package)
|
74
|
+
|
72
75
|
def get(self, attr: str) -> ta.Any:
|
73
76
|
try:
|
74
77
|
imp = self._imps_by_attr[attr]
|
@@ -78,13 +81,14 @@ class _ProxyInit:
|
|
78
81
|
val: ta.Any
|
79
82
|
|
80
83
|
if imp.attr is None:
|
81
|
-
val =
|
84
|
+
val = self._import_module(imp.pkg)
|
82
85
|
|
83
86
|
else:
|
84
87
|
try:
|
85
88
|
mod = self._mods_by_pkgs[imp.pkg]
|
86
89
|
except KeyError:
|
87
|
-
mod =
|
90
|
+
mod = self._import_module(imp.pkg)
|
91
|
+
self._mods_by_pkgs[imp.pkg] = mod
|
88
92
|
|
89
93
|
val = getattr(mod, imp.attr)
|
90
94
|
|
omlish/lang/imports/traversal.py
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
"""
|
2
|
+
TODO:
|
3
|
+
- overhaul this - use pkgutil.walk_packages unless called needs non-importing (which this currently doesn't do anyway),
|
4
|
+
and support namespace packages if they do.
|
5
|
+
"""
|
1
6
|
import contextlib
|
2
7
|
import sys
|
3
8
|
import typing as ta
|
@@ -18,8 +23,9 @@ def yield_importable(
|
|
18
23
|
recursive: bool = False,
|
19
24
|
filter: ta.Callable[[str], bool] | None = None, # noqa
|
20
25
|
include_special: bool = False,
|
26
|
+
raise_on_failure: bool = False,
|
21
27
|
) -> ta.Iterator[str]:
|
22
|
-
|
28
|
+
import importlib.resources
|
23
29
|
|
24
30
|
def rec(cur):
|
25
31
|
if cur.split('.')[-1] == '__pycache__':
|
@@ -28,17 +34,13 @@ def yield_importable(
|
|
28
34
|
try:
|
29
35
|
module = sys.modules[cur]
|
30
36
|
except KeyError:
|
31
|
-
|
32
|
-
__import__(cur)
|
33
|
-
except ImportError:
|
34
|
-
return
|
35
|
-
module = sys.modules[cur]
|
37
|
+
module = importlib.import_module(cur)
|
36
38
|
|
37
39
|
# FIXME: pyox
|
38
40
|
if getattr(module, '__file__', None) is None:
|
39
41
|
return
|
40
42
|
|
41
|
-
for file in resources.files(cur).iterdir():
|
43
|
+
for file in importlib.resources.files(cur).iterdir():
|
42
44
|
if file.is_file() and file.name.endswith('.py'):
|
43
45
|
if not (include_special or file.name not in SPECIAL_IMPORTABLE):
|
44
46
|
continue
|
@@ -51,11 +53,17 @@ def yield_importable(
|
|
51
53
|
|
52
54
|
elif recursive and file.is_dir():
|
53
55
|
name = cur + '.' + file.name
|
56
|
+
|
54
57
|
if filter is not None and not filter(name):
|
55
58
|
continue
|
56
|
-
|
59
|
+
|
60
|
+
if raise_on_failure:
|
57
61
|
yield from rec(name)
|
58
62
|
|
63
|
+
else:
|
64
|
+
with contextlib.suppress(ImportError, NotImplementedError):
|
65
|
+
yield from rec(name)
|
66
|
+
|
59
67
|
yield from rec(package_root)
|
60
68
|
|
61
69
|
|
@@ -67,12 +75,14 @@ def yield_import_all(
|
|
67
75
|
recursive: bool = False,
|
68
76
|
filter: ta.Callable[[str], bool] | None = None, # noqa
|
69
77
|
include_special: bool = False,
|
78
|
+
raise_on_failure: bool = False,
|
70
79
|
) -> ta.Iterator[str]:
|
71
80
|
for import_path in yield_importable(
|
72
81
|
package_root,
|
73
82
|
recursive=recursive,
|
74
83
|
filter=filter,
|
75
84
|
include_special=include_special,
|
85
|
+
raise_on_failure=raise_on_failure,
|
76
86
|
):
|
77
87
|
__import__(import_path, globals=globals, locals=locals)
|
78
88
|
yield import_path
|
omlish/lite/imports.py
CHANGED
omlish/lite/reprs.py
CHANGED
omlish/manifests/base.py
CHANGED
omlish/manifests/globals.py
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
+
# ruff: noqa: UP045
|
1
2
|
# @omlish-lite
|
3
|
+
import threading
|
4
|
+
import typing as ta
|
5
|
+
|
2
6
|
from ..lite.marshal import unmarshal_obj
|
3
7
|
from .loading import ManifestLoader
|
4
8
|
|
@@ -6,6 +10,59 @@ from .loading import ManifestLoader
|
|
6
10
|
##
|
7
11
|
|
8
12
|
|
9
|
-
|
10
|
-
|
11
|
-
|
13
|
+
class GlobalManifestLoader:
|
14
|
+
def __new__(cls, *args, **kwargs): # noqa
|
15
|
+
raise TypeError
|
16
|
+
|
17
|
+
def __init_subclass__(cls, **kwargs): # noqa
|
18
|
+
raise TypeError
|
19
|
+
|
20
|
+
##
|
21
|
+
|
22
|
+
_lock: ta.ClassVar[threading.RLock] = threading.RLock()
|
23
|
+
|
24
|
+
_instance: ta.ClassVar[ta.Optional[ManifestLoader]] = None
|
25
|
+
|
26
|
+
@classmethod
|
27
|
+
def instance(cls) -> ManifestLoader:
|
28
|
+
if (inst := cls._instance) is None:
|
29
|
+
with cls._lock:
|
30
|
+
if (inst := cls._instance) is None:
|
31
|
+
inst = cls._instance = ManifestLoader(**cls.default_kwargs())
|
32
|
+
|
33
|
+
return inst
|
34
|
+
|
35
|
+
@classmethod
|
36
|
+
def initialize(cls, **kwargs: ta.Any) -> ManifestLoader:
|
37
|
+
with cls._lock:
|
38
|
+
if cls._instance is not None:
|
39
|
+
raise Exception(f'{cls.__name__} already initialized')
|
40
|
+
|
41
|
+
inst = cls._instance = ManifestLoader(**kwargs)
|
42
|
+
|
43
|
+
return inst
|
44
|
+
|
45
|
+
##
|
46
|
+
|
47
|
+
@classmethod
|
48
|
+
def default_value_instantiator(cls, obj_cls: type, **kwargs: ta.Any) -> ta.Any:
|
49
|
+
return unmarshal_obj(kwargs, obj_cls)
|
50
|
+
|
51
|
+
@classmethod
|
52
|
+
def default_kwargs(cls) -> ta.Mapping[str, ta.Any]:
|
53
|
+
return dict(
|
54
|
+
value_instantiator=cls.default_value_instantiator,
|
55
|
+
)
|
56
|
+
|
57
|
+
##
|
58
|
+
|
59
|
+
@classmethod
|
60
|
+
def load(
|
61
|
+
cls,
|
62
|
+
*pkg_names: str,
|
63
|
+
only: ta.Optional[ta.Iterable[type]] = None,
|
64
|
+
) -> ta.Sequence[ManifestLoader.LoadedManifest]:
|
65
|
+
return cls.instance().load(
|
66
|
+
*pkg_names,
|
67
|
+
only=only,
|
68
|
+
)
|
omlish/manifests/loading.py
CHANGED
@@ -5,6 +5,10 @@ Should be kept somewhat lightweight - used in cli entrypoints.
|
|
5
5
|
|
6
6
|
TODO:
|
7
7
|
- persisted caching support - {pkg_name: manifests}
|
8
|
+
- real relative cls names - shouldn't need parent package names
|
9
|
+
- *require* loaded class names - special All sentinel for explicit all
|
10
|
+
- ! late instantiation !
|
11
|
+
- per-manifest-item cache?
|
8
12
|
"""
|
9
13
|
import dataclasses as dc
|
10
14
|
import importlib.machinery
|
@@ -22,34 +26,101 @@ from .types import Manifest
|
|
22
26
|
|
23
27
|
|
24
28
|
class ManifestLoader:
|
29
|
+
class LoadedManifest:
|
30
|
+
def __init__(
|
31
|
+
self,
|
32
|
+
package: 'ManifestLoader.LoadedPackage',
|
33
|
+
manifest: Manifest,
|
34
|
+
) -> None:
|
35
|
+
super().__init__()
|
36
|
+
|
37
|
+
self._package = package
|
38
|
+
self._manifest = manifest
|
39
|
+
|
40
|
+
@property
|
41
|
+
def package(self) -> 'ManifestLoader.LoadedPackage':
|
42
|
+
return self._package
|
43
|
+
|
44
|
+
@property
|
45
|
+
def manifest(self) -> Manifest:
|
46
|
+
return self._manifest
|
47
|
+
|
48
|
+
@property
|
49
|
+
def loader(self) -> 'ManifestLoader':
|
50
|
+
return self._package.loader
|
51
|
+
|
52
|
+
@property
|
53
|
+
def class_key(self) -> str:
|
54
|
+
[(cls_key, value_dct)] = self._manifest.value.items()
|
55
|
+
return cls_key
|
56
|
+
|
57
|
+
_value: ta.Any
|
58
|
+
|
59
|
+
def value(self) -> ta.Any:
|
60
|
+
try:
|
61
|
+
return self._value
|
62
|
+
except AttributeError:
|
63
|
+
pass
|
64
|
+
|
65
|
+
value = self.loader._instantiate_loaded_manifest(self) # noqa
|
66
|
+
self._value = value
|
67
|
+
return value
|
68
|
+
|
69
|
+
class LoadedPackage:
|
70
|
+
def __init__(
|
71
|
+
self,
|
72
|
+
loader: 'ManifestLoader',
|
73
|
+
name: str,
|
74
|
+
) -> None:
|
75
|
+
super().__init__()
|
76
|
+
|
77
|
+
self._loader = loader
|
78
|
+
self._name = name
|
79
|
+
|
80
|
+
_manifests: ta.Sequence['ManifestLoader.LoadedManifest']
|
81
|
+
|
82
|
+
@property
|
83
|
+
def loader(self) -> 'ManifestLoader':
|
84
|
+
return self._loader
|
85
|
+
|
86
|
+
@property
|
87
|
+
def name(self) -> str:
|
88
|
+
return self._name
|
89
|
+
|
90
|
+
@property
|
91
|
+
def manifests(self) -> ta.Sequence['ManifestLoader.LoadedManifest']:
|
92
|
+
return self._manifests
|
93
|
+
|
25
94
|
def __init__(
|
26
95
|
self,
|
27
96
|
*,
|
28
97
|
module_remap: ta.Optional[ta.Mapping[str, str]] = None,
|
29
|
-
|
98
|
+
value_instantiator: ta.Optional[ta.Callable[..., ta.Any]] = None,
|
30
99
|
) -> None:
|
31
100
|
super().__init__()
|
32
101
|
|
33
|
-
self.
|
102
|
+
self._value_instantiator = value_instantiator
|
103
|
+
self._module_remap = module_remap or {}
|
34
104
|
|
35
105
|
self._lock = threading.RLock()
|
36
106
|
|
37
|
-
self._module_remap = module_remap or {}
|
38
107
|
self._module_reverse_remap = {v: k for k, v in self._module_remap.items()}
|
39
108
|
|
40
|
-
self.
|
41
|
-
self.
|
109
|
+
self._loaded_classes: ta.Dict[str, type] = {}
|
110
|
+
self._loaded_packages: ta.Dict[str, ta.Optional[ManifestLoader.LoadedPackage]] = {}
|
111
|
+
|
112
|
+
self._scanned_package_root_dirs: ta.Dict[str, ta.Sequence[str]] = {}
|
42
113
|
|
43
114
|
#
|
44
115
|
|
45
116
|
@classmethod
|
46
|
-
def
|
117
|
+
def kwargs_from_entry_point(
|
47
118
|
cls,
|
48
119
|
globals: ta.Mapping[str, ta.Any], # noqa
|
49
120
|
*,
|
50
121
|
module_remap: ta.Optional[ta.Mapping[str, str]] = None,
|
51
122
|
**kwargs: ta.Any,
|
52
|
-
) ->
|
123
|
+
) -> ta.Dict[str, ta.Any]:
|
53
124
|
rm: ta.Dict[str, str] = {}
|
54
125
|
|
55
126
|
if module_remap:
|
@@ -61,16 +132,11 @@ class ManifestLoader:
|
|
61
132
|
if '__main__' not in rm and name == '__main__':
|
62
133
|
rm[spec.name] = '__main__'
|
63
134
|
|
64
|
-
return
|
135
|
+
return dict(module_remap=rm, **kwargs)
|
65
136
|
|
66
137
|
#
|
67
138
|
|
68
|
-
def
|
69
|
-
try:
|
70
|
-
return self._cls_cache[key]
|
71
|
-
except KeyError:
|
72
|
-
pass
|
73
|
-
|
139
|
+
def _load_class_uncached(self, key: str) -> type:
|
74
140
|
if not key.startswith('$'):
|
75
141
|
raise Exception(f'Bad key: {key}')
|
76
142
|
|
@@ -89,16 +155,25 @@ class ManifestLoader:
|
|
89
155
|
if not isinstance(cls, type):
|
90
156
|
raise TypeError(cls)
|
91
157
|
|
92
|
-
self._cls_cache[key] = cls
|
93
158
|
return cls
|
94
159
|
|
95
|
-
def
|
160
|
+
def _load_class_locked(self, key: str) -> type:
|
161
|
+
try:
|
162
|
+
return self._loaded_classes[key]
|
163
|
+
except KeyError:
|
164
|
+
pass
|
165
|
+
|
166
|
+
cls = self._load_class_uncached(key)
|
167
|
+
self._loaded_classes[key] = cls
|
168
|
+
return cls
|
169
|
+
|
170
|
+
def _load_class(self, key: str) -> type:
|
96
171
|
with self._lock:
|
97
|
-
return self.
|
172
|
+
return self._load_class_locked(key)
|
98
173
|
|
99
174
|
#
|
100
175
|
|
101
|
-
def
|
176
|
+
def _deserialize_raw_manifests(self, obj: ta.Any, pkg_name: str) -> ta.Sequence[Manifest]:
|
102
177
|
if not isinstance(obj, (list, tuple)):
|
103
178
|
raise TypeError(obj)
|
104
179
|
|
@@ -119,13 +194,9 @@ class ManifestLoader:
|
|
119
194
|
|
120
195
|
return lst
|
121
196
|
|
122
|
-
def load_contents(self, obj: ta.Any, pkg_name: str) -> ta.Sequence[Manifest]:
|
123
|
-
with self._lock:
|
124
|
-
return self.load_contents(obj, pkg_name)
|
125
|
-
|
126
197
|
#
|
127
198
|
|
128
|
-
def
|
199
|
+
def _read_package_file_text(self, pkg_name: str, file_name: str) -> ta.Optional[str]:
|
129
200
|
# importlib.resources.files actually imports the package - to avoid this, if possible, the file is read straight
|
130
201
|
# off the filesystem.
|
131
202
|
spec = importlib.util.find_spec(pkg_name)
|
@@ -149,45 +220,71 @@ class ManifestLoader:
|
|
149
220
|
|
150
221
|
MANIFESTS_FILE_NAME: ta.ClassVar[str] = '.manifests.json'
|
151
222
|
|
152
|
-
def
|
153
|
-
|
154
|
-
return self._raw_cache[pkg_name]
|
155
|
-
except KeyError:
|
156
|
-
pass
|
157
|
-
|
158
|
-
src = self._read_pkg_file_text(pkg_name, self.MANIFESTS_FILE_NAME)
|
223
|
+
def _load_package_uncached(self, pkg_name: str) -> ta.Optional[LoadedPackage]:
|
224
|
+
src = self._read_package_file_text(pkg_name, self.MANIFESTS_FILE_NAME)
|
159
225
|
if src is None:
|
160
|
-
self._raw_cache[pkg_name] = None
|
161
226
|
return None
|
162
227
|
|
163
228
|
obj = json.loads(src)
|
164
229
|
if not isinstance(obj, (list, tuple)):
|
165
230
|
raise TypeError(obj)
|
166
231
|
|
167
|
-
|
232
|
+
raw_lst = self._deserialize_raw_manifests(obj, pkg_name)
|
168
233
|
|
169
|
-
|
170
|
-
|
234
|
+
ld_pkg = ManifestLoader.LoadedPackage(self, pkg_name)
|
235
|
+
|
236
|
+
ld_man_lst: ta.List[ManifestLoader.LoadedManifest] = []
|
237
|
+
for raw in raw_lst:
|
238
|
+
ld_man = ManifestLoader.LoadedManifest(ld_pkg, raw)
|
239
|
+
|
240
|
+
ld_man_lst.append(ld_man)
|
241
|
+
|
242
|
+
ld_pkg._manifests = ld_man_lst # noqa
|
243
|
+
|
244
|
+
return ld_pkg
|
245
|
+
|
246
|
+
def _load_package_locked(self, pkg_name: str) -> ta.Optional[LoadedPackage]:
|
247
|
+
try:
|
248
|
+
return self._loaded_packages[pkg_name]
|
249
|
+
except KeyError:
|
250
|
+
pass
|
171
251
|
|
172
|
-
|
252
|
+
pkg = self._load_package_uncached(pkg_name)
|
253
|
+
self._loaded_packages[pkg_name] = pkg
|
254
|
+
return pkg
|
255
|
+
|
256
|
+
def load_package(self, pkg_name: str) -> ta.Optional[LoadedPackage]:
|
173
257
|
with self._lock:
|
174
|
-
return self.
|
258
|
+
return self._load_package_locked(pkg_name)
|
175
259
|
|
176
260
|
#
|
177
261
|
|
178
|
-
def
|
179
|
-
if self.
|
180
|
-
return self.
|
262
|
+
def _instantiate_value(self, cls: type, **kwargs: ta.Any) -> ta.Any:
|
263
|
+
if self._value_instantiator is not None:
|
264
|
+
return self._value_instantiator(cls, **kwargs)
|
181
265
|
else:
|
182
266
|
return cls(**kwargs)
|
183
267
|
|
268
|
+
def _instantiate_loaded_manifest(self, ld_man: LoadedManifest) -> ta.Any:
|
269
|
+
[(cls_key, value_dct)] = ld_man.manifest.value.items()
|
270
|
+
cls = self._load_class(cls_key)
|
271
|
+
value = self._instantiate_value(cls, **value_dct)
|
272
|
+
return value
|
273
|
+
|
184
274
|
#
|
185
275
|
|
276
|
+
class LOAD_ALL: # noqa
|
277
|
+
def __new__(cls, *args, **kwargs): # noqa
|
278
|
+
raise TypeError
|
279
|
+
|
280
|
+
def __init_subclass__(cls, **kwargs): # noqa
|
281
|
+
raise TypeError
|
282
|
+
|
186
283
|
def _load(
|
187
284
|
self,
|
188
285
|
*pkg_names: str,
|
189
286
|
only: ta.Optional[ta.Iterable[type]] = None,
|
190
|
-
) -> ta.Sequence[
|
287
|
+
) -> ta.Sequence[LoadedManifest]:
|
191
288
|
only_keys: ta.Optional[ta.Set]
|
192
289
|
if only is not None:
|
193
290
|
only_keys = set()
|
@@ -200,18 +297,17 @@ class ManifestLoader:
|
|
200
297
|
else:
|
201
298
|
only_keys = None
|
202
299
|
|
203
|
-
lst: ta.List[
|
300
|
+
lst: ta.List[ManifestLoader.LoadedManifest] = []
|
204
301
|
for pn in pkg_names:
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
continue
|
302
|
+
lp = self.load_package(pn)
|
303
|
+
if lp is None:
|
304
|
+
continue
|
209
305
|
|
210
|
-
|
211
|
-
|
306
|
+
for m in lp.manifests:
|
307
|
+
if only_keys is not None and m.class_key not in only_keys:
|
308
|
+
continue
|
212
309
|
|
213
|
-
|
214
|
-
lst.append(manifest)
|
310
|
+
lst.append(m)
|
215
311
|
|
216
312
|
return lst
|
217
313
|
|
@@ -219,7 +315,7 @@ class ManifestLoader:
|
|
219
315
|
self,
|
220
316
|
*pkg_names: str,
|
221
317
|
only: ta.Optional[ta.Iterable[type]] = None,
|
222
|
-
) -> ta.Sequence[
|
318
|
+
) -> ta.Sequence[LoadedManifest]:
|
223
319
|
with self._lock:
|
224
320
|
return self._load(
|
225
321
|
*pkg_names,
|
@@ -228,42 +324,82 @@ class ManifestLoader:
|
|
228
324
|
|
229
325
|
#
|
230
326
|
|
231
|
-
ENTRY_POINT_GROUP = 'omlish.manifests'
|
327
|
+
ENTRY_POINT_GROUP: ta.ClassVar[str] = 'omlish.manifests'
|
328
|
+
|
329
|
+
_discovered_packages: ta.ClassVar[ta.Optional[ta.Sequence[str]]] = None
|
330
|
+
|
331
|
+
@classmethod
|
332
|
+
def discover_packages(cls) -> ta.Sequence[str]:
|
333
|
+
if (x := cls._discovered_packages) is not None:
|
334
|
+
return x
|
232
335
|
|
233
|
-
def discover_pkgs(self) -> ta.Sequence[str]:
|
234
336
|
# This is a fat dep so do it late.
|
235
|
-
|
337
|
+
from importlib import metadata as importlib_metadata # noqa
|
236
338
|
|
237
|
-
|
339
|
+
x = [
|
238
340
|
ep.value
|
239
|
-
for ep in importlib_metadata.entry_points(group=
|
341
|
+
for ep in importlib_metadata.entry_points(group=cls.ENTRY_POINT_GROUP)
|
240
342
|
]
|
241
343
|
|
242
|
-
|
344
|
+
cls._discovered_packages = x
|
345
|
+
return x
|
346
|
+
|
347
|
+
#
|
348
|
+
|
349
|
+
def _scan_package_root_dir_uncached(
|
350
|
+
self,
|
351
|
+
root_dir: str,
|
352
|
+
) -> ta.Sequence[str]:
|
243
353
|
pkgs: ta.List[str] = []
|
244
|
-
|
245
|
-
|
354
|
+
|
355
|
+
for n in os.listdir(root_dir):
|
356
|
+
if (
|
357
|
+
os.path.isdir(p := os.path.join(root_dir, n)) and
|
358
|
+
os.path.exists(os.path.join(p, '__init__.py'))
|
359
|
+
):
|
246
360
|
pkgs.append(n)
|
361
|
+
|
247
362
|
return pkgs
|
248
363
|
|
249
|
-
def
|
364
|
+
def _scan_package_root_dir_locked(
|
365
|
+
self,
|
366
|
+
root_dir: str,
|
367
|
+
) -> ta.Sequence[str]:
|
368
|
+
try:
|
369
|
+
return self._scanned_package_root_dirs[root_dir]
|
370
|
+
except KeyError:
|
371
|
+
pass
|
372
|
+
|
373
|
+
ret = self._scan_package_root_dir_uncached(root_dir)
|
374
|
+
self._scanned_package_root_dirs[root_dir] = ret
|
375
|
+
return ret
|
376
|
+
|
377
|
+
def _scan_package_root_dir(
|
378
|
+
self,
|
379
|
+
root_dir: str,
|
380
|
+
) -> ta.Sequence[str]:
|
381
|
+
with self._lock:
|
382
|
+
return self._scan_package_root_dir_locked(root_dir)
|
383
|
+
|
384
|
+
def scan_or_discover_packages(
|
250
385
|
self,
|
251
386
|
*,
|
252
|
-
|
253
|
-
|
387
|
+
specified_root_dirs: ta.Optional[ta.Sequence[str]] = None,
|
388
|
+
fallback_root_dir: ta.Optional[str] = None,
|
254
389
|
) -> ta.Sequence[str]:
|
255
390
|
pkgs: list[str] = []
|
256
391
|
|
257
|
-
if
|
258
|
-
if isinstance(
|
259
|
-
raise TypeError(
|
260
|
-
|
261
|
-
|
392
|
+
if specified_root_dirs is not None:
|
393
|
+
if isinstance(specified_root_dirs, str):
|
394
|
+
raise TypeError(specified_root_dirs)
|
395
|
+
|
396
|
+
for r in specified_root_dirs:
|
397
|
+
pkgs.extend(self._scan_package_root_dir(r))
|
262
398
|
|
263
399
|
else:
|
264
|
-
pkgs.extend(self.
|
400
|
+
pkgs.extend(self.discover_packages())
|
265
401
|
|
266
|
-
if not pkgs and
|
267
|
-
pkgs.extend(self.
|
402
|
+
if not pkgs and fallback_root_dir is not None:
|
403
|
+
pkgs.extend(self._scan_package_root_dir(fallback_root_dir))
|
268
404
|
|
269
405
|
return pkgs
|
omlish/os/pidfiles/pinning.py
CHANGED
@@ -245,7 +245,8 @@ class LslocksPidfdPidfilePinner(PidfilePinner):
|
|
245
245
|
|
246
246
|
if __name__ == '__main__':
|
247
247
|
def _main() -> None:
|
248
|
-
argparse
|
248
|
+
import argparse # noqa
|
249
|
+
|
249
250
|
parser = argparse.ArgumentParser()
|
250
251
|
parser.add_argument('file')
|
251
252
|
args = parser.parse_args()
|
@@ -1,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=aT8yZ-Zh-9wfHl5Ym5ouiWC1i0cy7Q7RlhzavB6VLPI,8587
|
2
|
-
omlish/__about__.py,sha256=
|
2
|
+
omlish/__about__.py,sha256=qgXlKBCqBWl3hZlS4yepho5vzin0hRyrGpM0ceofB74,3576
|
3
3
|
omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
|
4
4
|
omlish/c3.py,sha256=rer-TPOFDU6fYq_AWio_AmA-ckZ8JDY5shIzQ_yXfzA,8414
|
5
5
|
omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
|
@@ -73,10 +73,10 @@ omlish/codecs/base.py,sha256=IVnJlduvhiH1imul4DPhl2gHBWS76774AV5h86dX0ls,2214
|
|
73
73
|
omlish/codecs/bytes.py,sha256=3DxyQQCvFcP3mQ5G93f_mygXEb-7I8buM8EyzUcx2Is,2155
|
74
74
|
omlish/codecs/chain.py,sha256=nbkL2nz0ZqT2lxYwSXktHh1YFTQ4Iii1Hp-fWjis6rc,532
|
75
75
|
omlish/codecs/funcs.py,sha256=or0Jogczuzk7csDTRl-HURMEjl8LXXqxxXYK45xcM5w,855
|
76
|
-
omlish/codecs/registry.py,sha256=
|
76
|
+
omlish/codecs/registry.py,sha256=_s-RKf06dlZhmXNH7Z2qbO8LPEtWeP-wgDAaHp9DFlg,3933
|
77
77
|
omlish/codecs/standard.py,sha256=eiZ4u9ep0XrA4Z_D1zJI0vmWyuN8HLrX4Se_r_Cq_ZM,60
|
78
78
|
omlish/codecs/text.py,sha256=uHhV8jBgH0iZgcrV0nl4-0a_9ofln4iFH4OXoVm2CW4,5709
|
79
|
-
omlish/collections/__init__.py,sha256=
|
79
|
+
omlish/collections/__init__.py,sha256=BIc806ri5Eq-kR03Ya2YfYTRI0g1rn_0haQPUqxXqys,2816
|
80
80
|
omlish/collections/abc.py,sha256=p9zhL5oNV5WPyWmMn34fWfkuxPQAjOtL7WQA-Xsyhwk,2628
|
81
81
|
omlish/collections/bimap.py,sha256=3szDCscPJlFRtkpyVQNWneg4s50mr6Rd0jdTzVEIcnE,1661
|
82
82
|
omlish/collections/coerce.py,sha256=tAls15v_7p5bUN33R7Zbko87KW5toWHl9fRialCqyNY,7030
|
@@ -115,7 +115,7 @@ omlish/concurrent/threadlets.py,sha256=JfirbTDJgy9Ouokz_VmHeAAPS7cih8qMUJrN-owwX
|
|
115
115
|
omlish/configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
116
116
|
omlish/configs/all.py,sha256=xTfR7NySnlIeqhk0GlUOncPnWZ97cLhCtRDlN_Ny8og,1107
|
117
117
|
omlish/configs/classes.py,sha256=sWBL1K90Ix5E-N_A6Uz7s-djpkS2rKEzOLFYB8pHk9k,1173
|
118
|
-
omlish/configs/formats.py,sha256=
|
118
|
+
omlish/configs/formats.py,sha256=TenrNVqsgY5mwWJv3XBTaLTCbLxdKZEkH1U_9M1sNd8,5337
|
119
119
|
omlish/configs/nginx.py,sha256=b4fMI8dIZBUgOjmveRINrmmwSt8DO3y7nfvd-__YxDo,2062
|
120
120
|
omlish/configs/shadow.py,sha256=rc-loE5ex2GFwvdQJXqJsnSQa-MNF6Mizh4FlirSYUo,2234
|
121
121
|
omlish/configs/types.py,sha256=vANNURlIos3fR3fgcL2EMW5t6RevzSHU-BnVZgwIDOM,110
|
@@ -210,7 +210,7 @@ omlish/diag/__init__.py,sha256=c1q8vuapGH1YiYdU300FIJXMI1MOcnLNBZXr-zc8BXk,1181
|
|
210
210
|
omlish/diag/asts.py,sha256=MWh9XAG3m9L10FIJCyoNT2aU4Eft6tun_x9K0riq6Dk,3332
|
211
211
|
omlish/diag/debug.py,sha256=ClED7kKXeVMyKrjGIxcq14kXk9kvUJfytBQwK9y7c4Q,1637
|
212
212
|
omlish/diag/lslocks.py,sha256=VuA4MNNqXTcnHWsJvulGM6pNJRKmlXFXUZTfXpY0V6g,1750
|
213
|
-
omlish/diag/lsof.py,sha256=
|
213
|
+
omlish/diag/lsof.py,sha256=5N5aZQ7UqEBgV-hj3_a8QcvALOeLlVb8otqF2hvucxY,9107
|
214
214
|
omlish/diag/procfs.py,sha256=KaGTAA2Gj8eEEp7MjClRe4aimwzd-HDABThFzvq2cBQ,9684
|
215
215
|
omlish/diag/procstats.py,sha256=EJEe2Zc58ykBoTfqMXro7H52aQa_pd6uC2hsIPFceso,825
|
216
216
|
omlish/diag/ps.py,sha256=MEpMU6fbkh0bSWrOHh_okOa0JDTUSUQUVSYBdh1TGvE,1672
|
@@ -308,7 +308,7 @@ omlish/formats/toml/codec.py,sha256=5HFGWEPd9IFxPlRMRheX8FEDlRIzLe1moHEOj2_PFKU,
|
|
308
308
|
omlish/formats/toml/parser.py,sha256=O2M0penQV3t8NAsq_conJjvTsXI8iivUFuBg2a5J3dU,30643
|
309
309
|
omlish/formats/toml/writer.py,sha256=kLLQNEA_Kzd3ue7UXPQ_torOKoaLT82W16Bt99sID-w,3231
|
310
310
|
omlish/funcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
311
|
-
omlish/funcs/builders.py,sha256=
|
311
|
+
omlish/funcs/builders.py,sha256=Av41RkDFbsVGzQ7cWzevCG-UqZhLCBSDT8DhyWKq1rQ,4006
|
312
312
|
omlish/funcs/genmachine.py,sha256=D9dChaliNBIjYE6lJP5ctcVQUCffNBhceyaaLvBJ7ns,2578
|
313
313
|
omlish/funcs/match.py,sha256=EPeKojvecnJuDEWaXEYuef0Sx1J6Y0uTL01h4Z8ldxc,6199
|
314
314
|
omlish/funcs/pairs.py,sha256=m570hXCaW6tCJq2QITJ_CKFFzXDDOogKvskX7N7oICs,3904
|
@@ -431,7 +431,7 @@ omlish/lang/casing.py,sha256=cFUlbDdXLhwnWwcYx4qnM5c4zGX7hIRUfcjiZbxUD28,4636
|
|
431
431
|
omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
|
432
432
|
omlish/lang/collections.py,sha256=XI76WcSi4SclWmEGirErg7EzQUfjtmiK2xSK7jJISzY,2528
|
433
433
|
omlish/lang/comparison.py,sha256=MOwEG0Yny-jBPHO9kQto9FSRyeNpQW24UABsghkrHxY,1356
|
434
|
-
omlish/lang/contextmanagers.py,sha256=
|
434
|
+
omlish/lang/contextmanagers.py,sha256=na4T51jL0SMkC3oEJJsxdbAKgzSrfyFV6h9NCrQ3rX0,7685
|
435
435
|
omlish/lang/datetimes.py,sha256=01tg21QOx-PWDlm-CSFTalym3vpqF0EKzeinmtcVNoU,379
|
436
436
|
omlish/lang/descriptors.py,sha256=zBtgO9LjdSTGHNUgiIqswh78WOVoGH6KzS0NbgB1Wls,6572
|
437
437
|
omlish/lang/enums.py,sha256=F9tflHfaAoV2MpyuhZzpfX9-H55M3zNa9hCszsngEo8,111
|
@@ -465,9 +465,9 @@ omlish/lang/classes/virtual.py,sha256=z0MYQD9Q5MkX8DzF325wDB4J9XoYbsB09jZ1omC62T
|
|
465
465
|
omlish/lang/imports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
466
466
|
omlish/lang/imports/conditional.py,sha256=qxHYlE_xuwPJb6F9K8upagHxuYL0APPLWRVo5079Ipg,1007
|
467
467
|
omlish/lang/imports/lazy.py,sha256=gDv7ffrGsPEAHZ9a1Myt7Uf-4vqWErhCd1DaS7SQL0c,1464
|
468
|
-
omlish/lang/imports/proxyinit.py,sha256=
|
468
|
+
omlish/lang/imports/proxyinit.py,sha256=prcQSZYdXSvZLsWZClNSOhIJVHNMuO8nD9NTtG-fFv4,12636
|
469
469
|
omlish/lang/imports/resolution.py,sha256=DeRarn35Fryg5JhVhy8wbiC9lvr58AnllI9B_reswUE,2085
|
470
|
-
omlish/lang/imports/traversal.py,sha256=
|
470
|
+
omlish/lang/imports/traversal.py,sha256=LLic4zfhsSBzKF33_0qABBcjxfajc57mYRkeuj_Zuns,2855
|
471
471
|
omlish/lifecycles/__init__.py,sha256=1FjYceXs-4fc-S-C9zFYmc2axHs4znnQHcJVHdY7a6E,578
|
472
472
|
omlish/lifecycles/abstract.py,sha256=c9UY7oxzYZ_neh5DPE4yv5HfuDv7B4Mj_9Zo-B8KDSs,1114
|
473
473
|
omlish/lifecycles/base.py,sha256=DeUxARnOufWfBvhZQbonl1RVJgbrSeK5QNM6dWEuOwA,1398
|
@@ -483,7 +483,7 @@ omlish/lite/check.py,sha256=ytCkwZoKfOlJqylL-AGm8C2WfsWJd2q3kFbnZCzX3_M,13844
|
|
483
483
|
omlish/lite/configs.py,sha256=4-1uVxo-aNV7vMKa7PVNhM610eejG1WepB42-Dw2xQI,914
|
484
484
|
omlish/lite/contextmanagers.py,sha256=jpMxp5xwooRQJxsQ6J2ll4AJP9O7a5_YrLCGgwUFfD0,5703
|
485
485
|
omlish/lite/dataclasses.py,sha256=aRSCZz1jN_UI-CWJhN0SJeKxa-79vXNUZ6YOMgG31SE,3610
|
486
|
-
omlish/lite/imports.py,sha256=
|
486
|
+
omlish/lite/imports.py,sha256=GyEDKL-WuHtdOKIL-cc8aFd0-bHwZFDEjAB52ItabX0,1341
|
487
487
|
omlish/lite/inject.py,sha256=xvmLmtD3_2INnkurJQv76_Rkh9usbApEQrXJ4cvuVAk,29019
|
488
488
|
omlish/lite/json.py,sha256=m0Ce9eqUZG23-H7-oOp8n1sf4fzno5vtK4AK_4Vc-Mg,706
|
489
489
|
omlish/lite/logs.py,sha256=CWFG0NKGhqNeEgryF5atN2gkPYbUdTINEw_s1phbINM,51
|
@@ -492,7 +492,7 @@ omlish/lite/maybes.py,sha256=0p_fzb6yiOjEpvMKaQ53Q6CH1VPW1or7v7Lt1JIKcgM,4359
|
|
492
492
|
omlish/lite/maysyncs.py,sha256=MT3zF5kQ5rNlWU7db9Q_uXSM8K2C8LK85PIgdBsJyGE,7251
|
493
493
|
omlish/lite/pycharm.py,sha256=FRHGcCDo42UzZXqNwW_DkhI-6kb_CmJKPiQ8F6mYkLA,1174
|
494
494
|
omlish/lite/reflect.py,sha256=pzOY2PPuHH0omdtglkN6DheXDrGopdL3PtTJnejyLFU,2189
|
495
|
-
omlish/lite/reprs.py,sha256=
|
495
|
+
omlish/lite/reprs.py,sha256=2Bc7ukhKvYNTKmxPIuv9glZIph13C37y_W4fg9pBnu8,2006
|
496
496
|
omlish/lite/resources.py,sha256=YNSmX1Ohck1aoWRs55a-o5ChVbFJIQhtbqE-XwF55Oc,326
|
497
497
|
omlish/lite/runtime.py,sha256=J59skBq9kwo1H2s36jAk-k87eKPUtua6CmuXh-3dgmE,464
|
498
498
|
omlish/lite/secrets.py,sha256=YE9XOkGFEEMfNn-IzjIAulgEiuwS148o1wMZ3XmQDTY,827
|
@@ -517,9 +517,9 @@ omlish/logs/standard.py,sha256=w0jS824YDvlzrGgAxKiPk9RoZ5V1b0ADiFsBEpKLuLY,3152
|
|
517
517
|
omlish/logs/timing.py,sha256=qsQ3DB6swts1pxrFlmLWQzhH-3nzDrq1MUu7PxjjUyU,1519
|
518
518
|
omlish/logs/utils.py,sha256=OkFWf1exmWImmT7BaSiIC7c0Fk9tAis-PRqo8H4ny3c,398
|
519
519
|
omlish/manifests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
520
|
-
omlish/manifests/base.py,sha256=
|
521
|
-
omlish/manifests/globals.py,sha256=
|
522
|
-
omlish/manifests/loading.py,sha256=
|
520
|
+
omlish/manifests/base.py,sha256=Z5afzBJgI0tyTS8mPbYY4pYvoZu_xtdhRBOtZ3IIwzA,929
|
521
|
+
omlish/manifests/globals.py,sha256=nrA85o8zFTEYv440Y1wgr7SmtW6AE_3jF_Dls6RB_nE,1661
|
522
|
+
omlish/manifests/loading.py,sha256=q9M6lpiGCqPOmQMR12ZWYm8F4iME32byaLlT5VsRB9c,11844
|
523
523
|
omlish/manifests/static.py,sha256=7YwOVh_Ek9_aTrWsWNO8kWS10_j4K7yv3TpXZSHsvDY,501
|
524
524
|
omlish/manifests/types.py,sha256=5hQuY-WZ9VMqHZXr-9Dayg380JsnX2vJzXyw6vC6UDs,317
|
525
525
|
omlish/marshal/.dataclasses.json,sha256=wXWUy_IR8AolAa2RQnqn_mo2QnmVcvUJmayIykdVl0I,22
|
@@ -600,7 +600,7 @@ omlish/os/pidfiles/__main__.py,sha256=AF8TwjK4xgHVnoLAP9dIWgKvT0vGhHJlfDW0tKZ7tx
|
|
600
600
|
omlish/os/pidfiles/cli.py,sha256=dAKukx4mrarH8t7KZM4n_XSfTk3ycShGAFqRrirK5dw,2079
|
601
601
|
omlish/os/pidfiles/manager.py,sha256=oOnL90ttOG5ba_k9XPJ18reP7M5S-_30ln4OAfYV5W8,2357
|
602
602
|
omlish/os/pidfiles/pidfile.py,sha256=KlqrW7I-lYVDNJspFHE89i_A0HTTteT5B99b7vpTfNs,4400
|
603
|
-
omlish/os/pidfiles/pinning.py,sha256=
|
603
|
+
omlish/os/pidfiles/pinning.py,sha256=u81LRe3-6Xd6K_dsVbbEPVdsUvY7zy3Xv7413-5NBLQ,6627
|
604
604
|
omlish/reflect/__init__.py,sha256=9pzXLXXNMHkLhhI79iUr-o0SMOtR6HMUmAEUplZkIdE,853
|
605
605
|
omlish/reflect/inspect.py,sha256=WCo2YpBYauKw6k758FLlZ_H4Q05rgVPs96fEv9w6zHQ,1538
|
606
606
|
omlish/reflect/ops.py,sha256=F77OTaw0Uw020cJCWX_Q4kL3wvxlJ8jV8wz7BctGL_k,2619
|
@@ -908,9 +908,9 @@ omlish/typedvalues/marshal.py,sha256=AtBz7Jq-BfW8vwM7HSxSpR85JAXmxK2T0xDblmm1HI0
|
|
908
908
|
omlish/typedvalues/of_.py,sha256=UXkxSj504WI2UrFlqdZJbu2hyDwBhL7XVrc2qdR02GQ,1309
|
909
909
|
omlish/typedvalues/reflect.py,sha256=PAvKW6T4cW7u--iX80w3HWwZUS3SmIZ2_lQjT65uAyk,1026
|
910
910
|
omlish/typedvalues/values.py,sha256=ym46I-q2QJ_6l4UlERqv3yj87R-kp8nCKMRph0xQ3UA,1307
|
911
|
-
omlish-0.0.0.
|
912
|
-
omlish-0.0.0.
|
913
|
-
omlish-0.0.0.
|
914
|
-
omlish-0.0.0.
|
915
|
-
omlish-0.0.0.
|
916
|
-
omlish-0.0.0.
|
911
|
+
omlish-0.0.0.dev401.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
|
912
|
+
omlish-0.0.0.dev401.dist-info/METADATA,sha256=A-XCNmgKPIC0W6WqyFrKmVdtNNwE_zrRIJUW9ZxSez8,18825
|
913
|
+
omlish-0.0.0.dev401.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
914
|
+
omlish-0.0.0.dev401.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
|
915
|
+
omlish-0.0.0.dev401.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
|
916
|
+
omlish-0.0.0.dev401.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|