omlish 0.0.0.dev246__py3-none-any.whl → 0.0.0.dev248__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/.manifests.json +2 -2
- omlish/__about__.py +2 -2
- omlish/collections/cache/descriptor.py +0 -2
- omlish/collections/identity.py +6 -0
- omlish/concurrent/executors.py +0 -1
- omlish/concurrent/futures.py +0 -1
- omlish/dataclasses/impl/descriptors.py +0 -2
- omlish/diag/replserver/server.py +0 -1
- omlish/dispatch/_dispatch2.py +7 -3
- omlish/dispatch/_dispatch3.py +7 -3
- omlish/dispatch/dispatch.py +29 -63
- omlish/dispatch/functions.py +1 -1
- omlish/dispatch/impls.py +69 -0
- omlish/dispatch/methods.py +1 -1
- omlish/dynamic.py +0 -3
- omlish/formats/json/stream/build.py +2 -0
- omlish/formats/yaml.py +0 -3
- omlish/graphs/dags.py +0 -2
- omlish/graphs/domination.py +0 -5
- omlish/graphs/dot/items.py +0 -1
- omlish/graphs/dot/rendering.py +0 -1
- omlish/graphs/trees.py +0 -1
- omlish/inject/binder.py +0 -10
- omlish/iterators/iterators.py +0 -4
- omlish/lang/__init__.py +1 -0
- omlish/lang/collections.py +36 -0
- omlish/lang/descriptors.py +0 -1
- omlish/lifecycles/base.py +0 -1
- omlish/lifecycles/contextmanagers.py +0 -1
- omlish/lifecycles/controller.py +0 -2
- omlish/lifecycles/manager.py +0 -1
- omlish/marshal/trivial/any.py +0 -1
- omlish/math/bits.py +0 -1
- omlish/math/stats.py +0 -1
- omlish/specs/jmespath/cli.py +1 -1
- omlish/sql/queries/rendering.py +108 -87
- omlish/term/codes.py +0 -1
- omlish/testing/pytest/plugins/logging.py +0 -1
- omlish/testing/pytest/plugins/pydevd.py +0 -1
- omlish/testing/pytest/plugins/repeat.py +0 -1
- omlish/testing/pytest/plugins/skips.py +0 -1
- omlish/testing/pytest/plugins/spacing.py +0 -1
- omlish/testing/pytest/plugins/switches.py +0 -1
- omlish/text/delimit.py +0 -1
- {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/RECORD +50 -50
- omlish/sql/queries/rendering2.py +0 -248
- {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/top_level.txt +0 -0
omlish/math/stats.py
CHANGED
omlish/specs/jmespath/cli.py
CHANGED
omlish/sql/queries/rendering.py
CHANGED
@@ -16,11 +16,11 @@ def needs_parens(self, e: Expr) -> bool:
|
|
16
16
|
raise TypeError(e)
|
17
17
|
"""
|
18
18
|
import dataclasses as dc
|
19
|
-
import io
|
20
19
|
import typing as ta
|
21
20
|
|
22
21
|
from ... import dispatch
|
23
22
|
from ... import lang
|
23
|
+
from ...text import parts as tp
|
24
24
|
from ..params import ParamStyle
|
25
25
|
from ..params import make_params_preparer
|
26
26
|
from .base import Node
|
@@ -46,6 +46,12 @@ from .unary import UnaryOp
|
|
46
46
|
from .unary import UnaryOps
|
47
47
|
|
48
48
|
|
49
|
+
@dc.dataclass(frozen=True)
|
50
|
+
class RenderedQueryParts(lang.Final):
|
51
|
+
p: tp.Part
|
52
|
+
args: lang.Args
|
53
|
+
|
54
|
+
|
49
55
|
@dc.dataclass(frozen=True)
|
50
56
|
class RenderedQuery(lang.Final):
|
51
57
|
s: str
|
@@ -55,12 +61,11 @@ class RenderedQuery(lang.Final):
|
|
55
61
|
class Renderer(lang.Abstract):
|
56
62
|
def __init__(
|
57
63
|
self,
|
58
|
-
out: ta.TextIO,
|
59
64
|
*,
|
60
65
|
param_style: ParamStyle | None = None,
|
61
66
|
) -> None:
|
62
67
|
super().__init__()
|
63
|
-
|
68
|
+
|
64
69
|
self._param_style = param_style if param_style is not None else self.default_param_style
|
65
70
|
|
66
71
|
self._params_preparer = make_params_preparer(self._param_style)
|
@@ -71,18 +76,41 @@ class Renderer(lang.Abstract):
|
|
71
76
|
return self._params_preparer.prepare()
|
72
77
|
|
73
78
|
@dispatch.method
|
74
|
-
def render(self, o: ta.Any) ->
|
79
|
+
def render(self, o: ta.Any) -> tp.Part:
|
75
80
|
raise TypeError(o)
|
76
81
|
|
77
82
|
@classmethod
|
78
|
-
def
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
+
def render_query_parts(cls, o: ta.Any, *args: ta.Any, **kwargs: ta.Any) -> RenderedQueryParts:
|
84
|
+
r = cls(*args, **kwargs)
|
85
|
+
return RenderedQueryParts(
|
86
|
+
r.render(o),
|
87
|
+
r.args(),
|
88
|
+
)
|
89
|
+
|
90
|
+
@classmethod
|
91
|
+
def render_query(cls, o: ta.Any, *args: ta.Any, **kwargs: ta.Any) -> RenderedQuery:
|
92
|
+
rqp = cls.render_query_parts(o, *args, **kwargs)
|
93
|
+
return RenderedQuery(
|
94
|
+
tp.render(rqp.p),
|
95
|
+
rqp.args,
|
96
|
+
)
|
83
97
|
|
84
98
|
|
85
99
|
class StdRenderer(Renderer):
|
100
|
+
# parens
|
101
|
+
|
102
|
+
NEEDS_PAREN_TYPES: ta.AbstractSet[type[Node]] = {
|
103
|
+
Binary,
|
104
|
+
# IsNull,
|
105
|
+
# SelectExpr,
|
106
|
+
}
|
107
|
+
|
108
|
+
def needs_paren(self, node: Node) -> bool:
|
109
|
+
return type(node) in self.NEEDS_PAREN_TYPES
|
110
|
+
|
111
|
+
def paren(self, node: Node) -> tp.Part:
|
112
|
+
return tp.Wrap(self.render(node)) if self.needs_paren(node) else self.render(node)
|
113
|
+
|
86
114
|
# binary
|
87
115
|
|
88
116
|
BINARY_OP_TO_STR: ta.ClassVar[ta.Mapping[BinaryOp, str]] = {
|
@@ -103,55 +131,50 @@ class StdRenderer(Renderer):
|
|
103
131
|
}
|
104
132
|
|
105
133
|
@Renderer.render.register
|
106
|
-
def render_binary(self, o: Binary) ->
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
134
|
+
def render_binary(self, o: Binary) -> tp.Part:
|
135
|
+
return [
|
136
|
+
self.paren(o.l),
|
137
|
+
self.BINARY_OP_TO_STR[o.op],
|
138
|
+
self.paren(o.r),
|
139
|
+
]
|
112
140
|
|
113
141
|
# exprs
|
114
142
|
|
115
143
|
@Renderer.render.register
|
116
|
-
def render_literal(self, o: Literal) ->
|
117
|
-
|
144
|
+
def render_literal(self, o: Literal) -> tp.Part:
|
145
|
+
return repr(o.v)
|
118
146
|
|
119
147
|
@Renderer.render.register
|
120
|
-
def render_name_expr(self, o: NameExpr) ->
|
121
|
-
self.render(o.n)
|
148
|
+
def render_name_expr(self, o: NameExpr) -> tp.Part:
|
149
|
+
return self.render(o.n)
|
122
150
|
|
123
151
|
@Renderer.render.register
|
124
|
-
def render_param(self, o: Param) ->
|
125
|
-
self.
|
152
|
+
def render_param(self, o: Param) -> tp.Part:
|
153
|
+
return self._params_preparer.add(o.n if o.n is not None else id(o))
|
126
154
|
|
127
155
|
# idents
|
128
156
|
|
129
157
|
@Renderer.render.register
|
130
|
-
def render_ident(self, o: Ident) ->
|
131
|
-
|
158
|
+
def render_ident(self, o: Ident) -> tp.Part:
|
159
|
+
return f'"{o.s}"'
|
132
160
|
|
133
161
|
# inserts
|
134
162
|
|
135
163
|
@Renderer.render.register
|
136
|
-
def render_values(self, o: Values) ->
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
self.render(v)
|
142
|
-
self._out.write(')')
|
164
|
+
def render_values(self, o: Values) -> tp.Part:
|
165
|
+
return [
|
166
|
+
'values',
|
167
|
+
tp.Wrap(tp.List([self.render(v) for v in o.vs])),
|
168
|
+
]
|
143
169
|
|
144
170
|
@Renderer.render.register
|
145
|
-
def render_insert(self, o: Insert) ->
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
self.render(c)
|
153
|
-
self._out.write(') ')
|
154
|
-
self.render(o.data)
|
171
|
+
def render_insert(self, o: Insert) -> tp.Part:
|
172
|
+
return [
|
173
|
+
'insert into',
|
174
|
+
self.render(o.into),
|
175
|
+
tp.Wrap(tp.List([self.render(c) for c in o.columns])),
|
176
|
+
self.render(o.data),
|
177
|
+
]
|
155
178
|
|
156
179
|
# multis
|
157
180
|
|
@@ -161,32 +184,31 @@ class StdRenderer(Renderer):
|
|
161
184
|
}
|
162
185
|
|
163
186
|
@Renderer.render.register
|
164
|
-
def render_multi(self, o: Multi) ->
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
self._out.write(d)
|
170
|
-
self.render(e)
|
171
|
-
self._out.write(')')
|
187
|
+
def render_multi(self, o: Multi) -> tp.Part:
|
188
|
+
return tp.Wrap(tp.List(
|
189
|
+
[self.render(e) for e in o.es],
|
190
|
+
delimiter=' ' + self.MULTI_KIND_TO_STR[o.k], # FIXME: Part
|
191
|
+
))
|
172
192
|
|
173
193
|
# names
|
174
194
|
|
175
195
|
@Renderer.render.register
|
176
|
-
def render_name(self, o: Name) ->
|
196
|
+
def render_name(self, o: Name) -> tp.Part:
|
197
|
+
out: list[tp.Part] = []
|
177
198
|
for n, i in enumerate(o.ps):
|
178
199
|
if n:
|
179
|
-
|
180
|
-
self.render(i)
|
200
|
+
out.append('.')
|
201
|
+
out.append(self.render(i))
|
202
|
+
return tp.Concat(out)
|
181
203
|
|
182
204
|
# relations
|
183
205
|
|
184
206
|
@Renderer.render.register
|
185
|
-
def render_table(self, o: Table) ->
|
186
|
-
|
187
|
-
|
188
|
-
self.
|
189
|
-
|
207
|
+
def render_table(self, o: Table) -> tp.Part:
|
208
|
+
return [
|
209
|
+
self.render(o.n),
|
210
|
+
*(['as', self.render(o.a)] if o.a is not None else []),
|
211
|
+
]
|
190
212
|
|
191
213
|
JOIN_KIND_TO_STR: ta.ClassVar[ta.Mapping[JoinKind, str]] = {
|
192
214
|
JoinKind.DEFAULT: 'join',
|
@@ -202,38 +224,31 @@ class StdRenderer(Renderer):
|
|
202
224
|
}
|
203
225
|
|
204
226
|
@Renderer.render.register
|
205
|
-
def render_join(self, o: Join) ->
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
self._out.write(' on ')
|
213
|
-
self.render(o.c)
|
227
|
+
def render_join(self, o: Join) -> tp.Part:
|
228
|
+
return [
|
229
|
+
self.render(o.l),
|
230
|
+
self.JOIN_KIND_TO_STR[o.k],
|
231
|
+
self.render(o.r),
|
232
|
+
*(['on', self.render(o.c)] if o.c is not None else []),
|
233
|
+
]
|
214
234
|
|
215
235
|
# selects
|
216
236
|
|
217
237
|
@Renderer.render.register
|
218
|
-
def render_select_item(self, o: SelectItem) ->
|
219
|
-
|
220
|
-
|
221
|
-
self.
|
222
|
-
|
238
|
+
def render_select_item(self, o: SelectItem) -> tp.Part:
|
239
|
+
return [
|
240
|
+
self.render(o.v),
|
241
|
+
*(['as', self.render(o.a)] if o.a is not None else []),
|
242
|
+
]
|
223
243
|
|
224
244
|
@Renderer.render.register
|
225
|
-
def render_select(self, o: Select) ->
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
self.render(
|
231
|
-
|
232
|
-
self._out.write(' from ')
|
233
|
-
self.render(o.from_)
|
234
|
-
if o.where:
|
235
|
-
self._out.write(' where ')
|
236
|
-
self.render(o.where)
|
245
|
+
def render_select(self, o: Select) -> tp.Part:
|
246
|
+
return [
|
247
|
+
'select',
|
248
|
+
tp.List([self.render(i) for i in o.items]),
|
249
|
+
*(['from', self.render(o.from_)] if o.from_ is not None else []),
|
250
|
+
*(['where', self.render(o.where)] if o.where is not None else []),
|
251
|
+
]
|
237
252
|
|
238
253
|
# unary
|
239
254
|
|
@@ -247,12 +262,18 @@ class StdRenderer(Renderer):
|
|
247
262
|
}
|
248
263
|
|
249
264
|
@Renderer.render.register
|
250
|
-
def render_unary(self, o: Unary) ->
|
265
|
+
def render_unary(self, o: Unary) -> tp.Part:
|
251
266
|
pfx, sfx = self.UNARY_OP_TO_STR[o.op]
|
252
|
-
|
253
|
-
|
254
|
-
|
267
|
+
return tp.Concat([
|
268
|
+
pfx,
|
269
|
+
self.render(o.v),
|
270
|
+
sfx,
|
271
|
+
])
|
272
|
+
|
273
|
+
|
274
|
+
def render_parts(n: Node, **kwargs: ta.Any) -> RenderedQueryParts:
|
275
|
+
return StdRenderer.render_query_parts(n, **kwargs)
|
255
276
|
|
256
277
|
|
257
278
|
def render(n: Node, **kwargs: ta.Any) -> RenderedQuery:
|
258
|
-
return StdRenderer.
|
279
|
+
return StdRenderer.render_query(n, **kwargs)
|
omlish/term/codes.py
CHANGED
@@ -3,7 +3,6 @@ from ._registry import register
|
|
3
3
|
|
4
4
|
@register
|
5
5
|
class SpacingPlugin:
|
6
|
-
|
7
6
|
def pytest_addoption(self, parser):
|
8
7
|
parser.addoption('--newlines-before', action='store', type=int, help='Adds newlines before tests')
|
9
8
|
parser.addoption('--newlines-after', action='store', type=int, help='Adds newlines after tests')
|
omlish/text/delimit.py
CHANGED