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 CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev399'
2
- __revision__ = 'a8c0f1b2847879fa35db7e882438c69db3bd3b7c'
1
+ __version__ = '0.0.0.dev401'
2
+ __revision__ = '40d67dd6b213814fd76e662f51b8e4fca8dbc6c3'
3
3
 
4
4
 
5
5
  #
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.MANIFEST_LOADER
106
- pkgs = {__package__.split('.')[0], *ldr.discover_pkgs()}
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:
@@ -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
- from .bimap import ( # noqa
8
- BiMap,
9
-
10
- make_bi_map,
11
- )
12
-
13
- from .coerce import ( # noqa
14
- abs_set,
15
- abs_set_of,
16
- abs_set_of_or_none,
17
- abs_set_or_none,
18
- frozenset_,
19
- frozenset_of,
20
- frozenset_of_or_none,
21
- frozenset_or_none,
22
- map, # noqa
23
- map_of,
24
- map_of_or_none,
25
- map_or_none,
26
- opt_abs_set,
27
- opt_abs_set_of,
28
- opt_frozenset,
29
- opt_frozenset_of,
30
- opt_map,
31
- opt_map_of,
32
- opt_seq,
33
- opt_seq_of,
34
- seq,
35
- seq_of,
36
- seq_of_or_none,
37
- seq_or_none,
38
- )
39
-
40
- from .frozen import ( # noqa
41
- Frozen,
42
- FrozenDict,
43
- FrozenList,
44
- frozendict,
45
- frozenlist,
46
- )
47
-
48
- from .hasheq import ( # noqa
49
- HashEq,
50
- HashEqMap,
51
- HashEq_,
52
- hash_eq,
53
- )
54
-
55
- from .identity import ( # noqa
56
- IdentityKeyDict,
57
- IdentitySet,
58
- IdentityWeakKeyDictionary,
59
- IdentityWeakSet,
60
- )
61
-
62
- if _ta.TYPE_CHECKING:
63
- from . import kv
64
- else:
65
- kv = _lang.proxy_import('.kv', __package__)
66
-
67
- from .mappings import ( # noqa
68
- MissingDict,
69
- TypeMap,
70
- DynamicTypeMap,
71
- guarded_map_update,
72
- multikey_dict,
73
- )
74
-
75
- from .multimaps import ( # noqa
76
- MultiMap,
77
-
78
- SequenceMultiMap,
79
- AbstractSetMultiMap,
80
-
81
- BiMultiMap,
82
- InverseBiMultiMap,
83
-
84
- SequenceBiMultiMap,
85
- AbstractSetBiMultiMap,
86
-
87
- TupleBiMultiMap,
88
- seq_bi_multi_map,
89
-
90
- FrozensetBiMultiMap,
91
- abs_set_bi_multi_map,
92
- )
93
-
94
- from .ordered import ( # noqa
95
- OrderedFrozenSet,
96
- OrderedSet,
97
- )
98
-
99
- from .persistent.persistent import ( # noqa
100
- PersistentMap,
101
- PersistentMapping,
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
- RankedSeq,
119
- RankedSetSeq,
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
- else:
128
- _lang.proxy_init(globals(), '.sorted.skiplist', [
129
- 'SkipList',
130
- 'SkipListDict',
131
- ])
132
-
133
- from .sorted.sorted import ( # noqa
134
- SortedCollection,
135
- SortedItems,
136
- SortedIter,
137
- SortedListDict,
138
- SortedMapping,
139
- SortedMutableMapping,
140
- )
141
-
142
- from .trie import ( # noqa
143
- Trie,
144
- )
145
-
146
- from .unmodifiable import ( # noqa
147
- Unmodifiable,
148
- UnmodifiableMapping,
149
- UnmodifiableSequence,
150
- UnmodifiableSet,
151
- )
152
-
153
- from .utils import ( # noqa
154
- PartitionResult,
155
- all_equal,
156
- all_not_equal,
157
- indexes,
158
- key_cmp,
159
- make_map,
160
- make_map_by,
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
- return YamlConfigData(__import__('yaml').safe_load(s))
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
- return __import__('yaml').safe_dump(d.obj)
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 = __import__('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
- return __import__('tempfile').mkdtemp(prefix=f'_{self.__class__.__name__}_{os.getpid()}__') # noqa
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:
@@ -1,6 +1,7 @@
1
1
  """
2
2
  TODO:
3
3
  - AsyncExitStacked
4
+ - lol does double_check_setdefault need a CowDict in FT?
4
5
  """
5
6
  import abc
6
7
  import contextlib
@@ -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 = importlib.import_module(imp.pkg, package=self._name_package.package)
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 = importlib.import_module(imp.pkg, package=self._name_package.package)
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
 
@@ -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
- from importlib import resources
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
- try:
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
- with contextlib.suppress(ImportError, NotImplementedError):
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
@@ -28,7 +28,7 @@ def import_module_attr(dotted_path: str) -> ta.Any:
28
28
 
29
29
 
30
30
  def import_attr(dotted_path: str) -> ta.Any:
31
- importlib = __import__('importlib')
31
+ import importlib # noqa
32
32
  parts = dotted_path.split('.')
33
33
  mod: ta.Any = None
34
34
  mod_pos = 0
omlish/lite/reprs.py CHANGED
@@ -75,7 +75,8 @@ class AttrRepr:
75
75
  except AttributeError:
76
76
  pass
77
77
 
78
- reprlib = __import__('reprlib')
78
+ import reprlib # noqa
79
+
79
80
  cls._reprlib_ = reprlib
80
81
  return reprlib
81
82
 
omlish/manifests/base.py CHANGED
@@ -16,7 +16,8 @@ class ModAttrManifest:
16
16
  attr_name: str
17
17
 
18
18
  def load(self) -> ta.Any:
19
- importlib = __import__('importlib')
19
+ import importlib # noqa
20
+
20
21
  mod = importlib.import_module(self.mod_name)
21
22
  return getattr(mod, self.attr_name)
22
23
 
@@ -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
- MANIFEST_LOADER = ManifestLoader(
10
- cls_instantiator=lambda cls, **kwargs: unmarshal_obj(kwargs, cls),
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
+ )
@@ -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
- cls_instantiator: ta.Optional[ta.Callable[..., ta.Any]] = None,
98
+ value_instantiator: ta.Optional[ta.Callable[..., ta.Any]] = None,
30
99
  ) -> None:
31
100
  super().__init__()
32
101
 
33
- self._cls_instantiator = cls_instantiator
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._cls_cache: ta.Dict[str, type] = {}
41
- self._raw_cache: ta.Dict[str, ta.Optional[ta.Sequence[Manifest]]] = {}
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 from_entry_point(
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
- ) -> 'ManifestLoader':
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 cls(module_remap=rm, **kwargs)
135
+ return dict(module_remap=rm, **kwargs)
65
136
 
66
137
  #
67
138
 
68
- def _load_cls(self, key: str) -> type:
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 load_cls(self, key: str) -> type:
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._load_cls(key)
172
+ return self._load_class_locked(key)
98
173
 
99
174
  #
100
175
 
101
- def _load_contents(self, obj: ta.Any, pkg_name: str) -> ta.Sequence[Manifest]:
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 _read_pkg_file_text(self, pkg_name: str, file_name: str) -> ta.Optional[str]:
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 _load_raw(self, pkg_name: str) -> ta.Optional[ta.Sequence[Manifest]]:
153
- try:
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
- lst = self._load_contents(obj, pkg_name)
232
+ raw_lst = self._deserialize_raw_manifests(obj, pkg_name)
168
233
 
169
- self._raw_cache[pkg_name] = lst
170
- return lst
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
- def load_raw(self, pkg_name: str) -> ta.Optional[ta.Sequence[Manifest]]:
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._load_raw(pkg_name)
258
+ return self._load_package_locked(pkg_name)
175
259
 
176
260
  #
177
261
 
178
- def instantiate_cls(self, cls: type, **kwargs: ta.Any) -> ta.Any:
179
- if self._cls_instantiator is not None:
180
- return self._cls_instantiator(cls, **kwargs)
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[Manifest]:
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[Manifest] = []
300
+ lst: ta.List[ManifestLoader.LoadedManifest] = []
204
301
  for pn in pkg_names:
205
- for manifest in (self.load_raw(pn) or []):
206
- [(key, value_dct)] = manifest.value.items()
207
- if only_keys is not None and key not in only_keys:
208
- continue
302
+ lp = self.load_package(pn)
303
+ if lp is None:
304
+ continue
209
305
 
210
- cls = self._load_cls(key)
211
- value = self.instantiate_cls(cls, **value_dct)
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
- manifest = dc.replace(manifest, value=value)
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[Manifest]:
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
- importlib_metadata = __import__('importlib.metadata').metadata
337
+ from importlib import metadata as importlib_metadata # noqa
236
338
 
237
- return [
339
+ x = [
238
340
  ep.value
239
- for ep in importlib_metadata.entry_points(group=self.ENTRY_POINT_GROUP)
341
+ for ep in importlib_metadata.entry_points(group=cls.ENTRY_POINT_GROUP)
240
342
  ]
241
343
 
242
- def scan_pkg_root(self, root: str) -> ta.Sequence[str]:
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
- for n in os.listdir(root):
245
- if os.path.isdir(p := os.path.join(root, n)) and os.path.exists(os.path.join(p, '__init__.py')):
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 scan_or_discover_pkgs(
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
- specified_roots: ta.Optional[ta.Sequence[str]] = None,
253
- fallback_root: ta.Optional[str] = None,
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 specified_roots is not None:
258
- if isinstance(specified_roots, str):
259
- raise TypeError(specified_roots)
260
- for r in specified_roots:
261
- pkgs.extend(self.scan_pkg_root(r))
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.discover_pkgs())
400
+ pkgs.extend(self.discover_packages())
265
401
 
266
- if not pkgs and fallback_root is not None:
267
- pkgs.extend(self.scan_pkg_root(fallback_root))
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
@@ -245,7 +245,8 @@ class LslocksPidfdPidfilePinner(PidfilePinner):
245
245
 
246
246
  if __name__ == '__main__':
247
247
  def _main() -> None:
248
- argparse = __import__('argparse')
248
+ import argparse # noqa
249
+
249
250
  parser = argparse.ArgumentParser()
250
251
  parser.add_argument('file')
251
252
  args = parser.parse_args()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev399
3
+ Version: 0.0.0.dev401
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=aT8yZ-Zh-9wfHl5Ym5ouiWC1i0cy7Q7RlhzavB6VLPI,8587
2
- omlish/__about__.py,sha256=fsEaOnDS-IEelnR6gQvtXqr8_KRBvYJ0sk9zeUjWmkI,3576
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=PIf7XdwVX7Q85-MnyURtX9SKAYolK_r7wls9Z-qAsnA,3911
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=bNcBs7Z-IbvfzG37uF44Ao4cQFZkTl1IcmTYpjajh3M,2675
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=DlaI_0mxrYmPl9pUWZFQ6xvqXz997uQOGtt9EKt6V9o,5307
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=A0u3aSh7-QBxV7ilR-Bp7IEy6-kFg0wjLfsVn4bVJfQ,9133
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=mJkgvJxM98x5pbMQzRY95tRUsbAfy_ivHtt4fDKfzsM,3984
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=7atRNgR13cgynKIgrDZNLq5qAV52xWy8ISeOVaL6HrQ,7627
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=fe9lVhBQ605OaJ8rEuF680yIqh4QFCUoioTEfesDYQc,12533
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=lp1wPisPK-Op0i1dA3xmcQZeBUhYZxThIxoV6Ei0bgw,2523
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=JDYRFxu-ofHEBfd5VV3b27oKOLhtTpuzte1_Nt7yLgw,1352
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=Tiqf_ciD8FfS0ury7FcJ5G21yY342fW0vPacYlb8EO4,2014
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=YBK6jxMgY5G3hK0ZBlbU-tghzifkGhwRTyWa5XqOmno,939
521
- omlish/manifests/globals.py,sha256=LZm4ueBjlC023uxL8zvivSyzMgx5O8kSbo9oNfhF_DE,206
522
- omlish/manifests/loading.py,sha256=S-yEGsnBEu670ya6Bc09QqbRtA5rBp5rA4D3zuJUl9M,8070
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=L1MZp7UiBg3uzeDgvt8ScWJHwuIHXZGhgl47hTiiMjY,6636
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.dev399.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
912
- omlish-0.0.0.dev399.dist-info/METADATA,sha256=Kezuj4MTMgqRhNq1Y3YMIosDiWl5vpGH3FlTb0FV60g,18825
913
- omlish-0.0.0.dev399.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
914
- omlish-0.0.0.dev399.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
915
- omlish-0.0.0.dev399.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
916
- omlish-0.0.0.dev399.dist-info/RECORD,,
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,,