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.
Files changed (51) hide show
  1. omlish/.manifests.json +2 -2
  2. omlish/__about__.py +2 -2
  3. omlish/collections/cache/descriptor.py +0 -2
  4. omlish/collections/identity.py +6 -0
  5. omlish/concurrent/executors.py +0 -1
  6. omlish/concurrent/futures.py +0 -1
  7. omlish/dataclasses/impl/descriptors.py +0 -2
  8. omlish/diag/replserver/server.py +0 -1
  9. omlish/dispatch/_dispatch2.py +7 -3
  10. omlish/dispatch/_dispatch3.py +7 -3
  11. omlish/dispatch/dispatch.py +29 -63
  12. omlish/dispatch/functions.py +1 -1
  13. omlish/dispatch/impls.py +69 -0
  14. omlish/dispatch/methods.py +1 -1
  15. omlish/dynamic.py +0 -3
  16. omlish/formats/json/stream/build.py +2 -0
  17. omlish/formats/yaml.py +0 -3
  18. omlish/graphs/dags.py +0 -2
  19. omlish/graphs/domination.py +0 -5
  20. omlish/graphs/dot/items.py +0 -1
  21. omlish/graphs/dot/rendering.py +0 -1
  22. omlish/graphs/trees.py +0 -1
  23. omlish/inject/binder.py +0 -10
  24. omlish/iterators/iterators.py +0 -4
  25. omlish/lang/__init__.py +1 -0
  26. omlish/lang/collections.py +36 -0
  27. omlish/lang/descriptors.py +0 -1
  28. omlish/lifecycles/base.py +0 -1
  29. omlish/lifecycles/contextmanagers.py +0 -1
  30. omlish/lifecycles/controller.py +0 -2
  31. omlish/lifecycles/manager.py +0 -1
  32. omlish/marshal/trivial/any.py +0 -1
  33. omlish/math/bits.py +0 -1
  34. omlish/math/stats.py +0 -1
  35. omlish/specs/jmespath/cli.py +1 -1
  36. omlish/sql/queries/rendering.py +108 -87
  37. omlish/term/codes.py +0 -1
  38. omlish/testing/pytest/plugins/logging.py +0 -1
  39. omlish/testing/pytest/plugins/pydevd.py +0 -1
  40. omlish/testing/pytest/plugins/repeat.py +0 -1
  41. omlish/testing/pytest/plugins/skips.py +0 -1
  42. omlish/testing/pytest/plugins/spacing.py +0 -1
  43. omlish/testing/pytest/plugins/switches.py +0 -1
  44. omlish/text/delimit.py +0 -1
  45. {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/METADATA +1 -1
  46. {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/RECORD +50 -50
  47. omlish/sql/queries/rendering2.py +0 -248
  48. {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/LICENSE +0 -0
  49. {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/WHEEL +0 -0
  50. {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/entry_points.txt +0 -0
  51. {omlish-0.0.0.dev246.dist-info → omlish-0.0.0.dev248.dist-info}/top_level.txt +0 -0
omlish/math/stats.py CHANGED
@@ -234,7 +234,6 @@ class Stats(ta.Sequence[float]):
234
234
 
235
235
 
236
236
  class SamplingHistogram:
237
-
238
237
  @dc.dataclass(frozen=True)
239
238
  class Entry:
240
239
  value: float
@@ -53,7 +53,7 @@ def _main() -> int:
53
53
  data = json.loads(data)
54
54
 
55
55
  try:
56
- print(json_dumps(search(expression, data), ensure_ascii=False))
56
+ print(json_dumps(search(expression, data)))
57
57
  return 0
58
58
 
59
59
  except ArityError as e:
@@ -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
- self._out = out
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) -> None:
79
+ def render(self, o: ta.Any) -> tp.Part:
75
80
  raise TypeError(o)
76
81
 
77
82
  @classmethod
78
- def render_str(cls, o: ta.Any, *args: ta.Any, **kwargs: ta.Any) -> RenderedQuery:
79
- out = io.StringIO()
80
- pp = cls(out, *args, **kwargs)
81
- pp.render(o)
82
- return RenderedQuery(out.getvalue(), pp.args())
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) -> None:
107
- self._out.write('(')
108
- self.render(o.l)
109
- self._out.write(f' {self.BINARY_OP_TO_STR[o.op]} ')
110
- self.render(o.r)
111
- self._out.write(')')
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) -> None:
117
- self._out.write(repr(o.v))
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) -> None:
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) -> None:
125
- self._out.write(self._params_preparer.add(o.n if o.n is not None else id(o)))
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) -> None:
131
- self._out.write(f'"{o.s}"')
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) -> None:
137
- self._out.write('values (')
138
- for i, v in enumerate(o.vs):
139
- if i:
140
- self._out.write(', ')
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) -> None:
146
- self._out.write('insert into ')
147
- self.render(o.into)
148
- self._out.write(' (')
149
- for i, c in enumerate(o.columns):
150
- if i:
151
- self._out.write(', ')
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) -> None:
165
- d = f' {self.MULTI_KIND_TO_STR[o.k]} '
166
- self._out.write('(')
167
- for i, e in enumerate(o.es):
168
- if i:
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) -> None:
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
- self._out.write('.')
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) -> None:
186
- self.render(o.n)
187
- if o.a is not None:
188
- self._out.write(' as ')
189
- self.render(o.a)
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) -> 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)
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) -> None:
219
- self.render(o.v)
220
- if o.a is not None:
221
- self._out.write(' as ')
222
- self.render(o.a)
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) -> None:
226
- self._out.write('select ')
227
- for i, it in enumerate(o.items):
228
- if i:
229
- self._out.write(', ')
230
- self.render(it)
231
- if o.from_ is not None:
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) -> None:
265
+ def render_unary(self, o: Unary) -> tp.Part:
251
266
  pfx, sfx = self.UNARY_OP_TO_STR[o.op]
252
- self._out.write(pfx)
253
- self.render(o.v)
254
- self._out.write(sfx)
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.render_str(n, **kwargs)
279
+ return StdRenderer.render_query(n, **kwargs)
omlish/term/codes.py CHANGED
@@ -27,7 +27,6 @@ def strip_ansi_codes(s: str) -> str:
27
27
 
28
28
 
29
29
  class ControlSequence:
30
-
31
30
  def __init__(self, fn: ta.Callable[..., str], desc: str) -> None:
32
31
  super().__init__()
33
32
  self._fn = fn
@@ -4,7 +4,6 @@ from ._registry import register
4
4
 
5
5
  @register
6
6
  class LoggingPlugin:
7
-
8
7
  def pytest_addoption(self, parser):
9
8
  parser.addoption('--log', action='store', help='Configures logging with given log level')
10
9
 
@@ -4,7 +4,6 @@ from ._registry import register
4
4
 
5
5
  @register
6
6
  class PydevdPlugin:
7
-
8
7
  def pytest_addoption(self, parser):
9
8
  parser.addoption('--no-pydevd', action='store_true', default=False, help='Disables pydevd debugging')
10
9
 
@@ -6,7 +6,6 @@ PARAM_NAME = '__repeat'
6
6
 
7
7
  @register
8
8
  class RepeatPlugin:
9
-
10
9
  def pytest_addoption(self, parser):
11
10
  parser.addoption('--repeat', action='store', type=int, help='Number of times to repeat each test')
12
11
 
@@ -10,7 +10,6 @@ from ._registry import register
10
10
 
11
11
  @register
12
12
  class SkipsPlugin:
13
-
14
13
  def pytest_collection_modifyitems(self, session, items):
15
14
  dct: dict[str, set[str]] = {}
16
15
  for arg in session.config.args:
@@ -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')
@@ -75,7 +75,6 @@ def get_specified_switches(obj: Configable) -> ta.Mapping[str, SwitchState]:
75
75
 
76
76
  @register
77
77
  class SwitchesPlugin:
78
-
79
78
  def pytest_configure(self, config):
80
79
  for sw in SWITCH_ATTRS:
81
80
  config.addinivalue_line('markers', f'{sw}: mark test as {sw}')
omlish/text/delimit.py CHANGED
@@ -7,7 +7,6 @@ import typing as ta
7
7
 
8
8
 
9
9
  class DelimitedEscaping:
10
-
11
10
  def __init__(
12
11
  self,
13
12
  delimit_char: str,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omlish
3
- Version: 0.0.0.dev246
3
+ Version: 0.0.0.dev248
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause