omlish 0.0.0.dev50__py3-none-any.whl → 0.0.0.dev52__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev50'
2
- __revision__ = '2b2cef5bd15c042c17a10bf1caa60e70dbeeeb43'
1
+ __version__ = '0.0.0.dev52'
2
+ __revision__ = '5ab36e956ad89c19e714eca498e51f63ada8ab92'
3
3
 
4
4
 
5
5
  #
@@ -28,6 +28,8 @@ class Project(ProjectBase):
28
28
  name = 'omlish'
29
29
  description = 'omlish'
30
30
 
31
+ #
32
+
31
33
  optional_dependencies = {
32
34
  'async': [
33
35
  'anyio ~= 4.6',
@@ -61,7 +63,7 @@ class Project(ProjectBase):
61
63
 
62
64
  'json5 ~= 0.9',
63
65
 
64
- 'pyyaml ~= 5.0',
66
+ 'pyyaml ~= 6.0',
65
67
 
66
68
  'cbor2 ~= 5.6',
67
69
 
@@ -109,6 +111,32 @@ class Project(ProjectBase):
109
111
  ],
110
112
  }
111
113
 
114
+ #
115
+
116
+ _plus_dependencies = [
117
+ 'anyio',
118
+ 'sniffio',
119
+
120
+ 'asttokens',
121
+ 'executing',
122
+
123
+ 'orjson',
124
+ 'pyyaml',
125
+
126
+ 'wrapt',
127
+ ]
128
+
129
+ _dependency_specs_by_name = (lambda od: { # noqa
130
+ s.split()[0]: s
131
+ for l in od.values() for s in l
132
+ })(optional_dependencies)
133
+
134
+ optional_dependencies['plus'] = (lambda ds, pd: [ # noqa
135
+ ds[n] for n in pd
136
+ ])(_dependency_specs_by_name, _plus_dependencies)
137
+
138
+ #
139
+
112
140
  entry_points = {
113
141
  'omlish.manifests': {name: name},
114
142
  }
@@ -134,6 +162,7 @@ class SetuptoolsBase:
134
162
  '*.c',
135
163
  '*.cc',
136
164
  '*.cu',
165
+ '*.g4',
137
166
  '*.h',
138
167
 
139
168
  '.manifests.json',
omlish/bootstrap/sys.py CHANGED
@@ -29,7 +29,7 @@ else:
29
29
  libc = lang.proxy_import('..libc', __package__)
30
30
  logs = lang.proxy_import('..logs', __package__)
31
31
  osu = lang.proxy_import('..os', __package__)
32
- dotenv = lang.proxy_import('.formats.dotenv', __package__)
32
+ dotenv = lang.proxy_import('..formats.dotenv', __package__)
33
33
 
34
34
 
35
35
  ##
@@ -33,7 +33,7 @@ def field( # noqa
33
33
  derive: ta.Callable[..., ta.Any] | None = None,
34
34
  coerce: bool | ta.Callable[[ta.Any], ta.Any] | None = None,
35
35
  validate: ta.Callable[[ta.Any], bool] | None = None,
36
- check_type: bool | type | None = None,
36
+ check_type: bool | type | tuple[type | None, ...] | None = None,
37
37
  override: bool = False,
38
38
  repr_fn: ta.Callable[[ta.Any], str | None] | None = None,
39
39
  frozen: bool | None = None,
@@ -193,7 +193,10 @@ def field_init(
193
193
 
194
194
  if fx.check_type:
195
195
  cn = f'__dataclass_check_type__{f.name}__'
196
- if isinstance(fx.check_type, type):
196
+ ct: ta.Any
197
+ if isinstance(fx.check_type, tuple):
198
+ ct = tuple(type(None) if e is None else check_.isinstance(e, type) for e in fx.check_type)
199
+ elif isinstance(fx.check_type, (type, tuple)):
197
200
  ct = fx.check_type
198
201
  # FIXME:
199
202
  # elif info.params_extras.generic_init:
@@ -45,7 +45,7 @@ class FieldExtras(lang.Final):
45
45
  derive: ta.Callable[..., ta.Any] | None = None # TODO
46
46
  coerce: bool | ta.Callable[[ta.Any], ta.Any] | None = None
47
47
  validate: ta.Callable[[ta.Any], bool] | None = None
48
- check_type: bool | type | None = None
48
+ check_type: bool | type | tuple[type | None, ...] | None = None
49
49
  override: bool = False
50
50
  repr_fn: ta.Callable[[ta.Any], str | None] | None = None
51
51
  frozen: bool | None = None # TODO
@@ -25,12 +25,18 @@ def get_impl_func_cls_set(func: ta.Callable) -> frozenset[type]:
25
25
  if not ann:
26
26
  raise TypeError(f'Invalid impl func: {func!r}')
27
27
 
28
+ def erase(a):
29
+ if isinstance(a, rfl.Generic):
30
+ return a.cls
31
+ else:
32
+ return check.isinstance(a, type)
33
+
28
34
  _, cls = next(iter(ta.get_type_hints(func).items()))
29
35
  rty = rfl.type_(cls)
30
36
  if isinstance(rty, rfl.Union):
31
- ret = frozenset(check.isinstance(arg, type) for arg in rty.args)
37
+ ret = frozenset(erase(arg) for arg in rty.args)
32
38
  else:
33
- ret = frozenset([check.isinstance(rty, type)])
39
+ ret = frozenset([erase(rty)])
34
40
 
35
41
  _IMPL_FUNC_CLS_SET_CACHE[func] = ret
36
42
  return ret
@@ -24,7 +24,8 @@ from .base import ( # noqa
24
24
  RecursiveMarshalerFactory,
25
25
  RecursiveUnmarshalerFactory,
26
26
 
27
- SetType,
27
+ Override,
28
+ ReflectOverride,
28
29
  )
29
30
 
30
31
  from .exceptions import ( # noqa
@@ -44,6 +45,8 @@ from .naming import ( # noqa
44
45
  )
45
46
 
46
47
  from .global_ import ( # noqa
48
+ GLOBAL_REGISTRY,
49
+
47
50
  marshal,
48
51
  unmarshal,
49
52
  )
omlish/marshal/base.py CHANGED
@@ -81,11 +81,11 @@ https://github.com/yukinarit/pyserde
81
81
  - Flatten
82
82
  """
83
83
  import abc
84
- import dataclasses as dc
85
84
  import typing as ta
86
85
 
87
86
  from .. import check
88
87
  from .. import collections as col
88
+ from .. import dataclasses as dc
89
89
  from .. import lang
90
90
  from .. import matchfns as mfs
91
91
  from .. import reflect as rfl
@@ -163,13 +163,18 @@ class BaseContext(lang.Abstract):
163
163
  registry: Registry
164
164
  options: col.TypeMap[Option] = col.TypeMap()
165
165
 
166
+ def _reflect(self, o: ta.Any) -> rfl.Type:
167
+ if (ovr := self.registry.get_of(o, ReflectOverride)):
168
+ return ovr[-1].rty
169
+ return rfl.type_(o)
170
+
166
171
 
167
172
  @dc.dataclass(frozen=True)
168
173
  class MarshalContext(BaseContext, lang.Final):
169
174
  factory: MarshalerFactory | None = None
170
175
 
171
176
  def make(self, o: ta.Any) -> Marshaler:
172
- rty = rfl.type_(o)
177
+ rty = self._reflect(o)
173
178
  try:
174
179
  return check.not_none(self.factory)(self, rty) # type: ignore
175
180
  except mfs.MatchGuardError:
@@ -181,7 +186,7 @@ class UnmarshalContext(BaseContext, lang.Final):
181
186
  factory: UnmarshalerFactory | None = None
182
187
 
183
188
  def make(self, o: ta.Any) -> Unmarshaler:
184
- rty = rfl.type_(o)
189
+ rty = self._reflect(o)
185
190
  try:
186
191
  return check.not_none(self.factory)(self, rty) # type: ignore
187
192
  except mfs.MatchGuardError:
@@ -214,10 +219,15 @@ class RecursiveUnmarshalerFactory(RecursiveTypeFactory[UnmarshalContext, Unmarsh
214
219
  ##
215
220
 
216
221
 
217
- @dc.dataclass(frozen=True)
218
- class SetType(RegistryItem, lang.Final):
219
- marshaler: Marshaler | None = None
222
+ @dc.dataclass(frozen=True, kw_only=True)
223
+ class Override(RegistryItem, lang.Final):
224
+ marshaler: Marshaler | None = dc.xfield(None, check_type=(Marshaler, None))
220
225
  marshaler_factory: MarshalerFactory | None = None
221
226
 
222
- unmarshaler: Unmarshaler | None = None
227
+ unmarshaler: Unmarshaler | None = dc.xfield(None, check_type=(Unmarshaler, None))
223
228
  unmarshaler_factory: UnmarshalerFactory | None = None
229
+
230
+
231
+ @dc.dataclass(frozen=True)
232
+ class ReflectOverride(RegistryItem, lang.Final):
233
+ rty: rfl.Type
@@ -3,6 +3,7 @@ import typing as ta
3
3
  from .. import check
4
4
  from .. import collections as col
5
5
  from .. import dataclasses as dc
6
+ from .. import lang
6
7
  from .. import reflect as rfl
7
8
  from .base import MarshalContext
8
9
  from .base import Marshaler
@@ -119,11 +120,12 @@ def _make_field_obj(ctx, ty, obj, fac):
119
120
 
120
121
  class DataclassMarshalerFactory(MarshalerFactory):
121
122
  def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
122
- return isinstance(rty, type) and dc.is_dataclass(rty)
123
+ return isinstance(rty, type) and dc.is_dataclass(rty) and not lang.is_abstract_class(rty)
123
124
 
124
125
  def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
125
126
  ty = check.isinstance(rty, type)
126
127
  check.state(dc.is_dataclass(ty))
128
+ check.state(not lang.is_abstract_class(ty))
127
129
 
128
130
  dc_md = get_dataclass_metadata(ty)
129
131
 
@@ -143,11 +145,12 @@ class DataclassMarshalerFactory(MarshalerFactory):
143
145
 
144
146
  class DataclassUnmarshalerFactory(UnmarshalerFactory):
145
147
  def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
146
- return isinstance(rty, type) and dc.is_dataclass(rty)
148
+ return isinstance(rty, type) and dc.is_dataclass(rty) and not lang.is_abstract_class(rty)
147
149
 
148
150
  def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
149
151
  ty = check.isinstance(rty, type)
150
152
  check.state(dc.is_dataclass(ty))
153
+ check.state(not lang.is_abstract_class(ty))
151
154
  dc_md = get_dataclass_metadata(ty)
152
155
 
153
156
  d: dict[str, tuple[FieldInfo, Unmarshaler]] = {}
omlish/marshal/global_.py CHANGED
@@ -17,7 +17,7 @@ T = ta.TypeVar('T')
17
17
  ##
18
18
 
19
19
 
20
- GLOBAL_REGISTRY = Registry()
20
+ GLOBAL_REGISTRY: Registry = Registry()
21
21
 
22
22
 
23
23
  ##
omlish/marshal/objects.py CHANGED
@@ -45,10 +45,10 @@ class FieldMetadata:
45
45
 
46
46
  options: FieldOptions = DEFAULT_FIELD_OPTIONS
47
47
 
48
- marshaler: Marshaler | None = None
48
+ marshaler: Marshaler | None = dc.xfield(None, check_type=(Marshaler, None))
49
49
  marshaler_factory: MarshalerFactory | None = None
50
50
 
51
- unmarshaler: Unmarshaler | None = None
51
+ unmarshaler: Unmarshaler | None = dc.xfield(None, check_type=(Unmarshaler, None))
52
52
  unmarshaler_factory: UnmarshalerFactory | None = None
53
53
 
54
54
  def update(self, **kwargs: ta.Any) -> 'FieldMetadata':
@@ -1,10 +1,13 @@
1
+ """
2
+ TODO:
3
+ - inheritance
4
+ """
1
5
  import dataclasses as dc
2
6
  import threading
3
7
  import typing as ta
4
8
 
5
- from .. import check
9
+ from .. import collections as col
6
10
  from .. import lang
7
- from .. import reflect as rfl
8
11
 
9
12
 
10
13
  class RegistryItem(lang.Abstract):
@@ -15,8 +18,8 @@ RegistryItemT = ta.TypeVar('RegistryItemT', bound=RegistryItem)
15
18
 
16
19
 
17
20
  @dc.dataclass(frozen=True)
18
- class _TypeRegistry:
19
- rty: rfl.Type
21
+ class _KeyRegistryItems:
22
+ key: ta.Any
20
23
  items: list[RegistryItem] = dc.field(default_factory=list)
21
24
  item_lists_by_ty: dict[type[RegistryItem], list[RegistryItem]] = dc.field(default_factory=dict)
22
25
 
@@ -30,28 +33,54 @@ class Registry:
30
33
  def __init__(self) -> None:
31
34
  super().__init__()
32
35
  self._mtx = threading.Lock()
33
- self._dct: dict[rfl.Type, _TypeRegistry] = {}
34
- self._ps: ta.Sequence[Registry] = []
36
+ self._idct: ta.MutableMapping[ta.Any, _KeyRegistryItems] = col.IdentityKeyDict()
37
+ self._dct: dict[ta.Any, _KeyRegistryItems] = {}
35
38
 
36
- def register(self, rty: rfl.Type, *items: RegistryItem) -> 'Registry':
37
- check.isinstance(rty, rfl.TYPES)
39
+ def register(
40
+ self,
41
+ key: ta.Any,
42
+ *items: RegistryItem,
43
+ identity: bool = False,
44
+ ) -> 'Registry':
38
45
  with self._mtx:
39
- if (sr := self._dct.get(rty)) is None:
40
- sr = self._dct[rty] = _TypeRegistry(rty)
46
+ dct: ta.Any = self._idct if identity else self._dct
47
+ if (sr := dct.get(key)) is None:
48
+ sr = dct[key] = _KeyRegistryItems(key)
41
49
  sr.add(*items)
42
50
  return self
43
51
 
44
- def get(self, rty: rfl.Type) -> ta.Sequence[RegistryItem]:
45
- check.isinstance(rty, rfl.TYPES)
52
+ def get(
53
+ self,
54
+ key: ta.Any,
55
+ *,
56
+ identity: bool | None = None,
57
+ ) -> ta.Sequence[RegistryItem]:
58
+ if identity is None:
59
+ return (
60
+ *self.get(key, identity=True),
61
+ *self.get(key, identity=False),
62
+ )
63
+ dct: ta.Any = self._idct if identity else self._dct
46
64
  try:
47
- return self._dct[rty].items
65
+ return dct[key].items
48
66
  except KeyError:
49
67
  return ()
50
68
 
51
- def get_of(self, rty: rfl.Type, item_ty: type[RegistryItemT]) -> ta.Sequence[RegistryItemT]:
52
- check.isinstance(rty, rfl.TYPES)
69
+ def get_of(
70
+ self,
71
+ key: ta.Any,
72
+ item_ty: type[RegistryItemT],
73
+ *,
74
+ identity: bool | None = None,
75
+ ) -> ta.Sequence[RegistryItemT]:
76
+ if identity is None:
77
+ return (
78
+ *self.get_of(key, item_ty, identity=True),
79
+ *self.get_of(key, item_ty, identity=False),
80
+ )
81
+ dct: ta.Any = self._idct if identity else self._dct
53
82
  try:
54
- sr = self._dct[rty]
83
+ sr = dct[key]
55
84
  except KeyError:
56
85
  return ()
57
- return sr.item_lists_by_ty.get(item_ty, ()) # type: ignore
86
+ return sr.item_lists_by_ty.get(item_ty, ())
@@ -7,6 +7,7 @@ from .secrets import ( # noqa
7
7
  FnSecrets,
8
8
  LoggingSecrets,
9
9
  MappingSecrets,
10
+ Secret,
10
11
  SecretRef,
11
12
  SecretRefOrStr,
12
13
  Secrets,
omlish/secrets/secrets.py CHANGED
@@ -99,6 +99,12 @@ class Secrets(lang.Abstract):
99
99
  else:
100
100
  return Secret(key=key, value=raw)
101
101
 
102
+ def try_get(self, key: str) -> Secret | None:
103
+ try:
104
+ return self.get(key)
105
+ except KeyError:
106
+ return None
107
+
102
108
  @abc.abstractmethod
103
109
  def _get_raw(self, key: str) -> str:
104
110
  raise NotImplementedError
@@ -119,15 +125,36 @@ EMPTY_SECRETS = EmptySecrets()
119
125
 
120
126
 
121
127
  class MappingSecrets(Secrets):
122
- def __init__(self, dct: ta.Mapping[str, str]) -> None:
128
+ def __init__(
129
+ self,
130
+ dct: ta.Mapping[str, str | Secret],
131
+ no_copy: bool = False,
132
+ ) -> None:
123
133
  super().__init__()
134
+
135
+ if not no_copy:
136
+ dct = {
137
+ k: v if isinstance(v, Secret) else Secret(key=k, value=v)
138
+ for k, v in dct.items()
139
+ }
140
+
124
141
  self._dct = dct
125
142
 
126
143
  def __repr__(self) -> str:
127
144
  return f'{self.__class__.__name__}({{{", ".join(map(repr, self._dct.keys()))}}})'
128
145
 
129
146
  def _get_raw(self, key: str) -> str:
130
- return self._dct[key]
147
+ try:
148
+ e = self._dct[key]
149
+ except KeyError: # noqa
150
+ raise
151
+ else:
152
+ if isinstance(e, Secret):
153
+ return e.reveal()
154
+ elif isinstance(e, str):
155
+ return e
156
+ else:
157
+ raise TypeError(e)
131
158
 
132
159
 
133
160
  ##
@@ -167,7 +194,7 @@ class CachingSecrets(Secrets):
167
194
  ) -> None:
168
195
  super().__init__()
169
196
  self._child = child
170
- self._dct: dict[str, str] = {}
197
+ self._dct: dict[str, Secret] = {}
171
198
  self._ttl_s = ttl_s
172
199
  self._clock = clock
173
200
  self._deque: collections.deque[tuple[str, float]] = collections.deque()
@@ -187,15 +214,17 @@ class CachingSecrets(Secrets):
187
214
  def _get_raw(self, key: str) -> str:
188
215
  self.evict()
189
216
  try:
190
- return self._dct[key]
217
+ e = self._dct[key]
191
218
  except KeyError:
192
219
  pass
193
- out = self._child._get_raw(key) # noqa
220
+ else:
221
+ return e.reveal()
222
+ out = self._child.get(key) # noqa
194
223
  self._dct[key] = out
195
224
  if self._ttl_s is not None:
196
225
  dl = self._clock() + self._ttl_s
197
226
  self._deque.append((key, dl))
198
- return out
227
+ return out.reveal()
199
228
 
200
229
 
201
230
  ##
@@ -172,21 +172,17 @@ def register(*args: inj.Element | inj.Elements) -> None:
172
172
  _HARNESS_ELEMENTS_LIST.append(inj.as_elements(*args))
173
173
 
174
174
 
175
- TypeT = ta.TypeVar('TypeT', bound=type)
176
-
177
-
178
175
  def bind(
179
176
  scope: PytestScope | str = PytestScope.SESSION,
180
177
  *,
181
178
  eager: bool = False, # FIXME
182
- ) -> ta.Callable[[TypeT], TypeT]:
183
- def inner(cls):
179
+ ) -> ta.Callable[[T], T]:
180
+ def inner(obj):
184
181
  pts = scope if isinstance(scope, PytestScope) else PytestScope[check.isinstance(scope, str).upper()]
185
- check.isinstance(cls, type)
186
182
  register(inj.as_elements(
187
- inj.bind(cls, in_=_SCOPES_BY_PYTEST_SCOPE[pts]),
183
+ inj.bind(obj, in_=_SCOPES_BY_PYTEST_SCOPE[pts]),
188
184
  ))
189
- return cls
185
+ return obj
190
186
  return inner
191
187
 
192
188
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev50
3
+ Version: 0.0.0.dev52
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -26,7 +26,7 @@ Requires-Dist: psutil ~=6.0 ; extra == 'all'
26
26
  Requires-Dist: orjson ~=3.10 ; extra == 'all'
27
27
  Requires-Dist: ujson ~=5.10 ; extra == 'all'
28
28
  Requires-Dist: json5 ~=0.9 ; extra == 'all'
29
- Requires-Dist: pyyaml ~=5.0 ; extra == 'all'
29
+ Requires-Dist: pyyaml ~=6.0 ; extra == 'all'
30
30
  Requires-Dist: cbor2 ~=5.6 ; extra == 'all'
31
31
  Requires-Dist: cloudpickle ~=3.0 ; extra == 'all'
32
32
  Requires-Dist: httpx[http2] ~=0.27 ; extra == 'all'
@@ -61,13 +61,21 @@ Provides-Extra: formats
61
61
  Requires-Dist: orjson ~=3.10 ; extra == 'formats'
62
62
  Requires-Dist: ujson ~=5.10 ; extra == 'formats'
63
63
  Requires-Dist: json5 ~=0.9 ; extra == 'formats'
64
- Requires-Dist: pyyaml ~=5.0 ; extra == 'formats'
64
+ Requires-Dist: pyyaml ~=6.0 ; extra == 'formats'
65
65
  Requires-Dist: cbor2 ~=5.6 ; extra == 'formats'
66
66
  Requires-Dist: cloudpickle ~=3.0 ; extra == 'formats'
67
67
  Provides-Extra: http
68
68
  Requires-Dist: httpx[http2] ~=0.27 ; extra == 'http'
69
69
  Provides-Extra: misc
70
70
  Requires-Dist: wrapt ~=1.14 ; extra == 'misc'
71
+ Provides-Extra: plus
72
+ Requires-Dist: anyio ~=4.6 ; extra == 'plus'
73
+ Requires-Dist: sniffio ~=1.3 ; extra == 'plus'
74
+ Requires-Dist: asttokens ~=2.4 ; extra == 'plus'
75
+ Requires-Dist: executing ~=2.1 ; extra == 'plus'
76
+ Requires-Dist: orjson ~=3.10 ; extra == 'plus'
77
+ Requires-Dist: pyyaml ~=6.0 ; extra == 'plus'
78
+ Requires-Dist: wrapt ~=1.14 ; extra == 'plus'
71
79
  Provides-Extra: secrets
72
80
  Requires-Dist: cryptography ~=43.0 ; extra == 'secrets'
73
81
  Provides-Extra: sqlalchemy
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=sAddTbCUKdX0UYA4PeZ_z9JKF0vyzEpFYWq1tAAl9bw,1091
2
- omlish/__about__.py,sha256=7zWpck9jm2tOqlJ3NoFzl7oxiXot4m9j-ysVKiDGu50,2919
2
+ omlish/__about__.py,sha256=hr6Vr8v0IBjMA5wCjGRcZujewz5WvmS9N2vy1-B3iR0,3420
3
3
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omlish/argparse.py,sha256=Vr70_85EVLJLgEkRtwOr264tMRtqtlN7ncFfXRUk5aM,6914
5
5
  omlish/c3.py,sha256=4vogWgwPb8TbNS2KkZxpoWbwjj7MuHG2lQG-hdtkvjI,8062
@@ -34,7 +34,7 @@ omlish/bootstrap/diag.py,sha256=x_BKS_uhfW8QFk1NeH_VIocHif-A6FVTZ37262qCgZ0,5052
34
34
  omlish/bootstrap/harness.py,sha256=vDnpM0ZLSJaylxQNA4u2lwQwiU-KXZDb7MlkrhchFJY,2022
35
35
  omlish/bootstrap/main.py,sha256=u-TfxO4GkAK3LbRweQERogtO4kT0z3gqXRjnXvtJzC8,5328
36
36
  omlish/bootstrap/marshal.py,sha256=ZxdAeMNd2qXRZ1HUK89HmEhz8tqlS9OduW34QBscKw0,516
37
- omlish/bootstrap/sys.py,sha256=U0MFxO9tLFV3cdN5Y-Zrink6_45sFvzPUYQXyBk7-ns,8741
37
+ omlish/bootstrap/sys.py,sha256=i6veZeE83wO0HTl9b6ykj_pEN05fqu0enoAv4sw5Ayc,8742
38
38
  omlish/collections/__init__.py,sha256=tGUzvS_ZjiqALsLRy7JX3h4KZRQX2CmtdAfTRD7UwMk,1677
39
39
  omlish/collections/_abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
40
40
  omlish/collections/_io_abc.py,sha256=Cxs8KB1B_69rxpUYxI-MTsilAmNooJJn3w07DKqYKkE,1255
@@ -68,12 +68,12 @@ omlish/dataclasses/__init__.py,sha256=LALx4dXSvBWAKzmZxb3rkNdoR7kOaXeGcVypTnECvc
68
68
  omlish/dataclasses/utils.py,sha256=Ewd6w31uXy1sVUj59sxmXfGuI0CgsAbcfNXx0tsrNco,3347
69
69
  omlish/dataclasses/impl/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936
70
70
  omlish/dataclasses/impl/__init__.py,sha256=0hgOm3_u3yimjEkB-9fRMqX9rAW6kQC5t8XL0lpvffQ,410
71
- omlish/dataclasses/impl/api.py,sha256=6QtUAbP3DQZw8WEkgpsYfYKTn4CQBV9v0z2B4fTcR80,6405
71
+ omlish/dataclasses/impl/api.py,sha256=p7W519_EnDAWlkOVS-4BpP4SxadWIiUzC3RldSoB28o,6431
72
72
  omlish/dataclasses/impl/as_.py,sha256=CD-t7hkC1EP2F_jvZKIA_cVoDuwZ-Ln_xC4fJumPYX0,2598
73
73
  omlish/dataclasses/impl/copy.py,sha256=Tn8_n6Vohs-w4otbGdubBEvhd3TsSTaM3EfNGdS2LYo,591
74
74
  omlish/dataclasses/impl/descriptors.py,sha256=rEYE1Len99agTQCC25hSPMnM19BgPr0ZChABGi58Fdk,2476
75
75
  omlish/dataclasses/impl/exceptions.py,sha256=DeiM6rcjgncudn-XVuph9TDbVDEwBtyYb1bcbO3FFcA,193
76
- omlish/dataclasses/impl/fields.py,sha256=NIu30OggZvKhqQaZWad9dAE-B9yt9qvWtPR5U_TJIbQ,6281
76
+ omlish/dataclasses/impl/fields.py,sha256=iXA8j3q8GFQoj-6MgAKVLGG9GSSNOLGgyVtogCQ5q1E,6459
77
77
  omlish/dataclasses/impl/frozen.py,sha256=x87DSM8FIMZ3c_BIUE8NooCkExFjPsabeqIueEP5qKs,2988
78
78
  omlish/dataclasses/impl/hashing.py,sha256=FKnHuXCg9ylrzK2TLGqO5yfRN4HX3F415CSLlVYXtYE,3190
79
79
  omlish/dataclasses/impl/init.py,sha256=IgxO9nwHaHF8jGrUAk-Y5xke9uV2OwzfEe-88McE1Wg,6161
@@ -82,7 +82,7 @@ omlish/dataclasses/impl/main.py,sha256=Ti0PKbFKraKvfmoPuR-G7nLVNzRC8mvEuXhCuC-M2
82
82
  omlish/dataclasses/impl/metaclass.py,sha256=dlQEIN9MHBirll7Nx3StpzxYxXjrqxJ-QsorMcCNt7w,2828
83
83
  omlish/dataclasses/impl/metadata.py,sha256=4veWwTr-aA0KP-Y1cPEeOcXHup9EKJTYNJ0ozIxtzD4,1401
84
84
  omlish/dataclasses/impl/order.py,sha256=zWvWDkSTym8cc7vO1cLHqcBhhjOlucHOCUVJcdh4jt0,1369
85
- omlish/dataclasses/impl/params.py,sha256=IDM9VK-b5x7VauwYwXtwb9cg94UNpRUoZ0OH-Bv_kmM,2674
85
+ omlish/dataclasses/impl/params.py,sha256=-RDsDDHmTjXY-7bSJzKlRJJdyf1pNUfqwcswS4ZZhH0,2700
86
86
  omlish/dataclasses/impl/processing.py,sha256=DFxyFjL_h3awRyF_5eyTnB8QkuApx7Zc4QFnVoltlao,459
87
87
  omlish/dataclasses/impl/reflect.py,sha256=a19BbNxrmjNTbXzWuAl_794RCIQSMYyVqQ2Bf-DnNnM,5305
88
88
  omlish/dataclasses/impl/replace.py,sha256=wS9GHX4fIwaPv1JBJzIewdBfXyK3X3V7_t55Da87dYo,1217
@@ -105,7 +105,7 @@ omlish/diag/replserver/server.py,sha256=5pRjBn-Vz8gtu45756ycdbJe58C_xrB9rElPytr6
105
105
  omlish/dispatch/__init__.py,sha256=GsiGJ91NKiQptSROtnCSkrZExBkvfDwYvdoTu5dBqF0,117
106
106
  omlish/dispatch/_dispatch2.py,sha256=v3tCNyxGpOwY8qTwdp54TlM8mG6OVwtQoUZfYJ_griU,1756
107
107
  omlish/dispatch/_dispatch3.py,sha256=Vnu5DfoPWFJLodudBqoZBXGTi2wYk-Az56MXJgdQvwc,2608
108
- omlish/dispatch/dispatch.py,sha256=8B66wOat30HckcIsCq4pnutBy20iSPwPQOqJ4msHaGU,3739
108
+ omlish/dispatch/dispatch.py,sha256=8XQiLVoAq4u2oO0DnDSXQB9Q5qDk569l4CIFBqwDSyc,3847
109
109
  omlish/dispatch/functions.py,sha256=S8ElsLi6DKxTdtFGigWaF0vAquwy2sK-3f4iRLaYq70,1522
110
110
  omlish/dispatch/methods.py,sha256=XHjwwC9Gn4iDWxbyLAcbdSwRgVaq-8Bnn5cAwf5oZdA,5403
111
111
  omlish/docker/__init__.py,sha256=LGL5ByHrd7EaQnIDO6eLQvovDamngUiTfnpThV_4-MA,437
@@ -219,28 +219,28 @@ omlish/logs/formatters.py,sha256=q79nMnR2mRIStPyGrydQHpYTXgC5HHptt8lH3W2Wwbs,671
219
219
  omlish/logs/handlers.py,sha256=nyuFgmO05By_Xwq7es58ClzS51-F53lJL7gD0x5IqAg,228
220
220
  omlish/logs/noisy.py,sha256=Ubc-eTH6ZbGYsLfUUi69JAotwuUwzb-SJBeGo_0dIZI,348
221
221
  omlish/logs/utils.py,sha256=MgGovbP0zUrZ3FGD3qYNQWn-l0jy0Y0bStcQvv5BOmQ,391
222
- omlish/marshal/__init__.py,sha256=_vx3txFh09j3SoxSfSS4AwwnDa9jgAWzXYjluIitGWA,1969
222
+ omlish/marshal/__init__.py,sha256=peWAlHMn-SQBi0K2Hc95fvchUOCwVqnkC1pzKP-dgpw,2013
223
223
  omlish/marshal/any.py,sha256=e82OyYK3Emm1P1ClnsnxP7fIWC2iNVyW0H5nK4mLmWM,779
224
- omlish/marshal/base.py,sha256=ceNjOFxCwLNuxkmxofk3Sh5rE39JGxnc4giN7NNr9kA,6121
224
+ omlish/marshal/base.py,sha256=I7IOzFGn_DFeBRFCH8F0ONBa-NzM4mmMDld6bmoW-rc,6501
225
225
  omlish/marshal/base64.py,sha256=F-3ogJdcFCtWINRgJgWT0rErqgx6f4qahhcg8OrkqhE,1089
226
- omlish/marshal/dataclasses.py,sha256=B21hFukA9pNhp-PzBWG7rxz_F5BjNzMxU3nFURRrGXo,6037
226
+ omlish/marshal/dataclasses.py,sha256=Ofo1QjK7QBReT1310JNB2wsNEBShx6nxT93NEHb42ZM,6233
227
227
  omlish/marshal/datetimes.py,sha256=0ffg8cEvx9SMKIXZGD9b7MqpLfmgw0uKKdn6YTfoqok,3714
228
228
  omlish/marshal/enums.py,sha256=-0fKutBbyz8ygEaA0_P_8IOJrI9jMGigmnPbutV9Bg4,1464
229
229
  omlish/marshal/exceptions.py,sha256=jwQWn4LcPnadT2KRI_1JJCOSkwWh0yHnYK9BmSkNN4U,302
230
230
  omlish/marshal/factories.py,sha256=UV2Svjok-lTWsRqKGh-CeuAhvlohw9uJe7ZLyoKMvTM,2968
231
231
  omlish/marshal/forbidden.py,sha256=BNshzm4lN5O8sUZ1YvxrSYq3WPklq9NMQCRZ7RC3DLM,865
232
- omlish/marshal/global_.py,sha256=8XCjPcIjA65StESshzNfQiSyuckVaEiiWROmC3qk0mo,1117
232
+ omlish/marshal/global_.py,sha256=K76wB1-pdg4VWgiqR7wyxRNYr-voJApexYW2nV-R4DM,1127
233
233
  omlish/marshal/helpers.py,sha256=-SOgYJmrURILHpPK6Wu3cCvhj8RJrqfJxuKhh9UMs7o,1102
234
234
  omlish/marshal/iterables.py,sha256=6I_ZdJemLSQtJ4J5NrB9wi-eyxiJZS61HzHXp1yeiX8,2592
235
235
  omlish/marshal/mappings.py,sha256=zhLtyot7tzQtBNj7C4RBxjMELxA5r2q2Mth8Br7xkFs,2803
236
236
  omlish/marshal/maybes.py,sha256=mgK3QsWHkXgRqo076KxYKH6elRxzJ_QDTodv93mgHR0,2198
237
237
  omlish/marshal/naming.py,sha256=lIklR_Od4x1ghltAgOzqcKhHs-leeSv2YmFhCHO7GIs,613
238
238
  omlish/marshal/numbers.py,sha256=oY_yMNJEnJhjfLh89gpPXvKqeUyhQcaTcQB6ecyHiG8,1704
239
- omlish/marshal/objects.py,sha256=fe4dPEF6BqZRWHSn3D7Z5JyLg-Z7JFPhBe2gjUGBefw,6543
239
+ omlish/marshal/objects.py,sha256=EOo33BboPu9l9hNg0mljDAt_KHQ6taPXYk9uu2kU8Rk,6627
240
240
  omlish/marshal/optionals.py,sha256=r0XB5rqfasvgZJNrKYd6Unq2U4nHt3JURi26j0dYHlw,1499
241
241
  omlish/marshal/polymorphism.py,sha256=doA8aLUhna6aco5b2Ok3jsem1V4NsF3rM5RTfJt0a7U,5708
242
242
  omlish/marshal/primitives.py,sha256=wcvcs5GH_TWVmzAszh3dvyKibJgBxnXke-AlAXiwrrI,1107
243
- omlish/marshal/registries.py,sha256=GI2KogcxawMkk02Ky7-TsnijChoe1I7YTOPIbUNwSAI,1665
243
+ omlish/marshal/registries.py,sha256=FvC6qXHCizNB2QmU_N3orxW7iqfGYkiUXYYdTRWS6HA,2353
244
244
  omlish/marshal/standard.py,sha256=uQZIGiCwihmhB1tmhpKnZWZly0DDkdGjCnN0d41WHho,2985
245
245
  omlish/marshal/unions.py,sha256=ZWl0maHwh1V_cSnNmuCbbCQZzqlNtOModsTwnVTXNPA,2735
246
246
  omlish/marshal/utils.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
@@ -255,12 +255,12 @@ omlish/reflect/isinstance.py,sha256=x5T9S2634leinBT4hl3CZZkRttvdvvlxChkC_x9Qu2s,
255
255
  omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
256
256
  omlish/reflect/subst.py,sha256=JM2RGv2-Rcex8wCqhmgvRG59zD242P9jM3O2QLjKWWo,3586
257
257
  omlish/reflect/types.py,sha256=Zkcp8nx_vFNH7pBZ5pU5P0wIgQCauj5Nic3BZb5cRik,7030
258
- omlish/secrets/__init__.py,sha256=VKB2IF9vz4h4RXcZxgXj36KXOLcGBzfqVnxPgPDWpmg,408
258
+ omlish/secrets/__init__.py,sha256=SGB1KrlNrxlNpazEHYy95NTzteLi8ndoEgMhU7luBl8,420
259
259
  omlish/secrets/crypto.py,sha256=6CsLy0UEqCrBK8Xx_3-iFF6SKtu2GlEqUQ8-MliY3tk,3709
260
260
  omlish/secrets/marshal.py,sha256=U9uSRTWzZmumfNZeh_dROwVdGrARsp155TylRbjilP8,2048
261
261
  omlish/secrets/openssl.py,sha256=wxA_wIlxtuOUy71ABxAJgavh-UI_taOfm-A0dVlmSwM,6219
262
262
  omlish/secrets/passwords.py,sha256=3r-vEK6Gp6aq4L5Csnd06QnrjO9xfzHJP-g_7I9W_ao,4101
263
- omlish/secrets/secrets.py,sha256=ClD7t_mkmWkseVk4ahLzYLuLXeTxiwwPiidYm42vLh4,6871
263
+ omlish/secrets/secrets.py,sha256=XkzCrGNRLXUBXbw6_2pFGV2fuphbcgehtpp8zsjHaWM,7580
264
264
  omlish/secrets/subprocesses.py,sha256=EcnKlHHtnUMHGrBWXDfu8tv28wlgZx4P4GOiuPW9Vo8,1105
265
265
  omlish/specs/__init__.py,sha256=Xl4fT1o1MlcEIAjMt5EifgMuO4UBSa9Suj5NE9eMX1A,87
266
266
  omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU,1113
@@ -320,7 +320,7 @@ omlish/testing/pytest/helpers.py,sha256=TJpD60mBtLi9FtxX4TThfuXvg5FIRPSiZk1aeRwe
320
320
  omlish/testing/pytest/marks.py,sha256=ExuwitbMr1txMbaAcWZ652pYa30M-i3wVacnjqschTs,424
321
321
  omlish/testing/pytest/skip.py,sha256=uACMFtQQNJfFDbWrppjWevdrQgKVH1MUmH5rXIpv0IE,846
322
322
  omlish/testing/pytest/inject/__init__.py,sha256=pdRKv1HcDmJ_yArKJbYITPXXZthRSGgBJWqITr0Er38,117
323
- omlish/testing/pytest/inject/harness.py,sha256=sMKjP2EWHq-eeTB1YVXcANli2Czxt56_9ERg4HtkVPg,5810
323
+ omlish/testing/pytest/inject/harness.py,sha256=v4DaKJ0KL8oQjzIMK43Gh8GHP4hiI6-lY37O9lyOHRk,5724
324
324
  omlish/testing/pytest/plugins/__init__.py,sha256=ys1zXrYrNm7Uo6YOIVJ6Bd3dQo6kv387k7MbTYlqZSI,467
325
325
  omlish/testing/pytest/plugins/_registry.py,sha256=IK04KlBgiOJxKAyCCgjpX2R-9tE-btalYJkgjLc8Te8,77
326
326
  omlish/testing/pytest/plugins/asyncs.py,sha256=SV6oKCy50CGkzLGYX-CT4MfWNqsrH8ONEbIWC3tFcHA,5324
@@ -339,9 +339,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
339
339
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
340
340
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
341
341
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
342
- omlish-0.0.0.dev50.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
343
- omlish-0.0.0.dev50.dist-info/METADATA,sha256=n3_q2oVGCWe-a9pQRP20C3tnfr8wJeNYr6pgiLBqsi4,3817
344
- omlish-0.0.0.dev50.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
345
- omlish-0.0.0.dev50.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
346
- omlish-0.0.0.dev50.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
347
- omlish-0.0.0.dev50.dist-info/RECORD,,
342
+ omlish-0.0.0.dev52.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
343
+ omlish-0.0.0.dev52.dist-info/METADATA,sha256=wq0yemnhS_oXtTPbb4Aw2Bknr1_bYebJ-A3ASRPebXI,4167
344
+ omlish-0.0.0.dev52.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
345
+ omlish-0.0.0.dev52.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
346
+ omlish-0.0.0.dev52.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
347
+ omlish-0.0.0.dev52.dist-info/RECORD,,