omlish 0.0.0.dev172__py3-none-any.whl → 0.0.0.dev174__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev172'
2
- __revision__ = 'e37ff8d8de7971241ac3ad5a24d9b2fdc38f56c9'
1
+ __version__ = '0.0.0.dev174'
2
+ __revision__ = '4f993faa76d18f69b14ecdaef0be0291704815e2'
3
3
 
4
4
 
5
5
  #
@@ -1,5 +1,6 @@
1
1
  # ruff: noqa: UP006 UP007
2
2
  import dataclasses as dc
3
+ import typing as ta
3
4
 
4
5
 
5
6
  def dataclass_cache_hash(
@@ -30,3 +31,12 @@ def dataclass_cache_hash(
30
31
  return cls
31
32
 
32
33
  return inner
34
+
35
+
36
+ def dataclass_maybe_post_init(sup: ta.Any) -> bool:
37
+ try:
38
+ fn = sup.__post_init__
39
+ except AttributeError:
40
+ return False
41
+ fn()
42
+ return True
omlish/lite/marshal.py CHANGED
@@ -21,9 +21,11 @@ import weakref # noqa
21
21
 
22
22
  from .check import check
23
23
  from .reflect import deep_subclasses
24
+ from .reflect import get_literal_type_args
24
25
  from .reflect import get_new_type_supertype
25
26
  from .reflect import get_optional_alias_arg
26
27
  from .reflect import is_generic_alias
28
+ from .reflect import is_literal_type
27
29
  from .reflect import is_new_type
28
30
  from .reflect import is_union_alias
29
31
  from .strings import snake_case
@@ -141,6 +143,18 @@ class OptionalObjMarshaler(ObjMarshaler):
141
143
  return self.item.unmarshal(o, ctx)
142
144
 
143
145
 
146
+ @dc.dataclass(frozen=True)
147
+ class LiteralObjMarshaler(ObjMarshaler):
148
+ item: ObjMarshaler
149
+ vs: frozenset
150
+
151
+ def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
152
+ return self.item.marshal(check.in_(o, self.vs), ctx)
153
+
154
+ def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
155
+ return check.in_(self.item.unmarshal(o, ctx), self.vs)
156
+
157
+
144
158
  @dc.dataclass(frozen=True)
145
159
  class MappingObjMarshaler(ObjMarshaler):
146
160
  ty: type
@@ -352,6 +366,11 @@ class ObjMarshalerManager:
352
366
  if is_new_type(ty):
353
367
  return rec(get_new_type_supertype(ty))
354
368
 
369
+ if is_literal_type(ty):
370
+ lvs = frozenset(get_literal_type_args(ty))
371
+ lty = check.single(set(map(type, lvs)))
372
+ return LiteralObjMarshaler(rec(lty), lvs)
373
+
355
374
  if is_generic_alias(ty):
356
375
  try:
357
376
  mt = self._generic_mapping_types[ta.get_origin(ty)]
omlish/lite/reflect.py CHANGED
@@ -7,6 +7,9 @@ import typing as ta
7
7
  T = ta.TypeVar('T')
8
8
 
9
9
 
10
+ ##
11
+
12
+
10
13
  _GENERIC_ALIAS_TYPES = (
11
14
  ta._GenericAlias, # type: ignore # noqa
12
15
  *([ta._SpecialGenericAlias] if hasattr(ta, '_SpecialGenericAlias') else []), # noqa
@@ -24,6 +27,9 @@ is_union_alias = functools.partial(is_generic_alias, origin=ta.Union)
24
27
  is_callable_alias = functools.partial(is_generic_alias, origin=ta.Callable)
25
28
 
26
29
 
30
+ ##
31
+
32
+
27
33
  def is_optional_alias(spec: ta.Any) -> bool:
28
34
  return (
29
35
  isinstance(spec, _GENERIC_ALIAS_TYPES) and # noqa
@@ -38,6 +44,9 @@ def get_optional_alias_arg(spec: ta.Any) -> ta.Any:
38
44
  return it
39
45
 
40
46
 
47
+ ##
48
+
49
+
41
50
  def is_new_type(spec: ta.Any) -> bool:
42
51
  if isinstance(ta.NewType, type):
43
52
  return isinstance(spec, ta.NewType)
@@ -50,6 +59,26 @@ def get_new_type_supertype(spec: ta.Any) -> ta.Any:
50
59
  return spec.__supertype__
51
60
 
52
61
 
62
+ ##
63
+
64
+
65
+ def is_literal_type(spec: ta.Any) -> bool:
66
+ if hasattr(ta, '_LiteralGenericAlias'):
67
+ return isinstance(spec, ta._LiteralGenericAlias) # noqa
68
+ else:
69
+ return (
70
+ isinstance(spec, ta._GenericAlias) and # type: ignore # noqa
71
+ spec.__origin__ is ta.Literal
72
+ )
73
+
74
+
75
+ def get_literal_type_args(spec: ta.Any) -> ta.Iterable[ta.Any]:
76
+ return spec.__args__
77
+
78
+
79
+ ##
80
+
81
+
53
82
  def deep_subclasses(cls: ta.Type[T]) -> ta.Iterator[ta.Type[T]]:
54
83
  seen = set()
55
84
  todo = list(reversed(cls.__subclasses__()))
@@ -0,0 +1,50 @@
1
+ import dataclasses as dc
2
+ import typing as ta
3
+
4
+ from .. import check
5
+ from .. import reflect as rfl
6
+ from .base import MarshalContext
7
+ from .base import Marshaler
8
+ from .base import MarshalerFactory
9
+ from .base import UnmarshalContext
10
+ from .base import Unmarshaler
11
+ from .base import UnmarshalerFactory
12
+ from .values import Value
13
+
14
+
15
+ @dc.dataclass(frozen=True)
16
+ class LiteralMarshaler(Marshaler):
17
+ e: Marshaler
18
+ vs: frozenset
19
+
20
+ def marshal(self, ctx: MarshalContext, o: ta.Any | None) -> Value:
21
+ return self.e.marshal(ctx, check.in_(o, self.vs))
22
+
23
+
24
+ class LiteralMarshalerFactory(MarshalerFactory):
25
+ def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
26
+ return isinstance(rty, rfl.Literal)
27
+
28
+ def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
29
+ lty = check.isinstance(rty, rfl.Literal)
30
+ ety = check.single(set(map(type, lty.args)))
31
+ return LiteralMarshaler(ctx.make(ety), frozenset(lty.args))
32
+
33
+
34
+ @dc.dataclass(frozen=True)
35
+ class LiteralUnmarshaler(Unmarshaler):
36
+ e: Unmarshaler
37
+ vs: frozenset
38
+
39
+ def unmarshal(self, ctx: UnmarshalContext, v: Value) -> ta.Any | None:
40
+ return check.in_(self.e.unmarshal(ctx, v), self.vs)
41
+
42
+
43
+ class LiteralUnmarshalerFactory(UnmarshalerFactory):
44
+ def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
45
+ return isinstance(rty, rfl.Literal)
46
+
47
+ def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
48
+ lty = check.isinstance(rty, rfl.Literal)
49
+ ety = check.single(set(map(type, lty.args)))
50
+ return LiteralUnmarshaler(ctx.make(ety), frozenset(lty.args))
@@ -17,6 +17,8 @@ from .enums import EnumMarshalerFactory
17
17
  from .enums import EnumUnmarshalerFactory
18
18
  from .iterables import IterableMarshalerFactory
19
19
  from .iterables import IterableUnmarshalerFactory
20
+ from .literals import LiteralMarshalerFactory
21
+ from .literals import LiteralUnmarshalerFactory
20
22
  from .mappings import MappingMarshalerFactory
21
23
  from .mappings import MappingUnmarshalerFactory
22
24
  from .maybes import MaybeMarshalerFactory
@@ -48,6 +50,7 @@ STANDARD_MARSHALER_FACTORIES: list[MarshalerFactory] = [
48
50
  DataclassMarshalerFactory(),
49
51
  NamedtupleMarshalerFactory(),
50
52
  EnumMarshalerFactory(),
53
+ LiteralMarshalerFactory(),
51
54
  NUMBERS_MARSHALER_FACTORY,
52
55
  UUID_MARSHALER_FACTORY,
53
56
  BASE64_MARSHALER_FACTORY,
@@ -80,6 +83,7 @@ STANDARD_UNMARSHALER_FACTORIES: list[UnmarshalerFactory] = [
80
83
  DataclassUnmarshalerFactory(),
81
84
  NamedtupleUnmarshalerFactory(),
82
85
  EnumUnmarshalerFactory(),
86
+ LiteralUnmarshalerFactory(),
83
87
  NUMBERS_UNMARSHALER_FACTORY,
84
88
  UUID_UNMARSHALER_FACTORY,
85
89
  BASE64_UNMARSHALER_FACTORY,
@@ -27,10 +27,13 @@ from .types import ( # noqa
27
27
  Any,
28
28
  DEFAULT_REFLECTOR,
29
29
  Generic,
30
+ Literal,
30
31
  NewType,
32
+ ReflectTypeError,
31
33
  Reflector,
32
34
  TYPES,
33
35
  Type,
36
+ TypeInfo,
34
37
  Union,
35
38
  get_newtype_supertype,
36
39
  get_orig_bases,
omlish/reflect/subst.py CHANGED
@@ -8,6 +8,7 @@ from .ops import get_concrete_type
8
8
  from .ops import to_annotation
9
9
  from .types import Any
10
10
  from .types import Generic
11
+ from .types import Literal
11
12
  from .types import NewType
12
13
  from .types import Type
13
14
  from .types import Union
@@ -35,7 +36,7 @@ def replace_type_vars(
35
36
  update_aliases: bool = False,
36
37
  ) -> Type:
37
38
  def rec(cur):
38
- if isinstance(cur, (type, NewType, Any)):
39
+ if isinstance(cur, (type, NewType, Any, Literal)):
39
40
  return cur
40
41
 
41
42
  if isinstance(cur, Generic):
omlish/reflect/types.py CHANGED
@@ -7,6 +7,7 @@ TODO:
7
7
  - cache this shit, esp generic_mro shit
8
8
  - cache __hash__ in Generic/Union
9
9
  """
10
+ import abc
10
11
  import dataclasses as dc
11
12
  import types
12
13
  import typing as ta
@@ -17,11 +18,12 @@ _NoneType = types.NoneType # type: ignore
17
18
  _NONE_TYPE_FROZENSET: frozenset['Type'] = frozenset([_NoneType])
18
19
 
19
20
 
20
- _GenericAlias = ta._GenericAlias # type: ignore # noqa
21
+ _AnnotatedAlias = ta._AnnotatedAlias # type: ignore # noqa
21
22
  _CallableGenericAlias = ta._CallableGenericAlias # type: ignore # noqa
23
+ _GenericAlias = ta._GenericAlias # type: ignore # noqa
24
+ _LiteralGenericAlias = ta._LiteralGenericAlias # type: ignore # noqa
22
25
  _SpecialGenericAlias = ta._SpecialGenericAlias # type: ignore # noqa
23
26
  _UnionGenericAlias = ta._UnionGenericAlias # type: ignore # noqa
24
- _AnnotatedAlias = ta._AnnotatedAlias # type: ignore # noqa
25
27
 
26
28
 
27
29
  ##
@@ -116,19 +118,29 @@ def get_newtype_supertype(obj: ta.Any) -> ta.Any:
116
118
  ##
117
119
 
118
120
 
119
- Type: ta.TypeAlias = ta.Union[
121
+ class TypeInfo(abc.ABC): # noqa
122
+ pass
123
+
124
+
125
+ Type: ta.TypeAlias = ta.Union[ # noqa
120
126
  type,
121
127
  ta.TypeVar,
122
- 'Union',
123
- 'Generic',
124
- 'NewType',
125
- 'Annotated',
126
- 'Any',
128
+ TypeInfo,
127
129
  ]
128
130
 
129
131
 
132
+ TYPES: tuple[type, ...] = (
133
+ type,
134
+ ta.TypeVar,
135
+ TypeInfo,
136
+ )
137
+
138
+
139
+ ##
140
+
141
+
130
142
  @dc.dataclass(frozen=True)
131
- class Union:
143
+ class Union(TypeInfo):
132
144
  args: frozenset[Type]
133
145
 
134
146
  @property
@@ -144,8 +156,11 @@ class Union:
144
156
  return Union(rem)
145
157
 
146
158
 
159
+ #
160
+
161
+
147
162
  @dc.dataclass(frozen=True)
148
- class Generic:
163
+ class Generic(TypeInfo):
149
164
  cls: type
150
165
  args: tuple[Type, ...] # map[int, V] = (int, V) | map[T, T] = (T, T)
151
166
 
@@ -167,39 +182,51 @@ class Generic:
167
182
  )
168
183
 
169
184
 
185
+ #
186
+
187
+
170
188
  @dc.dataclass(frozen=True)
171
- class NewType:
189
+ class NewType(TypeInfo):
172
190
  obj: ta.Any
173
191
  ty: Type
174
192
 
175
193
 
194
+ #
195
+
196
+
176
197
  @dc.dataclass(frozen=True)
177
- class Annotated:
198
+ class Annotated(TypeInfo):
178
199
  ty: Type
179
200
  md: ta.Sequence[ta.Any]
180
201
 
181
202
  obj: ta.Any = dc.field(compare=False, repr=False)
182
203
 
183
204
 
184
- class Any:
205
+ #
206
+
207
+
208
+ @dc.dataclass(frozen=True)
209
+ class Literal(TypeInfo):
210
+ args: tuple[ta.Any, ...]
211
+
212
+ obj: ta.Any = dc.field(compare=False, repr=False)
213
+
214
+
215
+ #
216
+
217
+
218
+ class Any(TypeInfo):
185
219
  pass
186
220
 
187
221
 
188
222
  ANY = Any()
189
223
 
190
224
 
191
- TYPES: tuple[type, ...] = (
192
- type,
193
- ta.TypeVar,
194
- Union,
195
- Generic,
196
- NewType,
197
- Annotated,
198
- Any,
199
- )
225
+ ##
200
226
 
201
227
 
202
- ##
228
+ class ReflectTypeError(TypeError):
229
+ pass
203
230
 
204
231
 
205
232
  class Reflector:
@@ -212,57 +239,80 @@ class Reflector:
212
239
 
213
240
  self._override = override
214
241
 
242
+ #
243
+
215
244
  def is_type(self, obj: ta.Any) -> bool:
216
- if isinstance(obj, (Union, Generic, ta.TypeVar, NewType, Any)): # noqa
245
+ try:
246
+ self._type(obj, check_only=True)
247
+ except ReflectTypeError:
248
+ return False
249
+ else:
217
250
  return True
218
251
 
219
- oty = type(obj)
220
-
221
- return (
222
- oty is _UnionGenericAlias or oty is types.UnionType or # noqa
223
-
224
- isinstance(obj, ta.NewType) or # noqa
225
-
226
- (
227
- is_simple_generic_alias_type(oty) or
228
- oty is _CallableGenericAlias
229
- ) or
252
+ def type(self, obj: ta.Any) -> Type:
253
+ if (ty := self._type(obj, check_only=False)) is None:
254
+ raise RuntimeError(obj)
255
+ return ty
230
256
 
231
- isinstance(obj, type) or
257
+ #
232
258
 
233
- isinstance(obj, _SpecialGenericAlias)
234
- )
259
+ def _type(self, obj: ta.Any, *, check_only: bool) -> Type | None:
260
+ ##
261
+ # Overrides beat everything
235
262
 
236
- def type(self, obj: ta.Any) -> Type:
237
263
  if self._override is not None:
238
264
  if (ovr := self._override(obj)) is not None:
239
265
  return ovr
240
266
 
267
+ ##
268
+ # Any
269
+
241
270
  if obj is ta.Any:
242
271
  return ANY
243
272
 
244
- if isinstance(obj, (Union, Generic, ta.TypeVar, NewType, Any)): # noqa
273
+ ##
274
+ # Already a Type?
275
+
276
+ if isinstance(obj, (ta.TypeVar, TypeInfo)): # noqa
245
277
  return obj
246
278
 
247
279
  oty = type(obj)
248
280
 
281
+ ##
282
+ # Union
283
+
249
284
  if oty is _UnionGenericAlias or oty is types.UnionType:
285
+ if check_only:
286
+ return None
287
+
250
288
  return Union(frozenset(self.type(a) for a in ta.get_args(obj)))
251
289
 
290
+ ##
291
+ # NewType
292
+
252
293
  if isinstance(obj, ta.NewType): # noqa
294
+ if check_only:
295
+ return None
296
+
253
297
  return NewType(obj, get_newtype_supertype(obj))
254
298
 
299
+ ##
300
+ # Simple Generic
301
+
255
302
  if (
256
303
  is_simple_generic_alias_type(oty) or
257
304
  oty is _CallableGenericAlias
258
305
  ):
306
+ if check_only:
307
+ return None
308
+
259
309
  origin = ta.get_origin(obj)
260
310
  args = ta.get_args(obj)
261
311
 
262
312
  if oty is _CallableGenericAlias:
263
313
  p, r = args
264
314
  if p is Ellipsis or isinstance(p, ta.ParamSpec):
265
- raise TypeError(f'Callable argument not yet supported for {obj=}')
315
+ raise ReflectTypeError(f'Callable argument not yet supported for {obj=}')
266
316
  args = (*p, r)
267
317
  params = _KNOWN_SPECIAL_TYPE_VARS[:len(args)]
268
318
 
@@ -276,7 +326,7 @@ class Reflector:
276
326
  params = get_params(origin)
277
327
 
278
328
  if len(args) != len(params):
279
- raise TypeError(f'Mismatched {args=} and {params=} for {obj=}')
329
+ raise ReflectTypeError(f'Mismatched {args=} and {params=} for {obj=}')
280
330
 
281
331
  return Generic(
282
332
  origin,
@@ -285,7 +335,13 @@ class Reflector:
285
335
  obj,
286
336
  )
287
337
 
338
+ ##
339
+ # Full Generic
340
+
288
341
  if isinstance(obj, type):
342
+ if check_only:
343
+ return None
344
+
289
345
  if issubclass(obj, ta.Generic): # type: ignore
290
346
  params = get_params(obj)
291
347
  if params:
@@ -295,12 +351,20 @@ class Reflector:
295
351
  params,
296
352
  obj,
297
353
  )
354
+
298
355
  return obj
299
356
 
357
+ ##
358
+ # Special Generic
359
+
300
360
  if isinstance(obj, _SpecialGenericAlias):
301
361
  if (ks := _KNOWN_SPECIALS_BY_ALIAS.get(obj)) is not None:
362
+ if check_only:
363
+ return None
364
+
302
365
  if (np := ks.nparams) < 0:
303
- raise TypeError(obj)
366
+ raise ReflectTypeError(obj)
367
+
304
368
  params = _KNOWN_SPECIAL_TYPE_VARS[:np]
305
369
  return Generic(
306
370
  ks.origin,
@@ -309,11 +373,29 @@ class Reflector:
309
373
  obj,
310
374
  )
311
375
 
376
+ ##
377
+ # Annotated
378
+
312
379
  if isinstance(obj, _AnnotatedAlias):
380
+ if check_only:
381
+ return None
382
+
313
383
  o = ta.get_args(obj)[0]
314
384
  return Annotated(self.type(o), md=obj.__metadata__, obj=obj)
315
385
 
316
- raise TypeError(obj)
386
+ ##
387
+ # Literal
388
+
389
+ if isinstance(obj, _LiteralGenericAlias):
390
+ if check_only:
391
+ return None
392
+
393
+ return Literal(ta.get_args(obj), obj=obj)
394
+
395
+ ##
396
+ # Failure
397
+
398
+ raise ReflectTypeError(obj)
317
399
 
318
400
 
319
401
  DEFAULT_REFLECTOR = Reflector()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev172
3
+ Version: 0.0.0.dev174
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=lRkBDFxlAbf6lN5upo3WSf-owW8YG1T21dfpbQL-XHM,7598
2
- omlish/__about__.py,sha256=FhrhH5_-1RC_koxri7HpjROhO4wDd-xo-r03wYYQwpU,3409
2
+ omlish/__about__.py,sha256=KbZ8zoYDjSV1aGo6s2eOuuEIQygRCdb_vo1nsF-5JAI,3409
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
5
5
  omlish/cached.py,sha256=UI-XTFBwA6YXWJJJeBn-WkwBkfzDjLBBaZf4nIJA9y0,510
@@ -378,14 +378,14 @@ omlish/lite/__init__.py,sha256=Y3l4WY4JRi2uLG6kgbGp93fuGfkxkKwZDvhsa0Rwgtk,15
378
378
  omlish/lite/cached.py,sha256=O7ozcoDNFm1Hg2wtpHEqYSp_i_nCLNOP6Ueq_Uk-7mU,1300
379
379
  omlish/lite/check.py,sha256=0PD-GKtaDqDX6jU5KbzbMvH-vl6jH82xgYfplmfTQkg,12941
380
380
  omlish/lite/contextmanagers.py,sha256=m9JO--p7L7mSl4cycXysH-1AO27weDKjP3DZG61cwwM,1683
381
- omlish/lite/dataclasses.py,sha256=gpEim20a_qRnK18WUipEcAFq4Hn1S0u0SpanbfZ8LWQ,848
381
+ omlish/lite/dataclasses.py,sha256=M6UD4VwGo0Ky7RNzKWbO0IOy7iBZVCIbTiC6EYbFnX8,1035
382
382
  omlish/lite/inject.py,sha256=EEaioN9ESAveVCMe2s5osjwI97FPRUVoU8P95vGUiYo,23376
383
383
  omlish/lite/json.py,sha256=7-02Ny4fq-6YAu5ynvqoijhuYXWpLmfCI19GUeZnb1c,740
384
384
  omlish/lite/logs.py,sha256=CWFG0NKGhqNeEgryF5atN2gkPYbUdTINEw_s1phbINM,51
385
- omlish/lite/marshal.py,sha256=ldoZs_yiQIUpOjBviV9f4mwm7hSZy0hRLXrvQA-6POU,14257
385
+ omlish/lite/marshal.py,sha256=8V2mWl6D8gfJK_a86YKwmSsBBvoKMucLK4uLBwVpF60,14910
386
386
  omlish/lite/maybes.py,sha256=7OlHJ8Q2r4wQ-aRbZSlJY7x0e8gDvufFdlohGEIJ3P4,833
387
387
  omlish/lite/pycharm.py,sha256=pUOJevrPClSqTCEOkQBO11LKX2003tfDcp18a03QFrc,1163
388
- omlish/lite/reflect.py,sha256=L5_9gNp_BmAZ3l9PVezDmiXFg_6BOHbfQNB98tUULW0,1765
388
+ omlish/lite/reflect.py,sha256=pzOY2PPuHH0omdtglkN6DheXDrGopdL3PtTJnejyLFU,2189
389
389
  omlish/lite/resources.py,sha256=YNSmX1Ohck1aoWRs55a-o5ChVbFJIQhtbqE-XwF55Oc,326
390
390
  omlish/lite/runtime.py,sha256=XQo408zxTdJdppUZqOWHyeUR50VlCpNIExNGHz4U6O4,459
391
391
  omlish/lite/secrets.py,sha256=3Mz3V2jf__XU9qNHcH56sBSw95L3U2UPL24bjvobG0c,816
@@ -422,6 +422,7 @@ omlish/marshal/forbidden.py,sha256=NDe828hqCQw-AgxcEm8MiDZNxWoBwf3o7sTyvQsSsQ0,8
422
422
  omlish/marshal/global_.py,sha256=K76wB1-pdg4VWgiqR7wyxRNYr-voJApexYW2nV-R4DM,1127
423
423
  omlish/marshal/helpers.py,sha256=-SOgYJmrURILHpPK6Wu3cCvhj8RJrqfJxuKhh9UMs7o,1102
424
424
  omlish/marshal/iterables.py,sha256=H9FoCB5RlJW0SVSi3SBD6sxOXN9XRTOUkHRwCYSqRb8,2632
425
+ omlish/marshal/literals.py,sha256=m92biF9-PwHGVBx3zG3s2YvklLeOQ7T5IOdgwBJr-NU,1599
425
426
  omlish/marshal/mappings.py,sha256=XcNOaV708ZHeuIrWiFHC6F1O6U9NyyTKUurvXwIryJo,2789
426
427
  omlish/marshal/maybes.py,sha256=i-gOQJ-7tdt6sOazAeyCh4N71SK3jWv-BKlkx-fZm-s,2200
427
428
  omlish/marshal/namedtuples.py,sha256=H0icxcE5FrqgfI9dRc8LlXJy430g_yuILTCVD0Zvfd0,2799
@@ -434,7 +435,7 @@ omlish/marshal/optionals.py,sha256=r0XB5rqfasvgZJNrKYd6Unq2U4nHt3JURi26j0dYHlw,1
434
435
  omlish/marshal/polymorphism.py,sha256=2SxrfneA9QdhNdxieEGFnHDHpUo3ftETA9dMbCbmbWY,6511
435
436
  omlish/marshal/primitives.py,sha256=f_6m24Cb-FDGsZpYSas11nLt3xCCEUXugw3Hv4-aNhg,1291
436
437
  omlish/marshal/registries.py,sha256=FvC6qXHCizNB2QmU_N3orxW7iqfGYkiUXYYdTRWS6HA,2353
437
- omlish/marshal/standard.py,sha256=UMET8wkxf__ApIDuVcoCKsjNWwZejbICLeXhhmn56Nk,3321
438
+ omlish/marshal/standard.py,sha256=-iA2o674AW1uNVabcA9Dtr6z0gyFS5yLP80nBQ8R5qY,3479
438
439
  omlish/marshal/unions.py,sha256=tT4W-mxuPi7s_kdl25_AUltsurYPO_0mQl2CiVmNonY,4357
439
440
  omlish/marshal/utils.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
440
441
  omlish/marshal/uuids.py,sha256=H4B7UX_EPNmP2tC8bubcKrPLTS4aQu98huvbXQ3Zv2g,910
@@ -452,11 +453,11 @@ omlish/os/linux.py,sha256=whJ6scwMKSFBdXiVhJW0BCpJV4jOGMr-a_a3Bhwz6Ls,18938
452
453
  omlish/os/paths.py,sha256=hqPiyg_eYaRoIVPdAeX4oeLEV4Kpln_XsH0tHvbOf8Q,844
453
454
  omlish/os/pidfile.py,sha256=S4Nbe00oSxckY0qCC9AeTEZe7NSw4eJudnQX7wCXzks,1738
454
455
  omlish/os/sizes.py,sha256=ohkALLvqSqBX4iR-7DMKJ4pfOCRdZXV8htH4QywUNM0,152
455
- omlish/reflect/__init__.py,sha256=4-EuCSX1qpEWfScCFzAJv_XghHFu4cXxpxKeBKrosQ4,720
456
+ omlish/reflect/__init__.py,sha256=JBWwxKwP4IEaomkK0PTju02STU1BVXT14SCrShT1Sm0,769
456
457
  omlish/reflect/inspect.py,sha256=veJ424-9oZrqyvhVpvxOi7hcKW-PDBkdYL2yjrFlk4o,495
457
458
  omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
458
- omlish/reflect/subst.py,sha256=JM2RGv2-Rcex8wCqhmgvRG59zD242P9jM3O2QLjKWWo,3586
459
- omlish/reflect/types.py,sha256=B1zbq3yHo6B5JeNOXbmaxm78kqZTRb_4jIWY5GxzY4Q,8155
459
+ omlish/reflect/subst.py,sha256=g3q7NmNWsmc67mcchmCE3WFPCMDSBq-FXn4ah-DWL_U,3622
460
+ omlish/reflect/types.py,sha256=lYxK_hlC4kVDMKeDYJp0mymSth21quwuFAMAEFBznyE,9151
460
461
  omlish/secrets/__init__.py,sha256=SGB1KrlNrxlNpazEHYy95NTzteLi8ndoEgMhU7luBl8,420
461
462
  omlish/secrets/crypto.py,sha256=6CsLy0UEqCrBK8Xx_3-iFF6SKtu2GlEqUQ8-MliY3tk,3709
462
463
  omlish/secrets/marshal.py,sha256=U9uSRTWzZmumfNZeh_dROwVdGrARsp155TylRbjilP8,2048
@@ -569,9 +570,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
569
570
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
570
571
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
571
572
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
572
- omlish-0.0.0.dev172.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
573
- omlish-0.0.0.dev172.dist-info/METADATA,sha256=NmaRtipxdQVzOJ-RKJly49mHX61rTwtiJ5tjgdWs3QA,4264
574
- omlish-0.0.0.dev172.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
575
- omlish-0.0.0.dev172.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
576
- omlish-0.0.0.dev172.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
577
- omlish-0.0.0.dev172.dist-info/RECORD,,
573
+ omlish-0.0.0.dev174.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
574
+ omlish-0.0.0.dev174.dist-info/METADATA,sha256=mfdjBA3EnhNV8PVranSvjA6zIydorvYRoHtqJZ62xhA,4264
575
+ omlish-0.0.0.dev174.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
576
+ omlish-0.0.0.dev174.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
577
+ omlish-0.0.0.dev174.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
578
+ omlish-0.0.0.dev174.dist-info/RECORD,,