omlish 0.0.0.dev84__py3-none-any.whl → 0.0.0.dev86__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.dev84'
2
- __revision__ = 'b3347da7d48862b90c274893e4f9bfa477fecc70'
1
+ __version__ = '0.0.0.dev86'
2
+ __revision__ = '39be25efaa0206ceb3478be1878e14671f5940f1'
3
3
 
4
4
 
5
5
  #
@@ -1,10 +1,13 @@
1
1
  from .base import Backend
2
+ from .orjson import ORJSON_BACKEND
2
3
  from .std import STD_BACKEND
3
4
  from .ujson import UJSON_BACKEND
4
5
 
5
6
 
6
7
  DEFAULT_BACKED: Backend
7
- if UJSON_BACKEND is not None:
8
+ if ORJSON_BACKEND is not None:
9
+ DEFAULT_BACKED = ORJSON_BACKEND
10
+ elif UJSON_BACKEND is not None:
8
11
  DEFAULT_BACKED = UJSON_BACKEND
9
12
  else:
10
13
  DEFAULT_BACKED = STD_BACKEND
@@ -52,14 +52,18 @@ SCALAR_VALUE_TYPES: tuple[type, ...] = tuple(
52
52
  ##
53
53
 
54
54
 
55
+ class Position(ta.NamedTuple):
56
+ ofs: int
57
+ line: int
58
+ col: int
59
+
60
+
55
61
  class Token(ta.NamedTuple):
56
62
  kind: TokenKind
57
63
  value: ScalarValue
58
64
  raw: str | None
59
65
 
60
- ofs: int
61
- line: int
62
- col: int
66
+ pos: Position
63
67
 
64
68
  def __iter__(self):
65
69
  raise TypeError
@@ -94,9 +98,7 @@ CONST_TOKENS: ta.Mapping[str, tuple[TokenKind, str | float | None]] = {
94
98
  class JsonLexError(Exception):
95
99
  message: str
96
100
 
97
- ofs: int
98
- line: int
99
- col: int
101
+ pos: Position
100
102
 
101
103
 
102
104
  class JsonStreamLexer(GenMachine[str, Token]):
@@ -108,13 +110,21 @@ class JsonStreamLexer(GenMachine[str, Token]):
108
110
  self._include_raw = include_raw
109
111
 
110
112
  self._ofs = 0
111
- self._line = 0
113
+ self._line = 1
112
114
  self._col = 0
113
115
 
114
116
  self._buf = io.StringIO()
115
117
 
116
118
  super().__init__(self._do_main())
117
119
 
120
+ @property
121
+ def pos(self) -> Position:
122
+ return Position(
123
+ self._ofs,
124
+ self._line,
125
+ self._col,
126
+ )
127
+
118
128
  def _char_in(self, c: str) -> str:
119
129
  if c and len(c) != 1:
120
130
  raise ValueError(c)
@@ -134,14 +144,13 @@ class JsonStreamLexer(GenMachine[str, Token]):
134
144
  kind: TokenKind,
135
145
  value: ScalarValue,
136
146
  raw: str,
147
+ pos: Position,
137
148
  ) -> ta.Sequence[Token]:
138
149
  tok = Token(
139
150
  kind,
140
151
  value,
141
152
  raw if self._include_raw else None,
142
- self._ofs,
143
- self._line,
144
- self._col,
153
+ pos,
145
154
  )
146
155
  return (tok,)
147
156
 
@@ -152,7 +161,7 @@ class JsonStreamLexer(GenMachine[str, Token]):
152
161
  return raw
153
162
 
154
163
  def _raise(self, msg: str) -> ta.NoReturn:
155
- raise JsonLexError(msg, self._ofs, self._line, self._col)
164
+ raise JsonLexError(msg, self.pos)
156
165
 
157
166
  def _do_main(self):
158
167
  while True:
@@ -165,7 +174,7 @@ class JsonStreamLexer(GenMachine[str, Token]):
165
174
  continue
166
175
 
167
176
  if c in CONTROL_TOKENS:
168
- yield self._make_tok(CONTROL_TOKENS[c], c, c)
177
+ yield self._make_tok(CONTROL_TOKENS[c], c, c, self.pos)
169
178
  continue
170
179
 
171
180
  if c == '"':
@@ -180,8 +189,11 @@ class JsonStreamLexer(GenMachine[str, Token]):
180
189
  self._raise(f'Unexpected character: {c}')
181
190
 
182
191
  def _do_string(self):
192
+ check.state(self._buf.tell() == 0)
183
193
  self._buf.write('"')
184
194
 
195
+ pos = self.pos
196
+
185
197
  last = None
186
198
  while True:
187
199
  try:
@@ -199,13 +211,16 @@ class JsonStreamLexer(GenMachine[str, Token]):
199
211
 
200
212
  raw = self._flip_buf()
201
213
  sv = json.loads(raw)
202
- yield self._make_tok('STRING', sv, raw)
214
+ yield self._make_tok('STRING', sv, raw, pos)
203
215
 
204
216
  return self._do_main()
205
217
 
206
218
  def _do_number(self, c: str):
219
+ check.state(self._buf.tell() == 0)
207
220
  self._buf.write(c)
208
221
 
222
+ pos = self.pos
223
+
209
224
  while True:
210
225
  try:
211
226
  c = self._char_in((yield None)) # noqa
@@ -240,7 +255,7 @@ class JsonStreamLexer(GenMachine[str, Token]):
240
255
  self._raise(f'Invalid number format: {raw}')
241
256
 
242
257
  tk, tv = CONST_TOKENS[raw]
243
- yield self._make_tok(tk, tv, raw)
258
+ yield self._make_tok(tk, tv, raw, pos)
244
259
 
245
260
  return self._do_main()
246
261
 
@@ -250,7 +265,7 @@ class JsonStreamLexer(GenMachine[str, Token]):
250
265
  nv = float(raw)
251
266
  else:
252
267
  nv = int(raw)
253
- yield self._make_tok('NUMBER', nv, raw)
268
+ yield self._make_tok('NUMBER', nv, raw, pos)
254
269
 
255
270
  #
256
271
 
@@ -258,7 +273,7 @@ class JsonStreamLexer(GenMachine[str, Token]):
258
273
  return None
259
274
 
260
275
  if c in CONTROL_TOKENS:
261
- yield self._make_tok(CONTROL_TOKENS[c], c, c)
276
+ yield self._make_tok(CONTROL_TOKENS[c], c, c, pos)
262
277
 
263
278
  elif not c.isspace():
264
279
  self._raise(f'Unexpected character after number: {c}')
@@ -266,6 +281,7 @@ class JsonStreamLexer(GenMachine[str, Token]):
266
281
  return self._do_main()
267
282
 
268
283
  def _do_const(self, c: str):
284
+ pos = self.pos
269
285
  raw = c
270
286
  while True:
271
287
  try:
@@ -280,6 +296,6 @@ class JsonStreamLexer(GenMachine[str, Token]):
280
296
  self._raise(f'Invalid literal: {raw}')
281
297
 
282
298
  tk, tv = CONST_TOKENS[raw]
283
- yield self._make_tok(tk, tv, raw)
299
+ yield self._make_tok(tk, tv, raw, pos)
284
300
 
285
301
  return self._do_main()
omlish/formats/xml.py CHANGED
@@ -21,13 +21,13 @@ else:
21
21
  @dc.dataclass(frozen=True)
22
22
  class SimpleElement:
23
23
  tag: str
24
- attributes: ta.Mapping[str, str] | None = dc.xfield(default=None, repr_fn=dc.truthy_repr)
24
+ attrs: ta.Mapping[str, str] | None = dc.xfield(default=None, repr_fn=dc.truthy_repr)
25
25
  body: ta.Sequence[ta.Union['SimpleElement', str]] | None = dc.xfield(default=None, repr_fn=dc.truthy_repr)
26
26
 
27
27
  def as_dict(self) -> dict[str, ta.Any]:
28
28
  dct: dict[str, ta.Any] = {'tag': self.tag}
29
- if self.attributes:
30
- dct['attributes'] = self.attributes
29
+ if self.attrs:
30
+ dct['attrs'] = self.attrs
31
31
  if self.body:
32
32
  dct['body'] = [
33
33
  c.as_dict() if isinstance(c, SimpleElement) else c
omlish/http/sse.py CHANGED
@@ -1,6 +1,9 @@
1
1
  """
2
2
  TODO:
3
3
  - end-of-line = ( cr lf / cr / lf )
4
+
5
+ See:
6
+ - https://github.com/florimondmanca/httpx-sse/blob/master/src/httpx_sse/_decoders.py
4
7
  """
5
8
  import string
6
9
  import typing as ta
@@ -77,9 +77,12 @@ from .objects import ( # noqa
77
77
 
78
78
  from .polymorphism import ( # noqa
79
79
  Impl,
80
+ Impls,
80
81
  Polymorphism,
81
82
  PolymorphismMarshalerFactory,
82
83
  PolymorphismUnmarshalerFactory,
84
+ make_polymorphism_marshaler,
85
+ make_polymorphism_unmarshaler,
83
86
  polymorphism_from_subclasses,
84
87
  )
85
88
 
@@ -101,6 +104,8 @@ from .standard import ( # noqa
101
104
 
102
105
  from .unions import ( # noqa
103
106
  PRIMITIVE_UNION_TYPES,
107
+ PolymorphismUnionMarshalerFactory,
108
+ PolymorphismUnionUnmarshalerFactory,
104
109
  PrimitiveUnionMarshaler,
105
110
  PrimitiveUnionMarshalerFactory,
106
111
  PrimitiveUnionUnmarshaler,
@@ -50,21 +50,19 @@ class Impl:
50
50
  alts: ta.AbstractSet[str] = frozenset()
51
51
 
52
52
 
53
- class Polymorphism:
53
+ class Impls(ta.Sequence[Impl]):
54
54
  def __init__(
55
55
  self,
56
- ty: type,
57
- impls: ta.Iterable[Impl],
56
+ lst: ta.Iterable[Impl],
58
57
  ) -> None:
59
58
  super().__init__()
60
- self._ty = ty
61
- self._impls = list(impls)
59
+ self._lst = list(lst)
62
60
 
63
61
  by_ty: dict[type, Impl] = {}
64
62
  by_tag: dict[str, Impl] = {}
65
- for i in self._impls:
66
- if not issubclass(i.ty, ty) or i.ty in by_ty:
67
- raise TypeError(i.ty, ty)
63
+ for i in self._lst:
64
+ if i.ty in by_ty:
65
+ raise TypeError(i.ty)
68
66
  if i.tag in by_tag:
69
67
  raise NameError(i.tag)
70
68
  for a in i.alts:
@@ -77,13 +75,20 @@ class Polymorphism:
77
75
  self._by_ty = by_ty
78
76
  self._by_tag = by_tag
79
77
 
80
- @property
81
- def ty(self) -> type:
82
- return self._ty
78
+ def __iter__(self) -> ta.Iterator[Impl]:
79
+ return iter(self._lst)
83
80
 
84
- @property
85
- def impls(self) -> ta.Sequence[Impl]:
86
- return self._impls
81
+ def __len__(self) -> int:
82
+ return len(self._lst)
83
+
84
+ @ta.overload
85
+ def __getitem__(self, index: int) -> Impl: ...
86
+
87
+ @ta.overload
88
+ def __getitem__(self, index: slice) -> ta.Sequence[Impl]: ...
89
+
90
+ def __getitem__(self, index):
91
+ return self._lst[index]
87
92
 
88
93
  @property
89
94
  def by_ty(self) -> ta.Mapping[type, Impl]:
@@ -94,6 +99,29 @@ class Polymorphism:
94
99
  return self._by_tag
95
100
 
96
101
 
102
+ class Polymorphism:
103
+ def __init__(
104
+ self,
105
+ ty: type,
106
+ impls: ta.Iterable[Impl],
107
+ ) -> None:
108
+ super().__init__()
109
+ self._ty = ty
110
+ self._impls = Impls(impls)
111
+
112
+ for i in self._impls:
113
+ if not issubclass(i.ty, ty):
114
+ raise TypeError(i.ty, ty)
115
+
116
+ @property
117
+ def ty(self) -> type:
118
+ return self._ty
119
+
120
+ @property
121
+ def impls(self) -> Impls:
122
+ return self._impls
123
+
124
+
97
125
  def polymorphism_from_subclasses(
98
126
  ty: type,
99
127
  *,
@@ -151,6 +179,23 @@ class FieldPolymorphismMarshaler(Marshaler):
151
179
  return {self.tf: tag, **m.marshal(ctx, o)} # type: ignore
152
180
 
153
181
 
182
+ def make_polymorphism_marshaler(
183
+ impls: Impls,
184
+ tt: TypeTagging,
185
+ ctx: MarshalContext,
186
+ ) -> Marshaler:
187
+ m = {
188
+ i.ty: (i.tag, ctx.make(i.ty))
189
+ for i in impls
190
+ }
191
+ if isinstance(tt, WrapperTypeTagging):
192
+ return WrapperPolymorphismMarshaler(m)
193
+ elif isinstance(tt, FieldTypeTagging):
194
+ return FieldPolymorphismMarshaler(m, tt.field)
195
+ else:
196
+ raise TypeError(tt)
197
+
198
+
154
199
  @dc.dataclass(frozen=True)
155
200
  class PolymorphismMarshalerFactory(MarshalerFactory):
156
201
  p: Polymorphism
@@ -161,16 +206,7 @@ class PolymorphismMarshalerFactory(MarshalerFactory):
161
206
 
162
207
  def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
163
208
  check.is_(rty, self.p.ty)
164
- m = {
165
- i.ty: (i.tag, ctx.make(i.ty))
166
- for i in self.p.impls
167
- }
168
- if isinstance(self.tt, WrapperTypeTagging):
169
- return WrapperPolymorphismMarshaler(m)
170
- elif isinstance(self.tt, FieldTypeTagging):
171
- return FieldPolymorphismMarshaler(m, self.tt.field)
172
- else:
173
- raise TypeError(self.tt)
209
+ return make_polymorphism_marshaler(self.p.impls, self.tt, ctx)
174
210
 
175
211
 
176
212
  ##
@@ -199,6 +235,25 @@ class FieldPolymorphismUnmarshaler(Unmarshaler):
199
235
  return u.unmarshal(ctx, ma)
200
236
 
201
237
 
238
+ def make_polymorphism_unmarshaler(
239
+ impls: Impls,
240
+ tt: TypeTagging,
241
+ ctx: UnmarshalContext,
242
+ ) -> Unmarshaler:
243
+ m = {
244
+ t: u
245
+ for i in impls
246
+ for u in [ctx.make(i.ty)]
247
+ for t in [i.tag, *i.alts]
248
+ }
249
+ if isinstance(tt, WrapperTypeTagging):
250
+ return WrapperPolymorphismUnmarshaler(m)
251
+ elif isinstance(tt, FieldTypeTagging):
252
+ return FieldPolymorphismUnmarshaler(m, tt.field)
253
+ else:
254
+ raise TypeError(tt)
255
+
256
+
202
257
  @dc.dataclass(frozen=True)
203
258
  class PolymorphismUnmarshalerFactory(UnmarshalerFactory):
204
259
  p: Polymorphism
@@ -209,15 +264,4 @@ class PolymorphismUnmarshalerFactory(UnmarshalerFactory):
209
264
 
210
265
  def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
211
266
  check.is_(rty, self.p.ty)
212
- m = {
213
- t: u
214
- for i in self.p.impls
215
- for u in [ctx.make(i.ty)]
216
- for t in [i.tag, *i.alts]
217
- }
218
- if isinstance(self.tt, WrapperTypeTagging):
219
- return WrapperPolymorphismUnmarshaler(m)
220
- elif isinstance(self.tt, FieldTypeTagging):
221
- return FieldPolymorphismUnmarshaler(m, self.tt.field)
222
- else:
223
- raise TypeError(self.tt)
267
+ return make_polymorphism_unmarshaler(self.p.impls, self.tt, ctx)
omlish/marshal/unions.py CHANGED
@@ -1,7 +1,8 @@
1
- import dataclasses as dc
2
1
  import typing as ta
3
2
 
3
+ from .. import cached
4
4
  from .. import check
5
+ from .. import dataclasses as dc
5
6
  from .. import matchfns as mfs
6
7
  from .. import reflect as rfl
7
8
  from .base import MarshalContext
@@ -10,6 +11,11 @@ from .base import MarshalerFactory
10
11
  from .base import UnmarshalContext
11
12
  from .base import Unmarshaler
12
13
  from .base import UnmarshalerFactory
14
+ from .polymorphism import Impls
15
+ from .polymorphism import TypeTagging
16
+ from .polymorphism import WrapperTypeTagging
17
+ from .polymorphism import make_polymorphism_marshaler
18
+ from .polymorphism import make_polymorphism_unmarshaler
13
19
  from .values import Value
14
20
 
15
21
 
@@ -103,3 +109,40 @@ class PrimitiveUnionUnmarshalerFactory(UnmarshalerFactory):
103
109
 
104
110
  PRIMITIVE_UNION_MARSHALER_FACTORY = PrimitiveUnionMarshalerFactory()
105
111
  PRIMITIVE_UNION_UNMARSHALER_FACTORY = PrimitiveUnionUnmarshalerFactory()
112
+
113
+
114
+ ##
115
+
116
+
117
+ @dc.dataclass(frozen=True)
118
+ class PolymorphismUnionMarshalerFactory(MarshalerFactory):
119
+ impls: Impls
120
+ tt: TypeTagging = WrapperTypeTagging()
121
+
122
+ @cached.property
123
+ @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
+
127
+ def guard(self, ctx: MarshalContext, rty: rfl.Type) -> bool:
128
+ return isinstance(rty, rfl.Union) and rty == self.rty
129
+
130
+ def fn(self, ctx: MarshalContext, rty: rfl.Type) -> Marshaler:
131
+ return make_polymorphism_marshaler(self.impls, self.tt, ctx)
132
+
133
+
134
+ @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
+
144
+ def guard(self, ctx: UnmarshalContext, rty: rfl.Type) -> bool:
145
+ return isinstance(rty, rfl.Union) and rty == self.rty
146
+
147
+ def fn(self, ctx: UnmarshalContext, rty: rfl.Type) -> Unmarshaler:
148
+ return make_polymorphism_unmarshaler(self.impls, self.tt, ctx)
@@ -2,6 +2,7 @@ from .base import Builder
2
2
  from .binary import BinaryBuilder
3
3
  from .exprs import ExprBuilder
4
4
  from .idents import IdentBuilder
5
+ from .inserts import InsertBuilder
5
6
  from .multi import MultiBuilder
6
7
  from .names import NameBuilder
7
8
  from .relations import RelationBuilder
@@ -11,6 +12,7 @@ from .unary import UnaryBuilder
11
12
 
12
13
 
13
14
  class StdBuilder(
15
+ InsertBuilder,
14
16
  SelectBuilder,
15
17
  StmtBuilder,
16
18
 
@@ -0,0 +1,50 @@
1
+ import typing as ta
2
+
3
+ from ... import dataclasses as dc
4
+ from ... import lang
5
+ from .exprs import CanExpr
6
+ from .exprs import Expr
7
+ from .exprs import ExprBuilder
8
+ from .idents import CanIdent
9
+ from .idents import Ident
10
+ from .relations import CanRelation
11
+ from .relations import Relation
12
+ from .relations import RelationBuilder
13
+ from .selects import Select
14
+ from .stmts import Stmt
15
+
16
+
17
+ ##
18
+
19
+
20
+ class Values(dc.Frozen, lang.Final):
21
+ vs: ta.Sequence[Expr]
22
+
23
+
24
+ class Insert(Stmt, lang.Final):
25
+ columns: ta.Sequence[Ident]
26
+ into: Relation
27
+ data: Values | Select
28
+
29
+
30
+ CanValues: ta.TypeAlias = Values | ta.Sequence[CanExpr]
31
+
32
+
33
+ class InsertBuilder(ExprBuilder, RelationBuilder):
34
+ def values(self, vs: CanValues) -> Values:
35
+ if isinstance(vs, Values):
36
+ return vs
37
+ else:
38
+ return Values(tuple(self.expr(v) for v in vs))
39
+
40
+ def insert(
41
+ self,
42
+ columns: ta.Sequence[CanIdent],
43
+ into: CanRelation,
44
+ data: Select | Values | ta.Sequence[CanExpr],
45
+ ) -> Insert:
46
+ return Insert(
47
+ columns=tuple(self.ident(c) for c in columns),
48
+ into=self.relation(into),
49
+ data=data if isinstance(data, Select) else self.values(data),
50
+ )
@@ -11,8 +11,10 @@ from .base import Node
11
11
  from .binary import BinaryOp
12
12
  from .binary import BinaryOps
13
13
  from .exprs import Expr
14
+ from .inserts import Values
14
15
  from .multi import MultiKind
15
16
  from .relations import Relation
17
+ from .selects import Select
16
18
  from .stmts import Stmt
17
19
  from .unary import UnaryOp
18
20
  from .unary import UnaryOps
@@ -72,3 +74,10 @@ def _install_standard_marshalling() -> None:
72
74
  p = msh.polymorphism_from_subclasses(cls, naming=msh.Naming.SNAKE)
73
75
  msh.STANDARD_MARSHALER_FACTORIES[0:0] = [msh.PolymorphismMarshalerFactory(p)]
74
76
  msh.STANDARD_UNMARSHALER_FACTORIES[0:0] = [msh.PolymorphismUnmarshalerFactory(p)]
77
+
78
+ insert_data_impls = msh.Impls([
79
+ msh.Impl(Values, 'values'),
80
+ msh.Impl(Select, 'select'),
81
+ ])
82
+ msh.STANDARD_MARSHALER_FACTORIES[0:0] = [msh.PolymorphismUnionMarshalerFactory(insert_data_impls)]
83
+ msh.STANDARD_UNMARSHALER_FACTORIES[0:0] = [msh.PolymorphismUnionUnmarshalerFactory(insert_data_impls)]
@@ -28,7 +28,7 @@ class MultiBuilder(ExprBuilder):
28
28
  if len(es) == 1:
29
29
  return self.expr(es[0])
30
30
  else:
31
- return Multi(k, [self.expr(e) for e in es])
31
+ return Multi(k, tuple(self.expr(e) for e in es))
32
32
 
33
33
  def and_(self, *es: CanExpr) -> Expr:
34
34
  return self.multi(MultiKind.AND, *es)
@@ -27,6 +27,8 @@ from .binary import BinaryOps
27
27
  from .exprs import Literal
28
28
  from .exprs import NameExpr
29
29
  from .idents import Ident
30
+ from .inserts import Insert
31
+ from .inserts import Values
30
32
  from .multi import Multi
31
33
  from .multi import MultiKind
32
34
  from .names import Name
@@ -98,6 +100,29 @@ class StdRenderer(Renderer):
98
100
  def render_ident(self, o: Ident) -> None:
99
101
  self._out.write(f'"{o.s}"')
100
102
 
103
+ # inserts
104
+
105
+ @Renderer.render.register
106
+ def render_values(self, o: Values) -> None:
107
+ self._out.write('values (')
108
+ for i, v in enumerate(o.vs):
109
+ if i:
110
+ self._out.write(', ')
111
+ self.render(v)
112
+ self._out.write(')')
113
+
114
+ @Renderer.render.register
115
+ def render_insert(self, o: Insert) -> None:
116
+ self._out.write('insert into ')
117
+ self.render(o.into)
118
+ self._out.write(' (')
119
+ for i, c in enumerate(o.columns):
120
+ if i:
121
+ self._out.write(', ')
122
+ self.render(c)
123
+ self._out.write(') ')
124
+ self.render(o.data)
125
+
101
126
  # multis
102
127
 
103
128
  MULTI_KIND_TO_STR: ta.ClassVar[ta.Mapping[MultiKind, str]] = {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev84
3
+ Version: 0.0.0.dev86
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=oOKwJVkrCVI_eRBapOS36eRWek5mbyQvP62epTd67RE,3345
2
+ omlish/__about__.py,sha256=bmf1Xnu5T4--9ykGD63NIvhEZE9Fhk9w3IlmwLH40vU,3345
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
@@ -181,7 +181,7 @@ omlish/docker/manifests.py,sha256=LR4FpOGNUT3bZQ-gTjB6r_-1C3YiG30QvevZjrsVUQM,70
181
181
  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
- omlish/formats/xml.py,sha256=FYNUliVZproz4cA3nOTqj0ShfPMQ7rEIeMEP4umDNho,1511
184
+ omlish/formats/xml.py,sha256=ggiOwSERt4d9XmZwLZiDIh5qnFJS4jdmow9m9_9USps,1491
185
185
  omlish/formats/yaml.py,sha256=wTW8ECG9jyA7qIFUqKZUro4KAKpN4IvcW_qhlrKveXM,6836
186
186
  omlish/formats/json/__init__.py,sha256=xqW2APLGvCTO9dVTOlroR_AdrA5bCkdmUnbTkYHhJ7U,379
187
187
  omlish/formats/json/consts.py,sha256=u-x-qXqZvK0tWk3l3TrCTjk4mSjKmZ_ATdmd1hwHNAY,263
@@ -190,7 +190,7 @@ omlish/formats/json/json.py,sha256=Mdqv2vdMi7gp96eV0BIYH5UdWpjWfsh-tSMZeywG-08,3
190
190
  omlish/formats/json/render.py,sha256=H6q1R3gL6ULAnfEhQRKDOzDJjWizdsRDYxIerBSEbq8,3797
191
191
  omlish/formats/json/backends/__init__.py,sha256=gnaNDCxy_KmmPUPDnjxO5_WjuWxLGbI9FYWx8ZJuQUU,97
192
192
  omlish/formats/json/backends/base.py,sha256=WqtyoM82pyM0NyqpPwndrebr1bUVU1QlpmVQNrcAO8c,1114
193
- omlish/formats/json/backends/default.py,sha256=_roVwUL40yU4spmUR9O86Ps9ytlpVU_EqolN-wdlSe8,218
193
+ omlish/formats/json/backends/default.py,sha256=a-eM-Y1IHdpYvZFjazwq_orRncjtYR7BKxP_2kpEXog,322
194
194
  omlish/formats/json/backends/jiter.py,sha256=8qv_XWGpcupPtVm6Z_egHio_iY1Kk8eqkvXTF6fVZr4,1193
195
195
  omlish/formats/json/backends/orjson.py,sha256=wR8pMGFtkhZGHcNVk7vNYUnv8lUapdK89p6QpETIs9w,3778
196
196
  omlish/formats/json/backends/std.py,sha256=PM00Kh9ZR2XzollHMEvdo35Eml1N-zFfRW-LOCV5ftM,3085
@@ -201,7 +201,7 @@ omlish/formats/json/cli/cli.py,sha256=GkdNokklRuDWiXAIai1wijSBFVJlpdlNLTQ3Lyucos
201
201
  omlish/formats/json/cli/formats.py,sha256=tqEZKby4HeafGcaUs-m8B-2ZV12dRo40rzL-V99cp00,1714
202
202
  omlish/formats/json/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
203
203
  omlish/formats/json/stream/build.py,sha256=6deXBxTx1toFAPShz2Jo5OiXxH5Y4ppG8gDPRFoUgjA,2461
204
- omlish/formats/json/stream/lex.py,sha256=hMnsZld72XE7GCWdjbUANRxrruuBSSQeCm8wypMiMv0,6172
204
+ omlish/formats/json/stream/lex.py,sha256=01K_M9na7-3xv0h3VDBobLXuTS-w4YesNJ6GhOaDtYA,6494
205
205
  omlish/formats/json/stream/parse.py,sha256=WkbW7tvcdrTSluKhw70nPvjsq943eryVcjx8FSz78tM,5198
206
206
  omlish/formats/json/stream/render.py,sha256=B9ZNuBiDJOT25prhIsZu1ICKjxk4eMPwpgQF37NPufs,3212
207
207
  omlish/graphs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -224,7 +224,7 @@ omlish/http/headers.py,sha256=ZMmjrEiYjzo0YTGyK0YsvjdwUazktGqzVVYorY4fd44,5081
224
224
  omlish/http/json.py,sha256=9XwAsl4966Mxrv-1ytyCqhcE6lbBJw-0_tFZzGszgHE,7440
225
225
  omlish/http/multipart.py,sha256=R9ycpHsXRcmh0uoc43aYb7BdWL-8kSQHe7J-M81aQZM,2240
226
226
  omlish/http/sessions.py,sha256=VZ_WS5uiQG5y7i3u8oKuQMqf8dPKUOjFm_qk_0OvI8c,4793
227
- omlish/http/sse.py,sha256=T2_EXTcDfEhCF4E9B68YtEYLFb803MPnh8eCNjdPlRo,2223
227
+ omlish/http/sse.py,sha256=MDs9RvxQXoQliImcc6qK1ERajEYM7Q1l8xmr-9ceNBc,2315
228
228
  omlish/http/wsgi.py,sha256=czZsVUX-l2YTlMrUjKN49wRoP4rVpS0qpeBn4O5BoMY,948
229
229
  omlish/inject/__init__.py,sha256=JQ7x8l9MjU-kJ5ap7cPVq7SY7zbbCIrjyJAF0UeE5-s,1886
230
230
  omlish/inject/binder.py,sha256=H8AQ4ecmBOtDL8fMgrU1yUJl1gBADLNcdysRbvO8Wso,4167
@@ -308,7 +308,7 @@ omlish/logs/formatters.py,sha256=q79nMnR2mRIStPyGrydQHpYTXgC5HHptt8lH3W2Wwbs,671
308
308
  omlish/logs/handlers.py,sha256=nyuFgmO05By_Xwq7es58ClzS51-F53lJL7gD0x5IqAg,228
309
309
  omlish/logs/noisy.py,sha256=Ubc-eTH6ZbGYsLfUUi69JAotwuUwzb-SJBeGo_0dIZI,348
310
310
  omlish/logs/utils.py,sha256=MgGovbP0zUrZ3FGD3qYNQWn-l0jy0Y0bStcQvv5BOmQ,391
311
- omlish/marshal/__init__.py,sha256=G0MDeBStBjz9Njq-rt5C6WbuCik6c8st7cipwMVw668,2139
311
+ omlish/marshal/__init__.py,sha256=iVA7n31L08Bdub6HKPvYOXVvDhk2CMA6rPeKDL_u1to,2298
312
312
  omlish/marshal/any.py,sha256=e82OyYK3Emm1P1ClnsnxP7fIWC2iNVyW0H5nK4mLmWM,779
313
313
  omlish/marshal/base.py,sha256=7ZpJOMPlvtslhDdRlNZCC5MiUGu7Qfoq_S_miD0lmQY,6738
314
314
  omlish/marshal/base64.py,sha256=F-3ogJdcFCtWINRgJgWT0rErqgx6f4qahhcg8OrkqhE,1089
@@ -329,11 +329,11 @@ omlish/marshal/nop.py,sha256=2mWve_dicFAiUQ2Y5asKkUW-XGmEE9Qi2ClIasFad0c,461
329
329
  omlish/marshal/numbers.py,sha256=kFRIX9l1yofiYzafV6SnYfEg0PiCsAqeRHOeT6BSxlM,1672
330
330
  omlish/marshal/objects.py,sha256=74tUmMymimSqgd4a6kyMh_owJe6J7YQXwCXEF-JWt1c,8419
331
331
  omlish/marshal/optionals.py,sha256=r0XB5rqfasvgZJNrKYd6Unq2U4nHt3JURi26j0dYHlw,1499
332
- omlish/marshal/polymorphism.py,sha256=gCQ4_uzuqOcWstihK3twiMc-10G1ZHWLuLZxbajbecY,5644
332
+ omlish/marshal/polymorphism.py,sha256=2SxrfneA9QdhNdxieEGFnHDHpUo3ftETA9dMbCbmbWY,6511
333
333
  omlish/marshal/primitives.py,sha256=f_6m24Cb-FDGsZpYSas11nLt3xCCEUXugw3Hv4-aNhg,1291
334
334
  omlish/marshal/registries.py,sha256=FvC6qXHCizNB2QmU_N3orxW7iqfGYkiUXYYdTRWS6HA,2353
335
335
  omlish/marshal/standard.py,sha256=vcC17ZZW33lRki7jrRd-saHGUZcXEHOpbPNGxWWbLWI,3143
336
- omlish/marshal/unions.py,sha256=ZWl0maHwh1V_cSnNmuCbbCQZzqlNtOModsTwnVTXNPA,2735
336
+ omlish/marshal/unions.py,sha256=DSs_g0F6EiefCturQPWv70VUAmsZgqEU9flmgxpxm7o,4137
337
337
  omlish/marshal/utils.py,sha256=puKJpwPpuDlMOIrKMcLTRLJyMiL6n_Xs-p59AuDEymA,543
338
338
  omlish/marshal/uuids.py,sha256=H4B7UX_EPNmP2tC8bubcKrPLTS4aQu98huvbXQ3Zv2g,910
339
339
  omlish/marshal/values.py,sha256=ssHiWdg_L6M17kAn8GiGdPW7UeQOm3RDikWkvwblf5I,263
@@ -408,15 +408,16 @@ omlish/sql/alchemy/sqlean.py,sha256=RbkuOuFIfM4fowwKk8-sQ6Dxk-tTUwxS94nY5Kxt52s,
408
408
  omlish/sql/queries/__init__.py,sha256=BdhONMw2JebX-jEgYb1WrM5L3vkJOzQRm0nt04IYKgQ,1229
409
409
  omlish/sql/queries/base.py,sha256=_8O3MbH_OEjBnhp2oIJUZ3ClaQ8l4Sj9BdPdsP0Ie-g,224
410
410
  omlish/sql/queries/binary.py,sha256=dcEzeEn104AMPuQ7QrJU2O-YCN3SUdxB5S4jaWKOUqY,2253
411
- omlish/sql/queries/building.py,sha256=pddD8-WDDGwX97OW7MLahaZTLsO_0NLxxIIAXXq1N40,537
411
+ omlish/sql/queries/building.py,sha256=dIQyEqNef2egKAf5qO_aZvXxlAEfxIGWS23qvJ-ozqQ,591
412
412
  omlish/sql/queries/exprs.py,sha256=kAI5PmvfJ-TqEzzc9H4_womFShT1eA0jWSZH2j2Wg-c,1802
413
413
  omlish/sql/queries/idents.py,sha256=erW6fE9UapuvW1ZeLfGFz7yuW6zzktWIWmOuAHeF8_g,496
414
- omlish/sql/queries/marshal.py,sha256=MKZ3CVcr7mpnmg25twVgErWk1SpRBEkE1mu2fE8QwUA,2508
415
- omlish/sql/queries/multi.py,sha256=KKHf8uS3Akk-YACPUwaqQO20NlDdrB3gbauOAejZzgU,832
414
+ omlish/sql/queries/inserts.py,sha256=PS3oqGjDgnjUd4sxHVpfKDQnsjG4_6KTseRzWyiJQl0,1229
415
+ omlish/sql/queries/marshal.py,sha256=Q-N6RcBzpj3FIa2-7eX6dniLjXKzUhRC9g--61UQUbM,2890
416
+ omlish/sql/queries/multi.py,sha256=7x6x-4jnPzxA6ZasBjnjFuhHFpWt5rGCua3UvuTMIJ0,837
416
417
  omlish/sql/queries/names.py,sha256=YiIyS6ehYMYrdLlUxMawV_Xf2zdi7RwVO9Qsxr_W4_4,772
417
418
  omlish/sql/queries/ops.py,sha256=B7IDfjr2DW5LJhWoNaY1WW90BJhe5ZtmxIELhWXbW-0,129
418
419
  omlish/sql/queries/relations.py,sha256=-d3n-dN17c3TPMZmzSplhWawllUzdq12XPDAuzoeMEQ,838
419
- omlish/sql/queries/rendering.py,sha256=AC2PSGFCLXYk38mnH7EAMV7hQOKp5x6O-ZYV8FXgnAM,4360
420
+ omlish/sql/queries/rendering.py,sha256=vpZY6rAjX5MZl72Tk6_tle3CUPi6U28sN4PcQ7aZ1iI,5055
420
421
  omlish/sql/queries/selects.py,sha256=EcHlyKl5kGSY1d3GVxnImhGCTB6WvwQnlSA9eZanBqU,1364
421
422
  omlish/sql/queries/stmts.py,sha256=pBqwD7dRlqMu6uh6vR3xaWOEgbZCcFWbOQ9ryYd17T4,441
422
423
  omlish/sql/queries/unary.py,sha256=MEYBDZn_H0bexmUrJeONOv5-gIpYowUaXOsEHeQM4ks,1144
@@ -453,9 +454,9 @@ omlish/text/delimit.py,sha256=ubPXcXQmtbOVrUsNh5gH1mDq5H-n1y2R4cPL5_DQf68,4928
453
454
  omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,3296
454
455
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
455
456
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
456
- omlish-0.0.0.dev84.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
457
- omlish-0.0.0.dev84.dist-info/METADATA,sha256=Ui6NExa9RJ31Hhf-FtoRkeGzkSw-2RiAy2bI-1Octl8,3987
458
- omlish-0.0.0.dev84.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
459
- omlish-0.0.0.dev84.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
460
- omlish-0.0.0.dev84.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
461
- omlish-0.0.0.dev84.dist-info/RECORD,,
457
+ omlish-0.0.0.dev86.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
458
+ omlish-0.0.0.dev86.dist-info/METADATA,sha256=w6dXN4XU0iMfkJxV1fEHQ96o_V5idhf7cy3GApDwdAc,3987
459
+ omlish-0.0.0.dev86.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
460
+ omlish-0.0.0.dev86.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
461
+ omlish-0.0.0.dev86.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
462
+ omlish-0.0.0.dev86.dist-info/RECORD,,