omlish 0.0.0.dev401__py3-none-any.whl → 0.0.0.dev403__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 (36) hide show
  1. omlish/.manifests.json +1 -1
  2. omlish/__about__.py +3 -3
  3. omlish/argparse/cli.py +1 -0
  4. omlish/codecs/registry.py +5 -1
  5. omlish/dataclasses/_internals.py +12 -5
  6. omlish/dataclasses/impl/api/classes/make.py +67 -3
  7. omlish/dataclasses/impl/api/fields/constructor.py +7 -0
  8. omlish/dataclasses/impl/api/fields/conversion.py +14 -0
  9. omlish/dataclasses/impl/concerns/doc.py +19 -1
  10. omlish/dataclasses/impl/concerns/slots.py +37 -11
  11. omlish/dataclasses/metaclass/meta.py +22 -1
  12. omlish/dataclasses/specs.py +1 -1
  13. omlish/dataclasses/tools/static.py +1 -0
  14. omlish/dispatch/impls.py +1 -2
  15. omlish/dispatch/methods.py +0 -6
  16. omlish/inject/impl/proxy.py +2 -0
  17. omlish/inject/impl/scopes.py +4 -0
  18. omlish/io/compress/zstd.py +16 -8
  19. omlish/lang/__init__.py +2 -0
  20. omlish/lang/imports/traversal.py +1 -1
  21. omlish/lang/objects.py +1 -0
  22. omlish/lang/typing.py +32 -2
  23. omlish/lite/marshal.py +24 -24
  24. omlish/lite/reflect.py +22 -5
  25. omlish/lite/typing.py +11 -0
  26. omlish/manifests/loading.py +9 -7
  27. omlish/reflect/__init__.py +1 -0
  28. omlish/reflect/inspect.py +10 -0
  29. omlish/testing/__init__.py +1 -0
  30. omlish/testing/testing.py +30 -0
  31. {omlish-0.0.0.dev401.dist-info → omlish-0.0.0.dev403.dist-info}/METADATA +3 -3
  32. {omlish-0.0.0.dev401.dist-info → omlish-0.0.0.dev403.dist-info}/RECORD +36 -36
  33. {omlish-0.0.0.dev401.dist-info → omlish-0.0.0.dev403.dist-info}/WHEEL +0 -0
  34. {omlish-0.0.0.dev401.dist-info → omlish-0.0.0.dev403.dist-info}/entry_points.txt +0 -0
  35. {omlish-0.0.0.dev401.dist-info → omlish-0.0.0.dev403.dist-info}/licenses/LICENSE +0 -0
  36. {omlish-0.0.0.dev401.dist-info → omlish-0.0.0.dev403.dist-info}/top_level.txt +0 -0
omlish/.manifests.json CHANGED
@@ -311,7 +311,7 @@
311
311
  "module": ".io.compress.zstd",
312
312
  "attr": "_ZSTD_LAZY_CODEC",
313
313
  "file": "omlish/io/compress/zstd.py",
314
- "line": 43,
314
+ "line": 51,
315
315
  "value": {
316
316
  "$.codecs.base.LazyLoadedCodec": {
317
317
  "mod_name": "omlish.io.compress.zstd",
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev401'
2
- __revision__ = '40d67dd6b213814fd76e662f51b8e4fca8dbc6c3'
1
+ __version__ = '0.0.0.dev403'
2
+ __revision__ = '5403fd726d8c05e6b9edf0c3b0c86c6600809211'
3
3
 
4
4
 
5
5
  #
@@ -51,7 +51,7 @@ class Project(ProjectBase):
51
51
 
52
52
  'python-snappy ~= 0.7',
53
53
 
54
- 'zstandard ~= 0.23',
54
+ 'zstandard ~= 0.24; python_version < "3.14"',
55
55
 
56
56
  'brotli ~= 1.1',
57
57
  ],
omlish/argparse/cli.py CHANGED
@@ -140,6 +140,7 @@ def _get_argparse_arg_ann_kwargs(ann: ta.Any) -> ta.Mapping[str, ta.Any]:
140
140
  class _ArgparseCliAnnotationBox:
141
141
  def __init__(self, annotations: ta.Mapping[str, ta.Any]) -> None:
142
142
  super().__init__()
143
+
143
144
  self.__annotations__ = annotations # type: ignore
144
145
 
145
146
 
omlish/codecs/registry.py CHANGED
@@ -27,6 +27,8 @@ class CodecRegistry:
27
27
  ) -> None:
28
28
  super().__init__()
29
29
 
30
+ if late_load_callbacks is not None:
31
+ late_load_callbacks = list(late_load_callbacks)
30
32
  self._late_load_callbacks = late_load_callbacks
31
33
 
32
34
  self._lock = threading.RLock()
@@ -36,8 +38,10 @@ class CodecRegistry:
36
38
 
37
39
  def _late_load(self) -> None:
38
40
  if self._late_load_callbacks:
39
- for cb in self._late_load_callbacks:
41
+ while self._late_load_callbacks:
42
+ cb = self._late_load_callbacks[0]
40
43
  cb(self)
44
+ self._late_load_callbacks.pop(0)
41
45
  self._late_load_callbacks = None
42
46
 
43
47
  @contextlib.contextmanager
@@ -1,3 +1,7 @@
1
+ """
2
+ For arcane import machinery compatibility with stdlib, this must be a direct child of the 'dataclasses' package - not
3
+ under 'impl'.
4
+ """
1
5
  import dataclasses as dc
2
6
  import enum
3
7
  import sys
@@ -101,7 +105,10 @@ def _self_module():
101
105
  def std_is_classvar(cls: type, ty: ta.Any) -> bool:
102
106
  return (
103
107
  dc._is_classvar(ty, ta) # type: ignore # noqa
104
- or (isinstance(ty, str) and dc._is_type(ty, cls, ta, ta.ClassVar, dc._is_classvar)) # type: ignore # noqa
108
+ or (
109
+ isinstance(ty, str) and
110
+ dc._is_type(ty, cls, ta, ta.ClassVar, dc._is_classvar) # type: ignore # noqa
111
+ )
105
112
  )
106
113
 
107
114
 
@@ -109,8 +116,8 @@ def std_is_initvar(cls: type, ty: ta.Any) -> bool:
109
116
  return (
110
117
  dc._is_initvar(ty, dc) # type: ignore # noqa
111
118
  or (
112
- isinstance(ty, str)
113
- and any(
119
+ isinstance(ty, str) and
120
+ any(
114
121
  dc._is_type(ty, cls, mod, dc.InitVar, dc._is_initvar) # type: ignore # noqa
115
122
  for mod in (dc, _self_module())
116
123
  )
@@ -122,8 +129,8 @@ def std_is_kw_only(cls: type, ty: ta.Any) -> bool:
122
129
  return (
123
130
  dc._is_kw_only(ty, dc) # type: ignore # noqa
124
131
  or (
125
- isinstance(ty, str)
126
- and any(
132
+ isinstance(ty, str) and
133
+ any(
127
134
  dc._is_type(ty, cls, mod, dc.KW_ONLY, dc._is_kw_only) # type: ignore # noqa
128
135
  for mod in (dc, _self_module())
129
136
  )
@@ -10,6 +10,14 @@ from .decorator import dataclass
10
10
  ##
11
11
 
12
12
 
13
+ _IS_PY_3_14 = sys.version_info >= (3, 14)
14
+
15
+ if _IS_PY_3_14:
16
+ import annotationlib # noqa
17
+
18
+ _ANY_MARKER = object()
19
+
20
+
13
21
  def make_dataclass( # noqa
14
22
  cls_name,
15
23
  fields,
@@ -31,6 +39,8 @@ def make_dataclass( # noqa
31
39
 
32
40
  module=None,
33
41
 
42
+ decorator=dataclass,
43
+
34
44
  #
35
45
 
36
46
  metadata: ta.Sequence[ta.Any] | None = None,
@@ -46,6 +56,12 @@ def make_dataclass( # noqa
46
56
 
47
57
  allow_redundant_decorator: bool | None = None,
48
58
  ):
59
+ if decorator is not dataclass:
60
+ raise TypeError(
61
+ f'The `decorator` kwarg, as added in https://github.com/python/cpython/pull/122723, is not supported. '
62
+ f'{decorator=}',
63
+ )
64
+
49
65
  if namespace is None:
50
66
  namespace = {}
51
67
 
@@ -55,7 +71,10 @@ def make_dataclass( # noqa
55
71
  for item in fields:
56
72
  if isinstance(item, str):
57
73
  name = item
58
- tp = 'typing.Any'
74
+ if _IS_PY_3_14:
75
+ tp = _ANY_MARKER
76
+ else:
77
+ tp = 'typing.Any'
59
78
  elif len(item) == 2:
60
79
  name, tp, = item
61
80
  elif len(item) == 3:
@@ -73,13 +92,52 @@ def make_dataclass( # noqa
73
92
  seen.add(name)
74
93
  annotations[name] = tp
75
94
 
95
+ if _IS_PY_3_14:
96
+ # We initially block the VALUE format, because inside dataclass() we'll call get_annotations(), which will try
97
+ # the VALUE format first. If we don't block, that means we'd always end up eagerly importing typing here, which
98
+ # is what we're trying to avoid.
99
+ value_blocked = True
100
+
101
+ def annotate_method(format): # noqa
102
+ def get_any():
103
+ match format:
104
+ case annotationlib.Format.STRING:
105
+ return 'typing.Any'
106
+ case annotationlib.Format.FORWARDREF:
107
+ typing = sys.modules.get('typing')
108
+ if typing is None:
109
+ return annotationlib.ForwardRef('Any', module='typing')
110
+ else:
111
+ return typing.Any
112
+ case annotationlib.Format.VALUE:
113
+ if value_blocked:
114
+ raise NotImplementedError
115
+ from typing import Any
116
+ return Any
117
+ case _:
118
+ raise NotImplementedError
119
+
120
+ annos = {
121
+ ann: get_any() if t is _ANY_MARKER else t
122
+ for ann, t in annotations.items()
123
+ }
124
+ if format == annotationlib.Format.STRING:
125
+ return annotationlib.annotations_to_string(annos)
126
+ else:
127
+ return annos
128
+
76
129
  def exec_body_callback(ns):
77
130
  ns.update(namespace)
78
131
  ns.update(defaults)
79
- ns['__annotations__'] = annotations
132
+ if not _IS_PY_3_14:
133
+ ns['__annotations__'] = annotations
80
134
 
81
135
  cls = types.new_class(cls_name, bases, {}, exec_body_callback)
82
136
 
137
+ if _IS_PY_3_14:
138
+ # For now, set annotations including the _ANY_MARKER.
139
+ cls.__annotate__ = annotate_method # type: ignore
140
+
83
141
  if module is None:
84
142
  try:
85
143
  module = sys._getframemodulename(1) or '__main__' # type: ignore # noqa
@@ -89,7 +147,7 @@ def make_dataclass( # noqa
89
147
  if module is not None:
90
148
  cls.__module__ = module
91
149
 
92
- return dataclass(
150
+ cls = decorator(
93
151
  cls,
94
152
  init=init,
95
153
  repr=repr,
@@ -117,3 +175,9 @@ def make_dataclass( # noqa
117
175
 
118
176
  allow_redundant_decorator=allow_redundant_decorator,
119
177
  )
178
+
179
+ if _IS_PY_3_14:
180
+ # Now that the class is ready, allow the VALUE format.
181
+ value_blocked = False
182
+
183
+ return cls
@@ -1,5 +1,6 @@
1
1
  import collections
2
2
  import dataclasses as dc
3
+ import sys
3
4
  import typing as ta
4
5
 
5
6
  from ..... import lang
@@ -13,6 +14,9 @@ from .metadata import extra_field_params
13
14
  ##
14
15
 
15
16
 
17
+ _IS_PY_3_14 = sys.version_info >= (3, 14)
18
+
19
+
16
20
  def field(
17
21
  default=dc.MISSING,
18
22
  *,
@@ -23,6 +27,7 @@ def field(
23
27
  compare=True,
24
28
  metadata=None,
25
29
  kw_only=dc.MISSING,
30
+ doc=None,
26
31
 
27
32
  coerce: bool | CoerceFn | None = None,
28
33
  validate: ValidateFn | None = None, # noqa
@@ -40,6 +45,7 @@ def field(
40
45
  override=override,
41
46
  repr_fn=repr_fn,
42
47
  repr_priority=repr_priority,
48
+ doc=doc,
43
49
  ),
44
50
  })
45
51
 
@@ -58,4 +64,5 @@ def field(
58
64
  compare=compare,
59
65
  metadata=md,
60
66
  kw_only=kw_only,
67
+ **(dict(doc=doc) if _IS_PY_3_14 else {}),
61
68
  )
@@ -1,4 +1,5 @@
1
1
  import dataclasses as dc
2
+ import sys
2
3
  import typing as ta
3
4
 
4
5
  from ..... import check
@@ -16,6 +17,12 @@ from .metadata import set_field_spec_metadata
16
17
  ##
17
18
 
18
19
 
20
+ _IS_PY_3_14 = sys.version_info >= (3, 14)
21
+
22
+
23
+ ##
24
+
25
+
19
26
  STD_FIELD_TYPE_BY_SPEC_FIELD_TYPE: ta.Mapping[FieldType, StdFieldType] = {
20
27
  FieldType.INSTANCE: StdFieldType.INSTANCE,
21
28
  FieldType.CLASS_VAR: StdFieldType.CLASS_VAR,
@@ -99,6 +106,10 @@ def std_field_to_field_spec(
99
106
  metadata=f.metadata,
100
107
  kw_only=None if f.kw_only is dc.MISSING else (check.isinstance(f.kw_only, bool) if DEBUG else f.kw_only),
101
108
 
109
+ **lang.opt_kw(
110
+ doc=extra_params.get('doc', f.doc if _IS_PY_3_14 else None), # type: ignore[attr-defined] # noqa
111
+ ),
112
+
102
113
  **lang.opt_kw(
103
114
  coerce=extra_params.get('coerce'),
104
115
  validate=extra_params.get('validate'),
@@ -133,6 +144,7 @@ def field_spec_to_std_field(fs: FieldSpec) -> dc.Field:
133
144
  compare=fs.compare,
134
145
  **lang.opt_kw(metadata=fs.metadata),
135
146
  kw_only=dc.MISSING if fs.kw_only is None else fs.kw_only, # type: ignore[arg-type]
147
+ **(dict(doc=fs.doc) if _IS_PY_3_14 else {}),
136
148
  )
137
149
 
138
150
  f.name = fs.name
@@ -162,6 +174,7 @@ def check_field_spec_against_field(f: dc.Field, fs: FieldSpec) -> None:
162
174
  'compare': f.compare,
163
175
  # f.metadata,
164
176
  'kw_only': f.kw_only if f.kw_only is not dc.MISSING else None,
177
+ **({'doc': f.doc} if _IS_PY_3_14 else {}), # type: ignore[attr-defined] # noqa
165
178
 
166
179
  'std_field_type': f._field_type, # type: ignore[attr-defined] # noqa
167
180
  }
@@ -178,6 +191,7 @@ def check_field_spec_against_field(f: dc.Field, fs: FieldSpec) -> None:
178
191
  'compare': fs.compare,
179
192
  # fs.metadata,
180
193
  'kw_only': fs.kw_only,
194
+ **({'doc': fs.doc} if _IS_PY_3_14 else {}),
181
195
 
182
196
  'std_field_type': STD_FIELD_TYPE_BY_SPEC_FIELD_TYPE[fs.field_type].value,
183
197
  }
@@ -1,4 +1,5 @@
1
1
  import inspect
2
+ import sys
2
3
 
3
4
  from ..processing.base import ProcessingContext
4
5
  from ..processing.base import Processor
@@ -9,14 +10,31 @@ from ..processing.registry import register_processor_type
9
10
  ##
10
11
 
11
12
 
13
+ if sys.version_info >= (3, 14):
14
+ import annotationlib # noqa
15
+
16
+ def _raw_build_cls_sig(cls: type) -> str:
17
+ return str(inspect.signature(
18
+ cls,
19
+ annotation_format=annotationlib.Format.FORWARDREF, # noqa
20
+ )).replace(' -> None', '')
21
+
22
+ else:
23
+ def _raw_build_cls_sig(cls: type) -> str:
24
+ return str(inspect.signature(cls)).replace(' -> None', '')
25
+
26
+
12
27
  def _build_cls_doc(cls: type) -> str:
13
28
  try:
14
- text_sig = str(inspect.signature(cls)).replace(' -> None', '')
29
+ text_sig = _raw_build_cls_sig(cls)
15
30
  except (TypeError, ValueError):
16
31
  text_sig = ''
17
32
  return cls.__name__ + text_sig
18
33
 
19
34
 
35
+ ##
36
+
37
+
20
38
  class _LazyClsDocDescriptor:
21
39
  def __get__(self, instance, owner):
22
40
  if instance is not None:
@@ -2,6 +2,7 @@ import dataclasses as dc
2
2
  import inspect
3
3
  import itertools
4
4
  import types
5
+ import typing as ta
5
6
 
6
7
  from ..processing.base import Processor
7
8
  from ..processing.priority import ProcessorPriority
@@ -63,11 +64,41 @@ def _update_func_cell_for__class__(f, oldcls, newcls):
63
64
  return False
64
65
 
65
66
 
67
+ def _create_slots(
68
+ defined_fields,
69
+ inherited_slots,
70
+ field_names,
71
+ weakref_slot,
72
+ ):
73
+ # The slots for our class. Remove slots from our base classes. Add '__weakref__' if weakref_slot was given, unless
74
+ # it is already present.
75
+ seen_docs = False
76
+ slots = {}
77
+ for slot in itertools.filterfalse(
78
+ inherited_slots.__contains__,
79
+ itertools.chain(
80
+ # gh-93521: '__weakref__' also needs to be filtered out if already present in inherited_slots
81
+ field_names, ('__weakref__',) if weakref_slot else (),
82
+ ),
83
+ ):
84
+ doc = getattr(defined_fields.get(slot), 'doc', None)
85
+ if doc is not None:
86
+ seen_docs = True
87
+ slots[slot] = doc
88
+
89
+ # We only return dict if there's at least one doc member, otherwise we return tuple, which is the old default
90
+ # format.
91
+ if seen_docs:
92
+ return slots
93
+ return tuple(slots)
94
+
95
+
66
96
  def add_slots(
67
97
  cls: type,
68
98
  *,
69
99
  is_frozen: bool,
70
100
  weakref_slot: bool,
101
+ defined_fields: ta.Mapping[str, ta.Any],
71
102
  ) -> type:
72
103
  # Need to create a new class, since we can't set __slots__ after a class has been created, and the @dataclass
73
104
  # decorator is called after the class is created.
@@ -83,17 +114,11 @@ def add_slots(
83
114
  # Make sure slots don't overlap with those in base classes.
84
115
  inherited_slots = set(itertools.chain.from_iterable(map(_get_slots, cls.__mro__[1:-1])))
85
116
 
86
- # The slots for our class. Remove slots from our base classes. Add '__weakref__' if weakref_slot was given, unless
87
- # it is already present.
88
- cls_dict['__slots__'] = tuple(
89
- itertools.filterfalse(
90
- inherited_slots.__contains__,
91
- itertools.chain(
92
- field_names,
93
- # gh-93521: '__weakref__' also needs to be filtered out if already present in inherited_slots
94
- ('__weakref__',) if weakref_slot else (),
95
- ),
96
- ),
117
+ cls_dict['__slots__'] = _create_slots(
118
+ defined_fields,
119
+ inherited_slots,
120
+ field_names,
121
+ weakref_slot,
97
122
  )
98
123
 
99
124
  for field_name in field_names:
@@ -156,4 +181,5 @@ class SlotsProcessor(Processor):
156
181
  cls,
157
182
  is_frozen=self._ctx.cs.frozen,
158
183
  weakref_slot=self._ctx.cs.weakref_slot,
184
+ defined_fields=self._ctx.cs.fields_by_name,
159
185
  )
@@ -5,6 +5,7 @@ TODO:
5
5
  """
6
6
  import abc
7
7
  import dataclasses as dc
8
+ import sys
8
9
  import typing as ta
9
10
 
10
11
  from ... import lang
@@ -21,6 +22,26 @@ T = ta.TypeVar('T')
21
22
  ##
22
23
 
23
24
 
25
+ if sys.version_info >= (3, 14):
26
+ annotationlib = __import__('annotationlib') # noqa
27
+
28
+ # See:
29
+ # - https://github.com/python/cpython/pull/132345
30
+ # - https://github.com/python/cpython/pull/132490
31
+ def _get_ns_annotation_names(ns: ta.Mapping[str, ta.Any]) -> ta.Sequence[str]:
32
+ if (fn := annotationlib.get_annotate_from_class_namespace(ns)) is not None: # noqa
33
+ return list(annotationlib.call_annotate_function(fn, annotationlib.Format.FORWARDREF)) # noqa
34
+ else:
35
+ return []
36
+
37
+ else:
38
+ def _get_ns_annotation_names(ns: ta.Mapping[str, ta.Any]) -> ta.Sequence[str]:
39
+ return list(ns.get('__annotations__', []))
40
+
41
+
42
+ ##
43
+
44
+
24
45
  class DataMeta(abc.ABCMeta):
25
46
  def __new__(
26
47
  mcls,
@@ -88,7 +109,7 @@ class DataMeta(abc.ABCMeta):
88
109
 
89
110
  ofs: set[str] = set()
90
111
  if any(issubclass(b, lang.Abstract) for b in bases) and nkw.get('override'):
91
- ofs.update(a for a in namespace.get('__annotations__', []) if a not in namespace)
112
+ ofs.update(a for a in _get_ns_annotation_names(namespace) if a not in namespace)
92
113
  namespace.update((a, dc.MISSING) for a in ofs)
93
114
 
94
115
  #
@@ -65,7 +65,7 @@ class FieldSpec(lang.Final):
65
65
 
66
66
  kw_only: bool | None = None
67
67
 
68
- # doc: ta.Any = None
68
+ doc: ta.Any = None
69
69
 
70
70
  ##
71
71
  # ext
@@ -155,6 +155,7 @@ class Static(lang.Abstract):
155
155
  if k not in new_anns
156
156
  })
157
157
 
158
+ # FIXME: 3.14
158
159
  cls.__annotations__ = new_anns
159
160
 
160
161
  else:
omlish/dispatch/impls.py CHANGED
@@ -20,8 +20,7 @@ T = ta.TypeVar('T')
20
20
 
21
21
 
22
22
  def get_impl_func_cls_set(func: ta.Callable, *, arg_offset: int = 0) -> frozenset[type]:
23
- ann = getattr(func, '__annotations__', {})
24
- if not ann:
23
+ if not rfl.has_annotations(func):
25
24
  raise TypeError(f'Invalid impl func: {func!r}')
26
25
 
27
26
  def erase(a):
@@ -101,12 +101,6 @@ class Method(ta.Generic[P, R]):
101
101
  return wrapper
102
102
 
103
103
  def register(self, impl: T, cls_set: frozenset[type] | None = None) -> T:
104
- # bpo-39679: in Python <= 3.9, classmethods and staticmethods don't inherit __annotations__ of the wrapped
105
- # function (fixed in 3.10+ as a side-effect of bpo-43682) but we need that for annotation-derived
106
- # singledispatches. So we add that just-in-time here.
107
- if isinstance(impl, (staticmethod, classmethod)):
108
- impl.__annotations__ = getattr(impl.__func__, '__annotations__', {})
109
-
110
104
  check.callable(impl)
111
105
  if impl not in self._impls:
112
106
  self._impls[impl] = cls_set # type: ignore
@@ -15,6 +15,7 @@ def _cyclic_dependency_proxy() -> tuple[type, ta.Callable[[ta.Any, ta.Any], None
15
15
 
16
16
  def __init__(self, cls: ta.Any) -> None:
17
17
  super().__init__()
18
+
18
19
  self.__cls = cls
19
20
 
20
21
  def __repr__(self) -> str:
@@ -24,6 +25,7 @@ def _cyclic_dependency_proxy() -> tuple[type, ta.Callable[[ta.Any, ta.Any], None
24
25
 
25
26
  def __init__(self, cls):
26
27
  super().__init__(_CyclicDependencyPlaceholder(cls))
28
+
27
29
  if isinstance(cls, type):
28
30
  self._self__class__ = cls # noqa
29
31
 
@@ -67,6 +67,7 @@ class UnscopedScopeImpl(ScopeImpl, lang.Final):
67
67
  class SingletonScopeImpl(ScopeImpl, lang.Final):
68
68
  def __init__(self) -> None:
69
69
  super().__init__()
70
+
70
71
  self._dct: dict[BindingImpl, ta.Any] = {}
71
72
 
72
73
  @property
@@ -86,6 +87,7 @@ class SingletonScopeImpl(ScopeImpl, lang.Final):
86
87
  class ThreadScopeImpl(ScopeImpl, lang.Final):
87
88
  def __init__(self) -> None:
88
89
  super().__init__()
90
+
89
91
  self._local = threading.local()
90
92
 
91
93
  @property
@@ -135,6 +137,7 @@ class SeededScopeImpl(ScopeImpl):
135
137
 
136
138
  def __init__(self, ss: SeededScope) -> None:
137
139
  super().__init__()
140
+
138
141
  self._ss = check.isinstance(ss, SeededScope)
139
142
  self._st: SeededScopeImpl.State | None = None
140
143
 
@@ -150,6 +153,7 @@ class SeededScopeImpl(ScopeImpl):
150
153
  class Manager(SeededScope.Manager, lang.Final):
151
154
  def __init__(self, ss: SeededScope, i: Injector) -> None:
152
155
  super().__init__()
156
+
153
157
  self._ss = check.isinstance(ss, SeededScope)
154
158
  self._ii = check.isinstance(i, injector_.InjectorImpl)
155
159
  self._ssi = check.isinstance(self._ii.get_scope_impl(self._ss), SeededScopeImpl)
@@ -1,4 +1,5 @@
1
1
  import dataclasses as dc
2
+ import sys
2
3
  import typing as ta
3
4
 
4
5
  from ... import lang
@@ -7,10 +8,17 @@ from .codecs import make_compression_codec
7
8
  from .codecs import make_compression_lazy_loaded_codec
8
9
 
9
10
 
10
- if ta.TYPE_CHECKING:
11
- import zstandard
12
- else:
13
- zstandard = lang.proxy_import('zstandard')
11
+ if sys.version_info >= (3, 14):
12
+ if ta.TYPE_CHECKING:
13
+ from compression import zstd # noqa
14
+ else:
15
+ zstd = lang.proxy_import('compression.zstd')
16
+
17
+ else: # noqa
18
+ if ta.TYPE_CHECKING:
19
+ import zstandard as zstd
20
+ else:
21
+ zstd = lang.proxy_import('zstandard')
14
22
 
15
23
 
16
24
  ##
@@ -20,18 +28,18 @@ else:
20
28
  class ZstdCompression(Compression):
21
29
  level: int | None = None
22
30
 
23
- max_output_size: int = 0
31
+ # max_output_size: int = 0
24
32
 
25
33
  def compress(self, d: bytes) -> bytes:
26
- return zstandard.compress(
34
+ return zstd.compress(
27
35
  d,
28
36
  **(dict(level=self.level) if self.level is not None else {}),
29
37
  )
30
38
 
31
39
  def decompress(self, d: bytes) -> bytes:
32
- return zstandard.decompress(
40
+ return zstd.decompress(
33
41
  d,
34
- max_output_size=self.max_output_size,
42
+ # max_output_size=self.max_output_size,
35
43
  )
36
44
 
37
45
 
omlish/lang/__init__.py CHANGED
@@ -446,4 +446,6 @@ from ..lite.typing import ( # noqa
446
446
  Func1,
447
447
  Func2,
448
448
  Func3,
449
+
450
+ typing_annotations_attr,
449
451
  )
@@ -1,6 +1,6 @@
1
1
  """
2
2
  TODO:
3
- - overhaul this - use pkgutil.walk_packages unless called needs non-importing (which this currently doesn't do anyway),
3
+ - overhaul this - use pkgutil.walk_packages unless caller needs non-importing (which this currently doesn't do anyway),
4
4
  and support namespace packages if they do.
5
5
  """
6
6
  import contextlib
omlish/lang/objects.py CHANGED
@@ -72,6 +72,7 @@ def super_meta(
72
72
  **kwargs: ta.Any,
73
73
  ) -> type:
74
74
  """Per types.new_class"""
75
+
75
76
  resolved_bases = types.resolve_bases(bases)
76
77
  if resolved_bases is not bases:
77
78
  if '__orig_bases__' in namespace:
omlish/lang/typing.py CHANGED
@@ -59,43 +59,68 @@ def protocol_check(proto: type) -> ta.Callable[[Ty], Ty]:
59
59
  ##
60
60
 
61
61
 
62
- _MISSING = object()
62
+ _ANN_ATTRS: frozenset[str] = frozenset([
63
+ '__annotations__',
64
+
65
+ '__annotate__',
66
+ '__annotate_func__',
67
+
68
+ '__annotations_cache__',
69
+ ])
70
+
71
+ _UPDATE_WRAPPER_ASSIGNED_NO_ANNS = list(frozenset(functools.WRAPPER_ASSIGNMENTS) - _ANN_ATTRS)
63
72
 
64
73
 
65
74
  def _update_wrapper_no_anns(wrapper, wrapped):
66
- functools.update_wrapper(wrapper, wrapped, assigned=list(set(functools.WRAPPER_ASSIGNMENTS) - {'__annotations__'}))
75
+ functools.update_wrapper(wrapper, wrapped, assigned=_UPDATE_WRAPPER_ASSIGNED_NO_ANNS)
67
76
  return wrapper
68
77
 
69
78
 
79
+ ##
80
+
81
+
82
+ _MISSING = object()
83
+
84
+
70
85
  def typed_lambda(ret=_MISSING, **kw): # noqa
71
86
  def inner(fn):
72
87
  ns = {}
73
88
  ns['__fn'] = fn
89
+
74
90
  proto = ['def __lam(']
75
91
  call = ['return __fn(']
92
+
76
93
  pkw = dict(kw)
77
94
  for i, (n, t) in enumerate(pkw.items()):
78
95
  if i:
79
96
  call.append(', ')
80
97
  else:
81
98
  proto.append('*')
99
+
82
100
  ns['__ann_' + n] = t
83
101
  proto.append(f', {n}: __ann_{n}')
84
102
  call.append(f'{n}={n}')
103
+
85
104
  proto.append(')')
105
+
86
106
  if ret is not _MISSING:
87
107
  ns['__ann_return'] = ret
88
108
  proto.append(f' -> __ann_return')
109
+
89
110
  proto.append(':')
90
111
  call.append(')')
112
+
91
113
  src = f'{"".join(proto)} {"".join(call)}'
92
114
  exec(src, ns)
115
+
93
116
  lam = _update_wrapper_no_anns(ns['__lam'], fn)
94
117
  lam.__signature__ = inspect.signature(lam, follow_wrapped=False)
95
118
  return lam
119
+
96
120
  for k in kw:
97
121
  if k.startswith('__'):
98
122
  raise NameError(k)
123
+
99
124
  return inner
100
125
 
101
126
 
@@ -103,13 +128,17 @@ def typed_partial(obj, **kw): # noqa
103
128
  for k in kw:
104
129
  if k.startswith('__'):
105
130
  raise NameError(k)
131
+
106
132
  sig = inspect.signature(obj)
133
+
107
134
  inner = _update_wrapper_no_anns(lambda **lkw: obj(**lkw, **kw), obj)
135
+
108
136
  ret = (
109
137
  obj if isinstance(obj, type) else
110
138
  sig.return_annotation if sig.return_annotation is not inspect.Signature.empty else
111
139
  _MISSING
112
140
  )
141
+
113
142
  lam = typed_lambda(
114
143
  ret,
115
144
  **{
@@ -119,6 +148,7 @@ def typed_partial(obj, **kw): # noqa
119
148
  and p.annotation is not inspect.Signature.empty
120
149
  },
121
150
  )(inner)
151
+
122
152
  return _update_wrapper_no_anns(lam, obj)
123
153
 
124
154
 
omlish/lite/marshal.py CHANGED
@@ -545,32 +545,32 @@ class ObjMarshalerManager:
545
545
  [e] = ta.get_args(ty)
546
546
  return IterableObjMarshaler(st, rec(e))
547
547
 
548
- if is_union_alias(ty):
549
- uts = frozenset(ta.get_args(ty))
550
- if None in uts or type(None) in uts:
551
- is_opt = True
552
- uts = frozenset(ut for ut in uts if ut not in (None, type(None)))
553
- else:
554
- is_opt = False
548
+ if is_union_alias(ty):
549
+ uts = frozenset(ta.get_args(ty))
550
+ if None in uts or type(None) in uts:
551
+ is_opt = True
552
+ uts = frozenset(ut for ut in uts if ut not in (None, type(None)))
553
+ else:
554
+ is_opt = False
555
555
 
556
- um: ObjMarshaler
557
- if not uts:
558
- raise TypeError(ty)
559
- elif len(uts) == 1:
560
- um = rec(check.single(uts))
556
+ um: ObjMarshaler
557
+ if not uts:
558
+ raise TypeError(ty)
559
+ elif len(uts) == 1:
560
+ um = rec(check.single(uts))
561
+ else:
562
+ pt = tuple({ut for ut in uts if ut in _OBJ_MARSHALER_PRIMITIVE_TYPES})
563
+ np_uts = {ut for ut in uts if ut not in _OBJ_MARSHALER_PRIMITIVE_TYPES}
564
+ if not np_uts:
565
+ um = PrimitiveUnionObjMarshaler(pt)
566
+ elif len(np_uts) == 1:
567
+ um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
561
568
  else:
562
- pt = tuple({ut for ut in uts if ut in _OBJ_MARSHALER_PRIMITIVE_TYPES})
563
- np_uts = {ut for ut in uts if ut not in _OBJ_MARSHALER_PRIMITIVE_TYPES}
564
- if not np_uts:
565
- um = PrimitiveUnionObjMarshaler(pt)
566
- elif len(np_uts) == 1:
567
- um = PrimitiveUnionObjMarshaler(pt, x=rec(check.single(np_uts)))
568
- else:
569
- raise TypeError(ty)
570
-
571
- if is_opt:
572
- um = OptionalObjMarshaler(um)
573
- return um
569
+ raise TypeError(ty)
570
+
571
+ if is_opt:
572
+ um = OptionalObjMarshaler(um)
573
+ return um
574
574
 
575
575
  raise TypeError(ty)
576
576
 
omlish/lite/reflect.py CHANGED
@@ -1,5 +1,6 @@
1
- # ruff: noqa: UP006
1
+ # ruff: noqa: UP006 UP036 UP045
2
2
  import functools
3
+ import sys
3
4
  import types
4
5
  import typing as ta
5
6
 
@@ -16,24 +17,40 @@ _GENERIC_ALIAS_TYPES = (
16
17
  )
17
18
 
18
19
 
19
- def is_generic_alias(obj, *, origin: ta.Any = None) -> bool:
20
+ def is_generic_alias(obj: ta.Any, *, origin: ta.Any = None) -> bool:
20
21
  return (
21
22
  isinstance(obj, _GENERIC_ALIAS_TYPES) and
22
23
  (origin is None or ta.get_origin(obj) is origin)
23
24
  )
24
25
 
25
26
 
26
- is_union_alias = functools.partial(is_generic_alias, origin=ta.Union)
27
27
  is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
28
28
 
29
29
 
30
30
  ##
31
31
 
32
32
 
33
+ _UNION_ALIAS_ORIGINS = frozenset([
34
+ ta.get_origin(ta.Optional[int]),
35
+ *(
36
+ [
37
+ ta.get_origin(int | None),
38
+ ta.get_origin(getattr(ta, 'TypeVar')('_T') | None),
39
+ ] if sys.version_info >= (3, 10) else ()
40
+ ),
41
+ ])
42
+
43
+
44
+ def is_union_alias(obj: ta.Any) -> bool:
45
+ return ta.get_origin(obj) in _UNION_ALIAS_ORIGINS
46
+
47
+
48
+ #
49
+
50
+
33
51
  def is_optional_alias(spec: ta.Any) -> bool:
34
52
  return (
35
- isinstance(spec, _GENERIC_ALIAS_TYPES) and # noqa
36
- ta.get_origin(spec) is ta.Union and
53
+ is_union_alias(spec) and
37
54
  len(ta.get_args(spec)) == 2 and
38
55
  any(a in (None, type(None)) for a in ta.get_args(spec))
39
56
  )
omlish/lite/typing.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import dataclasses as dc
2
+ import sys
2
3
  import typing as ta
3
4
 
4
5
 
@@ -51,3 +52,13 @@ class Func3(ta.Generic[A0, A1, A2, T]):
51
52
 
52
53
  def __call__(self, a0: A0, a1: A1, a2: A2) -> T:
53
54
  return self.fn(a0, a1, a2)
55
+
56
+
57
+ ##
58
+
59
+
60
+ _TYPING_ANNOTATIONS_ATTR = '__annotate__' if sys.version_info >= (3, 14) else '__annotations__'
61
+
62
+
63
+ def typing_annotations_attr() -> str:
64
+ return _TYPING_ANNOTATIONS_ATTR
@@ -8,7 +8,8 @@ TODO:
8
8
  - real relative cls names - shouldn't need parent package names
9
9
  - *require* loaded class names - special All sentinel for explicit all
10
10
  - ! late instantiation !
11
- - per-manifest-item cache?
11
+ - TypeMap style weak cache of issubclass queries
12
+ - wait.. lazily load the class for virtual subclass queries? xor support virtual bases?
12
13
  """
13
14
  import dataclasses as dc
14
15
  import importlib.machinery
@@ -273,12 +274,13 @@ class ManifestLoader:
273
274
 
274
275
  #
275
276
 
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
277
+ # FIXME:
278
+ # class LOAD_ALL: # noqa
279
+ # def __new__(cls, *args, **kwargs): # noqa
280
+ # raise TypeError
281
+ #
282
+ # def __init_subclass__(cls, **kwargs): # noqa
283
+ # raise TypeError
282
284
 
283
285
  def _load(
284
286
  self,
@@ -1,6 +1,7 @@
1
1
  from .inspect import ( # noqa
2
2
  get_annotations,
3
3
  get_filtered_type_hints,
4
+ has_annotations,
4
5
  )
5
6
 
6
7
  from .ops import ( # noqa
omlish/reflect/inspect.py CHANGED
@@ -1,11 +1,14 @@
1
1
  """
2
2
  TODO:
3
3
  - vs ta.get_type_hints?
4
+ - eval (ta.get_type_hints) vs forwardref (inspect.get_annotations)?
5
+ - remove, or at least address, get_filtered_type_hints wrt 3.14
4
6
  """
5
7
  import typing as ta
6
8
 
7
9
  from .. import check
8
10
  from .. import lang
11
+ from ..lite.typing import typing_annotations_attr
9
12
 
10
13
 
11
14
  if ta.TYPE_CHECKING:
@@ -20,6 +23,13 @@ annotationlib = lang.lazy_import('annotationlib', optional=True, cache_failure=T
20
23
  ##
21
24
 
22
25
 
26
+ def has_annotations(obj: ta.Any) -> bool:
27
+ return hasattr(obj, typing_annotations_attr())
28
+
29
+
30
+ ##
31
+
32
+
23
33
  def get_annotations(obj: ta.Any) -> ta.Mapping[str, ta.Any]:
24
34
  if (al := annotationlib()) is not None:
25
35
  return al.get_annotations(obj, format=al.Format.FORWARDREF) # noqa
@@ -1,6 +1,7 @@
1
1
  from .testing import ( # noqa
2
2
  assert_dicts_equal_ordered,
3
3
  call_many_with_timeout,
4
+ run_all_tests,
4
5
  run_with_timeout,
5
6
  waitpid_with_timeout,
6
7
  xfail,
omlish/testing/testing.py CHANGED
@@ -117,3 +117,33 @@ def raise_in_thread(thr: threading.Thread, exc: ta.Union[BaseException, ta.Type[
117
117
  # https://github.com/python/cpython/blob/37ba7531a59a0a2b240a86f7e2adfb1b1cd8ac0c/Lib/test/test_threading.py#L182
118
118
  import ctypes as ct
119
119
  ct.pythonapi.PyThreadState_SetAsyncExc(ct.c_ulong(thr.ident), ct.py_object(exc)) # type: ignore
120
+
121
+
122
+ ##
123
+
124
+
125
+ def run_all_tests(
126
+ obj: ta.Any,
127
+ *,
128
+ filter: ta.Optional[ta.Callable[[str, ta.Any], bool]] = None, # noqa
129
+ out: ta.Optional[ta.Any] = None,
130
+ ) -> None:
131
+ if out is None:
132
+ out = sys.stderr
133
+
134
+ if isinstance(obj, ta.Mapping):
135
+ items: ta.Any = obj.items()
136
+ else:
137
+ items = ((a, getattr(obj, a)) for a in dir(obj))
138
+
139
+ for k, v in items:
140
+ if not callable(v):
141
+ continue
142
+
143
+ if filter is not None:
144
+ if not filter(k, v):
145
+ continue
146
+ elif not k.startswith('test_'):
147
+ continue
148
+
149
+ print(f'Running {k}', file=out)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omlish
3
- Version: 0.0.0.dev401
3
+ Version: 0.0.0.dev403
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -22,7 +22,7 @@ Requires-Dist: trio~=0.30; extra == "all"
22
22
  Requires-Dist: trio-asyncio~=0.15; extra == "all"
23
23
  Requires-Dist: lz4~=4.4; extra == "all"
24
24
  Requires-Dist: python-snappy~=0.7; extra == "all"
25
- Requires-Dist: zstandard~=0.23; extra == "all"
25
+ Requires-Dist: zstandard~=0.24; python_version < "3.14" and extra == "all"
26
26
  Requires-Dist: brotli~=1.1; extra == "all"
27
27
  Requires-Dist: asttokens~=3.0; extra == "all"
28
28
  Requires-Dist: executing~=2.2; extra == "all"
@@ -63,7 +63,7 @@ Requires-Dist: trio-asyncio~=0.15; extra == "async"
63
63
  Provides-Extra: compress
64
64
  Requires-Dist: lz4~=4.4; extra == "compress"
65
65
  Requires-Dist: python-snappy~=0.7; extra == "compress"
66
- Requires-Dist: zstandard~=0.23; extra == "compress"
66
+ Requires-Dist: zstandard~=0.24; python_version < "3.14" and extra == "compress"
67
67
  Requires-Dist: brotli~=1.1; extra == "compress"
68
68
  Provides-Extra: diag
69
69
  Requires-Dist: asttokens~=3.0; extra == "diag"
@@ -1,5 +1,5 @@
1
- omlish/.manifests.json,sha256=aT8yZ-Zh-9wfHl5Ym5ouiWC1i0cy7Q7RlhzavB6VLPI,8587
2
- omlish/__about__.py,sha256=qgXlKBCqBWl3hZlS4yepho5vzin0hRyrGpM0ceofB74,3576
1
+ omlish/.manifests.json,sha256=ftpXGlXqsqDmBh0eWXtndZBLj8Y6QVhS5g5lKgEAf3U,8587
2
+ omlish/__about__.py,sha256=sS7mjsxVPH8xRx_p0z5qBpHSL6REnABss-XCt5y8_Pk,3601
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
@@ -19,7 +19,7 @@ omlish/algorithm/toposort.py,sha256=5wog_7XTYtg5vq4tcKtn9DcXRsEMaVobzQ6ndMK4HhQ,
19
19
  omlish/algorithm/unify.py,sha256=jADtgVQkcGKRV4WokG0ePYe9X6BT_8RAS-WSfbBbjUk,838
20
20
  omlish/argparse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  omlish/argparse/all.py,sha256=NeeMM5MIebY7XDAHaCxUzeesEoUYwsf5i9PrBUcO1cI,1057
22
- omlish/argparse/cli.py,sha256=dRPR0VlHgssntrZV0klIMLWa9B1JzMsUDhHWUh_8qu4,8736
22
+ omlish/argparse/cli.py,sha256=60cfq_WFLwL3YsIQxGAQ7XDi-LzNjH33RavcKdRnhUU,8737
23
23
  omlish/asyncs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  omlish/asyncs/all.py,sha256=MjW0P9K8XBrw6AaH2X_qD5Y7hEZOF0cktqFv5BDGH-k,649
25
25
  omlish/asyncs/bridge.py,sha256=QonuN2KgT7sRsmJEgRvLqtubXma9RI2xOs27X5JSQcA,10153
@@ -73,7 +73,7 @@ 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=_s-RKf06dlZhmXNH7Z2qbO8LPEtWeP-wgDAaHp9DFlg,3933
76
+ omlish/codecs/registry.py,sha256=DxdfV1Ays5kPB-3fG_s3_ptNVbyUfY8BgjmvEmH2JSI,4132
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
79
  omlish/collections/__init__.py,sha256=BIc806ri5Eq-kR03Ya2YfYTRI0g1rn_0haQPUqxXqys,2816
@@ -137,12 +137,12 @@ omlish/daemons/spawning.py,sha256=psR73zOYjMKTqNpx1bMib8uU9wAZz62tw5TaWHrTdyY,53
137
137
  omlish/daemons/targets.py,sha256=00KmtlknMhQ5PyyVAhWl3rpeTMPym0GxvHHq6mYPZ7c,3051
138
138
  omlish/daemons/waiting.py,sha256=RfgD1L33QQVbD2431dkKZGE4w6DUcGvYeRXXi8puAP4,1676
139
139
  omlish/dataclasses/__init__.py,sha256=Xkf8vRYt4C0_4H9DP2rjfzkByXNVUxL4EgoSB1p0eho,2162
140
- omlish/dataclasses/_internals.py,sha256=vIGCZnStgD3ef4drYRtVOrxhxmAPa0vJpo4pXcDcQvM,3073
140
+ omlish/dataclasses/_internals.py,sha256=_THiziiIslUyYC98Y_tZd5aZgvEF3FAGkDSwzRfcDuo,3247
141
141
  omlish/dataclasses/debug.py,sha256=giBiv6aXvX0IagwNCW64qBzNjfOFr3-VmgDy_KYlb-k,29
142
142
  omlish/dataclasses/errors.py,sha256=tyv3WR6az66uGGiq9FIuCHvy1Ef-G7zeMY7mMG6hy2Y,2527
143
143
  omlish/dataclasses/inspect.py,sha256=EpVb50CsEUWpn70gkjBa-hI1mr5_VubHTERsofgE-Lw,4600
144
144
  omlish/dataclasses/reflection.py,sha256=6BD2FUiOEtpi_2JREWyVzemjbBJdBMUm8XxQ9SVIKGs,2799
145
- omlish/dataclasses/specs.py,sha256=JFpMILJhxiWYmfTD4TDl03O13o1i0Rwgf14WpI7U9go,6193
145
+ omlish/dataclasses/specs.py,sha256=VOY2uCjxLhemBuLd1VXz5KJXmZ48NL3sMJxzOhXmau8,6191
146
146
  omlish/dataclasses/impl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
147
  omlish/dataclasses/impl/configs.py,sha256=n1MOPGTulIVLMR2e4hbtU1FbHJTAVrOFXOCPU-fujVw,1442
148
148
  omlish/dataclasses/impl/utils.py,sha256=jAD6IIILo70aD_s60CaqRU2YvpZxBKy4K5EG-MTiqVo,1871
@@ -150,18 +150,18 @@ omlish/dataclasses/impl/api/__init__.py,sha256=k5iS9QOwf_f4iOfGffYhnqDOcmEIwEUUT
150
150
  omlish/dataclasses/impl/api/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
151
  omlish/dataclasses/impl/api/classes/conversion.py,sha256=T1I-aZKui2tv8rknuw9yCvGQLTrFnzTuHDFoezhE0ko,908
152
152
  omlish/dataclasses/impl/api/classes/decorator.py,sha256=LqkAjNFpUeLThnnkzt1tIYKtIf8maDCkjrZzSbABZbg,4067
153
- omlish/dataclasses/impl/api/classes/make.py,sha256=qcsELy9tpwMLr0RJmvlSgR0deh40nvxgy7RaG3SJ_nw,2939
153
+ omlish/dataclasses/impl/api/classes/make.py,sha256=gfYOSWBno3W_5w6YMN2El3EiXuKwN0bu0t5a5GV8Qlo,5165
154
154
  omlish/dataclasses/impl/api/classes/metadata.py,sha256=sMZgtoZaybfCoBKOVj7hKc-xqfU2Lca9WFrqg8UAAsE,2773
155
155
  omlish/dataclasses/impl/api/classes/params.py,sha256=cJAMxLHgW6xyKURlCnDQpA-TYfOgWpVBCavie-IZTOM,2000
156
156
  omlish/dataclasses/impl/api/fields/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
157
  omlish/dataclasses/impl/api/fields/building.py,sha256=8ruCNRY6ZHjWSmfUCH6jabh_LfiXkIOrR3fZ3WlHinY,3326
158
- omlish/dataclasses/impl/api/fields/constructor.py,sha256=BNHIpZNMhnmxn7TlAa7CM4FunzupoSFWquvIsUa05JQ,1537
159
- omlish/dataclasses/impl/api/fields/conversion.py,sha256=jh2k4klc-SkmpygPI1GJFNJd7ylj5dCKt2rwyAUSrfI,5144
158
+ omlish/dataclasses/impl/api/fields/constructor.py,sha256=5PkSFFO09hWzLmDWUaZnQFGEBl5-yNLsigZ4cMhvAz0,1681
159
+ omlish/dataclasses/impl/api/fields/conversion.py,sha256=f-dswgrBMXIy6fQL6O9u8jkVGTOWA72AE78X2TqO5jk,5544
160
160
  omlish/dataclasses/impl/api/fields/metadata.py,sha256=klwez7mFsIiIQ3hxvXx5zhC53FPXqlHVzcyrHikIsCE,1938
161
161
  omlish/dataclasses/impl/concerns/__init__.py,sha256=4Goga5wAOAbK6KcoHWC8jDC8M9ywgH7PfmXXxgCYCC8,208
162
162
  omlish/dataclasses/impl/concerns/abc.py,sha256=ok2qE9ltgZXdf34YtLElTr7A-IYErJvVfP1-G2t2Sbc,391
163
163
  omlish/dataclasses/impl/concerns/copy.py,sha256=0QoQkNNptD0mJdc4TJlD7lpDUm3kJNOH_EsqMLx_HB4,1762
164
- omlish/dataclasses/impl/concerns/doc.py,sha256=SL0hj4EzXrVOhaDzHVDGnzylkOU7mcXtr9Tm3wuZnQQ,1344
164
+ omlish/dataclasses/impl/concerns/doc.py,sha256=VVVEEvO-YpKOqUnhIXVTLOifmJedaB1AOKmhxvD8L0c,1727
165
165
  omlish/dataclasses/impl/concerns/eq.py,sha256=PI0KKzJyIziRLgcjl8efjapf8baaRCdcuyGW83bCpEo,1720
166
166
  omlish/dataclasses/impl/concerns/fields.py,sha256=JTO13HKs-swKnM7Qtb6El7FAfdLwxVLqULXAwotjus0,3318
167
167
  omlish/dataclasses/impl/concerns/frozen.py,sha256=DTYB6aIZEqzYvWd3n6VF4Z40apWVOYKFbiYlTiGzaYE,4511
@@ -174,7 +174,7 @@ omlish/dataclasses/impl/concerns/override.py,sha256=eegJ4KRs-p3Oj5ipY1eySwXJ3vFy
174
174
  omlish/dataclasses/impl/concerns/params.py,sha256=O_1f83gH8l_PzvOndxC4vlw2-bp8PNhNQUqB-0mJrWw,407
175
175
  omlish/dataclasses/impl/concerns/replace.py,sha256=2lZCmTpz4uxMsNw8a29OzSykDqWHaINzvk13qyMpVUA,1509
176
176
  omlish/dataclasses/impl/concerns/repr.py,sha256=j26G7vC147z-GJc86DbY__b1C4QPdiWlxeNNIujbqzM,3461
177
- omlish/dataclasses/impl/concerns/slots.py,sha256=xg6346UT_oUlb0kYaWFbeJUKzZcpQx4nJkT86CXfI5c,5922
177
+ omlish/dataclasses/impl/concerns/slots.py,sha256=onEWZRPVhiCJOoyk3lNA_PTh0w49TDyqmTmcCY_oiHs,6604
178
178
  omlish/dataclasses/impl/generation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
179
  omlish/dataclasses/impl/generation/base.py,sha256=adi68lJogtjx1SoxGJ5hqC-f-CMX2gWi8iALmucIwKo,686
180
180
  omlish/dataclasses/impl/generation/compilation.py,sha256=SQ3wuVQRDhrDRcWMZXsD4TibmkgMUlrTY295DbIPCy4,6996
@@ -196,7 +196,7 @@ omlish/dataclasses/impl/processing/registry.py,sha256=qTCVUOTYjDKGTxMXYUjvck3SsY
196
196
  omlish/dataclasses/metaclass/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
197
197
  omlish/dataclasses/metaclass/bases.py,sha256=dX8ctd6iZPZBedEI_Ty62qHzGtixUhda9eYF5lGsTtA,1404
198
198
  omlish/dataclasses/metaclass/confer.py,sha256=y2qx9FiPmu2uNUi9Z8MLDL_pSGeiuDutVVAit145RuQ,1400
199
- omlish/dataclasses/metaclass/meta.py,sha256=WZUQ_nhaQrar5XAkD22vdik2YiulEvKLwcCqBR7huRM,2644
199
+ omlish/dataclasses/metaclass/meta.py,sha256=eAlM0I3KOylnwDwz39wymAYE5qZlxMXnwJKdG5qqzTg,3330
200
200
  omlish/dataclasses/metaclass/specs.py,sha256=ZFt7A5S2UQi5ecFGhd9ubnRD0maswQGERMCT0jrnuDM,794
201
201
  omlish/dataclasses/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
202
202
  omlish/dataclasses/tools/as_.py,sha256=KP9ZQ6yh24QmLULGrQO2TucmEdVLtBj5YUZuUXa5HEY,2895
@@ -205,7 +205,7 @@ omlish/dataclasses/tools/modifiers.py,sha256=VpE16fYDIQo7dpT0oUbCuqr9WohMohmFdKH
205
205
  omlish/dataclasses/tools/only_.py,sha256=hPpqzr9YW09YmlX_QJNU2aePHYJEIrbGCPwmnvVS_to,849
206
206
  omlish/dataclasses/tools/replace.py,sha256=izM9lPT6AhEtjqn22auqaofa0j69KO7iootF-2Uj4cY,396
207
207
  omlish/dataclasses/tools/repr.py,sha256=KFvF6uv2YYIKq8O3ZNbEAS1tqRQALsJ-SUlBNPd5_GI,190
208
- omlish/dataclasses/tools/static.py,sha256=YFTgCtUeomTmbkF_wBCgoH3sn-jGcbG15VvB2KXXOG0,8675
208
+ omlish/dataclasses/tools/static.py,sha256=xLOnTLVEpOvkgKqWDtHGCpER1UaBoiS43LjH_WBh0-M,8701
209
209
  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
@@ -229,8 +229,8 @@ omlish/dispatch/_dispatch2.py,sha256=70k1tKKvuhxtAu6v4skECfHKIKVWrmlt7G_JKLUsKEs
229
229
  omlish/dispatch/_dispatch3.py,sha256=9Zjd7bINAC3keiaBdssc4v5dY0-8OI6XooV2DR9U7Z0,2818
230
230
  omlish/dispatch/dispatch.py,sha256=TzWihCt9Zr8wfIwVpKHVOOrYFVKpDXRevxYomtEfqYc,3176
231
231
  omlish/dispatch/functions.py,sha256=cwNzGIg2ZIalEgn9I03cnJVbMTHjWloyDTaowlO3UPs,1524
232
- omlish/dispatch/impls.py,sha256=K_okKvpZml4NkTHJmTVyMQSrIaIJcqTEgkreGwukaOw,1895
233
- omlish/dispatch/methods.py,sha256=nqLvpuktVO9sE3np79QuKqmPyTX8tluFzPr4MNBkljc,10296
232
+ omlish/dispatch/impls.py,sha256=3kyLw5yiYXWCN1DiqQbD1czMVrM8v1mpQ8NyD0tUrnk,1870
233
+ omlish/dispatch/methods.py,sha256=RJ-gLF2UdCQKZFhiuV4R1N3lRB_dMH3ItiHwmm-s62o,9873
234
234
  omlish/docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
235
235
  omlish/docker/all.py,sha256=t5jBNZAzqCoB05-nwCuSZ6C3PBEBD6T3wsIJvIXJaRg,576
236
236
  omlish/docker/cli.py,sha256=ws3ypayxdnp3nWeLww45jHG0Vwr5e4bUbLTqkpejAhc,2570
@@ -389,8 +389,8 @@ omlish/inject/impl/multis.py,sha256=j2QHSpJp0jPv10yZEZJwi0w62kXFQ25gkHa026xv4-Q,
389
389
  omlish/inject/impl/origins.py,sha256=dgGdkoMN6I4DZrWjlpZYijeFsrF6Up1WPq_QSAgTtuQ,1676
390
390
  omlish/inject/impl/privates.py,sha256=alpCYyk5VJ9lJknbRH2nLVNFYVvFhkj-VC1Vco3zCFQ,2613
391
391
  omlish/inject/impl/providers.py,sha256=QnwhsujJFIHC0JTgd2Wlo1kP53i3CWTrj1nKU2DNxwg,2375
392
- omlish/inject/impl/proxy.py,sha256=gyCME_W48Zrl7QJMKiIPwGpSctf5fhvh4ZldgtA9MEE,1641
393
- omlish/inject/impl/scopes.py,sha256=21ngZvtp38qUqwtXnQdn78EmDDzvK-hMw8rrg-ygK48,5905
392
+ omlish/inject/impl/proxy.py,sha256=dOAPh1DAmSWLg_oGDxivUpVgltec2mvKCvlvQJp8IRo,1643
393
+ omlish/inject/impl/scopes.py,sha256=sL250qM4-hCwwO28GdynM02OMb09FMmIvo_ifYhNhj0,5909
394
394
  omlish/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
395
395
  omlish/io/abc.py,sha256=M40QB2udYpCEqmlxCcHv6FlJYJY6ymmJQBlaklYv0U8,1256
396
396
  omlish/io/buffers.py,sha256=2ZAAZn-fTAtPCgtwcH_UJrSr5ZS9VNRp7yynufv0Rmk,7291
@@ -409,7 +409,7 @@ omlish/io/compress/lz4.py,sha256=qaze1yVXexjJyN18Adh8fbTm_5pEeyytx66KoMUNpCU,275
409
409
  omlish/io/compress/lzma.py,sha256=qDyshBgBUSPcZpAyXiRXnqI7zx7x60UpPxn8K3nN8aM,2469
410
410
  omlish/io/compress/snappy.py,sha256=JFoH_9l0Tr9AGaQ0jHRiP4TsFnG071l27mprCBcqt4c,704
411
411
  omlish/io/compress/zlib.py,sha256=dE38zBY4qNihUYtPjSpNRXweiw6mB6xsYqsBJklTDXM,2364
412
- omlish/io/compress/zstd.py,sha256=wik_HWLq_8fGAJgGyMGq9fhFQovot1aCH4lwMpihQmg,949
412
+ omlish/io/compress/zstd.py,sha256=FK3XJdMaCCCOrEcQMUyBcXwY5d8NEsO7I15Wyj_WwPI,1153
413
413
  omlish/io/coro/__init__.py,sha256=Mr8-GoDzOlA2sKmaDxuov2vPmjX_IeB_49I8dTSvjvA,1080
414
414
  omlish/io/coro/consts.py,sha256=4r6IMLBMic6MJHVn9UiORIkkPAuxsqtzFT3KV0fatC0,33
415
415
  omlish/io/coro/direct.py,sha256=Y--rP3wvBAYMeYctokb5IGd8UyQGmEFChyKISmRg5k0,294
@@ -425,7 +425,7 @@ omlish/iterators/iterators.py,sha256=RxW35yQ5ed8vBQ22IqpDXFx-i5JiLQdp7-pkMZXhJJ8
425
425
  omlish/iterators/recipes.py,sha256=wOwOZg-zWG9Zc3wcAxJFSe2rtavVBYwZOfG09qYEx_4,472
426
426
  omlish/iterators/tools.py,sha256=M16LXrJhMdsz5ea2qH0vws30ZvhQuQSCVFSLpRf_gTg,2096
427
427
  omlish/iterators/unique.py,sha256=Nw0pSaNEcHAkve0ugfLPvJcirDOn9ECyC5wIL8JlJKI,1395
428
- omlish/lang/__init__.py,sha256=3Gd6wcpol_c0hpzxgVZd7s0DB9iEYmKj2XlZPTWn9e4,7202
428
+ omlish/lang/__init__.py,sha256=le8N_Hj6ahtWnG6-gGEo53CK270rDA9wuhh6rUDS9ws,7232
429
429
  omlish/lang/attrs.py,sha256=zFiVuGVOq88x45464T_LxDa-ZEq_RD9zJLq2zeVEBDc,5105
430
430
  omlish/lang/casing.py,sha256=cFUlbDdXLhwnWwcYx4qnM5c4zGX7hIRUfcjiZbxUD28,4636
431
431
  omlish/lang/clsdct.py,sha256=HAGIvBSbCefzRjXriwYSBLO7QHKRv2UsE78jixOb-fA,1828
@@ -441,7 +441,7 @@ omlish/lang/generators.py,sha256=a4D5HU_mySs2T2z3xCmE_s3t4QJkj0YRrK4-hhpGd0A,519
441
441
  omlish/lang/iterables.py,sha256=y1SX2Co3VsOeX2wlfFF7K3rwLvF7Dtre7VY6EpfwAwA,3338
442
442
  omlish/lang/lazyglobals.py,sha256=G1hwpyIgM4PUkVJ_St3K-EdQkHQdWpFOcXao6I5LwyY,1435
443
443
  omlish/lang/maysyncs.py,sha256=kULOW2M9PFhLd1TdtmGGQstPgrJpl--JUv9FOHWl4f8,894
444
- omlish/lang/objects.py,sha256=ZsibJwNp1EXorbaObm9TlCNtuuM65snCmVb7H4_llqI,6116
444
+ omlish/lang/objects.py,sha256=E-ApDJUnLWXJX9ZwWU2qVhYF0H2fg7w08wWYWxbkdNI,6117
445
445
  omlish/lang/outcomes.py,sha256=0PqxoKaGbBXU9UYZ6AE2QSq94Z-gFDt6wYdp0KomNQw,8712
446
446
  omlish/lang/overrides.py,sha256=IBzK6ljfLX6TLgIyKTSjhqTLcuKRkQNVtEOnBLS4nuA,2095
447
447
  omlish/lang/params.py,sha256=sfbNoGrKCsAtubFufj_uh_WKshIgA8fqJ4PmLH1PH00,6639
@@ -450,7 +450,7 @@ omlish/lang/resolving.py,sha256=ei9LDyJexsMMHB9z8diUkNmynWhd_da7h7TqrMYM6lA,1611
450
450
  omlish/lang/resources.py,sha256=QtuybNgdw5e2QL3jtKi-5ENH98JemsMRi21A40tYrzA,2844
451
451
  omlish/lang/strings.py,sha256=TY-v0iGu6BxEKb99YS-VmIJqc-sTAqMv7mCDJQALMnI,4550
452
452
  omlish/lang/sys.py,sha256=KPe1UOXk1VxlOYt_aLmhN0KqsA4wnP-4nm4WEwO49pw,411
453
- omlish/lang/typing.py,sha256=eWI3RKhVi-_SV2rN4SGq8IbFo5XbGapbiWeduF97uG8,3846
453
+ omlish/lang/typing.py,sha256=A4CCZ3U6cCDfUBqgTxGj8qnl-e-r6UJWjJ0Y6XYxT3c,4077
454
454
  omlish/lang/cached/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
455
455
  omlish/lang/cached/function.py,sha256=epDPy9WyGc_VaKTrEQJ3dZun-NLsvdvbbNd7jbaUM2c,11730
456
456
  omlish/lang/cached/property.py,sha256=WHYyg4-6EA86TcNMfbXTjVhjEZPc0kngt9hfY3WN5w8,2768
@@ -467,7 +467,7 @@ omlish/lang/imports/conditional.py,sha256=qxHYlE_xuwPJb6F9K8upagHxuYL0APPLWRVo50
467
467
  omlish/lang/imports/lazy.py,sha256=gDv7ffrGsPEAHZ9a1Myt7Uf-4vqWErhCd1DaS7SQL0c,1464
468
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=LLic4zfhsSBzKF33_0qABBcjxfajc57mYRkeuj_Zuns,2855
470
+ omlish/lang/imports/traversal.py,sha256=pbFQIa880NGjSfcLsno2vE_G41_CLwDHb-7gWg2J3BI,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
@@ -487,11 +487,11 @@ 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
490
- omlish/lite/marshal.py,sha256=JD_8ox5-yeIo7MZ6iipCdiVxx33So52M02AtvFlRGC8,20392
490
+ omlish/lite/marshal.py,sha256=K_wnZwfC8cftGILyE3RlmzQEYuZOfzkMLKey41zuwtM,20296
491
491
  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
- omlish/lite/reflect.py,sha256=pzOY2PPuHH0omdtglkN6DheXDrGopdL3PtTJnejyLFU,2189
494
+ omlish/lite/reflect.py,sha256=gI-Qlws9V-jND7kvCQFaIhBFrndVpDsikTQ7C6U2z3w,2434
495
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
@@ -500,7 +500,7 @@ omlish/lite/strings.py,sha256=QGxT1Yh4oI8ycsfeobxnjEhvDob_GiAKLeIhZwo1j24,1986
500
500
  omlish/lite/timeouts.py,sha256=mCFOCkOu_nmSDrccsm-wYY7uhyLDzAMyvrAO07y2vBE,4975
501
501
  omlish/lite/timing.py,sha256=aVu3hEDB_jyTF_ryZI7iU-xg4q8CNwqpp9Apfru_iwY,196
502
502
  omlish/lite/types.py,sha256=QM9whf55r7TmmQBRApIWSlyVKsl1p_jcut_YheyZMFY,146
503
- omlish/lite/typing.py,sha256=U3-JaEnkDSYxK4tsu_MzUn3RP6qALBe5FXQXpD-licE,1090
503
+ omlish/lite/typing.py,sha256=m2CyJTz2OVOCPRvp-0UuEx7oleZgXqs3rYXijE0bTsA,1280
504
504
  omlish/logs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
505
505
  omlish/logs/abc.py,sha256=ho4ABKYMKX-V7g4sp1BByuOLzslYzLlQ0MESmjEpT-o,8005
506
506
  omlish/logs/all.py,sha256=Er2NIcDvlMpuAcRr9b_uMHeoERU7I6lu5oLrDGRdV0U,728
@@ -519,7 +519,7 @@ 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
521
  omlish/manifests/globals.py,sha256=nrA85o8zFTEYv440Y1wgr7SmtW6AE_3jF_Dls6RB_nE,1661
522
- omlish/manifests/loading.py,sha256=q9M6lpiGCqPOmQMR12ZWYm8F4iME32byaLlT5VsRB9c,11844
522
+ omlish/manifests/loading.py,sha256=kzJwESneZB1mAK6PsVPXvfNjr-MOXL7bbKQ8gEmbVkU,11984
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
@@ -601,8 +601,8 @@ omlish/os/pidfiles/cli.py,sha256=dAKukx4mrarH8t7KZM4n_XSfTk3ycShGAFqRrirK5dw,207
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
603
  omlish/os/pidfiles/pinning.py,sha256=u81LRe3-6Xd6K_dsVbbEPVdsUvY7zy3Xv7413-5NBLQ,6627
604
- omlish/reflect/__init__.py,sha256=9pzXLXXNMHkLhhI79iUr-o0SMOtR6HMUmAEUplZkIdE,853
605
- omlish/reflect/inspect.py,sha256=WCo2YpBYauKw6k758FLlZ_H4Q05rgVPs96fEv9w6zHQ,1538
604
+ omlish/reflect/__init__.py,sha256=ZUqqboWj5jLMVP1ljE5D9CnmXuSnsaWkKT3N9BKO0Mo,874
605
+ omlish/reflect/inspect.py,sha256=dUrVz8VfAdLVFtFpW416DxzVC17D80cvFb_g2Odzgq8,1823
606
606
  omlish/reflect/ops.py,sha256=F77OTaw0Uw020cJCWX_Q4kL3wvxlJ8jV8wz7BctGL_k,2619
607
607
  omlish/reflect/subst.py,sha256=_lfNS2m2UiJgqARQtmGLTGo7CrSm9OMvVzt6GWOEX6M,4590
608
608
  omlish/reflect/types.py,sha256=uMcxUHVJWYYcmF9ODeJ9WfcQ0DejsqsEVIX5K0HjJSM,12018
@@ -778,8 +778,8 @@ omlish/term/vt100/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
778
778
  omlish/term/vt100/c.py,sha256=93HARU6Dd1rVF-n8cAyXqkEqleYLcofuLgSUNd6-GbU,3537
779
779
  omlish/term/vt100/states.py,sha256=OxPUxfFTcfz56MhtDgIigEApChOtN6XO1g6R2H08mu4,8303
780
780
  omlish/term/vt100/terminal.py,sha256=KUlg331ele7P6SHsBKdbpdQFDKsxSply1Ds27NkppTs,9359
781
- omlish/testing/__init__.py,sha256=M_BQrcCHkoL-ZvE-UpQ8XxXNYRRawhjUz4rCJnAqM2A,152
782
- omlish/testing/testing.py,sha256=XOZTPjL8pggx2v5TUHUDjSgaU6lMnuPJ58hWoFQyzPY,2979
781
+ omlish/testing/__init__.py,sha256=h8GMv0PhVyMECsQoYuqoBzHjYO6UJyXBZvnozzUg9M8,171
782
+ omlish/testing/testing.py,sha256=tlBeqVmzGhjRbWygJt3mZljq662qR4nAaGNE2VoAey4,3617
783
783
  omlish/testing/pytest/__init__.py,sha256=i4ti6Q2rVYJ-XBk9UYDfUUagCrEDTC5jOeSykBjYYZQ,234
784
784
  omlish/testing/pytest/helpers.py,sha256=HxiKvpJQ4b6WCiQXOqQTqKbmr7CMAgCF6hViT6pfIuw,202
785
785
  omlish/testing/pytest/marks.py,sha256=g0RgdvFAd3xog3kKYyb9QtiUVPrEG3JX_abhDNrHJy0,285
@@ -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.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,,
911
+ omlish-0.0.0.dev403.dist-info/licenses/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
912
+ omlish-0.0.0.dev403.dist-info/METADATA,sha256=AFfMDWuU93a0pAwqEi7fa2ctw0_KONoRYd-MEI5u9NI,18881
913
+ omlish-0.0.0.dev403.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
914
+ omlish-0.0.0.dev403.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
915
+ omlish-0.0.0.dev403.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
916
+ omlish-0.0.0.dev403.dist-info/RECORD,,