omlish 0.0.0.dev200__py3-none-any.whl → 0.0.0.dev202__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.dev200'
2
- __revision__ = '2c496f686e6c5d735b06d5836f93f26d8f63cf4e'
1
+ __version__ = '0.0.0.dev202'
2
+ __revision__ = '3da244e2a7f1e04753682c9f4ddc813289a82a42'
3
3
 
4
4
 
5
5
  #
omlish/formats/props.py CHANGED
@@ -306,8 +306,7 @@ class Properties(collections.abc.MutableMapping):
306
306
  if self._metadoc and self._prev_key:
307
307
  prev_metadata = self._metadata.setdefault(self._prev_key, {})
308
308
  prev_metadata.setdefault('_doc', '')
309
- if docstr.startswith(' '):
310
- docstr = docstr[1:]
309
+ docstr = docstr.removeprefix(' ')
311
310
  prev_metadata['_doc'] += docstr + '\n'
312
311
  return
313
312
 
omlish/lang/__init__.py CHANGED
@@ -189,7 +189,8 @@ from .resolving import ( # noqa
189
189
  )
190
190
 
191
191
  from .resources import ( # noqa
192
- RelativeResource,
192
+ ReadableResource,
193
+ get_package_resources,
193
194
  get_relative_resources,
194
195
  )
195
196
 
omlish/lang/resources.py CHANGED
@@ -6,7 +6,7 @@ import typing as ta
6
6
 
7
7
 
8
8
  @dc.dataclass(frozen=True)
9
- class RelativeResource:
9
+ class ReadableResource:
10
10
  name: str
11
11
  is_file: bool
12
12
  read_bytes: ta.Callable[[], bytes]
@@ -15,13 +15,26 @@ class RelativeResource:
15
15
  return self.read_bytes().decode(encoding)
16
16
 
17
17
 
18
+ def get_package_resources(anchor: str) -> ta.Mapping[str, ReadableResource]:
19
+ lst: list[ReadableResource] = []
20
+
21
+ for pf in importlib.resources.files(anchor).iterdir():
22
+ lst.append(ReadableResource(
23
+ name=pf.name,
24
+ is_file=pf.is_file(),
25
+ read_bytes=pf.read_bytes if pf.is_file() else None, # type: ignore
26
+ ))
27
+
28
+ return {r.name: r for r in lst}
29
+
30
+
18
31
  def get_relative_resources(
19
32
  path: str = '',
20
33
  *,
21
34
  globals: ta.Mapping[str, ta.Any] | None = None, # noqa
22
35
  package: str | None = None,
23
36
  file: str | None = None,
24
- ) -> ta.Mapping[str, RelativeResource]:
37
+ ) -> ta.Mapping[str, ReadableResource]:
25
38
  if globals is not None:
26
39
  if not package:
27
40
  package = globals.get('__package__')
@@ -45,7 +58,7 @@ def get_relative_resources(
45
58
 
46
59
  #
47
60
 
48
- lst: list[RelativeResource] = []
61
+ lst: list[ReadableResource] = []
49
62
 
50
63
  if package:
51
64
  pkg_parts = package.split('.')
@@ -53,7 +66,7 @@ def get_relative_resources(
53
66
  pkg_parts = pkg_parts[:-num_up]
54
67
  anchor = '.'.join([*pkg_parts, *path_parts])
55
68
  for pf in importlib.resources.files(anchor).iterdir():
56
- lst.append(RelativeResource(
69
+ lst.append(ReadableResource(
57
70
  name=pf.name,
58
71
  is_file=pf.is_file(),
59
72
  read_bytes=pf.read_bytes if pf.is_file() else None, # type: ignore
@@ -73,7 +86,7 @@ def get_relative_resources(
73
86
 
74
87
  for ff in os.listdir(dst_dir):
75
88
  ff = os.path.join(dst_dir, ff)
76
- lst.append(RelativeResource(
89
+ lst.append(ReadableResource(
77
90
  name=os.path.basename(ff),
78
91
  is_file=os.path.isfile(ff),
79
92
  read_bytes=functools.partial(_read_file, ff),
omlish/sql/abc.py CHANGED
@@ -1,3 +1,6 @@
1
+ """
2
+ https://peps.python.org/pep-0249/
3
+ """
1
4
  import typing as ta
2
5
 
3
6
 
@@ -14,6 +17,16 @@ DbapiColumnDescription: ta.TypeAlias = tuple[
14
17
  ]
15
18
 
16
19
 
20
+ class DbapiColumnDescription_(ta.NamedTuple): # noqa
21
+ name: str
22
+ type_code: DbapiTypeCode
23
+ display_size: int | None
24
+ internal_size: int | None
25
+ precision: int | None
26
+ scale: int | None
27
+ null_ok: bool | None
28
+
29
+
17
30
  class DbapiConnection(ta.Protocol):
18
31
  def close(self) -> object: ...
19
32
 
@@ -17,13 +17,13 @@ class StdBuilder(
17
17
  SelectBuilder,
18
18
  StmtBuilder,
19
19
 
20
+ RelationBuilder,
21
+
20
22
  MultiBuilder,
21
23
  BinaryBuilder,
22
24
  UnaryBuilder,
23
25
  ExprBuilder,
24
26
 
25
- RelationBuilder,
26
-
27
27
  ParamBuilder,
28
28
 
29
29
  NameBuilder,
@@ -30,7 +30,7 @@ class Insert(Stmt, lang.Final):
30
30
  CanValues: ta.TypeAlias = Values | ta.Sequence[CanExpr]
31
31
 
32
32
 
33
- class InsertBuilder(ExprBuilder, RelationBuilder):
33
+ class InsertBuilder(RelationBuilder, ExprBuilder):
34
34
  def values(self, vs: CanValues) -> Values:
35
35
  if isinstance(vs, Values):
36
36
  return vs
@@ -17,6 +17,7 @@ from .binary import BinaryOps
17
17
  from .exprs import Expr
18
18
  from .inserts import Values
19
19
  from .multi import MultiKind
20
+ from .relations import JoinKind
20
21
  from .relations import Relation
21
22
  from .selects import Select
22
23
  from .stmts import Stmt
@@ -66,8 +67,12 @@ def _install_standard_marshalling() -> None:
66
67
  msh.STANDARD_MARSHALER_FACTORIES[0:0] = [msh.TypeMapMarshalerFactory({ty: OpMarshalerUnmarshaler(ty, ns)})]
67
68
  msh.STANDARD_UNMARSHALER_FACTORIES[0:0] = [msh.TypeMapUnmarshalerFactory({ty: OpMarshalerUnmarshaler(ty, ns)})]
68
69
 
69
- msh.STANDARD_MARSHALER_FACTORIES[0:0] = [msh.TypeMapMarshalerFactory({MultiKind: LowerEnumMarshaler(MultiKind)})]
70
- msh.STANDARD_UNMARSHALER_FACTORIES[0:0] = [msh.TypeMapUnmarshalerFactory({MultiKind: LowerEnumMarshaler(MultiKind)})] # noqa
70
+ ets = [
71
+ JoinKind,
72
+ MultiKind,
73
+ ]
74
+ msh.STANDARD_MARSHALER_FACTORIES[0:0] = [msh.TypeMapMarshalerFactory({t: LowerEnumMarshaler(t) for t in ets})]
75
+ msh.STANDARD_UNMARSHALER_FACTORIES[0:0] = [msh.TypeMapUnmarshalerFactory({t: LowerEnumMarshaler(t) for t in ets})]
71
76
 
72
77
  for cls in [
73
78
  Expr,
@@ -3,15 +3,18 @@ TODO:
3
3
  - join
4
4
  - subquery
5
5
  """
6
+ import enum
6
7
  import typing as ta
7
8
 
8
9
  from ... import dataclasses as dc
9
10
  from ... import lang
10
11
  from .base import Node
12
+ from .exprs import CanExpr
13
+ from .exprs import Expr
11
14
  from .idents import Ident
15
+ from .multi import MultiBuilder
12
16
  from .names import CanName
13
17
  from .names import Name
14
- from .names import NameBuilder
15
18
 
16
19
 
17
20
  ##
@@ -21,22 +24,100 @@ class Relation(Node, lang.Abstract):
21
24
  pass
22
25
 
23
26
 
27
+ #
28
+
29
+
24
30
  class Table(Relation, lang.Final):
25
31
  n: Name
26
32
  a: Ident | None = dc.xfield(None, repr_fn=dc.opt_repr)
27
33
 
28
34
 
35
+ #
36
+
37
+
38
+ class JoinKind(enum.Enum):
39
+ DEFAULT = enum.auto()
40
+ INNER = enum.auto()
41
+ LEFT = enum.auto()
42
+ LEFT_OUTER = enum.auto()
43
+ RIGHT = enum.auto()
44
+ RIGHT_OUTER = enum.auto()
45
+ FULL = enum.auto()
46
+ FULL_OUTER = enum.auto()
47
+ CROSS = enum.auto()
48
+ NATURAL = enum.auto()
49
+
50
+
51
+ class Join(Relation, lang.Final):
52
+ k: JoinKind
53
+ l: Relation
54
+ r: Relation
55
+
56
+ c: Expr | None = None
57
+
58
+
59
+ ##
60
+
61
+
29
62
  CanTable: ta.TypeAlias = Table | CanName
30
63
  CanRelation: ta.TypeAlias = Relation | CanTable
31
64
 
32
65
 
33
- class RelationBuilder(NameBuilder):
66
+ class RelationBuilder(MultiBuilder):
34
67
  def table(self, n: CanTable) -> Table:
35
68
  if isinstance(n, Table):
36
69
  return n
37
70
  else:
38
71
  return Table(self.name(n))
39
72
 
73
+ #
74
+
75
+ def join(
76
+ self,
77
+ k: JoinKind,
78
+ l: CanRelation,
79
+ r: CanRelation,
80
+ *cs: CanExpr,
81
+ ) -> Join:
82
+ return Join(
83
+ k,
84
+ self.relation(l),
85
+ self.relation(r),
86
+ self.or_(*cs) if cs else None,
87
+ )
88
+
89
+ def default_join(self, l: CanRelation, r: CanRelation, *cs: CanExpr) -> Join:
90
+ return self.join(JoinKind.DEFAULT, l, r, *cs)
91
+
92
+ def inner_join(self, l: CanRelation, r: CanRelation, *cs: CanExpr) -> Join:
93
+ return self.join(JoinKind.INNER, l, r, *cs)
94
+
95
+ def left_join(self, l: CanRelation, r: CanRelation, *cs: CanExpr) -> Join:
96
+ return self.join(JoinKind.LEFT, l, r, *cs)
97
+
98
+ def left_outer_join(self, l: CanRelation, r: CanRelation, *cs: CanExpr) -> Join:
99
+ return self.join(JoinKind.LEFT_OUTER, l, r, *cs)
100
+
101
+ def right_join(self, l: CanRelation, r: CanRelation, *cs: CanExpr) -> Join:
102
+ return self.join(JoinKind.RIGHT, l, r, *cs)
103
+
104
+ def right_outer_join(self, l: CanRelation, r: CanRelation, *cs: CanExpr) -> Join:
105
+ return self.join(JoinKind.RIGHT_OUTER, l, r, *cs)
106
+
107
+ def full_join(self, l: CanRelation, r: CanRelation, *cs: CanExpr) -> Join:
108
+ return self.join(JoinKind.FULL, l, r, *cs)
109
+
110
+ def full_outer_join(self, l: CanRelation, r: CanRelation, *cs: CanExpr) -> Join:
111
+ return self.join(JoinKind.FULL_OUTER, l, r, *cs)
112
+
113
+ def cross_join(self, l: CanRelation, r: CanRelation, *cs: CanExpr) -> Join:
114
+ return self.join(JoinKind.CROSS, l, r, *cs)
115
+
116
+ def natural_join(self, l: CanRelation, r: CanRelation, *cs: CanExpr) -> Join:
117
+ return self.join(JoinKind.NATURAL, l, r, *cs)
118
+
119
+ #
120
+
40
121
  def relation(self, o: CanRelation) -> Relation:
41
122
  if isinstance(o, Relation):
42
123
  return o
@@ -36,6 +36,8 @@ from .multi import Multi
36
36
  from .multi import MultiKind
37
37
  from .names import Name
38
38
  from .params import Param
39
+ from .relations import Join
40
+ from .relations import JoinKind
39
41
  from .relations import Table
40
42
  from .selects import Select
41
43
  from .selects import SelectItem
@@ -156,7 +158,6 @@ class StdRenderer(Renderer):
156
158
  MULTI_KIND_TO_STR: ta.ClassVar[ta.Mapping[MultiKind, str]] = {
157
159
  MultiKind.AND: 'and',
158
160
  MultiKind.OR: 'or',
159
-
160
161
  }
161
162
 
162
163
  @Renderer.render.register
@@ -187,6 +188,30 @@ class StdRenderer(Renderer):
187
188
  self._out.write(' as ')
188
189
  self.render(o.a)
189
190
 
191
+ JOIN_KIND_TO_STR: ta.ClassVar[ta.Mapping[JoinKind, str]] = {
192
+ JoinKind.DEFAULT: 'join',
193
+ JoinKind.INNER: 'inner join',
194
+ JoinKind.LEFT: 'left join',
195
+ JoinKind.LEFT_OUTER: 'left outer join',
196
+ JoinKind.RIGHT: 'right join',
197
+ JoinKind.RIGHT_OUTER: 'right outer join',
198
+ JoinKind.FULL: 'full join',
199
+ JoinKind.FULL_OUTER: 'full outer join',
200
+ JoinKind.CROSS: 'cross join',
201
+ JoinKind.NATURAL: 'natural join',
202
+ }
203
+
204
+ @Renderer.render.register
205
+ def render_join(self, o: Join) -> None:
206
+ self.render(o.l)
207
+ self._out.write(' ')
208
+ self._out.write(self.JOIN_KIND_TO_STR[o.k])
209
+ self._out.write(' ')
210
+ self.render(o.r)
211
+ if o.c is not None:
212
+ self._out.write(' on ')
213
+ self.render(o.c)
214
+
190
215
  # selects
191
216
 
192
217
  @Renderer.render.register
@@ -30,7 +30,7 @@ class Select(Stmt, lang.Final):
30
30
  CanSelectItem: ta.TypeAlias = SelectItem | CanExpr
31
31
 
32
32
 
33
- class SelectBuilder(ExprBuilder, RelationBuilder):
33
+ class SelectBuilder(RelationBuilder, ExprBuilder):
34
34
  def select_item(self, o: CanSelectItem) -> SelectItem:
35
35
  if isinstance(o, SelectItem):
36
36
  return o
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omlish
3
- Version: 0.0.0.dev200
3
+ Version: 0.0.0.dev202
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=dyIpveH7Z8OnQp2pTn6NVv7LCDXVrozJWAzbk8PBavg,7950
2
- omlish/__about__.py,sha256=AJX5iNOlWrDlDBEKE35thbObkh7MHjKwPM855AMs7ls,3409
2
+ omlish/__about__.py,sha256=TkrqZrE-0H4UPhtpzOoT1oElyBJWd2jFOEJucdouLTY,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
@@ -226,7 +226,7 @@ omlish/formats/codecs.py,sha256=ip4TLOyWAaUyEJmrIOzuLMtjRdgaMEsC6JeAlcCVi28,1657
226
226
  omlish/formats/dotenv.py,sha256=qoDG4Ayu7B-8LjBBhcmNiLZW0_9LgCi3Ri2aPo9DEQ8,19314
227
227
  omlish/formats/json5.py,sha256=odpZIShlUpv19aACWe58SoMPcv0AHKIa6zSMjlKgaMI,515
228
228
  omlish/formats/pickle.py,sha256=jdp4E9WH9qVPBE3sSqbqDtUo18RbTSIiSpSzJ-IEVZw,529
229
- omlish/formats/props.py,sha256=cek3JLFLIrpE76gvs8rs_B8yF4SpY8ooDH8apWsquwE,18953
229
+ omlish/formats/props.py,sha256=auCv-Jx79KGlWfyG1-Qo0ou-Ex0W_mF3r_lDFdsVkWI,18920
230
230
  omlish/formats/repr.py,sha256=kYrNs4o-ji8nOdp6u_L3aMgBMWN1ZAZJSAWgQQfStSQ,414
231
231
  omlish/formats/xml.py,sha256=ggiOwSERt4d9XmZwLZiDIh5qnFJS4jdmow9m9_9USps,1491
232
232
  omlish/formats/yaml.py,sha256=ffOwGnLA6chdiFyaS7X0TBMGmHG9AoGudzKVWfQ1UOs,7389
@@ -357,7 +357,7 @@ omlish/iterators/iterators.py,sha256=ghI4dO6WPyyFOLTIIMaHQ_IOy2xXaFpGPqveZ5YGIBU
357
357
  omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
358
358
  omlish/iterators/tools.py,sha256=SvXyyQJh7aceLYhRl6pQB-rfSaXw5IMIWukeEeOZt-0,2492
359
359
  omlish/iterators/unique.py,sha256=0jAX3kwzVfRNhe0Tmh7kVP_Q2WBIn8POo_O-rgFV0rQ,1390
360
- omlish/lang/__init__.py,sha256=GqZ3exAAK7iphRf8e4d3CvAz7EptvmEOmCkmN06uYvQ,3986
360
+ omlish/lang/__init__.py,sha256=091aYd1gRii-ulxI9QAMjZBPLcl-kfL-XU82kLMR0qU,4013
361
361
  omlish/lang/cached.py,sha256=92TvRZQ6sWlm7dNn4hgl7aWKbX0J1XUEo3DRjBpgVQk,7834
362
362
  omlish/lang/clsdct.py,sha256=AjtIWLlx2E6D5rC97zQ3Lwq2SOMkbg08pdO_AxpzEHI,1744
363
363
  omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
@@ -372,7 +372,7 @@ omlish/lang/iterables.py,sha256=HOjcxOwyI5bBApDLsxRAGGhTTmw7fdZl2kEckxRVl-0,1994
372
372
  omlish/lang/maybes.py,sha256=1RN7chX_x2XvgUwryZRz0W7hAX-be3eEFcFub5vvf6M,3417
373
373
  omlish/lang/objects.py,sha256=LOC3JvX1g5hPxJ7Sv2TK9kNkAo9c8J-Jw2NmClR_rkA,4576
374
374
  omlish/lang/resolving.py,sha256=OuN2mDTPNyBUbcrswtvFKtj4xgH4H4WglgqSKv3MTy0,1606
375
- omlish/lang/resources.py,sha256=yywDWhh0tsgw24l7mHYv49ll4oZS8Kc8MSCa8f4UbbI,2280
375
+ omlish/lang/resources.py,sha256=N64KeVE-rYMxqBBRp91qzgVqpOVR2uX7k1WlS_bo5hM,2681
376
376
  omlish/lang/strings.py,sha256=BsciSYnckD4vGtC6kmtnugR9IN6CIHdcjO4nZu-pSAw,3898
377
377
  omlish/lang/sys.py,sha256=UoZz_PJYVKLQAKqYxxn-LHz1okK_38I__maZgnXMcxU,406
378
378
  omlish/lang/timeouts.py,sha256=vECdWYhc_IZgcal1Ng1Y42wf2FV3KAx-i8As-MgGHIQ,1186
@@ -531,7 +531,7 @@ omlish/specs/openapi/__init__.py,sha256=zilQhafjvteRDF_TUIRgF293dBC6g-TJChmUb6T9
531
531
  omlish/specs/openapi/marshal.py,sha256=Z-E2Knm04C81N8AA8cibCVSl2ImhSpHZVc7yAhmPx88,2135
532
532
  omlish/specs/openapi/openapi.py,sha256=y4h04jeB7ORJSVrcy7apaBdpwLjIyscv1Ub5SderH2c,12682
533
533
  omlish/sql/__init__.py,sha256=TpZLsEJKJzvJ0eMzuV8hwOJJbkxBCV1RZPUMLAVB6io,173
534
- omlish/sql/abc.py,sha256=kiOitW_ZhTXrJanJ582wD7o9K69v6HXqDPkxuHEAxrc,1606
534
+ omlish/sql/abc.py,sha256=NfbcIlEvdEu6vn0TolhfYb2SO5uzUmY0kARCbg6uVAU,1879
535
535
  omlish/sql/dbapi.py,sha256=5ghJH-HexsmDlYdWlhf00nCGQX2IC98_gxIxMkucOas,3195
536
536
  omlish/sql/dbs.py,sha256=lpdFmm2vTwLoBiVYGj9yPsVcTEYYNCxlYZZpjfChzkY,1870
537
537
  omlish/sql/params.py,sha256=Z4VPet6GhNqD1T_MXSWSHkdy3cpUEhST-OplC4B_fYI,4433
@@ -545,18 +545,18 @@ omlish/sql/alchemy/sqlean.py,sha256=RbkuOuFIfM4fowwKk8-sQ6Dxk-tTUwxS94nY5Kxt52s,
545
545
  omlish/sql/queries/__init__.py,sha256=8wdq6PBf5YzqQWFu-CE8om6BN38sDAD9UEz9VzkojzM,1337
546
546
  omlish/sql/queries/base.py,sha256=_8O3MbH_OEjBnhp2oIJUZ3ClaQ8l4Sj9BdPdsP0Ie-g,224
547
547
  omlish/sql/queries/binary.py,sha256=dcEzeEn104AMPuQ7QrJU2O-YCN3SUdxB5S4jaWKOUqY,2253
548
- omlish/sql/queries/building.py,sha256=lmHItVEi0IkIDEhYL1le8adNhjah0SHhffm59CZtpH4,643
548
+ omlish/sql/queries/building.py,sha256=J2ZDfDyLzRm8q5-TLAN6I_qjhs-7RpfW23yuCYYLf5k,643
549
549
  omlish/sql/queries/exprs.py,sha256=THeSyFF8bouDvU-Keej-hyFUwbp63bw0HpAF4lCYuiQ,1187
550
550
  omlish/sql/queries/idents.py,sha256=w2RxO6SR3K-u30S259OtnAZaPv7YA70PzY9R7RtuCQ8,891
551
- omlish/sql/queries/inserts.py,sha256=Uo0ewnLPEt43dnX5AJWOC9ioViou7xYes7sGT9lD_0k,1281
552
- omlish/sql/queries/marshal.py,sha256=uLN_gOqiYHBQioZEvg7OREycY0bzKwzBw5mnbg_0cio,2938
551
+ omlish/sql/queries/inserts.py,sha256=H0Dv_6l--T7WXuoJQbLFd23PnjXA-3RETegjYnPr9lc,1281
552
+ omlish/sql/queries/marshal.py,sha256=T94501RbQn8UsUiRJkklvehtxJTYm2XTp03urMl1fas,3011
553
553
  omlish/sql/queries/multi.py,sha256=7x6x-4jnPzxA6ZasBjnjFuhHFpWt5rGCua3UvuTMIJ0,837
554
554
  omlish/sql/queries/names.py,sha256=4sDvgRobMEt_6mDeuYVbCqHzLCOwpXUdEyyB4-QjxKo,1996
555
555
  omlish/sql/queries/ops.py,sha256=B7IDfjr2DW5LJhWoNaY1WW90BJhe5ZtmxIELhWXbW-0,129
556
556
  omlish/sql/queries/params.py,sha256=iR8tnetkZFWY378iUbPe08d86g-Wf1J3YqfZr_KhIwQ,1175
557
- omlish/sql/queries/relations.py,sha256=-d3n-dN17c3TPMZmzSplhWawllUzdq12XPDAuzoeMEQ,838
558
- omlish/sql/queries/rendering.py,sha256=NOJqwxK8yt3Morq5yhgI-zU_51MSyhDvSc8S-8tURVM,5946
559
- omlish/sql/queries/selects.py,sha256=8dqm4KyrJvOsW3KHSO7qLEfPlZa7sJDp8puuGxrfvoA,1369
557
+ omlish/sql/queries/relations.py,sha256=7YrEC9IjoVpRGLAFKRSRsHHnTmx-g7hBNXsOgP2HOuI,2998
558
+ omlish/sql/queries/rendering.py,sha256=8naCMwxVEFAJaMP5m2bf6kCyhvwFZhXiWYEma51fQ4k,6813
559
+ omlish/sql/queries/selects.py,sha256=RFySZ9sb-nE29QrLLbQ7JYZW_V_ifaFTcl-RQTgQncY,1369
560
560
  omlish/sql/queries/stmts.py,sha256=pBqwD7dRlqMu6uh6vR3xaWOEgbZCcFWbOQ9ryYd17T4,441
561
561
  omlish/sql/queries/unary.py,sha256=MEYBDZn_H0bexmUrJeONOv5-gIpYowUaXOsEHeQM4ks,1144
562
562
  omlish/sql/tabledefs/__init__.py,sha256=TvtQsp-jJu6_ZahyCOFAaElSSBcRftNyJpdiDPGYCDk,190
@@ -609,9 +609,9 @@ omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
609
609
  omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
610
610
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
611
611
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
612
- omlish-0.0.0.dev200.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
613
- omlish-0.0.0.dev200.dist-info/METADATA,sha256=ZStmAEKO4tvTAtBeGJDad2z_76jk0FY_eVEe6fcobNw,4264
614
- omlish-0.0.0.dev200.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
615
- omlish-0.0.0.dev200.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
616
- omlish-0.0.0.dev200.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
617
- omlish-0.0.0.dev200.dist-info/RECORD,,
612
+ omlish-0.0.0.dev202.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
613
+ omlish-0.0.0.dev202.dist-info/METADATA,sha256=XEiYKss22Lx_Cerj_g1QURXuSPir4iCoi-tiPex6nik,4264
614
+ omlish-0.0.0.dev202.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
615
+ omlish-0.0.0.dev202.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
616
+ omlish-0.0.0.dev202.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
617
+ omlish-0.0.0.dev202.dist-info/RECORD,,