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.
@@ -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
- ])