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 +2 -2
- omlish/codecs/registry.py +3 -3
- omlish/collections/__init__.py +1 -0
- omlish/lang/contextmanagers.py +1 -0
- omlish/manifests/globals.py +60 -3
- omlish/manifests/loading.py +204 -68
- {omlish-0.0.0.dev400.dist-info → omlish-0.0.0.dev401.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev400.dist-info → omlish-0.0.0.dev401.dist-info}/RECORD +12 -12
- {omlish-0.0.0.dev400.dist-info → omlish-0.0.0.dev401.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev400.dist-info → omlish-0.0.0.dev401.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev400.dist-info → omlish-0.0.0.dev401.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev400.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
omlish/lang/contextmanagers.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
|
@@ -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
|
@@ -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
|
@@ -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=
|
522
|
-
omlish/manifests/loading.py,sha256=
|
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.
|
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
|