omlish 0.0.0.dev405__py3-none-any.whl → 0.0.0.dev407__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/.manifests.json +80 -80
- omlish/__about__.py +2 -2
- omlish/asyncs/anyio/sync.py +3 -0
- omlish/asyncs/bluelet/runner.py +1 -0
- omlish/asyncs/bluelet/sockets.py +2 -0
- omlish/asyncs/sync.py +1 -0
- omlish/bootstrap/__main__.py +3 -3
- omlish/bootstrap/base.py +2 -0
- omlish/bootstrap/harness.py +1 -0
- omlish/codecs/base.py +4 -4
- omlish/codecs/text.py +1 -0
- omlish/collections/frozen.py +1 -0
- omlish/collections/mappings.py +2 -0
- omlish/collections/ordered.py +1 -0
- omlish/collections/sorted/sorted.py +1 -0
- omlish/collections/trie.py +2 -2
- omlish/concurrent/executors.py +1 -0
- omlish/dataclasses/tools/modifiers.py +1 -0
- omlish/diag/procfs.py +3 -3
- omlish/diag/threads.py +1 -0
- omlish/formats/codecs.py +4 -4
- omlish/formats/dotenv.py +5 -0
- omlish/formats/props.py +1 -0
- omlish/formats/toml/writer.py +1 -0
- omlish/formats/yaml.py +1 -0
- omlish/funcs/pipes.py +3 -0
- omlish/graphs/trees.py +1 -0
- omlish/http/jwt.py +2 -0
- omlish/http/multipart.py +1 -0
- omlish/inject/impl/injector.py +1 -0
- omlish/io/buffers.py +2 -0
- omlish/io/compress/codecs.py +4 -4
- omlish/iterators/unique.py +1 -0
- omlish/lang/classes/restrict.py +1 -0
- omlish/lang/classes/simple.py +1 -0
- omlish/lang/contextmanagers.py +1 -0
- omlish/lang/descriptors.py +2 -0
- omlish/lang/objects.py +2 -0
- omlish/lang/resolving.py +1 -0
- omlish/lifecycles/contextmanagers.py +1 -0
- omlish/lite/cached.py +1 -0
- omlish/lite/inject.py +2 -0
- omlish/lite/secrets.py +1 -0
- omlish/logs/handlers.py +1 -0
- omlish/manifests/base.py +4 -4
- omlish/manifests/loading.py +111 -51
- omlish/manifests/static.py +2 -2
- omlish/manifests/types.py +2 -2
- omlish/marshal/factories.py +2 -0
- omlish/marshal/polymorphism/metadata.py +2 -0
- omlish/marshal/registries.py +1 -0
- omlish/multiprocessing/spawn.py +3 -0
- omlish/os/pidfiles/__main__.py +3 -3
- omlish/secrets/openssl.py +2 -0
- omlish/secrets/pwgen.py +3 -3
- omlish/secrets/secrets.py +5 -0
- omlish/specs/jmespath/__main__.py +3 -3
- omlish/specs/jmespath/errors.py +4 -0
- omlish/specs/jmespath/visitor.py +2 -0
- omlish/specs/jsonschema/keywords/base.py +1 -0
- omlish/sql/alchemy/apiadapter.py +1 -0
- omlish/sql/alchemy/asyncs.py +3 -0
- omlish/sql/alchemy/duckdb.py +2 -0
- omlish/sql/api/dbapi.py +2 -0
- omlish/sql/params.py +3 -0
- omlish/sql/queries/names.py +1 -0
- omlish/sync.py +3 -0
- omlish/testing/pytest/inject/harness.py +4 -2
- omlish/text/asdl.py +3 -0
- {omlish-0.0.0.dev405.dist-info → omlish-0.0.0.dev407.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev405.dist-info → omlish-0.0.0.dev407.dist-info}/RECORD +75 -75
- {omlish-0.0.0.dev405.dist-info → omlish-0.0.0.dev407.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev405.dist-info → omlish-0.0.0.dev407.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev405.dist-info → omlish-0.0.0.dev407.dist-info}/licenses/LICENSE +0 -0
- {omlish-0.0.0.dev405.dist-info → omlish-0.0.0.dev407.dist-info}/top_level.txt +0 -0
omlish/funcs/pipes.py
CHANGED
@@ -39,6 +39,7 @@ class Fn(abc.ABC, ta.Generic[T]):
|
|
39
39
|
class Bind(Fn[T]):
|
40
40
|
def __init__(self, fn: ta.Callable[..., T], *args: ta.Any, **kwargs: ta.Any) -> None:
|
41
41
|
super().__init__()
|
42
|
+
|
42
43
|
if Ellipsis not in args and Ellipsis not in kwargs:
|
43
44
|
args += (Ellipsis,)
|
44
45
|
self._fn = fn
|
@@ -75,6 +76,7 @@ bind = Bind
|
|
75
76
|
class Pipe(Fn[T]):
|
76
77
|
def __init__(self, lfns: ta.Sequence[ta.Callable], rfn: ta.Callable[..., T]) -> None:
|
77
78
|
super().__init__()
|
79
|
+
|
78
80
|
self._lfn, *self._rfns = [*lfns, rfn]
|
79
81
|
|
80
82
|
def __call__(self, *args: ta.Any, **kwargs: ta.Any) -> T:
|
@@ -95,6 +97,7 @@ def pipe(*fns: ta.Callable) -> Pipe:
|
|
95
97
|
class Apply(Fn[T]):
|
96
98
|
def __init__(self, *fns: ta.Callable[[T], ta.Any]) -> None:
|
97
99
|
super().__init__()
|
100
|
+
|
98
101
|
self._fns = fns
|
99
102
|
|
100
103
|
def __call__(self, o: T) -> T: # noqa
|
omlish/graphs/trees.py
CHANGED
omlish/http/jwt.py
CHANGED
@@ -52,6 +52,7 @@ class Algorithm(abc.ABC):
|
|
52
52
|
class HmacAlgorithm(Algorithm):
|
53
53
|
def __init__(self, name: str, digest: ta.Any) -> None:
|
54
54
|
super().__init__()
|
55
|
+
|
55
56
|
self._name = name
|
56
57
|
self._digest = digest
|
57
58
|
|
@@ -69,6 +70,7 @@ class HmacAlgorithm(Algorithm):
|
|
69
70
|
class RsaAlgorithm(Algorithm):
|
70
71
|
def __init__(self, name: str, digest: str) -> None:
|
71
72
|
super().__init__()
|
73
|
+
|
72
74
|
self._name = name
|
73
75
|
self._digest = digest
|
74
76
|
|
omlish/http/multipart.py
CHANGED
omlish/inject/impl/injector.py
CHANGED
@@ -111,6 +111,7 @@ class InjectorImpl(Injector, lang.Final):
|
|
111
111
|
class _Request:
|
112
112
|
def __init__(self, injector: 'InjectorImpl') -> None:
|
113
113
|
super().__init__()
|
114
|
+
|
114
115
|
self._injector = injector
|
115
116
|
self._provisions: dict[Key, lang.Maybe] = {}
|
116
117
|
self._seen_keys: set[Key] = set()
|
omlish/io/buffers.py
CHANGED
@@ -24,6 +24,7 @@ class DelimitingBuffer:
|
|
24
24
|
class Error(Exception):
|
25
25
|
def __init__(self, buffer: 'DelimitingBuffer') -> None:
|
26
26
|
super().__init__(buffer)
|
27
|
+
|
27
28
|
self.buffer = buffer
|
28
29
|
|
29
30
|
def __repr__(self) -> str:
|
@@ -179,6 +180,7 @@ class ReadableListBuffer:
|
|
179
180
|
|
180
181
|
def __init__(self) -> None:
|
181
182
|
super().__init__()
|
183
|
+
|
182
184
|
self._lst: list[bytes] = []
|
183
185
|
|
184
186
|
def __len__(self) -> int:
|
omlish/io/compress/codecs.py
CHANGED
@@ -67,12 +67,12 @@ def make_compression_codec(
|
|
67
67
|
|
68
68
|
|
69
69
|
def make_compression_lazy_loaded_codec(
|
70
|
-
|
71
|
-
|
70
|
+
module: str,
|
71
|
+
attr: str,
|
72
72
|
codec: CompressionCodec,
|
73
73
|
) -> codecs.LazyLoadedCodec:
|
74
74
|
return codecs.LazyLoadedCodec.new(
|
75
|
-
|
76
|
-
|
75
|
+
module,
|
76
|
+
attr,
|
77
77
|
codec,
|
78
78
|
)
|
omlish/iterators/unique.py
CHANGED
omlish/lang/classes/restrict.py
CHANGED
omlish/lang/classes/simple.py
CHANGED
omlish/lang/contextmanagers.py
CHANGED
omlish/lang/descriptors.py
CHANGED
@@ -200,6 +200,7 @@ decorator = _decorator
|
|
200
200
|
class AccessForbiddenError(Exception):
|
201
201
|
def __init__(self, name: str | None = None, *args: ta.Any, **kwargs: ta.Any) -> None:
|
202
202
|
super().__init__(*((name,) if name is not None else ()), *args, **kwargs) # noqa
|
203
|
+
|
203
204
|
self.name = name
|
204
205
|
|
205
206
|
|
@@ -231,6 +232,7 @@ class _ClassOnly:
|
|
231
232
|
if not isinstance(mth, classmethod):
|
232
233
|
raise TypeError(f'must be classmethod: {mth}')
|
233
234
|
super().__init__()
|
235
|
+
|
234
236
|
self._mth = (mth,)
|
235
237
|
functools.update_wrapper(self, mth) # type: ignore
|
236
238
|
|
omlish/lang/objects.py
CHANGED
@@ -166,6 +166,7 @@ class SimpleProxy(ta.Generic[T]):
|
|
166
166
|
class Descriptor:
|
167
167
|
def __init__(self, attr: str) -> None:
|
168
168
|
super().__init__()
|
169
|
+
|
169
170
|
self._attr = attr
|
170
171
|
|
171
172
|
def __get__(self, instance, owner=None):
|
@@ -189,6 +190,7 @@ class SimpleProxy(ta.Generic[T]):
|
|
189
190
|
|
190
191
|
def __init__(self, wrapped: T) -> None:
|
191
192
|
super().__init__()
|
193
|
+
|
192
194
|
object.__setattr__(self, '__wrapped__', wrapped)
|
193
195
|
|
194
196
|
def __init_subclass__(cls, **kwargs: ta.Any) -> None:
|
omlish/lang/resolving.py
CHANGED
@@ -33,6 +33,7 @@ class ContextManagerLifecycle(Lifecycle, lang.Final, ta.Generic[ContextManagerT]
|
|
33
33
|
class LifecycleContextManager(ta.Generic[LifecycleT]):
|
34
34
|
def __init__(self, lifecycle: LifecycleT) -> None:
|
35
35
|
super().__init__()
|
36
|
+
|
36
37
|
self._lifecycle = lifecycle
|
37
38
|
self._controller = lifecycle if isinstance(lifecycle, LifecycleController) else LifecycleController(lifecycle)
|
38
39
|
|
omlish/lite/cached.py
CHANGED
omlish/lite/inject.py
CHANGED
@@ -402,6 +402,7 @@ class ContextvarInjectorScope(InjectorScope, abc.ABC):
|
|
402
402
|
|
403
403
|
def __init_subclass__(cls, **kwargs: ta.Any) -> None:
|
404
404
|
super().__init_subclass__(**kwargs)
|
405
|
+
|
405
406
|
check.not_in(abc.ABC, cls.__bases__)
|
406
407
|
check.state(not hasattr(cls, '_cv'))
|
407
408
|
cls._cv = contextvars.ContextVar(f'{cls.__name__}_cv')
|
@@ -676,6 +677,7 @@ class _Injector(Injector):
|
|
676
677
|
class _Request:
|
677
678
|
def __init__(self, injector: '_Injector') -> None:
|
678
679
|
super().__init__()
|
680
|
+
|
679
681
|
self._injector = injector
|
680
682
|
self._provisions: ta.Dict[InjectorKey, Maybe] = {}
|
681
683
|
self._seen_keys: ta.Set[InjectorKey] = set()
|
omlish/lite/secrets.py
CHANGED
omlish/logs/handlers.py
CHANGED
omlish/manifests/base.py
CHANGED
@@ -12,14 +12,14 @@ NameAliasesManifestT = ta.TypeVar('NameAliasesManifestT', bound='NameAliasesMani
|
|
12
12
|
|
13
13
|
@dc.dataclass(frozen=True)
|
14
14
|
class ModAttrManifest:
|
15
|
-
|
16
|
-
|
15
|
+
module: str
|
16
|
+
attr: str
|
17
17
|
|
18
18
|
def load(self) -> ta.Any:
|
19
19
|
import importlib # noqa
|
20
20
|
|
21
|
-
mod = importlib.import_module(self.
|
22
|
-
return getattr(mod, self.
|
21
|
+
mod = importlib.import_module(self.module)
|
22
|
+
return getattr(mod, self.attr)
|
23
23
|
|
24
24
|
|
25
25
|
##
|
omlish/manifests/loading.py
CHANGED
@@ -31,35 +31,42 @@ class ManifestLoader:
|
|
31
31
|
def __init__(
|
32
32
|
self,
|
33
33
|
package: 'ManifestLoader.LoadedPackage',
|
34
|
-
|
34
|
+
resolved: 'ManifestLoader._ResolvedManifest',
|
35
35
|
) -> None:
|
36
36
|
super().__init__()
|
37
37
|
|
38
38
|
self._package = package
|
39
|
-
self.
|
40
|
-
|
41
|
-
[(cls_key, value_dct)] = self._manifest.value.items() # noqa
|
42
|
-
self._cls_key = cls_key
|
39
|
+
self._resolved = resolved
|
43
40
|
|
44
41
|
def __repr__(self) -> str:
|
45
|
-
return
|
42
|
+
return (
|
43
|
+
f'{self.__class__.__name__}@{id(self):x}('
|
44
|
+
f'package={self._package.name!r}, '
|
45
|
+
f'module={self._resolved.module!r}, '
|
46
|
+
f'class_key={self._resolved.class_key!r}'
|
47
|
+
f')'
|
48
|
+
)
|
46
49
|
|
47
50
|
@property
|
48
51
|
def package(self) -> 'ManifestLoader.LoadedPackage':
|
49
52
|
return self._package
|
50
53
|
|
54
|
+
@property
|
55
|
+
def module(self) -> str:
|
56
|
+
return self._resolved.module
|
57
|
+
|
58
|
+
@property
|
59
|
+
def class_key(self) -> str:
|
60
|
+
return self._resolved.class_key
|
61
|
+
|
51
62
|
@property
|
52
63
|
def manifest(self) -> Manifest:
|
53
|
-
return self.
|
64
|
+
return self._resolved.manifest
|
54
65
|
|
55
66
|
@property
|
56
67
|
def loader(self) -> 'ManifestLoader':
|
57
68
|
return self._package.loader
|
58
69
|
|
59
|
-
@property
|
60
|
-
def class_key(self) -> str:
|
61
|
-
return self._cls_key
|
62
|
-
|
63
70
|
_value: ta.Any
|
64
71
|
|
65
72
|
def value(self) -> ta.Any:
|
@@ -68,7 +75,7 @@ class ManifestLoader:
|
|
68
75
|
except AttributeError:
|
69
76
|
pass
|
70
77
|
|
71
|
-
value = self.loader.
|
78
|
+
value = self.loader._instantiate_resolved_manifest(self._resolved) # noqa
|
72
79
|
self._value = value
|
73
80
|
return value
|
74
81
|
|
@@ -86,7 +93,7 @@ class ManifestLoader:
|
|
86
93
|
_manifests: ta.Sequence['ManifestLoader.LoadedManifest']
|
87
94
|
|
88
95
|
def __repr__(self) -> str:
|
89
|
-
return f'{self.__class__.__name__}(name={self._name!r})'
|
96
|
+
return f'{self.__class__.__name__}@{id(self):x}(name={self._name!r})'
|
90
97
|
|
91
98
|
@property
|
92
99
|
def loader(self) -> 'ManifestLoader':
|
@@ -287,14 +294,19 @@ class ManifestLoader:
|
|
287
294
|
|
288
295
|
##
|
289
296
|
|
297
|
+
@dc.dataclass()
|
290
298
|
class ClassKeyError(Exception):
|
291
|
-
|
299
|
+
key: str
|
300
|
+
module: ta.Optional[str] = None
|
292
301
|
|
293
302
|
def _load_class_uncached(self, key: str) -> type:
|
294
|
-
if not key.startswith('
|
303
|
+
if not key.startswith('!'):
|
295
304
|
raise ManifestLoader.ClassKeyError(key)
|
296
305
|
|
297
306
|
parts = key[1:].split('.')
|
307
|
+
if '' in parts:
|
308
|
+
raise ManifestLoader.ClassKeyError(key)
|
309
|
+
|
298
310
|
pos = next(i for i, p in enumerate(parts) if p[0].isupper())
|
299
311
|
|
300
312
|
mod_name = '.'.join(parts[:pos])
|
@@ -330,37 +342,79 @@ class ManifestLoader:
|
|
330
342
|
raise TypeError(cls)
|
331
343
|
mod_name = cls.__module__
|
332
344
|
mod_name = self._module_reverse_remap.get(mod_name, mod_name)
|
333
|
-
return f'
|
345
|
+
return f'!{mod_name}.{cls.__qualname__}'
|
346
|
+
|
347
|
+
##
|
348
|
+
|
349
|
+
class _ResolvedManifest(ta.NamedTuple):
|
350
|
+
manifest: Manifest
|
351
|
+
package: str
|
352
|
+
|
353
|
+
module: str
|
354
|
+
class_key: str
|
355
|
+
value_dct: ta.Any
|
356
|
+
|
357
|
+
@classmethod
|
358
|
+
def _resolve_raw_manifest(
|
359
|
+
cls,
|
360
|
+
m: Manifest,
|
361
|
+
*,
|
362
|
+
package_name: str,
|
363
|
+
) -> _ResolvedManifest:
|
364
|
+
# self._module = module
|
365
|
+
# self._class_key = class_key
|
366
|
+
if not m.module.startswith('.'):
|
367
|
+
raise NameError(m.module)
|
368
|
+
|
369
|
+
module = package_name + m.module
|
370
|
+
|
371
|
+
[(class_key, value_dct)] = m.value.items()
|
372
|
+
|
373
|
+
if not class_key.startswith('!'):
|
374
|
+
raise ManifestLoader.ClassKeyError(class_key, module=module)
|
375
|
+
|
376
|
+
if class_key.startswith('!.'):
|
377
|
+
class_key = f'!{package_name}{class_key[1:]}'
|
378
|
+
|
379
|
+
# FIXME: move to builder
|
380
|
+
# elif key.startswith('$.'):
|
381
|
+
# if module.startswith('.'):
|
382
|
+
# raise NameError(module)
|
383
|
+
# kl = key[1:].split('.')
|
384
|
+
# ml = module.split('.')
|
385
|
+
# lvl = len(kl) - kl[::-1].index('')
|
386
|
+
# if lvl >= len(ml):
|
387
|
+
# raise ManifestLoader.ClassKeyError(key, module=module)
|
388
|
+
# rn = '.'.join([*ml[:-lvl], *kl[lvl:]])
|
389
|
+
# return f'${rn}'
|
390
|
+
|
391
|
+
return ManifestLoader._ResolvedManifest(
|
392
|
+
manifest=m,
|
393
|
+
package=package_name,
|
394
|
+
|
395
|
+
module=module,
|
396
|
+
class_key=class_key,
|
397
|
+
value_dct=value_dct,
|
398
|
+
)
|
334
399
|
|
335
400
|
##
|
336
401
|
|
337
|
-
|
402
|
+
@classmethod
|
403
|
+
def _deserialize_raw_manifests(cls, obj: ta.Any) -> ta.Sequence[Manifest]:
|
338
404
|
if not isinstance(obj, (list, tuple)):
|
339
405
|
raise TypeError(obj)
|
340
406
|
|
341
407
|
lst: ta.List[Manifest] = []
|
342
408
|
for e in obj:
|
343
|
-
|
344
|
-
|
345
|
-
m = dc.replace(m, module=pkg_name + m.module)
|
346
|
-
|
347
|
-
[(key, value_dct)] = m.value.items()
|
348
|
-
if not key.startswith('$'):
|
349
|
-
raise ManifestLoader.ClassKeyError(key)
|
350
|
-
if key.startswith('$.'):
|
351
|
-
key = f'${pkg_name}{key[1:]}'
|
352
|
-
m = dc.replace(m, value={key: value_dct})
|
353
|
-
|
354
|
-
lst.append(m)
|
409
|
+
lst.append(Manifest(**e))
|
355
410
|
|
356
411
|
return lst
|
357
412
|
|
358
|
-
|
359
|
-
|
360
|
-
def _read_package_file_text(self, pkg_name: str, file_name: str) -> ta.Optional[str]:
|
413
|
+
@classmethod
|
414
|
+
def _read_package_file_text(cls, package_name: str, file_name: str) -> ta.Optional[str]:
|
361
415
|
# importlib.resources.files actually imports the package - to avoid this, if possible, the file is read straight
|
362
416
|
# off the filesystem.
|
363
|
-
spec = importlib.util.find_spec(
|
417
|
+
spec = importlib.util.find_spec(package_name)
|
364
418
|
if (
|
365
419
|
spec is not None and
|
366
420
|
isinstance(spec.loader, importlib.machinery.SourceFileLoader) and
|
@@ -375,17 +429,16 @@ class ManifestLoader:
|
|
375
429
|
return f.read()
|
376
430
|
|
377
431
|
from importlib import resources as importlib_resources # noqa
|
378
|
-
t = importlib_resources.files(
|
432
|
+
t = importlib_resources.files(package_name).joinpath(file_name)
|
379
433
|
if not t.is_file():
|
380
434
|
return None
|
381
435
|
return t.read_text('utf-8')
|
382
436
|
|
383
|
-
#
|
384
|
-
|
385
437
|
MANIFESTS_FILE_NAME: ta.ClassVar[str] = '.manifests.json'
|
386
438
|
|
387
|
-
|
388
|
-
|
439
|
+
@classmethod
|
440
|
+
def _read_package_raw_manifests(cls, package_name: str) -> ta.Optional[ta.Sequence[Manifest]]:
|
441
|
+
src = cls._read_package_file_text(package_name, cls.MANIFESTS_FILE_NAME)
|
389
442
|
if src is None:
|
390
443
|
return None
|
391
444
|
|
@@ -393,13 +446,21 @@ class ManifestLoader:
|
|
393
446
|
if not isinstance(obj, (list, tuple)):
|
394
447
|
raise TypeError(obj)
|
395
448
|
|
396
|
-
|
449
|
+
return cls._deserialize_raw_manifests(obj)
|
450
|
+
|
451
|
+
##
|
452
|
+
|
453
|
+
def _load_package_uncached(self, package_name: str) -> ta.Optional[LoadedPackage]:
|
454
|
+
if (raw_lst := self._read_package_raw_manifests(package_name)) is None:
|
455
|
+
return None
|
397
456
|
|
398
|
-
ld_pkg = ManifestLoader.LoadedPackage(self,
|
457
|
+
ld_pkg = ManifestLoader.LoadedPackage(self, package_name)
|
399
458
|
|
400
459
|
ld_man_lst: ta.List[ManifestLoader.LoadedManifest] = []
|
401
460
|
for raw in raw_lst:
|
402
|
-
|
461
|
+
rsv = self._resolve_raw_manifest(raw, package_name=package_name)
|
462
|
+
|
463
|
+
ld_man = ManifestLoader.LoadedManifest(ld_pkg, rsv)
|
403
464
|
|
404
465
|
ld_man_lst.append(ld_man)
|
405
466
|
|
@@ -407,19 +468,19 @@ class ManifestLoader:
|
|
407
468
|
|
408
469
|
return ld_pkg
|
409
470
|
|
410
|
-
def _load_package_locked(self,
|
471
|
+
def _load_package_locked(self, package_name: str) -> ta.Optional[LoadedPackage]:
|
411
472
|
try:
|
412
|
-
return self._loaded_packages[
|
473
|
+
return self._loaded_packages[package_name]
|
413
474
|
except KeyError:
|
414
475
|
pass
|
415
476
|
|
416
|
-
pkg = self._load_package_uncached(
|
417
|
-
self._loaded_packages[
|
477
|
+
pkg = self._load_package_uncached(package_name)
|
478
|
+
self._loaded_packages[package_name] = pkg
|
418
479
|
return pkg
|
419
480
|
|
420
|
-
def load_package(self,
|
481
|
+
def load_package(self, package_name: str) -> ta.Optional[LoadedPackage]:
|
421
482
|
with self._lock:
|
422
|
-
return self._load_package_locked(
|
483
|
+
return self._load_package_locked(package_name)
|
423
484
|
|
424
485
|
##
|
425
486
|
|
@@ -429,10 +490,9 @@ class ManifestLoader:
|
|
429
490
|
else:
|
430
491
|
return cls(**kwargs)
|
431
492
|
|
432
|
-
def
|
433
|
-
|
434
|
-
|
435
|
-
value = self._instantiate_value(cls, **value_dct)
|
493
|
+
def _instantiate_resolved_manifest(self, resolved: _ResolvedManifest) -> ta.Any:
|
494
|
+
cls = self._load_class(resolved.class_key)
|
495
|
+
value = self._instantiate_value(cls, **resolved.value_dct)
|
436
496
|
return value
|
437
497
|
|
438
498
|
##
|
omlish/manifests/static.py
CHANGED
@@ -13,8 +13,8 @@ class StaticModAttrManifest(dc.Static, ModAttrManifest, abc.ABC):
|
|
13
13
|
def __init_subclass__(cls, **kwargs: ta.Any) -> None:
|
14
14
|
if (
|
15
15
|
not (lang.is_abstract_class(cls) or abc.ABC in cls.__bases__) and
|
16
|
-
'
|
16
|
+
'module' not in cls.__dict__
|
17
17
|
):
|
18
|
-
setattr(cls, '
|
18
|
+
setattr(cls, 'module', cls.__module__)
|
19
19
|
|
20
20
|
super().__init_subclass__(**kwargs)
|
omlish/manifests/types.py
CHANGED
@@ -9,7 +9,7 @@ import typing as ta
|
|
9
9
|
|
10
10
|
@dc.dataclass(frozen=True)
|
11
11
|
class ManifestOrigin:
|
12
|
-
module: str
|
12
|
+
module: str # Always starts with exactly one '.'
|
13
13
|
attr: ta.Optional[str] # None if inline
|
14
14
|
|
15
15
|
file: str
|
@@ -18,4 +18,4 @@ class ManifestOrigin:
|
|
18
18
|
|
19
19
|
@dc.dataclass(frozen=True)
|
20
20
|
class Manifest(ManifestOrigin):
|
21
|
-
value: ta.Any
|
21
|
+
value: ta.Any # [{class_key: value_dct}], where class_key is of the form `!.foo.bar.Class` or `!baz.quz.Class`
|
omlish/marshal/factories.py
CHANGED
@@ -41,6 +41,7 @@ class TypeMapFactory(mfs.MatchFn[[C, rfl.Type], R]):
|
|
41
41
|
class TypeCacheFactory(mfs.MatchFn[[C, rfl.Type], R]):
|
42
42
|
def __init__(self, f: mfs.MatchFn[[C, rfl.Type], R]) -> None:
|
43
43
|
super().__init__()
|
44
|
+
|
44
45
|
self._f = f
|
45
46
|
self._dct: dict[rfl.Type, R | None] = {}
|
46
47
|
self._mtx = threading.RLock()
|
@@ -90,6 +91,7 @@ class RecursiveTypeFactory(mfs.MatchFn[[C, rfl.Type], R]):
|
|
90
91
|
prx: ta.Callable[[], tuple[R, ta.Callable[[R], None]]],
|
91
92
|
) -> None:
|
92
93
|
super().__init__()
|
94
|
+
|
93
95
|
self._f = f
|
94
96
|
self._prx = prx
|
95
97
|
self._dct: dict[rfl.Type, R] = {}
|
@@ -39,6 +39,7 @@ class Impls(ta.Sequence[Impl]):
|
|
39
39
|
lst: ta.Iterable[Impl],
|
40
40
|
) -> None:
|
41
41
|
super().__init__()
|
42
|
+
|
42
43
|
self._lst = list(lst)
|
43
44
|
|
44
45
|
by_ty: dict[type, Impl] = {}
|
@@ -89,6 +90,7 @@ class Polymorphism:
|
|
89
90
|
impls: ta.Iterable[Impl],
|
90
91
|
) -> None:
|
91
92
|
super().__init__()
|
93
|
+
|
92
94
|
self._ty = ty
|
93
95
|
self._impls = Impls(impls)
|
94
96
|
|
omlish/marshal/registries.py
CHANGED
@@ -35,6 +35,7 @@ class _KeyRegistryItems:
|
|
35
35
|
class Registry:
|
36
36
|
def __init__(self) -> None:
|
37
37
|
super().__init__()
|
38
|
+
|
38
39
|
self._mtx = threading.Lock()
|
39
40
|
self._idct: ta.MutableMapping[ta.Any, _KeyRegistryItems] = col.IdentityKeyDict()
|
40
41
|
self._dct: dict[ta.Any, _KeyRegistryItems] = {}
|
omlish/multiprocessing/spawn.py
CHANGED
@@ -24,6 +24,7 @@ class ExtrasSpawnPosixPopen(mp.popen_spawn_posix.Popen):
|
|
24
24
|
def __init__(self, process_obj: 'ExtrasSpawnProcess', *, extras: SpawnExtras) -> None:
|
25
25
|
self.__extras = extras
|
26
26
|
self.__pass_fds = extras.pass_fds
|
27
|
+
|
27
28
|
super().__init__(process_obj)
|
28
29
|
|
29
30
|
def _launch(self, process_obj: 'ExtrasSpawnProcess') -> None:
|
@@ -38,6 +39,7 @@ class ExtrasSpawnPosixPopen(mp.popen_spawn_posix.Popen):
|
|
38
39
|
class ExtrasSpawnProcess(mp.context.SpawnProcess):
|
39
40
|
def __init__(self, *args: ta.Any, extras: SpawnExtras, **kwargs: ta.Any) -> None:
|
40
41
|
self.__extras = extras
|
42
|
+
|
41
43
|
super().__init__(*args, **kwargs)
|
42
44
|
|
43
45
|
def _Popen(self, process_obj: 'ExtrasSpawnProcess') -> ExtrasSpawnPosixPopen: # type: ignore # noqa
|
@@ -56,6 +58,7 @@ class ExtrasSpawnProcess(mp.context.SpawnProcess):
|
|
56
58
|
class ExtrasSpawnContext(mp.context.SpawnContext):
|
57
59
|
def __init__(self, extras: SpawnExtras = SpawnExtras()) -> None:
|
58
60
|
self.__extras = extras
|
61
|
+
|
59
62
|
super().__init__()
|
60
63
|
|
61
64
|
def Process(self, *args: ta.Any, **kwargs: ta.Any): # type: ignore # noqa
|
omlish/os/pidfiles/__main__.py
CHANGED
omlish/secrets/openssl.py
CHANGED
@@ -56,6 +56,7 @@ class OpensslAescbcCrypto(Crypto):
|
|
56
56
|
iters: int = 10_000,
|
57
57
|
) -> None:
|
58
58
|
super().__init__()
|
59
|
+
|
59
60
|
self._iters = iters
|
60
61
|
|
61
62
|
def generate_key(self, sz: int = DEFAULT_KEY_SIZE) -> bytes:
|
@@ -131,6 +132,7 @@ class OpensslSubprocessAescbcCrypto(Crypto):
|
|
131
132
|
file_input: SubprocessFileInputMethod = temp_subprocess_file_input,
|
132
133
|
) -> None:
|
133
134
|
super().__init__()
|
135
|
+
|
134
136
|
self._cmd = cmd
|
135
137
|
self._timeout = timeout
|
136
138
|
self._file_input = file_input
|
omlish/secrets/pwgen.py
CHANGED
@@ -76,9 +76,9 @@ def _main() -> None:
|
|
76
76
|
|
77
77
|
|
78
78
|
# @omlish-manifest
|
79
|
-
_CLI_MODULE = {'
|
80
|
-
'
|
81
|
-
'
|
79
|
+
_CLI_MODULE = {'!omdev.cli.types.CliModule': {
|
80
|
+
'name': 'pwgen',
|
81
|
+
'module': __name__,
|
82
82
|
}}
|
83
83
|
|
84
84
|
|