omlish 0.0.0.dev245__py3-none-any.whl → 0.0.0.dev247__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 +2 -2
- omlish/collections/__init__.py +0 -1
- omlish/collections/frozen.py +2 -2
- omlish/collections/hasheq.py +1 -2
- omlish/collections/identity.py +7 -2
- omlish/collections/mappings.py +0 -16
- omlish/collections/sorted/sorted.py +1 -2
- omlish/daemons/services.py +7 -0
- omlish/dataclasses/__init__.py +3 -0
- omlish/dataclasses/utils.py +14 -0
- omlish/http/handlers.py +16 -0
- omlish/lang/__init__.py +6 -0
- omlish/lang/attrs.py +29 -0
- omlish/lang/cached/function.py +1 -0
- omlish/lang/collections.py +50 -0
- omlish/marshal/__init__.py +23 -0
- omlish/marshal/composite/wrapped.py +26 -0
- omlish/marshal/objects/dataclasses.py +36 -11
- omlish/marshal/objects/namedtuples.py +9 -9
- omlish/marshal/polymorphism/marshal.py +16 -2
- omlish/marshal/polymorphism/unmarshal.py +16 -2
- omlish/os/pidfiles/pidfile.py +20 -4
- omlish/os/signals.py +5 -1
- omlish/specs/jmespath/cli.py +1 -1
- omlish/sql/queries/rendering.py +108 -87
- {omlish-0.0.0.dev245.dist-info → omlish-0.0.0.dev247.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev245.dist-info → omlish-0.0.0.dev247.dist-info}/RECORD +31 -30
- omlish/sql/queries/rendering2.py +0 -248
- {omlish-0.0.0.dev245.dist-info → omlish-0.0.0.dev247.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev245.dist-info → omlish-0.0.0.dev247.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev245.dist-info → omlish-0.0.0.dev247.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev245.dist-info → omlish-0.0.0.dev247.dist-info}/top_level.txt +0 -0
omlish/sql/queries/rendering2.py
DELETED
@@ -1,248 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
TODO:
|
3
|
-
- minimal parens
|
4
|
-
- text.parts
|
5
|
-
- QuoteStyle
|
6
|
-
- ParamStyle
|
7
|
-
|
8
|
-
==
|
9
|
-
|
10
|
-
def needs_parens(self, e: Expr) -> bool:
|
11
|
-
if isinstance(e, (Literal, Ident, Name)):
|
12
|
-
return True
|
13
|
-
elif isinstance(e, Expr):
|
14
|
-
return False
|
15
|
-
else:
|
16
|
-
raise TypeError(e)
|
17
|
-
"""
|
18
|
-
import dataclasses as dc
|
19
|
-
import typing as ta
|
20
|
-
|
21
|
-
from ... import dispatch
|
22
|
-
from ... import lang
|
23
|
-
from ...text import parts as tp
|
24
|
-
from ..params import ParamStyle
|
25
|
-
from ..params import make_params_preparer
|
26
|
-
from .base import Node
|
27
|
-
from .binary import Binary
|
28
|
-
from .binary import BinaryOp
|
29
|
-
from .binary import BinaryOps
|
30
|
-
from .exprs import Literal
|
31
|
-
from .exprs import NameExpr
|
32
|
-
from .idents import Ident
|
33
|
-
from .inserts import Insert
|
34
|
-
from .inserts import Values
|
35
|
-
from .multi import Multi
|
36
|
-
from .multi import MultiKind
|
37
|
-
from .names import Name
|
38
|
-
from .params import Param
|
39
|
-
from .relations import Join
|
40
|
-
from .relations import JoinKind
|
41
|
-
from .relations import Table
|
42
|
-
from .selects import Select
|
43
|
-
from .selects import SelectItem
|
44
|
-
from .unary import Unary
|
45
|
-
from .unary import UnaryOp
|
46
|
-
from .unary import UnaryOps
|
47
|
-
|
48
|
-
|
49
|
-
@dc.dataclass(frozen=True)
|
50
|
-
class RenderedQuery(lang.Final):
|
51
|
-
t: tp.Part
|
52
|
-
args: lang.Args
|
53
|
-
|
54
|
-
|
55
|
-
class Renderer(lang.Abstract):
|
56
|
-
def __init__(
|
57
|
-
self,
|
58
|
-
*,
|
59
|
-
param_style: ParamStyle | None = None,
|
60
|
-
) -> None:
|
61
|
-
super().__init__()
|
62
|
-
|
63
|
-
self._param_style = param_style if param_style is not None else self.default_param_style
|
64
|
-
|
65
|
-
self._params_preparer = make_params_preparer(self._param_style)
|
66
|
-
|
67
|
-
default_param_style: ta.ClassVar[ParamStyle] = ParamStyle.PYFORMAT
|
68
|
-
|
69
|
-
def args(self) -> lang.Args:
|
70
|
-
return self._params_preparer.prepare()
|
71
|
-
|
72
|
-
@dispatch.method
|
73
|
-
def render(self, o: ta.Any) -> tp.Part:
|
74
|
-
raise TypeError(o)
|
75
|
-
|
76
|
-
|
77
|
-
class StdRenderer(Renderer):
|
78
|
-
# parens
|
79
|
-
|
80
|
-
NEEDS_PAREN_TYPES: ta.AbstractSet[type[Node]] = {
|
81
|
-
Binary,
|
82
|
-
# IsNull,
|
83
|
-
# SelectExpr,
|
84
|
-
}
|
85
|
-
|
86
|
-
def needs_paren(self, node: Node) -> bool:
|
87
|
-
return type(node) in self.NEEDS_PAREN_TYPES
|
88
|
-
|
89
|
-
def paren(self, node: Node) -> tp.Part:
|
90
|
-
return tp.Wrap(self.render(node)) if self.needs_paren(node) else self.render(node)
|
91
|
-
|
92
|
-
# binary
|
93
|
-
|
94
|
-
BINARY_OP_TO_STR: ta.ClassVar[ta.Mapping[BinaryOp, str]] = {
|
95
|
-
BinaryOps.EQ: '=',
|
96
|
-
BinaryOps.NE: '!=',
|
97
|
-
BinaryOps.LT: '<',
|
98
|
-
BinaryOps.LE: '<=',
|
99
|
-
BinaryOps.GT: '>',
|
100
|
-
BinaryOps.GE: '>=',
|
101
|
-
|
102
|
-
BinaryOps.ADD: '+',
|
103
|
-
BinaryOps.SUB: '-',
|
104
|
-
BinaryOps.MUL: '*',
|
105
|
-
BinaryOps.DIV: '/',
|
106
|
-
BinaryOps.MOD: '%',
|
107
|
-
|
108
|
-
BinaryOps.CONCAT: '||',
|
109
|
-
}
|
110
|
-
|
111
|
-
@Renderer.render.register
|
112
|
-
def render_binary(self, o: Binary) -> tp.Part:
|
113
|
-
return [
|
114
|
-
self.paren(o.l),
|
115
|
-
self.BINARY_OP_TO_STR[o.op],
|
116
|
-
self.paren(o.r),
|
117
|
-
]
|
118
|
-
|
119
|
-
# exprs
|
120
|
-
|
121
|
-
@Renderer.render.register
|
122
|
-
def render_literal(self, o: Literal) -> tp.Part:
|
123
|
-
return repr(o.v)
|
124
|
-
|
125
|
-
@Renderer.render.register
|
126
|
-
def render_name_expr(self, o: NameExpr) -> tp.Part:
|
127
|
-
return self.render(o.n)
|
128
|
-
|
129
|
-
@Renderer.render.register
|
130
|
-
def render_param(self, o: Param) -> tp.Part:
|
131
|
-
return self._params_preparer.add(o.n if o.n is not None else id(o))
|
132
|
-
|
133
|
-
# idents
|
134
|
-
|
135
|
-
@Renderer.render.register
|
136
|
-
def render_ident(self, o: Ident) -> tp.Part:
|
137
|
-
return f'"{o.s}"'
|
138
|
-
|
139
|
-
# inserts
|
140
|
-
|
141
|
-
@Renderer.render.register
|
142
|
-
def render_values(self, o: Values) -> tp.Part:
|
143
|
-
return [
|
144
|
-
'values',
|
145
|
-
tp.Wrap(tp.List([self.render(v) for v in o.vs])),
|
146
|
-
]
|
147
|
-
|
148
|
-
@Renderer.render.register
|
149
|
-
def render_insert(self, o: Insert) -> tp.Part:
|
150
|
-
return [
|
151
|
-
'insert into',
|
152
|
-
self.render(o.into),
|
153
|
-
tp.Wrap(tp.List([self.render(c) for c in o.columns])),
|
154
|
-
]
|
155
|
-
|
156
|
-
# multis
|
157
|
-
|
158
|
-
MULTI_KIND_TO_STR: ta.ClassVar[ta.Mapping[MultiKind, str]] = {
|
159
|
-
MultiKind.AND: 'and',
|
160
|
-
MultiKind.OR: 'or',
|
161
|
-
}
|
162
|
-
|
163
|
-
@Renderer.render.register
|
164
|
-
def render_multi(self, o: Multi) -> tp.Part:
|
165
|
-
return tp.Wrap(tp.List(
|
166
|
-
[self.render(e) for e in o.es],
|
167
|
-
delimiter=' ' + self.MULTI_KIND_TO_STR[o.k], # FIXME: Part
|
168
|
-
))
|
169
|
-
|
170
|
-
# names
|
171
|
-
|
172
|
-
@Renderer.render.register
|
173
|
-
def render_name(self, o: Name) -> tp.Part:
|
174
|
-
out: list[tp.Part] = []
|
175
|
-
for n, i in enumerate(o.ps):
|
176
|
-
if n:
|
177
|
-
out.append('.')
|
178
|
-
out.append(self.render(i))
|
179
|
-
return tp.Concat(out)
|
180
|
-
|
181
|
-
# relations
|
182
|
-
|
183
|
-
@Renderer.render.register
|
184
|
-
def render_table(self, o: Table) -> tp.Part:
|
185
|
-
return [
|
186
|
-
self.render(o.n),
|
187
|
-
*(['as', self.render(o.a)] if o.a is not None else []),
|
188
|
-
]
|
189
|
-
|
190
|
-
JOIN_KIND_TO_STR: ta.ClassVar[ta.Mapping[JoinKind, str]] = {
|
191
|
-
JoinKind.DEFAULT: 'join',
|
192
|
-
JoinKind.INNER: 'inner join',
|
193
|
-
JoinKind.LEFT: 'left join',
|
194
|
-
JoinKind.LEFT_OUTER: 'left outer join',
|
195
|
-
JoinKind.RIGHT: 'right join',
|
196
|
-
JoinKind.RIGHT_OUTER: 'right outer join',
|
197
|
-
JoinKind.FULL: 'full join',
|
198
|
-
JoinKind.FULL_OUTER: 'full outer join',
|
199
|
-
JoinKind.CROSS: 'cross join',
|
200
|
-
JoinKind.NATURAL: 'natural join',
|
201
|
-
}
|
202
|
-
|
203
|
-
@Renderer.render.register
|
204
|
-
def render_join(self, o: Join) -> tp.Part:
|
205
|
-
return [
|
206
|
-
self.render(o.l),
|
207
|
-
self.JOIN_KIND_TO_STR[o.k],
|
208
|
-
self.render(o.r),
|
209
|
-
*(['on', self.render(o.c)] if o.c is not None else []),
|
210
|
-
]
|
211
|
-
|
212
|
-
# selects
|
213
|
-
|
214
|
-
@Renderer.render.register
|
215
|
-
def render_select_item(self, o: SelectItem) -> tp.Part:
|
216
|
-
return [
|
217
|
-
self.render(o.v),
|
218
|
-
*(['as', self.render(o.a)] if o.a is not None else []),
|
219
|
-
]
|
220
|
-
|
221
|
-
@Renderer.render.register
|
222
|
-
def render_select(self, o: Select) -> tp.Part:
|
223
|
-
return [
|
224
|
-
'select',
|
225
|
-
tp.List([self.render(i) for i in o.items]),
|
226
|
-
*(['from', self.render(o.from_)] if o.from_ is not None else []),
|
227
|
-
*(['where', self.render(o.where)] if o.where is not None else []),
|
228
|
-
]
|
229
|
-
|
230
|
-
# unary
|
231
|
-
|
232
|
-
UNARY_OP_TO_STR: ta.ClassVar[ta.Mapping[UnaryOp, tuple[str, str]]] = {
|
233
|
-
UnaryOps.NOT: ('not ', ''),
|
234
|
-
UnaryOps.IS_NULL: ('', ' is null'),
|
235
|
-
UnaryOps.IS_NOT_NULL: ('', ' is not null'),
|
236
|
-
|
237
|
-
UnaryOps.POS: ('+', ''),
|
238
|
-
UnaryOps.NEG: ('-', ''),
|
239
|
-
}
|
240
|
-
|
241
|
-
@Renderer.render.register
|
242
|
-
def render_unary(self, o: Unary) -> tp.Part:
|
243
|
-
pfx, sfx = self.UNARY_OP_TO_STR[o.op]
|
244
|
-
return tp.Concat([
|
245
|
-
pfx,
|
246
|
-
self.render(o.v),
|
247
|
-
sfx,
|
248
|
-
])
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|