omlish 0.0.0.dev400__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.dev400'
2
- __revision__ = '4e9cb702d1d048bb8211070b471983d3b4d7bb6d'
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,3 +1,4 @@
1
+ # fmt: off
1
2
  # ruff: noqa: I001
2
3
  from .. import lang as _lang
3
4
 
@@ -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
@@ -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
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev400
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=_QVlo8CQjNk-OHJAjF73aaQcYeg4EcZVNzbbBB0SVoU,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=oKrHZOcvB0a6onUsbsHGJ7d-sPVbYXBZ4Nt3uYR8OtQ,2805
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
@@ -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
@@ -518,8 +518,8 @@ 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
520
  omlish/manifests/base.py,sha256=Z5afzBJgI0tyTS8mPbYY4pYvoZu_xtdhRBOtZ3IIwzA,929
521
- omlish/manifests/globals.py,sha256=LZm4ueBjlC023uxL8zvivSyzMgx5O8kSbo9oNfhF_DE,206
522
- omlish/manifests/loading.py,sha256=iIX4XmQRlaqNMasSPStu3hcB_9t1y6iAFQ-Rydu9rcY,8068
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
@@ -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.dev400.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
912
- omlish-0.0.0.dev400.dist-info/METADATA,sha256=plSr7XXGzb3LCmxU49UqfaZzRfgAlM003BveHzqlP8M,18825
913
- omlish-0.0.0.dev400.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
914
- omlish-0.0.0.dev400.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
915
- omlish-0.0.0.dev400.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
916
- omlish-0.0.0.dev400.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,,