omlish 0.0.0.dev81__py3-none-any.whl → 0.0.0.dev82__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 (34) hide show
  1. omlish/__about__.py +2 -2
  2. omlish/dataclasses/impl/__init__.py +8 -0
  3. omlish/dataclasses/impl/params.py +3 -0
  4. omlish/dataclasses/impl/slots.py +61 -7
  5. omlish/formats/json/__init__.py +8 -1
  6. omlish/formats/json/backends/__init__.py +7 -0
  7. omlish/formats/json/backends/base.py +38 -0
  8. omlish/formats/json/backends/default.py +10 -0
  9. omlish/formats/json/backends/jiter.py +25 -0
  10. omlish/formats/json/backends/orjson.py +46 -2
  11. omlish/formats/json/backends/std.py +39 -0
  12. omlish/formats/json/backends/ujson.py +49 -0
  13. omlish/formats/json/cli.py +36 -6
  14. omlish/formats/json/consts.py +22 -0
  15. omlish/formats/json/encoding.py +17 -0
  16. omlish/formats/json/json.py +9 -39
  17. omlish/formats/json/render.py +49 -28
  18. omlish/formats/json/stream/__init__.py +0 -0
  19. omlish/formats/json/stream/build.py +113 -0
  20. omlish/formats/json/{stream.py → stream/lex.py} +68 -172
  21. omlish/formats/json/stream/parse.py +244 -0
  22. omlish/formats/json/stream/render.py +119 -0
  23. omlish/genmachine.py +14 -2
  24. omlish/marshal/base.py +2 -0
  25. omlish/marshal/newtypes.py +24 -0
  26. omlish/marshal/standard.py +4 -0
  27. omlish/reflect/__init__.py +1 -0
  28. omlish/reflect/types.py +6 -1
  29. {omlish-0.0.0.dev81.dist-info → omlish-0.0.0.dev82.dist-info}/METADATA +1 -1
  30. {omlish-0.0.0.dev81.dist-info → omlish-0.0.0.dev82.dist-info}/RECORD +34 -24
  31. {omlish-0.0.0.dev81.dist-info → omlish-0.0.0.dev82.dist-info}/LICENSE +0 -0
  32. {omlish-0.0.0.dev81.dist-info → omlish-0.0.0.dev82.dist-info}/WHEEL +0 -0
  33. {omlish-0.0.0.dev81.dist-info → omlish-0.0.0.dev82.dist-info}/entry_points.txt +0 -0
  34. {omlish-0.0.0.dev81.dist-info → omlish-0.0.0.dev82.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,244 @@
1
+ import typing as ta
2
+
3
+ from .... import lang
4
+ from ....genmachine import GenMachine
5
+ from .lex import SCALAR_VALUE_TYPES
6
+ from .lex import VALUE_TOKEN_KINDS
7
+ from .lex import ScalarValue
8
+ from .lex import Token
9
+
10
+
11
+ ##
12
+
13
+
14
+ class BeginObject(lang.Marker):
15
+ pass
16
+
17
+
18
+ class Key(ta.NamedTuple):
19
+ key: str
20
+
21
+
22
+ class EndObject(lang.Marker):
23
+ pass
24
+
25
+
26
+ class BeginArray(lang.Marker):
27
+ pass
28
+
29
+
30
+ class EndArray(lang.Marker):
31
+ pass
32
+
33
+
34
+ JsonStreamParserEvent: ta.TypeAlias = ta.Union[ # noqa
35
+ type[BeginObject],
36
+ Key,
37
+ type[EndObject],
38
+
39
+ type[BeginArray],
40
+ type[EndArray],
41
+
42
+ ScalarValue,
43
+ ]
44
+
45
+
46
+ class JsonStreamParserEvents(lang.Namespace):
47
+ BeginObject = BeginObject
48
+ Key = Key
49
+ EndObject = EndObject
50
+
51
+ BeginArray = BeginArray
52
+ EndArray = EndArray
53
+
54
+
55
+ ##
56
+
57
+
58
+ def yield_parser_events(obj: ta.Any) -> ta.Generator[JsonStreamParserEvent, None, None]:
59
+ if isinstance(obj, SCALAR_VALUE_TYPES):
60
+ yield obj # type: ignore
61
+
62
+ elif isinstance(obj, ta.Mapping):
63
+ yield BeginObject
64
+ for k, v in obj.items():
65
+ yield Key(k)
66
+ yield from yield_parser_events(v)
67
+ yield EndObject
68
+
69
+ elif isinstance(obj, ta.Sequence):
70
+ yield BeginArray
71
+ for v in obj:
72
+ yield from yield_parser_events(v)
73
+ yield EndArray
74
+
75
+ else:
76
+ raise TypeError(obj)
77
+
78
+
79
+ ##
80
+
81
+
82
+ class JsonStreamObject(list):
83
+ def __repr__(self) -> str:
84
+ return f'{self.__class__.__name__}({super().__repr__()})'
85
+
86
+
87
+ class JsonStreamParser(GenMachine[Token, JsonStreamParserEvent]):
88
+ def __init__(self) -> None:
89
+ super().__init__(self._do_value())
90
+
91
+ self._stack: list[ta.Literal['OBJECT', 'KEY', 'ARRAY']] = []
92
+
93
+ #
94
+
95
+ def _emit_event(self, v):
96
+ if not self._stack:
97
+ return ((v,), self._do_value())
98
+
99
+ tt = self._stack[-1]
100
+ if tt == 'KEY':
101
+ self._stack.pop()
102
+ if not self._stack:
103
+ raise self.StateError
104
+
105
+ tt2 = self._stack[-1]
106
+ if tt2 == 'OBJECT':
107
+ return ((v,), self._do_after_pair())
108
+
109
+ else:
110
+ raise self.StateError
111
+
112
+ elif tt == 'ARRAY':
113
+ return ((v,), self._do_after_element())
114
+
115
+ else:
116
+ raise self.StateError
117
+
118
+ #
119
+
120
+ def _do_value(self):
121
+ try:
122
+ tok = yield None
123
+ except GeneratorExit:
124
+ if self._stack:
125
+ raise self.StateError from None
126
+ else:
127
+ raise
128
+
129
+ if tok.kind in VALUE_TOKEN_KINDS:
130
+ y, r = self._emit_event(tok.value)
131
+ yield y
132
+ return r
133
+
134
+ elif tok.kind == 'LBRACE':
135
+ y, r = self._emit_begin_object()
136
+ yield y
137
+ return r
138
+
139
+ elif tok.kind == 'LBRACKET':
140
+ y, r = self._emit_begin_array()
141
+ yield y
142
+ return r
143
+
144
+ elif tok.kind == 'RBRACKET':
145
+ y, r = self._emit_end_array()
146
+ yield y
147
+ return r
148
+
149
+ else:
150
+ raise self.StateError
151
+
152
+ #
153
+
154
+ def _emit_begin_object(self):
155
+ self._stack.append('OBJECT')
156
+ return ((BeginObject,), self._do_object_body())
157
+
158
+ def _emit_end_object(self):
159
+ if not self._stack:
160
+ raise self.StateError
161
+
162
+ tt = self._stack.pop()
163
+ if tt != 'OBJECT':
164
+ raise self.StateError
165
+
166
+ return self._emit_event(EndObject)
167
+
168
+ def _do_object_body(self):
169
+ try:
170
+ tok = yield None
171
+ except GeneratorExit:
172
+ raise self.StateError from None
173
+
174
+ if tok.kind == 'STRING':
175
+ k = tok.value
176
+
177
+ try:
178
+ tok = yield None
179
+ except GeneratorExit:
180
+ raise self.StateError from None
181
+ if tok.kind != 'COLON':
182
+ raise self.StateError
183
+
184
+ yield (Key(k),)
185
+ self._stack.append('KEY')
186
+ return self._do_value()
187
+
188
+ elif tok.kind == 'RBRACE':
189
+ y, r = self._emit_end_object()
190
+ yield y
191
+ return r
192
+
193
+ else:
194
+ raise self.StateError
195
+
196
+ def _do_after_pair(self):
197
+ try:
198
+ tok = yield None
199
+ except GeneratorExit:
200
+ raise self.StateError from None
201
+
202
+ if tok.kind == 'COMMA':
203
+ return self._do_object_body()
204
+
205
+ elif tok.kind == 'RBRACE':
206
+ y, r = self._emit_end_object()
207
+ yield y
208
+ return r
209
+
210
+ else:
211
+ raise self.StateError
212
+
213
+ #
214
+
215
+ def _emit_begin_array(self):
216
+ self._stack.append('ARRAY')
217
+ return ((BeginArray,), self._do_value())
218
+
219
+ def _emit_end_array(self):
220
+ if not self._stack:
221
+ raise self.StateError
222
+
223
+ tt = self._stack.pop()
224
+ if tt != 'ARRAY':
225
+ raise self.StateError
226
+
227
+ return self._emit_event(EndArray)
228
+
229
+ def _do_after_element(self):
230
+ try:
231
+ tok = yield None
232
+ except GeneratorExit:
233
+ raise self.StateError from None
234
+
235
+ if tok.kind == 'COMMA':
236
+ return self._do_value()
237
+
238
+ elif tok.kind == 'RBRACKET':
239
+ y, r = self._emit_end_array()
240
+ yield y
241
+ return r
242
+
243
+ else:
244
+ raise self.StateError
@@ -0,0 +1,119 @@
1
+ import json
2
+ import typing as ta
3
+
4
+ from ..render import AbstractJsonRenderer
5
+ from ..render import JsonRendererOut
6
+ from .build import JsonObjectBuilder
7
+ from .parse import BeginArray
8
+ from .parse import BeginObject
9
+ from .parse import EndArray
10
+ from .parse import EndObject
11
+ from .parse import JsonStreamParserEvent
12
+ from .parse import Key
13
+
14
+
15
+ ##
16
+
17
+
18
+ class StreamJsonRenderer(AbstractJsonRenderer[ta.Iterable[JsonStreamParserEvent]]):
19
+ def __init__(
20
+ self,
21
+ out: JsonRendererOut,
22
+ opts: AbstractJsonRenderer.Options = AbstractJsonRenderer.Options(),
23
+ ) -> None:
24
+ if opts.sort_keys:
25
+ raise TypeError('Not yet implemented')
26
+
27
+ super().__init__(out, opts)
28
+
29
+ self._stack: list[tuple[ta.Literal['OBJECT', 'ARRAY'], int]] = []
30
+ self._builder: JsonObjectBuilder | None = None
31
+
32
+ def _render_value(
33
+ self,
34
+ o: ta.Any,
35
+ state: AbstractJsonRenderer.State = AbstractJsonRenderer.State.VALUE,
36
+ ) -> None:
37
+ if self._opts.style is not None:
38
+ pre, post = self._opts.style(o, state)
39
+ self._write(pre)
40
+ else:
41
+ post = None
42
+
43
+ if o is None or isinstance(o, bool):
44
+ self._write(self._literals[o])
45
+
46
+ elif isinstance(o, (str, int, float)):
47
+ self._write(json.dumps(o))
48
+
49
+ else:
50
+ raise TypeError(o)
51
+
52
+ if post:
53
+ self._write(post)
54
+
55
+ def _render(self, e: JsonStreamParserEvent) -> None:
56
+ if e != EndArray and self._stack and (tt := self._stack[-1])[0] == 'ARRAY':
57
+ if tt[1]:
58
+ self._write(self._comma)
59
+ self._write_indent()
60
+
61
+ self._stack[-1] = ('ARRAY', tt[1] + 1)
62
+
63
+ #
64
+
65
+ if e is None or isinstance(e, (str, int, float, bool)):
66
+ self._render_value(e)
67
+
68
+ #
69
+
70
+ elif e is BeginObject:
71
+ self._stack.append(('OBJECT', 0))
72
+ self._write('{')
73
+ self._level += 1
74
+
75
+ elif isinstance(e, Key):
76
+ if not self._stack or (tt := self._stack.pop())[0] != 'OBJECT':
77
+ raise Exception
78
+
79
+ if tt[1]:
80
+ self._write(self._comma)
81
+ self._write_indent()
82
+ self._render_value(e.key, AbstractJsonRenderer.State.KEY)
83
+ self._write(self._colon)
84
+
85
+ self._stack.append(('OBJECT', tt[1] + 1))
86
+
87
+ elif e is EndObject:
88
+ if not self._stack or (tt := self._stack.pop())[0] != 'OBJECT':
89
+ raise Exception
90
+
91
+ self._level -= 1
92
+ if tt[1]:
93
+ self._write_indent()
94
+ self._write('}')
95
+
96
+ #
97
+
98
+ elif e is BeginArray:
99
+ self._stack.append(('ARRAY', 0))
100
+ self._write('[')
101
+ self._level += 1
102
+
103
+ elif e is EndArray:
104
+ if not self._stack or (tt := self._stack.pop())[0] != 'ARRAY':
105
+ raise Exception
106
+
107
+ self._level -= 1
108
+ if tt[1]:
109
+ self._write_indent()
110
+ self._write(']')
111
+
112
+ #
113
+
114
+ else:
115
+ raise TypeError(e)
116
+
117
+ def render(self, events: ta.Iterable[JsonStreamParserEvent]) -> None:
118
+ for e in events:
119
+ self._render(e)
omlish/genmachine.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """
2
2
  TODO:
3
3
  - feed_iter helper
4
+ - accept yielding outputs on transitions, *except* on initial state - add test
4
5
 
5
6
  See:
6
7
  - https://github.com/pytransitions/transitions
@@ -25,10 +26,19 @@ class GenMachine(ta.Generic[I, O]):
25
26
  `None` to terminate.
26
27
  """
27
28
 
28
- def __init__(self, initial: MachineGen) -> None:
29
+ def __init__(self, initial: MachineGen | None = None) -> None:
29
30
  super().__init__()
31
+
32
+ if initial is None:
33
+ initial = self._initial_state()
34
+ if initial is None:
35
+ raise TypeError('No initial state')
36
+
30
37
  self._advance(initial)
31
38
 
39
+ def _initial_state(self) -> MachineGen | None:
40
+ return None
41
+
32
42
  _gen: MachineGen | None
33
43
 
34
44
  def __repr__(self) -> str:
@@ -57,7 +67,8 @@ class GenMachine(ta.Generic[I, O]):
57
67
  return self
58
68
 
59
69
  def __exit__(self, exc_type, exc_val, exc_tb):
60
- self.close()
70
+ if exc_type is None:
71
+ self.close()
61
72
 
62
73
  #
63
74
 
@@ -74,6 +85,7 @@ class GenMachine(ta.Generic[I, O]):
74
85
 
75
86
  def _advance(self, gen: MachineGen) -> None:
76
87
  self._gen = gen
88
+
77
89
  if (n := next(self._gen)) is not None: # noqa
78
90
  raise GenMachine.ClosedError
79
91
 
omlish/marshal/base.py CHANGED
@@ -6,6 +6,8 @@ TODO:
6
6
  - streaming? Start/EndObject, etc..
7
7
  - lang.Marker - class name, handle type[Foo]
8
8
  - can't disambiguate from str - can't coexist in bare union
9
+ - factories being free MatchFns does more harm than good - in practice these are such big guns you want to write a
10
+ class body if only ceremonially
9
11
 
10
12
  See:
11
13
  - https://github.com/python-attrs/cattrs
@@ -0,0 +1,24 @@
1
+ from .. import check
2
+ from .. import reflect as rfl
3
+ from .base import MarshalContext
4
+ from .base import Marshaler
5
+ from .base import MarshalerFactory
6
+ from .base import UnmarshalContext
7
+ from .base import Unmarshaler
8
+ from .base import UnmarshalerFactory
9
+
10
+
11
+ class NewtypeMarshalerFactory(MarshalerFactory):
12
+ def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
13
+ return isinstance(rty, rfl.NewType)
14
+
15
+ def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
16
+ return ctx.make(check.isinstance(rty, rfl.NewType).ty)
17
+
18
+
19
+ class NewtypeUnmarshalerFactory(UnmarshalerFactory):
20
+ def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
21
+ return isinstance(rty, rfl.NewType)
22
+
23
+ def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
24
+ return ctx.make(check.isinstance(rty, rfl.NewType).ty)
@@ -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 .newtypes import NewtypeMarshalerFactory
25
+ from .newtypes import NewtypeUnmarshalerFactory
24
26
  from .numbers import NUMBERS_MARSHALER_FACTORY
25
27
  from .numbers import NUMBERS_UNMARSHALER_FACTORY
26
28
  from .optionals import OptionalMarshalerFactory
@@ -38,6 +40,7 @@ from .uuids import UUID_UNMARSHALER_FACTORY
38
40
 
39
41
  STANDARD_MARSHALER_FACTORIES: list[MarshalerFactory] = [
40
42
  PRIMITIVE_MARSHALER_FACTORY,
43
+ NewtypeMarshalerFactory(),
41
44
  OptionalMarshalerFactory(),
42
45
  PrimitiveUnionMarshalerFactory(),
43
46
  DataclassMarshalerFactory(),
@@ -68,6 +71,7 @@ def new_standard_marshaler_factory() -> MarshalerFactory:
68
71
 
69
72
  STANDARD_UNMARSHALER_FACTORIES: list[UnmarshalerFactory] = [
70
73
  PRIMITIVE_UNMARSHALER_FACTORY,
74
+ NewtypeUnmarshalerFactory(),
71
75
  OptionalUnmarshalerFactory(),
72
76
  PrimitiveUnionUnmarshalerFactory(),
73
77
  DataclassUnmarshalerFactory(),
@@ -33,6 +33,7 @@ from .types import ( # noqa
33
33
  TYPES,
34
34
  Type,
35
35
  Union,
36
+ get_newtype_supertype,
36
37
  get_orig_bases,
37
38
  get_orig_class,
38
39
  get_params,
omlish/reflect/types.py CHANGED
@@ -107,6 +107,10 @@ def get_orig_class(obj: ta.Any) -> ta.Any:
107
107
  return obj.__orig_class__ # noqa
108
108
 
109
109
 
110
+ def get_newtype_supertype(obj: ta.Any) -> ta.Any:
111
+ return obj.__supertype__
112
+
113
+
110
114
  ##
111
115
 
112
116
 
@@ -164,6 +168,7 @@ class Generic:
164
168
  @dc.dataclass(frozen=True)
165
169
  class NewType:
166
170
  obj: ta.Any
171
+ ty: Type
167
172
 
168
173
 
169
174
  @dc.dataclass(frozen=True)
@@ -243,7 +248,7 @@ class Reflector:
243
248
  return Union(frozenset(self.type(a) for a in ta.get_args(obj)))
244
249
 
245
250
  if isinstance(obj, ta.NewType): # noqa
246
- return NewType(obj)
251
+ return NewType(obj, get_newtype_supertype(obj))
247
252
 
248
253
  if (
249
254
  is_simple_generic_alias_type(oty) or
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev81
3
+ Version: 0.0.0.dev82
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=ucaSu1XcJPryi-AqINUejkVDeJAFk7Bp5ar5_tJTgME,1692
2
- omlish/__about__.py,sha256=ShI7he6zZJPcB446sYRskzCJpPLVOwTUy-2gII0BYpI,3370
2
+ omlish/__about__.py,sha256=ZpKphb42APnlM0x6-ckvJM_4L1XAmYiDRoE3l5SxqIs,3370
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
@@ -10,7 +10,7 @@ omlish/defs.py,sha256=T3bq_7h_tO3nDB5RAFBn7DkdeQgqheXzkFColbOHZko,4890
10
10
  omlish/dynamic.py,sha256=35C_cCX_Vq2HrHzGk5T-zbrMvmUdiIiwDzDNixczoDo,6541
11
11
  omlish/fnpairs.py,sha256=Sl8CMFNyDS-1JYAjSWqnT5FmUm9Lj6o7FxSRo7g4jww,10875
12
12
  omlish/fnpipes.py,sha256=AJkgz9nvRRm7oqw7ZgYyz21klu276LWi54oYCLg-vOg,2196
13
- omlish/genmachine.py,sha256=zcFUbWHlX2qqNGTb6V8i9Hmbc7sta4DOry7B67mG-uY,2092
13
+ omlish/genmachine.py,sha256=RlU-y_dt2nRdvoo7Z3HsUELlBn3KuyI4qUnqLVbChRI,2450
14
14
  omlish/iterators.py,sha256=GGLC7RIT86uXMjhIIIqnff_Iu5SI_b9rXYywYGFyzmo,7292
15
15
  omlish/libc.py,sha256=8r7Ejyhttk9ruCfBkxNTrlzir5WPbDE2vmY7VPlceMA,15362
16
16
  omlish/matchfns.py,sha256=I1IlQGfEyk_AcFSy6ulVS3utC-uwyZM2YfUXYHc9Bw0,6152
@@ -126,7 +126,7 @@ omlish/configs/strings.py,sha256=0brx1duL85r1GpfbNvbHcSvH4jWzutwuvMFXda9NeI0,265
126
126
  omlish/dataclasses/__init__.py,sha256=k358fyF6LWsiWfd7u1d4CHDn2F4wQZCb5hXtSSc1Hck,1374
127
127
  omlish/dataclasses/utils.py,sha256=MzEeF8W6Yr5BjOVJOM0Au4YIMGAarXWxT0C6gzlhmfU,3425
128
128
  omlish/dataclasses/impl/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936
129
- omlish/dataclasses/impl/__init__.py,sha256=0hgOm3_u3yimjEkB-9fRMqX9rAW6kQC5t8XL0lpvffQ,410
129
+ omlish/dataclasses/impl/__init__.py,sha256=zqGBC5gSbjJxaqG_zS1LL1PX-zAfhIua8UqOE4IwO2k,789
130
130
  omlish/dataclasses/impl/api.py,sha256=p7W519_EnDAWlkOVS-4BpP4SxadWIiUzC3RldSoB28o,6431
131
131
  omlish/dataclasses/impl/as_.py,sha256=CD-t7hkC1EP2F_jvZKIA_cVoDuwZ-Ln_xC4fJumPYX0,2598
132
132
  omlish/dataclasses/impl/copy.py,sha256=Tn8_n6Vohs-w4otbGdubBEvhd3TsSTaM3EfNGdS2LYo,591
@@ -141,13 +141,13 @@ omlish/dataclasses/impl/main.py,sha256=Ti0PKbFKraKvfmoPuR-G7nLVNzRC8mvEuXhCuC-M2
141
141
  omlish/dataclasses/impl/metaclass.py,sha256=Fb0ExFiyYdOpvck4ayXMr_vEVDvHLhe28Ns3F4aduM8,3222
142
142
  omlish/dataclasses/impl/metadata.py,sha256=4veWwTr-aA0KP-Y1cPEeOcXHup9EKJTYNJ0ozIxtzD4,1401
143
143
  omlish/dataclasses/impl/order.py,sha256=zWvWDkSTym8cc7vO1cLHqcBhhjOlucHOCUVJcdh4jt0,1369
144
- omlish/dataclasses/impl/params.py,sha256=zsobAD6QvMAZeMsohP8nKFyv_w6Q4buocARQG1y1etA,2768
144
+ omlish/dataclasses/impl/params.py,sha256=MWRL0IhulYP0dycWnK3j-0ej0uTgeE_jIlKFiE9MnI0,2836
145
145
  omlish/dataclasses/impl/processing.py,sha256=DFxyFjL_h3awRyF_5eyTnB8QkuApx7Zc4QFnVoltlao,459
146
146
  omlish/dataclasses/impl/reflect.py,sha256=a19BbNxrmjNTbXzWuAl_794RCIQSMYyVqQ2Bf-DnNnM,5305
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
150
- omlish/dataclasses/impl/slots.py,sha256=_sm-x9v1tPnXEHBHNUMTHZocgVyhZaPdvamIPPBUVyk,2635
150
+ omlish/dataclasses/impl/slots.py,sha256=qXRLbtFWUs_2UV1fFUdv53_6fBLKJ_8McjNiP9YQlGM,5264
151
151
  omlish/dataclasses/impl/utils.py,sha256=aER2iL3UAtgS1BdLuEvTr9Tr2wC28wk1kiOeO-jIymw,6138
152
152
  omlish/diag/__init__.py,sha256=4S8v0myJM4Zld6_FV6cPe_nSv0aJb6kXftEit0HkiGE,1141
153
153
  omlish/diag/asts.py,sha256=BveUUNUcaAm4Hg55f4ZxGSI313E4L8cCZ5XjHpEkKVI,3325
@@ -182,16 +182,25 @@ omlish/formats/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
182
  omlish/formats/dotenv.py,sha256=UjZl3gac-0U24sDjCCGMcCqO1UCWG2Zs8PZ4JdAg2YE,17348
183
183
  omlish/formats/props.py,sha256=JwFJbKblqzqnzXf7YKFzQSDfcAXzkKsfoYvad6FPy98,18945
184
184
  omlish/formats/yaml.py,sha256=wTW8ECG9jyA7qIFUqKZUro4KAKpN4IvcW_qhlrKveXM,6836
185
- omlish/formats/json/__init__.py,sha256=moSR67Qkju2eYb_qVDtaivepe44mxAnYuC8OCSbtETg,298
185
+ omlish/formats/json/__init__.py,sha256=xqW2APLGvCTO9dVTOlroR_AdrA5bCkdmUnbTkYHhJ7U,379
186
186
  omlish/formats/json/__main__.py,sha256=1wxxKZVkj_u7HCcewwMIbGuZj_Wph95yrUbm474Op9M,188
187
- omlish/formats/json/cli.py,sha256=FJuVzXBx9ysd31fObwGeiCyFz7F0Mx7I9nC9vbjsbCs,5195
188
- omlish/formats/json/json.py,sha256=y8d8WWgzGZDTjzYc_xe9v4T0foXHI-UP7gjCwnHzUIA,828
189
- omlish/formats/json/render.py,sha256=7p-Q_nq9MwmlZkKHVDY58yVCkztePeZXnimiROoMDko,3239
190
- omlish/formats/json/stream.py,sha256=oGP91ivGEoPzC1Vv-cMDZHCqnt2Cq4WLswYTv39Bayk,9167
191
- omlish/formats/json/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
192
- omlish/formats/json/backends/orjson.py,sha256=GYZx0zgpxwkJbFh4EJLGa6VMoEK-Q6mf5tQp8aXqTDc,2526
193
- omlish/formats/json/backends/std.py,sha256=00NdUFT9GeWL1EWbgKhWLboDBIuDxr7EiizPZXbRWrc,1973
194
- omlish/formats/json/backends/ujson.py,sha256=m5-hlEQCMLhat3Hg_8QTyfMH-rSsQGJYdWRWoTWkfhM,1029
187
+ omlish/formats/json/cli.py,sha256=HimX6N-VWnBh6MhyxjXKHw_VNn7tUkelRflpjWv3X3I,6210
188
+ omlish/formats/json/consts.py,sha256=u-x-qXqZvK0tWk3l3TrCTjk4mSjKmZ_ATdmd1hwHNAY,263
189
+ omlish/formats/json/encoding.py,sha256=O4iIWle7W_-RwpOvJNlqOfkbnDyiQHexV5Za4hlrFzw,497
190
+ omlish/formats/json/json.py,sha256=Mdqv2vdMi7gp96eV0BIYH5UdWpjWfsh-tSMZeywG-08,331
191
+ omlish/formats/json/render.py,sha256=H6q1R3gL6ULAnfEhQRKDOzDJjWizdsRDYxIerBSEbq8,3797
192
+ omlish/formats/json/backends/__init__.py,sha256=gnaNDCxy_KmmPUPDnjxO5_WjuWxLGbI9FYWx8ZJuQUU,97
193
+ omlish/formats/json/backends/base.py,sha256=WqtyoM82pyM0NyqpPwndrebr1bUVU1QlpmVQNrcAO8c,1114
194
+ omlish/formats/json/backends/default.py,sha256=_roVwUL40yU4spmUR9O86Ps9ytlpVU_EqolN-wdlSe8,218
195
+ omlish/formats/json/backends/jiter.py,sha256=8qv_XWGpcupPtVm6Z_egHio_iY1Kk8eqkvXTF6fVZr4,1193
196
+ omlish/formats/json/backends/orjson.py,sha256=wR8pMGFtkhZGHcNVk7vNYUnv8lUapdK89p6QpETIs9w,3778
197
+ omlish/formats/json/backends/std.py,sha256=PM00Kh9ZR2XzollHMEvdo35Eml1N-zFfRW-LOCV5ftM,3085
198
+ omlish/formats/json/backends/ujson.py,sha256=BNJCU4kluGHdqTUKLJEuHhE2m2TmqR7HEN289S0Eokg,2278
199
+ omlish/formats/json/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
200
+ omlish/formats/json/stream/build.py,sha256=2Bikvvcaqad85J3kvmD6I5Dqp8NstyP6Gb2COeN-lxs,2780
201
+ omlish/formats/json/stream/lex.py,sha256=hMnsZld72XE7GCWdjbUANRxrruuBSSQeCm8wypMiMv0,6172
202
+ omlish/formats/json/stream/parse.py,sha256=WkbW7tvcdrTSluKhw70nPvjsq943eryVcjx8FSz78tM,5198
203
+ omlish/formats/json/stream/render.py,sha256=B9ZNuBiDJOT25prhIsZu1ICKjxk4eMPwpgQF37NPufs,3212
195
204
  omlish/graphs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
196
205
  omlish/graphs/dags.py,sha256=zp55lYgUdRCxmADwiGDHeehMJczZFA_tzdWqy77icOk,3047
197
206
  omlish/graphs/domination.py,sha256=oCGoWzWTxLwow0LDyGjjEf2AjFiOiDz4WaBtczwSbsQ,7576
@@ -298,7 +307,7 @@ omlish/logs/noisy.py,sha256=Ubc-eTH6ZbGYsLfUUi69JAotwuUwzb-SJBeGo_0dIZI,348
298
307
  omlish/logs/utils.py,sha256=MgGovbP0zUrZ3FGD3qYNQWn-l0jy0Y0bStcQvv5BOmQ,391
299
308
  omlish/marshal/__init__.py,sha256=G0MDeBStBjz9Njq-rt5C6WbuCik6c8st7cipwMVw668,2139
300
309
  omlish/marshal/any.py,sha256=e82OyYK3Emm1P1ClnsnxP7fIWC2iNVyW0H5nK4mLmWM,779
301
- omlish/marshal/base.py,sha256=_ZKSSuv6p9r86sja_jaxI09WYpjCBFi0KTsOiZCYyk0,6587
310
+ omlish/marshal/base.py,sha256=7ZpJOMPlvtslhDdRlNZCC5MiUGu7Qfoq_S_miD0lmQY,6738
302
311
  omlish/marshal/base64.py,sha256=F-3ogJdcFCtWINRgJgWT0rErqgx6f4qahhcg8OrkqhE,1089
303
312
  omlish/marshal/dataclasses.py,sha256=G6Uh8t4vvNBAx2BhzH8ksj8Hq_bo6npFphQhyF298VU,6892
304
313
  omlish/marshal/datetimes.py,sha256=0ffg8cEvx9SMKIXZGD9b7MqpLfmgw0uKKdn6YTfoqok,3714
@@ -312,6 +321,7 @@ omlish/marshal/iterables.py,sha256=6I_ZdJemLSQtJ4J5NrB9wi-eyxiJZS61HzHXp1yeiX8,2
312
321
  omlish/marshal/mappings.py,sha256=s2cFSLyo0PM1eoQ2-SONtFSOldk5ARsBj55-icvWZ5o,2787
313
322
  omlish/marshal/maybes.py,sha256=mgK3QsWHkXgRqo076KxYKH6elRxzJ_QDTodv93mgHR0,2198
314
323
  omlish/marshal/naming.py,sha256=lIklR_Od4x1ghltAgOzqcKhHs-leeSv2YmFhCHO7GIs,613
324
+ omlish/marshal/newtypes.py,sha256=fRpXLoCpoiaqcvl7v92I1_Qt7udn4vsPc1P3UfcBu-8,841
315
325
  omlish/marshal/nop.py,sha256=2mWve_dicFAiUQ2Y5asKkUW-XGmEE9Qi2ClIasFad0c,461
316
326
  omlish/marshal/numbers.py,sha256=kFRIX9l1yofiYzafV6SnYfEg0PiCsAqeRHOeT6BSxlM,1672
317
327
  omlish/marshal/objects.py,sha256=74tUmMymimSqgd4a6kyMh_owJe6J7YQXwCXEF-JWt1c,8419
@@ -319,7 +329,7 @@ omlish/marshal/optionals.py,sha256=r0XB5rqfasvgZJNrKYd6Unq2U4nHt3JURi26j0dYHlw,1
319
329
  omlish/marshal/polymorphism.py,sha256=gCQ4_uzuqOcWstihK3twiMc-10G1ZHWLuLZxbajbecY,5644
320
330
  omlish/marshal/primitives.py,sha256=f_6m24Cb-FDGsZpYSas11nLt3xCCEUXugw3Hv4-aNhg,1291
321
331
  omlish/marshal/registries.py,sha256=FvC6qXHCizNB2QmU_N3orxW7iqfGYkiUXYYdTRWS6HA,2353
322
- omlish/marshal/standard.py,sha256=uQZIGiCwihmhB1tmhpKnZWZly0DDkdGjCnN0d41WHho,2985
332
+ omlish/marshal/standard.py,sha256=vcC17ZZW33lRki7jrRd-saHGUZcXEHOpbPNGxWWbLWI,3143
323
333
  omlish/marshal/unions.py,sha256=ZWl0maHwh1V_cSnNmuCbbCQZzqlNtOModsTwnVTXNPA,2735
324
334
  omlish/marshal/utils.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
325
335
  omlish/marshal/uuids.py,sha256=H4B7UX_EPNmP2tC8bubcKrPLTS4aQu98huvbXQ3Zv2g,910
@@ -328,11 +338,11 @@ omlish/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
328
338
  omlish/math/bits.py,sha256=yip1l8agOYzT7bFyMGc0RR3XlnGCfHMpjw_SECLLh1I,3477
329
339
  omlish/math/floats.py,sha256=UimhOT7KRl8LXTzOI5cQWoX_9h6WNWe_3vcOuO7-h_8,327
330
340
  omlish/math/stats.py,sha256=MegzKVsmv2kra4jDWLOUgV0X7Ee2Tbl5u6ql1v4-dEY,10053
331
- omlish/reflect/__init__.py,sha256=eJzSLlCWcjGWn7NGzIR66vANvxiHQym73YJeMwB7mCw,725
341
+ omlish/reflect/__init__.py,sha256=qvrh1NM4GxJH-nUCMgc-ZxEHiDhintAkTky-UOcfn5o,752
332
342
  omlish/reflect/isinstance.py,sha256=x5T9S2634leinBT4hl3CZZkRttvdvvlxChkC_x9Qu2s,1176
333
343
  omlish/reflect/ops.py,sha256=RJ6jzrM4ieFsXzWyNXWV43O_WgzEaUvlHSc5N2ezW2A,2044
334
344
  omlish/reflect/subst.py,sha256=JM2RGv2-Rcex8wCqhmgvRG59zD242P9jM3O2QLjKWWo,3586
335
- omlish/reflect/types.py,sha256=8EhhLU-ko-Uepk3Xa0v22w8LBS7MbjPwJ4HNM_Dtf5g,7779
345
+ omlish/reflect/types.py,sha256=wvK0XyCQAlkUqSbbm9Fll9VbkIMp3pLnIfF1rtKj5Hg,7901
336
346
  omlish/secrets/__init__.py,sha256=SGB1KrlNrxlNpazEHYy95NTzteLi8ndoEgMhU7luBl8,420
337
347
  omlish/secrets/crypto.py,sha256=6CsLy0UEqCrBK8Xx_3-iFF6SKtu2GlEqUQ8-MliY3tk,3709
338
348
  omlish/secrets/marshal.py,sha256=U9uSRTWzZmumfNZeh_dROwVdGrARsp155TylRbjilP8,2048
@@ -440,9 +450,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
440
450
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
441
451
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
442
452
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
443
- omlish-0.0.0.dev81.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
444
- omlish-0.0.0.dev81.dist-info/METADATA,sha256=UooryMHMgAq8_m6upiqUVBeYA2q0sed0HRF4gxG3I8A,4047
445
- omlish-0.0.0.dev81.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
446
- omlish-0.0.0.dev81.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
447
- omlish-0.0.0.dev81.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
448
- omlish-0.0.0.dev81.dist-info/RECORD,,
453
+ omlish-0.0.0.dev82.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
454
+ omlish-0.0.0.dev82.dist-info/METADATA,sha256=tbUAyvNpmqNdIkCTSasl8G13hBLWp7xBvuiFgJDkYsA,4047
455
+ omlish-0.0.0.dev82.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
456
+ omlish-0.0.0.dev82.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
457
+ omlish-0.0.0.dev82.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
458
+ omlish-0.0.0.dev82.dist-info/RECORD,,