omlish 0.0.0.dev107__py3-none-any.whl → 0.0.0.dev108__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.dev107'
2
- __revision__ = '9f270e6dc323798d719017400a74df9173412f7b'
1
+ __version__ = '0.0.0.dev108'
2
+ __revision__ = 'cbe1cf56c59d1ba006099e53058ecd40aa4a731d'
3
3
 
4
4
 
5
5
  #
@@ -3,7 +3,6 @@ TODO:
3
3
  - more cache-recursive reuse - fields, mro, etc
4
4
  """
5
5
  import dataclasses as dc
6
- import inspect
7
6
  import sys
8
7
  import typing as ta
9
8
  import weakref
@@ -28,22 +27,9 @@ from .params import get_params_extras
28
27
  from .utils import Namespace
29
28
 
30
29
 
31
- try:
32
- import annotationlib # noqa
33
- except ImportError:
34
- annotationlib = None
35
-
36
-
37
30
  MISSING = dc.MISSING
38
31
 
39
32
 
40
- def _get_annotations(obj):
41
- if annotationlib is not None:
42
- return annotationlib.get_annotations(obj, format=annotationlib.Format.FORWARDREF) # noqa
43
- else:
44
- return inspect.get_annotations(obj)
45
-
46
-
47
33
  class ClassInfo:
48
34
 
49
35
  def __init__(self, cls: type, *, _constructing: bool = False) -> None:
@@ -67,7 +53,10 @@ class ClassInfo:
67
53
 
68
54
  @cached.property
69
55
  def cls_annotations(self) -> ta.Mapping[str, ta.Any]:
70
- return _get_annotations(self._cls)
56
+ # Does not use ta.get_type_hints because that's what std dataclasses do [1]. Might be worth revisiting? A part
57
+ # of why they don't is to not import typing for efficiency but we don't care about that degree of startup speed.
58
+ # [1]: https://github.com/python/cpython/blob/54c63a32d06cb5f07a66245c375eac7d7efb964a/Lib/dataclasses.py#L985-L986 # noqa
59
+ return rfl.get_annotations(self._cls)
71
60
 
72
61
  ##
73
62
 
@@ -1,3 +1,9 @@
1
+ # ruff: noqa: I001
2
+ import typing as _ta
3
+
4
+ from ... import lang as _lang
5
+
6
+
1
7
  from .consts import ( # noqa
2
8
  COMPACT_KWARGS,
3
9
  COMPACT_SEPARATORS,
@@ -23,6 +29,11 @@ from .json import ( # noqa
23
29
  loads,
24
30
  )
25
31
 
26
- from .render import ( # noqa
27
- JsonRenderer,
28
- )
32
+ if _ta.TYPE_CHECKING:
33
+ from .render import ( # noqa
34
+ JsonRenderer,
35
+ )
36
+ else:
37
+ _lang.proxy_init(globals(), '.render', [
38
+ 'JsonRenderer',
39
+ ])
@@ -5,7 +5,7 @@ TODO:
5
5
 
6
6
  ==
7
7
 
8
- jq Command options)
8
+ jq Command options:
9
9
  -n, --null-input use `null` as the single input value;
10
10
  -R, --raw-input read each line as string instead of JSON;
11
11
  -s, --slurp read all inputs into an array and use it as the single input value;
@@ -276,11 +276,10 @@ def _main() -> None:
276
276
  renderer = EagerRenderer(cfg.rendering)
277
277
 
278
278
  for buf in yield_input():
279
- if buf:
280
- for v in parser.parse(buf):
281
- for e in processor.process(v):
282
- s = renderer.render(e)
283
- print(s, file=out)
279
+ for v in parser.parse(buf):
280
+ for e in processor.process(v):
281
+ s = renderer.render(e)
282
+ print(s, file=out)
284
283
 
285
284
  else:
286
285
  parser = EagerParser(cfg.format)
@@ -35,8 +35,12 @@ class Processor:
35
35
  v = self._jmespath_expr.search(v)
36
36
 
37
37
  if self._opts.flat:
38
- if isinstance(v, str):
39
- raise TypeError(f'Flat output must be arrays, got {type(v)}', v)
38
+ if (
39
+ not isinstance(v, ta.Iterable) or # noqa
40
+ isinstance(v, ta.Mapping) or
41
+ isinstance(v, lang.BUILTIN_SCALAR_ITERABLE_TYPES)
42
+ ):
43
+ raise TypeError(f'Flat output must be flat collections, got {type(v)}', v)
40
44
 
41
45
  yield from v
42
46
 
omlish/lang/imports.py CHANGED
@@ -1,12 +1,9 @@
1
1
  import contextlib
2
- import functools
3
2
  import importlib.util
4
3
  import sys
5
4
  import types
6
5
  import typing as ta
7
6
 
8
- from .cached import cached_function
9
-
10
7
 
11
8
  ##
12
9
 
@@ -23,8 +20,40 @@ def can_import(name: str, package: str | None = None) -> bool:
23
20
  ##
24
21
 
25
22
 
26
- def lazy_import(name: str, package: str | None = None) -> ta.Callable[[], ta.Any]:
27
- return cached_function(functools.partial(importlib.import_module, name, package=package))
23
+ def lazy_import(
24
+ name: str,
25
+ package: str | None = None,
26
+ *,
27
+ optional: bool = False,
28
+ cache_failure: bool = False,
29
+ ) -> ta.Callable[[], ta.Any]:
30
+ result = not_set = object()
31
+
32
+ def inner():
33
+ nonlocal result
34
+
35
+ if result is not not_set:
36
+ if isinstance(result, Exception):
37
+ raise result
38
+ return result
39
+
40
+ try:
41
+ mod = importlib.import_module(name, package=package)
42
+
43
+ except Exception as e:
44
+ if optional:
45
+ if cache_failure:
46
+ result = None
47
+ return None
48
+
49
+ if cache_failure:
50
+ result = e
51
+ raise
52
+
53
+ result = mod
54
+ return mod
55
+
56
+ return inner
28
57
 
29
58
 
30
59
  def proxy_import(
@@ -1,3 +1,7 @@
1
+ """
2
+ TODO:
3
+ - heterogeneous tuples
4
+ """
1
5
  import collections.abc
2
6
  import dataclasses as dc
3
7
  import functools
@@ -0,0 +1,111 @@
1
+ import inspect
2
+ import typing as ta
3
+
4
+ from .. import check
5
+ from .. import collections as col
6
+ from .. import lang
7
+ from .. import reflect as rfl
8
+ from .base import MarshalContext
9
+ from .base import Marshaler
10
+ from .base import MarshalerFactory
11
+ from .base import Option
12
+ from .base import UnmarshalContext
13
+ from .base import Unmarshaler
14
+ from .base import UnmarshalerFactory
15
+ from .objects import FieldInfo
16
+ from .objects import FieldInfos
17
+ from .objects import FieldMetadata
18
+ from .objects import ObjectMarshaler
19
+ from .objects import ObjectUnmarshaler
20
+
21
+
22
+ ##
23
+
24
+
25
+ def _is_named_tuple(rty: rfl.Type) -> bool:
26
+ return (
27
+ isinstance(rty, type) and
28
+ issubclass(rty, tuple) and
29
+ ta.NamedTuple in rfl.get_orig_bases(rty)
30
+ )
31
+
32
+
33
+ def get_field_infos(
34
+ ty: type,
35
+ opts: col.TypeMap[Option] = col.TypeMap(),
36
+ ) -> FieldInfos:
37
+ check.arg(_is_named_tuple(ty), ty)
38
+
39
+ sig = inspect.signature(ty)
40
+
41
+ ret: list[FieldInfo] = []
42
+ for param in sig.parameters.values():
43
+ ret.append(FieldInfo(
44
+ name=param.name,
45
+ type=param.annotation,
46
+ metadata=FieldMetadata(),
47
+
48
+ marshal_name=param.name,
49
+ unmarshal_names=[param.name],
50
+ ))
51
+
52
+ return FieldInfos(ret)
53
+
54
+
55
+ ##
56
+
57
+
58
+ class NamedtupleMarshalerFactory(MarshalerFactory):
59
+ def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
60
+ return _is_named_tuple(rty)
61
+
62
+ def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
63
+ check.state(_is_named_tuple(rty))
64
+ ty = check.isinstance(rty, type)
65
+ check.state(not lang.is_abstract_class(ty))
66
+
67
+ fis = get_field_infos(ty, ctx.options)
68
+
69
+ fields = [
70
+ (fi, ctx.make(fi.type))
71
+ for fi in fis
72
+ ]
73
+
74
+ return ObjectMarshaler(
75
+ fields,
76
+ )
77
+
78
+
79
+ ##
80
+
81
+
82
+ class NamedtupleUnmarshalerFactory(UnmarshalerFactory):
83
+ def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
84
+ return _is_named_tuple(rty)
85
+
86
+ def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
87
+ check.state(_is_named_tuple(rty))
88
+ ty = check.isinstance(rty, type)
89
+ check.state(not lang.is_abstract_class(ty))
90
+
91
+ fis = get_field_infos(ty, ctx.options)
92
+
93
+ d: dict[str, tuple[FieldInfo, Unmarshaler]] = {}
94
+ defaults: dict[str, ta.Any] = {}
95
+
96
+ for fi in fis:
97
+ tup = (fi, ctx.make(fi.type))
98
+
99
+ for un in fi.unmarshal_names:
100
+ if un in d:
101
+ raise KeyError(f'Duplicate fields for name {un!r}: {fi.name!r}, {d[un][0].name!r}')
102
+ d[un] = tup
103
+
104
+ if fi.options.default.present:
105
+ defaults[fi.name] = fi.options.default.must()
106
+
107
+ return ObjectUnmarshaler(
108
+ ty,
109
+ d,
110
+ defaults=defaults,
111
+ )
@@ -21,6 +21,8 @@ from .mappings import MappingMarshalerFactory
21
21
  from .mappings import MappingUnmarshalerFactory
22
22
  from .maybes import MaybeMarshalerFactory
23
23
  from .maybes import MaybeUnmarshalerFactory
24
+ from .namedtuples import NamedtupleMarshalerFactory
25
+ from .namedtuples import NamedtupleUnmarshalerFactory
24
26
  from .newtypes import NewtypeMarshalerFactory
25
27
  from .newtypes import NewtypeUnmarshalerFactory
26
28
  from .numbers import NUMBERS_MARSHALER_FACTORY
@@ -44,6 +46,7 @@ STANDARD_MARSHALER_FACTORIES: list[MarshalerFactory] = [
44
46
  OptionalMarshalerFactory(),
45
47
  PrimitiveUnionMarshalerFactory(),
46
48
  DataclassMarshalerFactory(),
49
+ NamedtupleMarshalerFactory(),
47
50
  EnumMarshalerFactory(),
48
51
  NUMBERS_MARSHALER_FACTORY,
49
52
  UUID_MARSHALER_FACTORY,
@@ -75,6 +78,7 @@ STANDARD_UNMARSHALER_FACTORIES: list[UnmarshalerFactory] = [
75
78
  OptionalUnmarshalerFactory(),
76
79
  PrimitiveUnionUnmarshalerFactory(),
77
80
  DataclassUnmarshalerFactory(),
81
+ NamedtupleUnmarshalerFactory(),
78
82
  EnumUnmarshalerFactory(),
79
83
  NUMBERS_UNMARSHALER_FACTORY,
80
84
  UUID_UNMARSHALER_FACTORY,
omlish/marshal/unions.py CHANGED
@@ -3,6 +3,7 @@ import typing as ta
3
3
  from .. import cached
4
4
  from .. import check
5
5
  from .. import dataclasses as dc
6
+ from .. import lang
6
7
  from .. import matchfns as mfs
7
8
  from .. import reflect as rfl
8
9
  from .base import MarshalContext
@@ -115,34 +116,36 @@ PRIMITIVE_UNION_UNMARSHALER_FACTORY = PrimitiveUnionUnmarshalerFactory()
115
116
 
116
117
 
117
118
  @dc.dataclass(frozen=True)
118
- class PolymorphismUnionMarshalerFactory(MarshalerFactory):
119
+ class _BasePolymorphismUnionFactory(lang.Abstract):
119
120
  impls: Impls
120
121
  tt: TypeTagging = WrapperTypeTagging()
122
+ allow_partial: bool = dc.field(default=False, kw_only=True)
121
123
 
122
124
  @cached.property
123
125
  @dc.init
124
- def rty(self) -> rfl.Union:
125
- return rfl.type_(ta.Union[*tuple(i.ty for i in self.impls)]) # type: ignore
126
+ def rtys(self) -> frozenset[rfl.Type]:
127
+ return frozenset(i.ty for i in self.impls)
126
128
 
127
- def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
128
- return isinstance(rty, rfl.Union) and rty == self.rty
129
+ def guard(self, ctx: MarshalContext | UnmarshalContext, rty: rfl.Type) -> bool:
130
+ if not isinstance(rty, rfl.Union):
131
+ return False
132
+ if self.allow_partial:
133
+ return not (rty.args - self.rtys)
134
+ else:
135
+ return rty.args == self.rtys
129
136
 
130
- def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
131
- return make_polymorphism_marshaler(self.impls, self.tt, ctx)
137
+ def get_impls(self, rty: rfl.Type) -> Impls:
138
+ uty = check.isinstance(rty, rfl.Union)
139
+ return Impls([self.impls.by_ty[check.isinstance(a, type)] for a in uty.args])
132
140
 
133
141
 
134
142
  @dc.dataclass(frozen=True)
135
- class PolymorphismUnionUnmarshalerFactory(UnmarshalerFactory):
136
- impls: Impls
137
- tt: TypeTagging = WrapperTypeTagging()
138
-
139
- @cached.property
140
- @dc.init
141
- def rty(self) -> rfl.Union:
142
- return rfl.type_(ta.Union[*tuple(i.ty for i in self.impls)]) # type: ignore
143
+ class PolymorphismUnionMarshalerFactory(_BasePolymorphismUnionFactory, MarshalerFactory):
144
+ def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
145
+ return make_polymorphism_marshaler(self.get_impls(rty), self.tt, ctx)
143
146
 
144
- def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
145
- return isinstance(rty, rfl.Union) and rty == self.rty
146
147
 
148
+ @dc.dataclass(frozen=True)
149
+ class PolymorphismUnionUnmarshalerFactory(_BasePolymorphismUnionFactory, UnmarshalerFactory):
147
150
  def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
148
- return make_polymorphism_unmarshaler(self.impls, self.tt, ctx)
151
+ return make_polymorphism_unmarshaler(self.get_impls(rty), self.tt, ctx)
@@ -1,3 +1,7 @@
1
+ from .inspect import ( # noqa
2
+ get_annotations,
3
+ )
4
+
1
5
  from .isinstance import ( # noqa
2
6
  KNOWN_ISINSTANCE_GENERICS,
3
7
  isinstance_of,
@@ -0,0 +1,23 @@
1
+ """
2
+ TODO:
3
+ - vs ta.get_type_hints?
4
+ """
5
+ import typing as ta
6
+
7
+ from .. import lang
8
+
9
+
10
+ if ta.TYPE_CHECKING:
11
+ import inspect
12
+ else:
13
+ inspect = lang.proxy_import('inspect')
14
+
15
+
16
+ annotationlib = lang.lazy_import('annotationlib', optional=True, cache_failure=True)
17
+
18
+
19
+ def get_annotations(obj: ta.Any) -> ta.Mapping[str, ta.Any]:
20
+ if (al := annotationlib()) is not None:
21
+ return al.get_annotations(obj, format=al.Format.FORWARDREF) # noqa
22
+ else:
23
+ return inspect.get_annotations(obj)
omlish/reflect/types.py CHANGED
@@ -42,7 +42,7 @@ _KNOWN_SPECIALS = [
42
42
  v.__origin__,
43
43
  v._nparams, # noqa
44
44
  )
45
- for v in ta.__dict__.values()
45
+ for v in ta.__dict__.values() # noqa
46
46
  if isinstance(v, _SpecialGenericAlias)
47
47
  ]
48
48
 
@@ -78,7 +78,9 @@ def get_params(obj: ta.Any) -> tuple[ta.TypeVar, ...]:
78
78
  return obj.__dict__.get('__parameters__', ()) # noqa
79
79
 
80
80
  if (ks := _KNOWN_SPECIALS_BY_ORIGIN.get(obj)) is not None:
81
- return _KNOWN_SPECIAL_TYPE_VARS[:ks.nparams]
81
+ if (np := ks.nparams) < 0:
82
+ raise TypeError(obj)
83
+ return _KNOWN_SPECIAL_TYPE_VARS[:np]
82
84
 
83
85
  oty = type(obj)
84
86
 
@@ -256,18 +258,26 @@ class Reflector:
256
258
  ):
257
259
  origin = ta.get_origin(obj)
258
260
  args = ta.get_args(obj)
261
+
259
262
  if oty is _CallableGenericAlias:
260
263
  p, r = args
261
264
  if p is Ellipsis or isinstance(p, ta.ParamSpec):
262
265
  raise TypeError(f'Callable argument not yet supported for {obj=}')
263
266
  args = (*p, r)
264
267
  params = _KNOWN_SPECIAL_TYPE_VARS[:len(args)]
268
+
269
+ elif origin is tuple:
270
+ params = _KNOWN_SPECIAL_TYPE_VARS[:len(args)]
271
+
265
272
  elif origin is ta.Generic:
266
273
  params = args
274
+
267
275
  else:
268
276
  params = get_params(origin)
277
+
269
278
  if len(args) != len(params):
270
279
  raise TypeError(f'Mismatched {args=} and {params=} for {obj=}')
280
+
271
281
  return Generic(
272
282
  origin,
273
283
  tuple(self.type(a) for a in args),
@@ -289,7 +299,9 @@ class Reflector:
289
299
 
290
300
  if isinstance(obj, _SpecialGenericAlias):
291
301
  if (ks := _KNOWN_SPECIALS_BY_ALIAS.get(obj)) is not None:
292
- params = _KNOWN_SPECIAL_TYPE_VARS[:ks.nparams]
302
+ if (np := ks.nparams) < 0:
303
+ raise TypeError(obj)
304
+ params = _KNOWN_SPECIAL_TYPE_VARS[:np]
293
305
  return Generic(
294
306
  ks.origin,
295
307
  params,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev107
3
+ Version: 0.0.0.dev108
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=hTFp9tvE72BxKloIq1s1SS0LRQlIsvMtO69Sbc47rKg,1704
2
- omlish/__about__.py,sha256=cMIzyftUqzudI00DqKbFcTKOFEJwv0P276XfNYjZ07I,3352
2
+ omlish/__about__.py,sha256=nnMnzzIpQQBYqkBJnDhTgHSf5k4qBFwZmWBnq36lwnk,3352
3
3
  omlish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  omlish/argparse.py,sha256=Dc73G8lyoQBLvXhMYUbzQUh4SJu_OTvKUXjSUxq_ang,7499
5
5
  omlish/c3.py,sha256=4vogWgwPb8TbNS2KkZxpoWbwjj7MuHG2lQG-hdtkvjI,8062
@@ -143,7 +143,7 @@ omlish/dataclasses/impl/metadata.py,sha256=4veWwTr-aA0KP-Y1cPEeOcXHup9EKJTYNJ0oz
143
143
  omlish/dataclasses/impl/order.py,sha256=zWvWDkSTym8cc7vO1cLHqcBhhjOlucHOCUVJcdh4jt0,1369
144
144
  omlish/dataclasses/impl/params.py,sha256=MWRL0IhulYP0dycWnK3j-0ej0uTgeE_jIlKFiE9MnI0,2836
145
145
  omlish/dataclasses/impl/processing.py,sha256=DFxyFjL_h3awRyF_5eyTnB8QkuApx7Zc4QFnVoltlao,459
146
- omlish/dataclasses/impl/reflect.py,sha256=a19BbNxrmjNTbXzWuAl_794RCIQSMYyVqQ2Bf-DnNnM,5305
146
+ omlish/dataclasses/impl/reflect.py,sha256=-yEkg30fOHmMf5LQbzy6DFuDpQjuljsfV517_a74VAc,5365
147
147
  omlish/dataclasses/impl/replace.py,sha256=wS9GHX4fIwaPv1JBJzIewdBfXyK3X3V7_t55Da87dYo,1217
148
148
  omlish/dataclasses/impl/repr.py,sha256=oLXBTxqp88NKmz82HrJeGiTEiwK4l5LlXQT9Q0-tX3c,1605
149
149
  omlish/dataclasses/impl/simple.py,sha256=EovA-GpmQYtB_svItO2byTAWqbKGF4njz0MdQts3QBU,3157
@@ -183,7 +183,7 @@ omlish/formats/dotenv.py,sha256=UjZl3gac-0U24sDjCCGMcCqO1UCWG2Zs8PZ4JdAg2YE,1734
183
183
  omlish/formats/props.py,sha256=JwFJbKblqzqnzXf7YKFzQSDfcAXzkKsfoYvad6FPy98,18945
184
184
  omlish/formats/xml.py,sha256=ggiOwSERt4d9XmZwLZiDIh5qnFJS4jdmow9m9_9USps,1491
185
185
  omlish/formats/yaml.py,sha256=wTW8ECG9jyA7qIFUqKZUro4KAKpN4IvcW_qhlrKveXM,6836
186
- omlish/formats/json/__init__.py,sha256=c89CxdpwXEyf2nXhdS1TrFltShjIN_PLPG_hEq0isu4,418
186
+ omlish/formats/json/__init__.py,sha256=xP1_VdDhvgOW9wojwPzVJ7FGOYi9iJ99BzdYTwiIYMA,607
187
187
  omlish/formats/json/consts.py,sha256=A0cTAGGLyjo-gcYIQrL4JIaardI0yPMhQoNmh42BaRg,387
188
188
  omlish/formats/json/encoding.py,sha256=O4iIWle7W_-RwpOvJNlqOfkbnDyiQHexV5Za4hlrFzw,497
189
189
  omlish/formats/json/json.py,sha256=Mdqv2vdMi7gp96eV0BIYH5UdWpjWfsh-tSMZeywG-08,331
@@ -197,11 +197,11 @@ omlish/formats/json/backends/std.py,sha256=PM00Kh9ZR2XzollHMEvdo35Eml1N-zFfRW-LO
197
197
  omlish/formats/json/backends/ujson.py,sha256=BNJCU4kluGHdqTUKLJEuHhE2m2TmqR7HEN289S0Eokg,2278
198
198
  omlish/formats/json/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
199
199
  omlish/formats/json/cli/__main__.py,sha256=1wxxKZVkj_u7HCcewwMIbGuZj_Wph95yrUbm474Op9M,188
200
- omlish/formats/json/cli/cli.py,sha256=rncJMd3fbPpsJ8zhtIYkW24bumnh-qQiZI9XsQSdeEQ,9615
200
+ omlish/formats/json/cli/cli.py,sha256=dRtkX9cqXmff0RnYXAyXX324zbi2z0cg2Efp_5BOx0k,9575
201
201
  omlish/formats/json/cli/formats.py,sha256=FUZ0ptn3n0ljei2_o0t5UtmZkMB3_5p1pE-hgDD3-ak,1721
202
202
  omlish/formats/json/cli/io.py,sha256=IoJ5asjS_gUan5TcrGgS0KpJaiSE5YQgEGljFMCcDto,1427
203
203
  omlish/formats/json/cli/parsing.py,sha256=GfD6Om9FDaTJ662qROKSftSdp95tbw22Ids_vkMJV7U,2100
204
- omlish/formats/json/cli/processing.py,sha256=8seX8HFbMKXfPbBEKwcs7wvH5iCVKQXKuVfEHhFQG0o,1026
204
+ omlish/formats/json/cli/processing.py,sha256=UXHA_5El1qSDjPlJBBfREzHA_T2GNmP6nD1X99GNqOM,1214
205
205
  omlish/formats/json/cli/rendering.py,sha256=cmnGAUqY0vKlMYHMBydIBgbs23Isdobf1F8cRk8o9f0,2182
206
206
  omlish/formats/json/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
207
207
  omlish/formats/json/stream/build.py,sha256=MSxgreWSfI5CzNAdgQrArZ0yWqDsaHl-shI_jmjLDms,2505
@@ -274,7 +274,7 @@ omlish/lang/datetimes.py,sha256=ehI_DhQRM-bDxAavnp470XcekbbXc4Gdw9y1KpHDJT0,223
274
274
  omlish/lang/descriptors.py,sha256=RRBbkMgTzg82fFFE4D0muqobpM-ZZaOta6yB1lpX3s8,6617
275
275
  omlish/lang/exceptions.py,sha256=qJBo3NU1mOWWm-NhQUHCY5feYXR3arZVyEHinLsmRH4,47
276
276
  omlish/lang/functions.py,sha256=kkPfcdocg-OmyN7skIqrFxNvqAv89Zc_kXKYAN8vw8g,3895
277
- omlish/lang/imports.py,sha256=zxhoDw4d9F0GcKZGFAe1kU8AiTvGoWLVsqU2uggi_Rk,8729
277
+ omlish/lang/imports.py,sha256=vYc2vje10aJuJMvmpsGbEAQFX0j55MHbSURDFngJ2Go,9257
278
278
  omlish/lang/iterables.py,sha256=xRwktm6i2RHSb_ELfAXdjITIfE69qDyMEzgeZqvQXiU,2386
279
279
  omlish/lang/maybes.py,sha256=NYHZDjqDtwPMheDrj2VtUVujxRPf8Qpgk4ZlZCTvBZc,3492
280
280
  omlish/lang/objects.py,sha256=LOC3JvX1g5hPxJ7Sv2TK9kNkAo9c8J-Jw2NmClR_rkA,4576
@@ -330,9 +330,10 @@ omlish/marshal/factories.py,sha256=UV2Svjok-lTWsRqKGh-CeuAhvlohw9uJe7ZLyoKMvTM,2
330
330
  omlish/marshal/forbidden.py,sha256=BNshzm4lN5O8sUZ1YvxrSYq3WPklq9NMQCRZ7RC3DLM,865
331
331
  omlish/marshal/global_.py,sha256=K76wB1-pdg4VWgiqR7wyxRNYr-voJApexYW2nV-R4DM,1127
332
332
  omlish/marshal/helpers.py,sha256=-SOgYJmrURILHpPK6Wu3cCvhj8RJrqfJxuKhh9UMs7o,1102
333
- omlish/marshal/iterables.py,sha256=6I_ZdJemLSQtJ4J5NrB9wi-eyxiJZS61HzHXp1yeiX8,2592
333
+ omlish/marshal/iterables.py,sha256=sPkbWJa6gSbAxsVojLDqF4BZA_xURmlXkHM4yJ1Jh2s,2630
334
334
  omlish/marshal/mappings.py,sha256=s2cFSLyo0PM1eoQ2-SONtFSOldk5ARsBj55-icvWZ5o,2787
335
335
  omlish/marshal/maybes.py,sha256=mgK3QsWHkXgRqo076KxYKH6elRxzJ_QDTodv93mgHR0,2198
336
+ omlish/marshal/namedtuples.py,sha256=H0icxcE5FrqgfI9dRc8LlXJy430g_yuILTCVD0Zvfd0,2799
336
337
  omlish/marshal/naming.py,sha256=lIklR_Od4x1ghltAgOzqcKhHs-leeSv2YmFhCHO7GIs,613
337
338
  omlish/marshal/newtypes.py,sha256=fRpXLoCpoiaqcvl7v92I1_Qt7udn4vsPc1P3UfcBu-8,841
338
339
  omlish/marshal/nop.py,sha256=2mWve_dicFAiUQ2Y5asKkUW-XGmEE9Qi2ClIasFad0c,461
@@ -342,8 +343,8 @@ omlish/marshal/optionals.py,sha256=r0XB5rqfasvgZJNrKYd6Unq2U4nHt3JURi26j0dYHlw,1
342
343
  omlish/marshal/polymorphism.py,sha256=2SxrfneA9QdhNdxieEGFnHDHpUo3ftETA9dMbCbmbWY,6511
343
344
  omlish/marshal/primitives.py,sha256=f_6m24Cb-FDGsZpYSas11nLt3xCCEUXugw3Hv4-aNhg,1291
344
345
  omlish/marshal/registries.py,sha256=FvC6qXHCizNB2QmU_N3orxW7iqfGYkiUXYYdTRWS6HA,2353
345
- omlish/marshal/standard.py,sha256=vcC17ZZW33lRki7jrRd-saHGUZcXEHOpbPNGxWWbLWI,3143
346
- omlish/marshal/unions.py,sha256=DSs_g0F6EiefCturQPWv70VUAmsZgqEU9flmgxpxm7o,4137
346
+ omlish/marshal/standard.py,sha256=jarT6qEzwIAnZiJ24__AnNWVOJPV9z7LY_fvLvlwEWM,3319
347
+ omlish/marshal/unions.py,sha256=Ghd1robwbCXqd5ssmgjIBf1nQ_A0RlIoL49VQQrSRyo,4355
347
348
  omlish/marshal/utils.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
348
349
  omlish/marshal/uuids.py,sha256=H4B7UX_EPNmP2tC8bubcKrPLTS4aQu98huvbXQ3Zv2g,910
349
350
  omlish/marshal/values.py,sha256=ssHiWdg_L6M17kAn8GiGdPW7UeQOm3RDikWkvwblf5I,263
@@ -351,11 +352,12 @@ omlish/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
351
352
  omlish/math/bits.py,sha256=yip1l8agOYzT7bFyMGc0RR3XlnGCfHMpjw_SECLLh1I,3477
352
353
  omlish/math/floats.py,sha256=UimhOT7KRl8LXTzOI5cQWoX_9h6WNWe_3vcOuO7-h_8,327
353
354
  omlish/math/stats.py,sha256=MegzKVsmv2kra4jDWLOUgV0X7Ee2Tbl5u6ql1v4-dEY,10053
354
- omlish/reflect/__init__.py,sha256=qvrh1NM4GxJH-nUCMgc-ZxEHiDhintAkTky-UOcfn5o,752
355
+ omlish/reflect/__init__.py,sha256=3XME1VdOmmf8Qp3e8iTcqmRw6rzFzE3HQbM8fMNqY44,807
356
+ omlish/reflect/inspect.py,sha256=veJ424-9oZrqyvhVpvxOi7hcKW-PDBkdYL2yjrFlk4o,495
355
357
  omlish/reflect/isinstance.py,sha256=x5T9S2634leinBT4hl3CZZkRttvdvvlxChkC_x9Qu2s,1176
356
358
  omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
357
359
  omlish/reflect/subst.py,sha256=JM2RGv2-Rcex8wCqhmgvRG59zD242P9jM3O2QLjKWWo,3586
358
- omlish/reflect/types.py,sha256=wvK0XyCQAlkUqSbbm9Fll9VbkIMp3pLnIfF1rtKj5Hg,7901
360
+ omlish/reflect/types.py,sha256=B1zbq3yHo6B5JeNOXbmaxm78kqZTRb_4jIWY5GxzY4Q,8155
359
361
  omlish/secrets/__init__.py,sha256=SGB1KrlNrxlNpazEHYy95NTzteLi8ndoEgMhU7luBl8,420
360
362
  omlish/secrets/crypto.py,sha256=6CsLy0UEqCrBK8Xx_3-iFF6SKtu2GlEqUQ8-MliY3tk,3709
361
363
  omlish/secrets/marshal.py,sha256=U9uSRTWzZmumfNZeh_dROwVdGrARsp155TylRbjilP8,2048
@@ -467,9 +469,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
467
469
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
468
470
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
469
471
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
470
- omlish-0.0.0.dev107.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
471
- omlish-0.0.0.dev107.dist-info/METADATA,sha256=4y-O9HGxWaR8AFKM17OfN9pIvRTX2yJ3Ve3JDDc_B8c,4000
472
- omlish-0.0.0.dev107.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
473
- omlish-0.0.0.dev107.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
474
- omlish-0.0.0.dev107.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
475
- omlish-0.0.0.dev107.dist-info/RECORD,,
472
+ omlish-0.0.0.dev108.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
473
+ omlish-0.0.0.dev108.dist-info/METADATA,sha256=YT-AOzWICV5yww_4mweKcISx4dcR21NI6du4Lgambv0,4000
474
+ omlish-0.0.0.dev108.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
475
+ omlish-0.0.0.dev108.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
476
+ omlish-0.0.0.dev108.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
477
+ omlish-0.0.0.dev108.dist-info/RECORD,,