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.
Files changed (75) hide show
  1. omlish/.manifests.json +80 -80
  2. omlish/__about__.py +2 -2
  3. omlish/asyncs/anyio/sync.py +3 -0
  4. omlish/asyncs/bluelet/runner.py +1 -0
  5. omlish/asyncs/bluelet/sockets.py +2 -0
  6. omlish/asyncs/sync.py +1 -0
  7. omlish/bootstrap/__main__.py +3 -3
  8. omlish/bootstrap/base.py +2 -0
  9. omlish/bootstrap/harness.py +1 -0
  10. omlish/codecs/base.py +4 -4
  11. omlish/codecs/text.py +1 -0
  12. omlish/collections/frozen.py +1 -0
  13. omlish/collections/mappings.py +2 -0
  14. omlish/collections/ordered.py +1 -0
  15. omlish/collections/sorted/sorted.py +1 -0
  16. omlish/collections/trie.py +2 -2
  17. omlish/concurrent/executors.py +1 -0
  18. omlish/dataclasses/tools/modifiers.py +1 -0
  19. omlish/diag/procfs.py +3 -3
  20. omlish/diag/threads.py +1 -0
  21. omlish/formats/codecs.py +4 -4
  22. omlish/formats/dotenv.py +5 -0
  23. omlish/formats/props.py +1 -0
  24. omlish/formats/toml/writer.py +1 -0
  25. omlish/formats/yaml.py +1 -0
  26. omlish/funcs/pipes.py +3 -0
  27. omlish/graphs/trees.py +1 -0
  28. omlish/http/jwt.py +2 -0
  29. omlish/http/multipart.py +1 -0
  30. omlish/inject/impl/injector.py +1 -0
  31. omlish/io/buffers.py +2 -0
  32. omlish/io/compress/codecs.py +4 -4
  33. omlish/iterators/unique.py +1 -0
  34. omlish/lang/classes/restrict.py +1 -0
  35. omlish/lang/classes/simple.py +1 -0
  36. omlish/lang/contextmanagers.py +1 -0
  37. omlish/lang/descriptors.py +2 -0
  38. omlish/lang/objects.py +2 -0
  39. omlish/lang/resolving.py +1 -0
  40. omlish/lifecycles/contextmanagers.py +1 -0
  41. omlish/lite/cached.py +1 -0
  42. omlish/lite/inject.py +2 -0
  43. omlish/lite/secrets.py +1 -0
  44. omlish/logs/handlers.py +1 -0
  45. omlish/manifests/base.py +4 -4
  46. omlish/manifests/loading.py +111 -51
  47. omlish/manifests/static.py +2 -2
  48. omlish/manifests/types.py +2 -2
  49. omlish/marshal/factories.py +2 -0
  50. omlish/marshal/polymorphism/metadata.py +2 -0
  51. omlish/marshal/registries.py +1 -0
  52. omlish/multiprocessing/spawn.py +3 -0
  53. omlish/os/pidfiles/__main__.py +3 -3
  54. omlish/secrets/openssl.py +2 -0
  55. omlish/secrets/pwgen.py +3 -3
  56. omlish/secrets/secrets.py +5 -0
  57. omlish/specs/jmespath/__main__.py +3 -3
  58. omlish/specs/jmespath/errors.py +4 -0
  59. omlish/specs/jmespath/visitor.py +2 -0
  60. omlish/specs/jsonschema/keywords/base.py +1 -0
  61. omlish/sql/alchemy/apiadapter.py +1 -0
  62. omlish/sql/alchemy/asyncs.py +3 -0
  63. omlish/sql/alchemy/duckdb.py +2 -0
  64. omlish/sql/api/dbapi.py +2 -0
  65. omlish/sql/params.py +3 -0
  66. omlish/sql/queries/names.py +1 -0
  67. omlish/sync.py +3 -0
  68. omlish/testing/pytest/inject/harness.py +4 -2
  69. omlish/text/asdl.py +3 -0
  70. {omlish-0.0.0.dev405.dist-info → omlish-0.0.0.dev407.dist-info}/METADATA +1 -1
  71. {omlish-0.0.0.dev405.dist-info → omlish-0.0.0.dev407.dist-info}/RECORD +75 -75
  72. {omlish-0.0.0.dev405.dist-info → omlish-0.0.0.dev407.dist-info}/WHEEL +0 -0
  73. {omlish-0.0.0.dev405.dist-info → omlish-0.0.0.dev407.dist-info}/entry_points.txt +0 -0
  74. {omlish-0.0.0.dev405.dist-info → omlish-0.0.0.dev407.dist-info}/licenses/LICENSE +0 -0
  75. {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
@@ -26,6 +26,7 @@ NodeGenerator: ta.TypeAlias = ta.Generator[NodeT]
26
26
  class NodeError(Exception, ta.Generic[NodeT]):
27
27
  def __init__(self, node: NodeT, msg: str, *args, **kwargs) -> None:
28
28
  super().__init__(msg, *args, **kwargs) # noqa
29
+
29
30
  self._node = node
30
31
 
31
32
  @property
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
@@ -31,6 +31,7 @@ class MultipartEncoder:
31
31
  boundary: bytes | None = None,
32
32
  ) -> None:
33
33
  super().__init__()
34
+
34
35
  self._fields = fields
35
36
  self._boundary = boundary or (b'----WebKitFormBoundary-' + uuid.uuid4().hex.encode('ascii'))
36
37
 
@@ -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:
@@ -67,12 +67,12 @@ def make_compression_codec(
67
67
 
68
68
 
69
69
  def make_compression_lazy_loaded_codec(
70
- mod_name: str,
71
- attr_name: str,
70
+ module: str,
71
+ attr: str,
72
72
  codec: CompressionCodec,
73
73
  ) -> codecs.LazyLoadedCodec:
74
74
  return codecs.LazyLoadedCodec.new(
75
- mod_name,
76
- attr_name,
75
+ module,
76
+ attr,
77
77
  codec,
78
78
  )
@@ -33,6 +33,7 @@ class UniqueIterator(ta.Iterator[UniqueItem[T]]):
33
33
  keyer: ta.Callable[[T], ta.Any] = lang.identity,
34
34
  ) -> None:
35
35
  super().__init__()
36
+
36
37
  self._it = enumerate(it)
37
38
  self._keyer = keyer
38
39
 
@@ -129,6 +129,7 @@ class NoBool:
129
129
  class _NoBoolDescriptor:
130
130
  def __init__(self, fn, instance=None, owner=None) -> None:
131
131
  super().__init__()
132
+
132
133
  self._fn = fn
133
134
  self._instance = instance
134
135
  self._owner = owner
@@ -91,6 +91,7 @@ class Singleton:
91
91
 
92
92
  def __init_subclass__(cls, **kwargs: ta.Any) -> None:
93
93
  super().__init_subclass__(**kwargs)
94
+
94
95
  _set_singleton_instance(super().__new__(cls)) # noqa
95
96
 
96
97
 
@@ -266,6 +266,7 @@ class Timer:
266
266
  clock: ta.Callable[[], float] | None = None,
267
267
  ) -> None:
268
268
  super().__init__()
269
+
269
270
  self._clock = clock if clock is not None else time.monotonic
270
271
 
271
272
  _start: float
@@ -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
@@ -59,4 +59,5 @@ def get_fqcn_cls(fqcn: str, *, nocheck: bool = False) -> type:
59
59
  class Resolvable:
60
60
  def __init_subclass__(cls, **kwargs: ta.Any) -> None:
61
61
  super().__init_subclass__(**kwargs)
62
+
62
63
  get_cls_fqcn(cls, nocheck=True)
@@ -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
@@ -13,6 +13,7 @@ CallableT = ta.TypeVar('CallableT', bound=ta.Callable)
13
13
  class _AbstractCachedNullary:
14
14
  def __init__(self, fn):
15
15
  super().__init__()
16
+
16
17
  self._fn = fn
17
18
  self._value = self._missing = object()
18
19
  functools.update_wrapper(self, fn)
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
@@ -12,6 +12,7 @@ class Secret:
12
12
 
13
13
  def __init__(self, *, key: ta.Optional[str] = None, value: str) -> None:
14
14
  super().__init__()
15
+
15
16
  self._key = key
16
17
  setattr(self, self._VALUE_ATTR, lambda: value)
17
18
 
omlish/logs/handlers.py CHANGED
@@ -10,6 +10,7 @@ import typing as ta
10
10
  class ListHandler(logging.Handler):
11
11
  def __init__(self) -> None:
12
12
  super().__init__()
13
+
13
14
  self.records: ta.List[logging.LogRecord] = []
14
15
 
15
16
  def emit(self, record: logging.LogRecord) -> None:
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
- mod_name: str
16
- attr_name: str
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.mod_name)
22
- return getattr(mod, self.attr_name)
21
+ mod = importlib.import_module(self.module)
22
+ return getattr(mod, self.attr)
23
23
 
24
24
 
25
25
  ##
@@ -31,35 +31,42 @@ class ManifestLoader:
31
31
  def __init__(
32
32
  self,
33
33
  package: 'ManifestLoader.LoadedPackage',
34
- manifest: Manifest,
34
+ resolved: 'ManifestLoader._ResolvedManifest',
35
35
  ) -> None:
36
36
  super().__init__()
37
37
 
38
38
  self._package = package
39
- self._manifest = manifest
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 f'{self.__class__.__name__}@{id(self):x}(package={self._package!r}, class_key={self._cls_key!r})'
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._manifest
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._instantiate_loaded_manifest(self) # noqa
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
- pass
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'${mod_name}.{cls.__qualname__}'
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
- def _deserialize_raw_manifests(self, obj: ta.Any, pkg_name: str) -> ta.Sequence[Manifest]:
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
- m = Manifest(**e)
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(pkg_name)
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(pkg_name).joinpath(file_name)
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
- def _load_package_uncached(self, pkg_name: str) -> ta.Optional[LoadedPackage]:
388
- src = self._read_package_file_text(pkg_name, self.MANIFESTS_FILE_NAME)
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
- raw_lst = self._deserialize_raw_manifests(obj, pkg_name)
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, pkg_name)
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
- ld_man = ManifestLoader.LoadedManifest(ld_pkg, raw)
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, pkg_name: str) -> ta.Optional[LoadedPackage]:
471
+ def _load_package_locked(self, package_name: str) -> ta.Optional[LoadedPackage]:
411
472
  try:
412
- return self._loaded_packages[pkg_name]
473
+ return self._loaded_packages[package_name]
413
474
  except KeyError:
414
475
  pass
415
476
 
416
- pkg = self._load_package_uncached(pkg_name)
417
- self._loaded_packages[pkg_name] = pkg
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, pkg_name: str) -> ta.Optional[LoadedPackage]:
481
+ def load_package(self, package_name: str) -> ta.Optional[LoadedPackage]:
421
482
  with self._lock:
422
- return self._load_package_locked(pkg_name)
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 _instantiate_loaded_manifest(self, ld_man: LoadedManifest) -> ta.Any:
433
- [(cls_key, value_dct)] = ld_man.manifest.value.items()
434
- cls = self._load_class(cls_key)
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
  ##
@@ -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
- 'mod_name' not in cls.__dict__
16
+ 'module' not in cls.__dict__
17
17
  ):
18
- setattr(cls, 'mod_name', cls.__module__)
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`
@@ -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
 
@@ -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] = {}
@@ -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
@@ -1,7 +1,7 @@
1
1
  # @omlish-manifest
2
- _CLI_MODULE = {'$omdev.cli.types.CliModule': {
3
- 'cmd_name': 'pidfiles',
4
- 'mod_name': __name__,
2
+ _CLI_MODULE = {'!omdev.cli.types.CliModule': {
3
+ 'name': 'pidfiles',
4
+ 'module': __name__,
5
5
  }}
6
6
 
7
7
 
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 = {'$omdev.cli.types.CliModule': {
80
- 'cmd_name': 'pwgen',
81
- 'mod_name': __name__,
79
+ _CLI_MODULE = {'!omdev.cli.types.CliModule': {
80
+ 'name': 'pwgen',
81
+ 'module': __name__,
82
82
  }}
83
83
 
84
84