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.
@@ -3,6 +3,7 @@
3
3
  """
4
4
  TODO:
5
5
  - 'json pids', with code version? '.json.pid'? '.jpid'?
6
+ - json*L* pidfiles - first line is bare int, following may be json - now `head -n1 foo.pid` not cat
6
7
  """
7
8
  import fcntl
8
9
  import os
@@ -152,7 +153,12 @@ class Pidfile:
152
153
 
153
154
  #
154
155
 
155
- def write(self, pid: ta.Optional[int] = None) -> None:
156
+ def write(
157
+ self,
158
+ pid: ta.Optional[int] = None,
159
+ *,
160
+ suffix: ta.Optional[str] = None,
161
+ ) -> None:
156
162
  self.acquire_lock()
157
163
 
158
164
  if pid is None:
@@ -160,7 +166,11 @@ class Pidfile:
160
166
 
161
167
  self._f.seek(0)
162
168
  self._f.truncate()
163
- self._f.write(f'{pid}\n')
169
+ self._f.write('\n'.join([
170
+ str(pid),
171
+ *([suffix] if suffix is not None else []),
172
+ '',
173
+ ]))
164
174
  self._f.flush()
165
175
 
166
176
  def clear(self) -> None:
@@ -171,14 +181,20 @@ class Pidfile:
171
181
 
172
182
  #
173
183
 
174
- def read(self) -> ta.Optional[int]:
184
+ def read_raw(self) -> ta.Optional[str]:
175
185
  self.ensure_cannot_lock()
176
186
 
177
187
  self._f.seek(0)
178
188
  buf = self._f.read()
179
189
  if not buf:
180
190
  return None
181
- return int(buf)
191
+ return buf
192
+
193
+ def read(self) -> ta.Optional[int]:
194
+ buf = self.read_raw()
195
+ if not buf:
196
+ return None
197
+ return int(buf.splitlines()[0].strip())
182
198
 
183
199
  def kill(self, sig: int = signal.SIGTERM) -> None:
184
200
  if (pid := self.read()) is None:
omlish/os/signals.py CHANGED
@@ -1,9 +1,13 @@
1
1
  # ruff: noqa: UP006 UP007
2
2
  # @omlish-lite
3
3
  import signal
4
+ import typing as ta
4
5
 
5
6
 
6
- def parse_signal(s: str) -> int:
7
+ def parse_signal(s: ta.Union[int, str]) -> int:
8
+ if isinstance(s, int):
9
+ return s
10
+
7
11
  try:
8
12
  return int(s)
9
13
  except ValueError:
@@ -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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omlish
3
- Version: 0.0.0.dev245
3
+ Version: 0.0.0.dev247
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=vQTAIvR8OblSq-uP2GUfnbei0RnmAnM5j0T1-OToh9E,8253
2
- omlish/__about__.py,sha256=igneh_Z18EcRdtPlDRmK5tHmRK3NpxQPFoUopKrrNtw,3380
2
+ omlish/__about__.py,sha256=bQqOi2ALumtKm7vdnP1J3xHEquOOa8I2437ZblRqbuU,3380
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
5
5
  omlish/cached.py,sha256=MLap_p0rdGoDIMVhXVHm1tsbcWobJF0OanoodV03Ju8,542
@@ -136,14 +136,14 @@ omlish/codecs/funcs.py,sha256=p4imNt7TobyZVXWC-WhntHVu9KfJrO4QwdtPRh-cVOk,850
136
136
  omlish/codecs/registry.py,sha256=2FnO5YP7ui1LzkguwESY0MP3WIdwgPTIJTM_4RyTOEg,3896
137
137
  omlish/codecs/standard.py,sha256=eiZ4u9ep0XrA4Z_D1zJI0vmWyuN8HLrX4Se_r_Cq_ZM,60
138
138
  omlish/codecs/text.py,sha256=JzrdwMpQPo2NBBg3K1EZszzQy5vEWmd82SIerJd4yeQ,5723
139
- omlish/collections/__init__.py,sha256=umpclbTE3wsSflMrKmYEiGmWFhiukfJxvBWgtYMZ8mk,2161
139
+ omlish/collections/__init__.py,sha256=fAGCii4OttPRee9q4AD-IfQpdsmoCdgPwYUMPgnJwCs,2140
140
140
  omlish/collections/abc.py,sha256=sP7BpTVhx6s6C59mTFeosBi4rHOWC6tbFBYbxdZmvh0,2365
141
141
  omlish/collections/coerce.py,sha256=g68ROb_-5HgH-vI8612mU2S0FZ8-wp2ZHK5_Zy_kVC0,7037
142
142
  omlish/collections/exceptions.py,sha256=shcS-NCnEUudF8qC_SmO2TQyjivKlS4TDjaz_faqQ0c,44
143
- omlish/collections/frozen.py,sha256=mxhd8pw5zIXUiRHiBVZWYCYT7wYDVG3tAY5PNU-WH-I,4150
144
- omlish/collections/hasheq.py,sha256=XcOCE6f2lXizDCOXxSX6vJv-rLcpDo2OWCYIKGSWuic,3697
145
- omlish/collections/identity.py,sha256=SwnUE5D3v9RBjATDE1LUr_vO3Rb2NHcmTK64GZIcsO8,2720
146
- omlish/collections/mappings.py,sha256=YunNPyADrpitZGTJcXV0k4bmJddj1avDvEavz0coJWU,3203
143
+ omlish/collections/frozen.py,sha256=jQppK1pyQ3e_aAvw8OEKfnr7b0OB4RI5Qr1g9xXTZaQ,4137
144
+ omlish/collections/hasheq.py,sha256=SQdVICLZWKkYu4vUXrfmWBXO3i-jx01iM9IInDWkKfU,3664
145
+ omlish/collections/identity.py,sha256=1kdiByfzKHGQZgUg1vkwILt8oPPQgerGh0_HbLDdqKw,2835
146
+ omlish/collections/mappings.py,sha256=fCHQatlAstiZkWZiyIlOw637Yep7ce79EPPbJcWHHUA,2784
147
147
  omlish/collections/ordered.py,sha256=tUAl99XHbSbzn7Hdh99jUBl27NcC2J7ZTI67slTMe5M,2333
148
148
  omlish/collections/ranked.py,sha256=rg6DL36oOUiG5JQEAkGnT8b6f9mSndQlIovtt8GQj_w,2229
149
149
  omlish/collections/unmodifiable.py,sha256=-zys__n6L7liWzhmHAIvfxprq7cUE5HoR3foGvXc_7I,4748
@@ -158,7 +158,7 @@ omlish/collections/persistent/treap.py,sha256=A09ZPacGyJlyRB-Wi4TNj3tE0w-RpFNliP
158
158
  omlish/collections/persistent/treapmap.py,sha256=TxOM-ZRF5PK2xe5wRIhESNt7DGh9b_MeZfE7HLkCOs4,5804
159
159
  omlish/collections/sorted/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
160
  omlish/collections/sorted/skiplist.py,sha256=eU_cYQVnT-EZxv_dN9PYQZdOP0km5usEcOQRiJKL7Rw,5986
161
- omlish/collections/sorted/sorted.py,sha256=3dl3MD3soVP9j2m4lnDZFYA9fho6Ic1MpMpYePZTW-0,3353
161
+ omlish/collections/sorted/sorted.py,sha256=euHJan3FqTYSCJGsVcYYRV-yhAAQ5_htnjymnNoVHRE,3319
162
162
  omlish/concurrent/__init__.py,sha256=9p-s8MvBEYDqHIoYU3OYoe-Nni22QdkW7nhZGEukJTM,197
163
163
  omlish/concurrent/executors.py,sha256=FYKCDYYuj-OgMa8quLsA47SfFNX3KDJvRENVk8NDsrA,1292
164
164
  omlish/concurrent/futures.py,sha256=J2s9wYURUskqRJiBbAR0PNEAp1pXbIMYldOVBTQduQY,4239
@@ -183,13 +183,13 @@ omlish/daemons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
183
  omlish/daemons/daemon.py,sha256=3Wkvu8M_EaCKSpKI5UN5OayRXV0oVdF62tBss9_hlr0,3479
184
184
  omlish/daemons/launching.py,sha256=sNOYW939IGI4ZlLQ0bKxzXj6EyeOiwV7Upqhd5XfoHc,3747
185
185
  omlish/daemons/reparent.py,sha256=7uJ9oPGt9Ud7uA8bDl_SHcuqjcsmXa3kkjp9jf29wOw,585
186
- omlish/daemons/services.py,sha256=jIlGWhiWoqQlm_OFeffkSs9jjr-icDF1-I-SNMEgg9Y,3406
186
+ omlish/daemons/services.py,sha256=YYp2SMkJ71WgzOcYSXjWHeAyKKxu3j1dfuJvWkl0Dgw,3492
187
187
  omlish/daemons/spawning.py,sha256=psR73zOYjMKTqNpx1bMib8uU9wAZz62tw5TaWHrTdyY,5337
188
188
  omlish/daemons/targets.py,sha256=00KmtlknMhQ5PyyVAhWl3rpeTMPym0GxvHHq6mYPZ7c,3051
189
189
  omlish/daemons/waiting.py,sha256=RfgD1L33QQVbD2431dkKZGE4w6DUcGvYeRXXi8puAP4,1676
190
- omlish/dataclasses/__init__.py,sha256=b7EZCIfHnEHCHWwgD3YXxkdsU-uYd9iD4hM36RgpI1g,1598
190
+ omlish/dataclasses/__init__.py,sha256=9YNCTSCKvNxy0rwxrlh-Sx0qCdn69ROxdDOnmNuKrH0,1640
191
191
  omlish/dataclasses/static.py,sha256=6pZG2iTR9NN8pKm-5ukDABnaVlTKFOzMwkg-rbxURoo,7691
192
- omlish/dataclasses/utils.py,sha256=QWsHxVisS-MUCqh89JQsRdCLgdBVeC6EYK6jRwO9akU,3631
192
+ omlish/dataclasses/utils.py,sha256=BTXYyH0enSEP5kWxMnPTJ8_UPd7h4wF2RVPITNC8H4M,3872
193
193
  omlish/dataclasses/impl/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936
194
194
  omlish/dataclasses/impl/__init__.py,sha256=zqGBC5gSbjJxaqG_zS1LL1PX-zAfhIua8UqOE4IwO2k,789
195
195
  omlish/dataclasses/impl/api.py,sha256=RhU4f50GVdn-dxilia8NA3F7VIm2R5z78pFfpIVXPRQ,6635
@@ -320,7 +320,7 @@ omlish/http/consts.py,sha256=7BJ4D1MdIvqBcepkgCfBFHolgTwbOlqsOEiee_IjxOA,2289
320
320
  omlish/http/cookies.py,sha256=uuOYlHR6e2SC3GM41V0aozK10nef9tYg83Scqpn5-HM,6351
321
321
  omlish/http/dates.py,sha256=Otgp8wRxPgNGyzx8LFowu1vC4EKJYARCiAwLFncpfHM,2875
322
322
  omlish/http/encodings.py,sha256=w2WoKajpaZnQH8j-IBvk5ZFL2O2pAU_iBvZnkocaTlw,164
323
- omlish/http/handlers.py,sha256=l6JLDuK9XhYvF1IudnPz5hWTZW1dXRjUBSO4Uyck0LE,3365
323
+ omlish/http/handlers.py,sha256=ub0TiDCjFIVCUQZZZuDEB3tzJx6T6l_AMRl4s0ZrNy4,3896
324
324
  omlish/http/headers.py,sha256=ZMmjrEiYjzo0YTGyK0YsvjdwUazktGqzVVYorY4fd44,5081
325
325
  omlish/http/json.py,sha256=9XwAsl4966Mxrv-1ytyCqhcE6lbBJw-0_tFZzGszgHE,7440
326
326
  omlish/http/jwt.py,sha256=6Rigk1WrJ059DY4jDIKnxjnChWb7aFdermj2AI2DSvk,4346
@@ -399,10 +399,11 @@ omlish/iterators/iterators.py,sha256=ghI4dO6WPyyFOLTIIMaHQ_IOy2xXaFpGPqveZ5YGIBU
399
399
  omlish/iterators/recipes.py,sha256=53mkexitMhkwXQZbL6DrhpT0WePQ_56uXd5Jaw3DfzI,467
400
400
  omlish/iterators/tools.py,sha256=Pi4ybXytUXVZ3xwK89xpPImQfYYId9p1vIFQvVqVLqA,2551
401
401
  omlish/iterators/unique.py,sha256=0jAX3kwzVfRNhe0Tmh7kVP_Q2WBIn8POo_O-rgFV0rQ,1390
402
- omlish/lang/__init__.py,sha256=0LNdzzVTKiDEmjCzT9wUPbimcAu21KYe-EwD4xDgtRM,4592
403
- omlish/lang/attrs.py,sha256=vGYdGnS7ZAbSz0ZSZkkZKHCK1tKoNjZY0JdzFraHiUw,3105
402
+ omlish/lang/__init__.py,sha256=7QEQKrw1ojkB3kwFQrh-p7EH-UQI7sMemtxNX2OTTJI,4685
403
+ omlish/lang/attrs.py,sha256=fofCKN0X8TMu1yGqHpLpNLih9r9HWl3D3Vn3b6O791w,3891
404
404
  omlish/lang/clsdct.py,sha256=sJYadm-fwzti-gsi98knR5qQUxriBmOqQE_qz3RopNk,1743
405
405
  omlish/lang/cmp.py,sha256=5vbzWWbqdzDmNKAGL19z6ZfUKe5Ci49e-Oegf9f4BsE,1346
406
+ omlish/lang/collections.py,sha256=I0x5BI_cjTbL-uunoKFWA_RfNEz3gyuPkYIajdTH1CA,1236
406
407
  omlish/lang/contextmanagers.py,sha256=UPH6daYwSP9cH5AfSVsJyEHk1UURMGhVPM5ZRhp_Hvw,7576
407
408
  omlish/lang/datetimes.py,sha256=ehI_DhQRM-bDxAavnp470XcekbbXc4Gdw9y1KpHDJT0,223
408
409
  omlish/lang/descriptors.py,sha256=mZ2h9zJ__MMpw8hByjRbAiONcwfVb6GD0btNnVi8C5w,6573
@@ -419,7 +420,7 @@ omlish/lang/strings.py,sha256=egdv8PxLNG40-5V93agP5j2rBUDIsahCx048zV7uEbU,4690
419
420
  omlish/lang/sys.py,sha256=UoZz_PJYVKLQAKqYxxn-LHz1okK_38I__maZgnXMcxU,406
420
421
  omlish/lang/typing.py,sha256=Zdad9Zv0sa-hIaUXPrzPidT7sDVpRcussAI7D-j-I1c,3296
421
422
  omlish/lang/cached/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
422
- omlish/lang/cached/function.py,sha256=k3jRNuDtFh9Mk97oonC7nq5XRros2qmRJVWviMFrx74,8728
423
+ omlish/lang/cached/function.py,sha256=5pS3FCTxOradeMsrKg7JbXHsWhqdaa2C34apkXkwqqU,8785
423
424
  omlish/lang/cached/property.py,sha256=kzbao_35PlszdK_9oJBWrMmFFlVK_Xhx7YczHhTJ6cc,2764
424
425
  omlish/lang/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
425
426
  omlish/lang/classes/abstract.py,sha256=bIcuAetV_aChhpSURypmjjcqP07xi20uVYPKh1kvQNU,3710
@@ -476,7 +477,7 @@ omlish/manifests/base.py,sha256=D1WvJYcBR_njkc0gpALpFCWh1h3agb9qgqphnbbPlm4,935
476
477
  omlish/manifests/load.py,sha256=9mdsS3egmSX9pymO-m-y2Fhs4p6ruOdbsYaKT1-1Hwg,6655
477
478
  omlish/manifests/static.py,sha256=7YwOVh_Ek9_aTrWsWNO8kWS10_j4K7yv3TpXZSHsvDY,501
478
479
  omlish/manifests/types.py,sha256=IOt9dOe0r8okCHSL82ryi3sn4VZ6AT80g_QQR6oZtCE,306
479
- omlish/marshal/__init__.py,sha256=00D3S6qwUld1TUWd67hVHuNcrj3c_FAFSkCVXgGWT-s,2607
480
+ omlish/marshal/__init__.py,sha256=8jKG43_yJzX6MP0RMUJeLUn-BnWiMXDjpKH5-DnAIT4,3109
480
481
  omlish/marshal/base.py,sha256=s1wQRPG2Y6kH0qQXoL3d60ldYaVTqLuFs0NdbYXwAGg,6842
481
482
  omlish/marshal/exceptions.py,sha256=jwQWn4LcPnadT2KRI_1JJCOSkwWh0yHnYK9BmSkNN4U,302
482
483
  omlish/marshal/factories.py,sha256=Q926jSVjaQLEmStnHLhm_c_vqEysN1LnDCwAsFLIzXw,2970
@@ -493,18 +494,19 @@ omlish/marshal/composite/mappings.py,sha256=92oAqYzzTdRNhFDtmukpJd8anoi3pt2nX5Xh
493
494
  omlish/marshal/composite/maybes.py,sha256=4rxTv769Uk4gQGAnE6urVnMscF1vhcnwqP_lm5QzSoM,2211
494
495
  omlish/marshal/composite/newtypes.py,sha256=lYCacdR2BlLWMT1kc8o08UjsmJ6aYlAHkrzG8BozWCM,849
495
496
  omlish/marshal/composite/optionals.py,sha256=iQgSrb9Xyb_IP81YREAZ0xKYXImLgMILGLBnYL2lFWw,1508
497
+ omlish/marshal/composite/wrapped.py,sha256=F0pMC2WtJaPnOmzLT1FKFo9Tkzy1XbdBm9iROyp-myw,745
496
498
  omlish/marshal/objects/__init__.py,sha256=F4wej8L_tedC8ETYxAnmKfdPR9TjsqIus9Z3nZofYuc,182
497
- omlish/marshal/objects/dataclasses.py,sha256=Fo15maLrWICq4H3YlZpa0PjnJTC4eqG1IF0C-88qCKs,7780
499
+ omlish/marshal/objects/dataclasses.py,sha256=sz2GhOEL0wPQj1sNrH0dRN7MefiI72iaDPXIrdtgA64,8491
498
500
  omlish/marshal/objects/helpers.py,sha256=85GZp4h3Yo0GYGmnZpKgNxkWnSk8h2R21nfDLU2DtM0,1110
499
501
  omlish/marshal/objects/marshal.py,sha256=rdZsDWKgLBZxV0ZQlwHTJv9iUg0lC57trJHBOFKvuLo,2636
500
502
  omlish/marshal/objects/metadata.py,sha256=QVD7DRhXbLda_Edgpc3OD1xT9fthmeaaj6l_nTE1PMM,3307
501
- omlish/marshal/objects/namedtuples.py,sha256=ENWyiYZhTwDRqUkkWrHeNcoHGEo5GW634jMuBUc3654,2815
503
+ omlish/marshal/objects/namedtuples.py,sha256=nW3IA21PJ7D62_orr2qxnRt794N1TcFqwOO2rPOglmw,2842
502
504
  omlish/marshal/objects/unmarshal.py,sha256=-83sSgL6WX6C3JfXZr64ZLYi3SsJC9kyiGAbEQbVHQI,3620
503
505
  omlish/marshal/polymorphism/__init__.py,sha256=e2UTrSL0qp7w_1vkdxDWd7sXlWhep2KPV49-BB64ma8,130
504
- omlish/marshal/polymorphism/marshal.py,sha256=Lraih0Dhkcwu6Bb6QkrYOWoMIubh46VQkXxJQWisA8Y,1827
506
+ omlish/marshal/polymorphism/marshal.py,sha256=A-fhr4adRDbis3GwGp2fefwT68YT3A4HyogQbMCH69E,2248
505
507
  omlish/marshal/polymorphism/metadata.py,sha256=hbXqkYKXhfJeMllzI0Ubeeqbq201khVN8uprgVhMpHM,3046
506
508
  omlish/marshal/polymorphism/unions.py,sha256=YwsK9T3okGiHj88LTFNdUvuH7VkCsD-aTnZseKzhpdA,4350
507
- omlish/marshal/polymorphism/unmarshal.py,sha256=gdWTgpl4hXBqac1gHmg_23VMb7x42CE2x-3oRpCaLwU,2047
509
+ omlish/marshal/polymorphism/unmarshal.py,sha256=NnNQrJv85tQGkhC4MfvCTOBw7SXRbNNQOlTBXLiup4A,2439
508
510
  omlish/marshal/singular/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
509
511
  omlish/marshal/singular/base64.py,sha256=gQIkFN60lNEuSiu3MDQFoHwMZTtzDbrBRtNpFZ2HXew,1098
510
512
  omlish/marshal/singular/datetimes.py,sha256=1PDVFF6TGkGxGUno8TaFGRof0DQUookYf_X2Nl8T4V0,3723
@@ -534,7 +536,7 @@ omlish/os/journald.py,sha256=2nI8Res1poXkbLc31--MPUlzYMESnCcPUkIxDOCjZW0,3903
534
536
  omlish/os/linux.py,sha256=whJ6scwMKSFBdXiVhJW0BCpJV4jOGMr-a_a3Bhwz6Ls,18938
535
537
  omlish/os/mangle.py,sha256=M0v-SDt4TMnL68I45GekQrUaXkTIILXIlPdqRxKBTKM,524
536
538
  omlish/os/paths.py,sha256=hqPiyg_eYaRoIVPdAeX4oeLEV4Kpln_XsH0tHvbOf8Q,844
537
- omlish/os/signals.py,sha256=FtzkovLb58N3vNdfxflUeXWFCqqKzseCjk5kBdWT-ds,267
539
+ omlish/os/signals.py,sha256=_ycu36jyOAfm1YnEOoEql6w3R5sJ-3pk94NEOvXeGHo,347
538
540
  omlish/os/sizes.py,sha256=ohkALLvqSqBX4iR-7DMKJ4pfOCRdZXV8htH4QywUNM0,152
539
541
  omlish/os/temp.py,sha256=P97KiVeNB7rfGn4tlgU5ro86JUxAsiphLMlxsjQgfB0,1198
540
542
  omlish/os/deathpacts/__init__.py,sha256=IFJkHVWff-VhBbQX38th1RlmjUF2ptKh5TPIzP9Ei2M,229
@@ -545,7 +547,7 @@ omlish/os/pidfiles/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
545
547
  omlish/os/pidfiles/__main__.py,sha256=AF8TwjK4xgHVnoLAP9dIWgKvT0vGhHJlfDW0tKZ7tx4,200
546
548
  omlish/os/pidfiles/cli.py,sha256=2SSsP4O3VdpsDIMAkWgWSjh_YNIPzCD9l5LNN2qrIjo,2074
547
549
  omlish/os/pidfiles/manager.py,sha256=qSEwNaWT1KOAnU0KxliwvU_uowme5jyf1FyIPsGwnTY,2391
548
- omlish/os/pidfiles/pidfile.py,sha256=nU3ONJydi3dPfmLl56DOXR7viJ4TAI8eL-iwR2XoB6s,3899
550
+ omlish/os/pidfiles/pidfile.py,sha256=v0p5NTW8tFv1frCBzgjRkXnljsw8PQ1exfc7kjZJ5L8,4359
549
551
  omlish/os/pidfiles/pinning.py,sha256=v9RlJ4BnJZcaZZXiiRqbmzLluaSOkeeEb_WrbKEClBQ,6643
550
552
  omlish/reflect/__init__.py,sha256=Er2yBHibVO16hFNA1szQF2_f43Y3HRCBWtS-fjsOIYc,798
551
553
  omlish/reflect/inspect.py,sha256=WCo2YpBYauKw6k758FLlZ_H4Q05rgVPs96fEv9w6zHQ,1538
@@ -600,7 +602,7 @@ omlish/specs/jmespath/LICENSE,sha256=IH-ZZlZkS8XMkf_ubNVD1aYHQ2l_wd0tmHtXrCcYpRU
600
602
  omlish/specs/jmespath/__init__.py,sha256=9tsrquw1kXe1KAhTP3WeL0GlGBiTguQVxsC-lUYTWP4,2087
601
603
  omlish/specs/jmespath/__main__.py,sha256=wIXm6bs08etNG_GZlN2rBkADPb0rKfL2HSkm8spnpxw,200
602
604
  omlish/specs/jmespath/ast.py,sha256=XhcUGodHIdsY3-hVZEfpeW6LBehRjLbxVFXkMfZhRdk,5386
603
- omlish/specs/jmespath/cli.py,sha256=3KZwgbPXjJF_yd8H40f0vCNTNkcYLGbV7OQjp1etOdg,2182
605
+ omlish/specs/jmespath/cli.py,sha256=6lCzF3wtFvcPGFjZuq9erypFTpX2Xzu4XtKSbV1meG4,2162
604
606
  omlish/specs/jmespath/exceptions.py,sha256=Co1HiUBPFNwFgZY3FV_ayuZoSgZIAmDcImImxauYNxc,4435
605
607
  omlish/specs/jmespath/functions.py,sha256=lE_MlW5rDQirDCE9HtcAG-17kuHhH36RaPaQfk97xDY,22595
606
608
  omlish/specs/jmespath/lexer.py,sha256=hlPGCXPzGhd9ySj-z2cGTbyC9z3e0Io78IMYJZSEwNk,12647
@@ -668,8 +670,7 @@ omlish/sql/queries/names.py,sha256=4sDvgRobMEt_6mDeuYVbCqHzLCOwpXUdEyyB4-QjxKo,1
668
670
  omlish/sql/queries/ops.py,sha256=B7IDfjr2DW5LJhWoNaY1WW90BJhe5ZtmxIELhWXbW-0,129
669
671
  omlish/sql/queries/params.py,sha256=iR8tnetkZFWY378iUbPe08d86g-Wf1J3YqfZr_KhIwQ,1175
670
672
  omlish/sql/queries/relations.py,sha256=7YrEC9IjoVpRGLAFKRSRsHHnTmx-g7hBNXsOgP2HOuI,2998
671
- omlish/sql/queries/rendering.py,sha256=8naCMwxVEFAJaMP5m2bf6kCyhvwFZhXiWYEma51fQ4k,6813
672
- omlish/sql/queries/rendering2.py,sha256=S7BD7i2tMEWdxOtvw-udWfk5nei-vV3hUghR7qEIL-I,6469
673
+ omlish/sql/queries/rendering.py,sha256=3oSwzx713J81V0JM4FnVgNpeHjaenoWrds41M9j__Dg,7328
673
674
  omlish/sql/queries/selects.py,sha256=RFySZ9sb-nE29QrLLbQ7JYZW_V_ifaFTcl-RQTgQncY,1369
674
675
  omlish/sql/queries/std.py,sha256=J2ZDfDyLzRm8q5-TLAN6I_qjhs-7RpfW23yuCYYLf5k,643
675
676
  omlish/sql/queries/stmts.py,sha256=pBqwD7dRlqMu6uh6vR3xaWOEgbZCcFWbOQ9ryYd17T4,441
@@ -732,9 +733,9 @@ omlish/text/mangle.py,sha256=kfzFLfvepH-chl1P89_mdc5vC4FSqyPA2aVtgzuB8IY,1133
732
733
  omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
733
734
  omlish/text/parts.py,sha256=JkNZpyR2tv2CNcTaWJJhpQ9E4F0yPR8P_YfDbZfMtwQ,6182
734
735
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
735
- omlish-0.0.0.dev245.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
736
- omlish-0.0.0.dev245.dist-info/METADATA,sha256=JjIb3VY1vdwMkndkHrbTmD72X00OMiCJVwBpn07rc88,4176
737
- omlish-0.0.0.dev245.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
738
- omlish-0.0.0.dev245.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
739
- omlish-0.0.0.dev245.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
740
- omlish-0.0.0.dev245.dist-info/RECORD,,
736
+ omlish-0.0.0.dev247.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
737
+ omlish-0.0.0.dev247.dist-info/METADATA,sha256=82nI3LSDtkEUH8RynMRyrECBuyL-TP_WYtoC8UNk_OU,4176
738
+ omlish-0.0.0.dev247.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
739
+ omlish-0.0.0.dev247.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
740
+ omlish-0.0.0.dev247.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
741
+ omlish-0.0.0.dev247.dist-info/RECORD,,