omlish 0.0.0.dev214__py3-none-any.whl → 0.0.0.dev216__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev214'
2
- __revision__ = '9512c6d71a63bb51772d9183f0205459f229de64'
1
+ __version__ = '0.0.0.dev216'
2
+ __revision__ = '4805bde6bf1ddb3b6c2099d185808394e0634392'
3
3
 
4
4
 
5
5
  #
@@ -1,6 +1,6 @@
1
1
  # ruff: noqa: I001
2
2
  from .asyncio import ( # noqa
3
3
  asyncio_once,
4
- drain_tasks,
4
+ drain_asyncio_tasks,
5
5
  draining_asyncio_tasks,
6
6
  )
@@ -24,7 +24,7 @@ def asyncio_once(fn: CallableT) -> CallableT:
24
24
  return ta.cast(CallableT, inner)
25
25
 
26
26
 
27
- def drain_tasks(loop=None):
27
+ def drain_asyncio_tasks(loop=None):
28
28
  if loop is None:
29
29
  loop = asyncio.get_running_loop()
30
30
 
@@ -39,7 +39,7 @@ def draining_asyncio_tasks() -> ta.Iterator[None]:
39
39
  yield
40
40
  finally:
41
41
  if loop is not None:
42
- drain_tasks(loop) # noqa
42
+ drain_asyncio_tasks(loop) # noqa
43
43
 
44
44
 
45
45
  async def asyncio_wait_concurrent(
omlish/lite/marshal.py CHANGED
@@ -2,6 +2,7 @@
2
2
  TODO:
3
3
  - pickle stdlib objs? have to pin to 3.8 pickle protocol, will be cross-version
4
4
  - literals
5
+ - Options.sequence_cls = list, mapping_cls = dict, ... - def with_mutable_containers() -> Options
5
6
  """
6
7
  # ruff: noqa: UP006 UP007
7
8
  import abc
@@ -183,21 +184,55 @@ class IterableObjMarshaler(ObjMarshaler):
183
184
  @dc.dataclass(frozen=True)
184
185
  class FieldsObjMarshaler(ObjMarshaler):
185
186
  ty: type
186
- fs: ta.Mapping[str, ObjMarshaler]
187
+
188
+ @dc.dataclass(frozen=True)
189
+ class Field:
190
+ att: str
191
+ key: str
192
+ m: ObjMarshaler
193
+
194
+ omit_if_none: bool = False
195
+
196
+ fs: ta.Sequence[Field]
197
+
187
198
  non_strict: bool = False
188
199
 
200
+ #
201
+
202
+ _fs_by_att: ta.ClassVar[ta.Mapping[str, Field]]
203
+ _fs_by_key: ta.ClassVar[ta.Mapping[str, Field]]
204
+
205
+ def __post_init__(self) -> None:
206
+ fs_by_att: dict = {}
207
+ fs_by_key: dict = {}
208
+ for f in self.fs:
209
+ check.not_in(check.non_empty_str(f.att), fs_by_att)
210
+ check.not_in(check.non_empty_str(f.key), fs_by_key)
211
+ fs_by_att[f.att] = f
212
+ fs_by_key[f.key] = f
213
+ self.__dict__['_fs_by_att'] = fs_by_att
214
+ self.__dict__['_fs_by_key'] = fs_by_key
215
+
216
+ #
217
+
189
218
  def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
190
- return {
191
- k: m.marshal(getattr(o, k), ctx)
192
- for k, m in self.fs.items()
193
- }
219
+ d = {}
220
+ for f in self.fs:
221
+ mv = f.m.marshal(getattr(o, f.att), ctx)
222
+ if mv is None and f.omit_if_none:
223
+ continue
224
+ d[f.key] = mv
225
+ return d
194
226
 
195
227
  def unmarshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
196
- return self.ty(**{
197
- k: self.fs[k].unmarshal(v, ctx)
198
- for k, v in o.items()
199
- if not (self.non_strict or ctx.options.non_strict_fields) or k in self.fs
200
- })
228
+ kw = {}
229
+ for k, v in o.items():
230
+ if (f := self._fs_by_key.get(k)) is None:
231
+ if not (self.non_strict or ctx.options.non_strict_fields):
232
+ raise KeyError(k)
233
+ continue
234
+ kw[f.att] = f.m.unmarshal(v, ctx)
235
+ return self.ty(**kw)
201
236
 
202
237
 
203
238
  @dc.dataclass(frozen=True)
@@ -332,6 +367,22 @@ def register_single_field_type_obj_marshaler(fld, ty=None):
332
367
  ##
333
368
 
334
369
 
370
+ class ObjMarshalerFieldMetadata:
371
+ def __new__(cls, *args, **kwargs): # noqa
372
+ raise TypeError
373
+
374
+
375
+ class OBJ_MARSHALER_FIELD_KEY(ObjMarshalerFieldMetadata): # noqa
376
+ pass
377
+
378
+
379
+ class OBJ_MARSHALER_OMIT_IF_NONE(ObjMarshalerFieldMetadata): # noqa
380
+ pass
381
+
382
+
383
+ ##
384
+
385
+
335
386
  class ObjMarshalerManager:
336
387
  def __init__(
337
388
  self,
@@ -391,14 +442,30 @@ class ObjMarshalerManager:
391
442
  if dc.is_dataclass(ty):
392
443
  return FieldsObjMarshaler(
393
444
  ty,
394
- {f.name: rec(f.type) for f in dc.fields(ty)},
445
+ [
446
+ FieldsObjMarshaler.Field(
447
+ att=f.name,
448
+ key=check.non_empty_str(fk),
449
+ m=rec(f.type),
450
+ omit_if_none=check.isinstance(f.metadata.get(OBJ_MARSHALER_OMIT_IF_NONE, False), bool),
451
+ )
452
+ for f in dc.fields(ty)
453
+ if (fk := f.metadata.get(OBJ_MARSHALER_FIELD_KEY, f.name)) is not None
454
+ ],
395
455
  non_strict=non_strict_fields,
396
456
  )
397
457
 
398
458
  if issubclass(ty, tuple) and hasattr(ty, '_fields'):
399
459
  return FieldsObjMarshaler(
400
460
  ty,
401
- {p.name: rec(p.annotation) for p in inspect.signature(ty).parameters.values()},
461
+ [
462
+ FieldsObjMarshaler.Field(
463
+ att=p.name,
464
+ key=p.name,
465
+ m=rec(p.annotation),
466
+ )
467
+ for p in inspect.signature(ty).parameters.values()
468
+ ],
402
469
  non_strict=non_strict_fields,
403
470
  )
404
471
 
omlish/logs/standard.py CHANGED
@@ -22,7 +22,7 @@ from .proxy import ProxyLogHandler
22
22
 
23
23
  STANDARD_LOG_FORMAT_PARTS = [
24
24
  ('asctime', '%(asctime)-15s'),
25
- ('process', 'pid=%(process)-6s'),
25
+ ('process', 'pid=%(process)s'),
26
26
  ('thread', 'tid=%(thread)x'),
27
27
  ('levelname', '%(levelname)s'),
28
28
  ('name', '%(name)s'),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: omlish
3
- Version: 0.0.0.dev214
3
+ Version: 0.0.0.dev216
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=YGmAnUBszmosQQ_7Hh2wwtDiYdYZ4unNKYzOtALuels,7968
2
- omlish/__about__.py,sha256=_d2jSUjwFrpk8Jy6OmRvIQlDn2eLHleeBqNjm541vLQ,3380
2
+ omlish/__about__.py,sha256=PjS1s-BEA6BW1AWodoo9aQyr9k3shf8Uan7UcjNCYrU,3380
3
3
  omlish/__init__.py,sha256=SsyiITTuK0v74XpKV8dqNaCmjOlan1JZKrHQv5rWKPA,253
4
4
  omlish/c3.py,sha256=ubu7lHwss5V4UznbejAI0qXhXahrU01MysuHOZI9C4U,8116
5
5
  omlish/cached.py,sha256=UI-XTFBwA6YXWJJJeBn-WkwBkfzDjLBBaZf4nIJA9y0,510
@@ -93,8 +93,8 @@ omlish/asyncs/flavors.py,sha256=1mNxGNRVmjUHzA13K5ht8vdJv4CLEmzYTQ6BZXr1520,4866
93
93
  omlish/asyncs/trio.py,sha256=fmZ5b_lKdVV8NQ3euCUutWgnkqTFzSnOjvJSA_jvmrE,367
94
94
  omlish/asyncs/trio_asyncio.py,sha256=oqdOHy0slj9PjVxaDf3gJkq9AAgg7wYZbB469jOftVw,1327
95
95
  omlish/asyncs/asyncio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
- omlish/asyncs/asyncio/all.py,sha256=eZDtL8atzHqIdGCAAcQYWVmNvgRYerJB9Sy0reh-09k,115
97
- omlish/asyncs/asyncio/asyncio.py,sha256=uNd1h2EIaQb0pZVtvAkq-GnWjf9gn-sSHY0gkmm-7e0,1767
96
+ omlish/asyncs/asyncio/all.py,sha256=GR6BJOSS5W82hc7ZJF7Er_2NZ-94nTXZh71aVLJNa54,123
97
+ omlish/asyncs/asyncio/asyncio.py,sha256=3BMhVIF-QTjsFRGDtNYlRbBqKPCA3_AwJsjJoIWdM8k,1783
98
98
  omlish/asyncs/asyncio/channels.py,sha256=ZbmsEmdK1fV96liHdcVpRqA2dAMkXJt4Q3rFAg3YOIw,1074
99
99
  omlish/asyncs/asyncio/streams.py,sha256=Uc9PCWSfBqrK2kdVtfjjQU1eaYTWYmZm8QISDj2xiuw,1004
100
100
  omlish/asyncs/asyncio/subprocesses.py,sha256=XlIWwSxpVB7sMVc75-f7dI6r08JkdipNFRWXUKS8zAw,6960
@@ -415,7 +415,7 @@ omlish/lite/dataclasses.py,sha256=M6UD4VwGo0Ky7RNzKWbO0IOy7iBZVCIbTiC6EYbFnX8,10
415
415
  omlish/lite/inject.py,sha256=qBUftFeXMiRgANYbNS2e7TePMYyFAcuLgsJiLyMTW5o,28769
416
416
  omlish/lite/json.py,sha256=7-02Ny4fq-6YAu5ynvqoijhuYXWpLmfCI19GUeZnb1c,740
417
417
  omlish/lite/logs.py,sha256=CWFG0NKGhqNeEgryF5atN2gkPYbUdTINEw_s1phbINM,51
418
- omlish/lite/marshal.py,sha256=2ybMvKqhKIM4HyUxffzgKM2DOeOmiLgQ1FTNVdoji1U,16124
418
+ omlish/lite/marshal.py,sha256=4E78R-XzncjCClHsOdE-g1ocs5mhA91oFy1LYkaEjHs,18042
419
419
  omlish/lite/maybes.py,sha256=7OlHJ8Q2r4wQ-aRbZSlJY7x0e8gDvufFdlohGEIJ3P4,833
420
420
  omlish/lite/pycharm.py,sha256=pUOJevrPClSqTCEOkQBO11LKX2003tfDcp18a03QFrc,1163
421
421
  omlish/lite/reflect.py,sha256=pzOY2PPuHH0omdtglkN6DheXDrGopdL3PtTJnejyLFU,2189
@@ -435,7 +435,7 @@ omlish/logs/handlers.py,sha256=zgSnKQA5q9Fu7T0Nkd7twog9H1Wg9-bDCzz4_F1TOBo,319
435
435
  omlish/logs/json.py,sha256=zyqMWpZY3lk4WRk4wgmataBomGX9S3iDsydiM1sS-lI,1366
436
436
  omlish/logs/noisy.py,sha256=Ubc-eTH6ZbGYsLfUUi69JAotwuUwzb-SJBeGo_0dIZI,348
437
437
  omlish/logs/proxy.py,sha256=A-ROPUUAlF397qTbEqhel6YhQMstNuXL3Xmts7w9dAo,2347
438
- omlish/logs/standard.py,sha256=BVFn8pFyafxuco1sjA5COYxX5Q0Wv80_OE9zo6uDp2Q,3164
438
+ omlish/logs/standard.py,sha256=FbKdF2Z4Na5i2TNwKn0avLJXyICe2JKsPufjvKCHGn0,3162
439
439
  omlish/logs/utils.py,sha256=mzHrZ9ji75p5A8qR29eUr05CBAHMb8J753MSkID_VaQ,393
440
440
  omlish/manifests/__init__.py,sha256=P2B0dpT8D7l5lJwRGPA92IcQj6oeXfd90X5-q9BJrKg,51
441
441
  omlish/manifests/load.py,sha256=LrWAvBfdzDkFdLuVwfw2RwFvLjxx-rvfkpU9eBsWeIc,5626
@@ -626,9 +626,9 @@ omlish/text/indent.py,sha256=YjtJEBYWuk8--b9JU_T6q4yxV85_TR7VEVr5ViRCFwk,1336
626
626
  omlish/text/minja.py,sha256=jZC-fp3Xuhx48ppqsf2Sf1pHbC0t8XBB7UpUUoOk2Qw,5751
627
627
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
628
628
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
629
- omlish-0.0.0.dev214.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
630
- omlish-0.0.0.dev214.dist-info/METADATA,sha256=PQq6yr3xSMAgnBbWLpLKNNmi_mhsmDtvjnyYGgDmgEA,4176
631
- omlish-0.0.0.dev214.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
632
- omlish-0.0.0.dev214.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
633
- omlish-0.0.0.dev214.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
634
- omlish-0.0.0.dev214.dist-info/RECORD,,
629
+ omlish-0.0.0.dev216.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
630
+ omlish-0.0.0.dev216.dist-info/METADATA,sha256=6BbpSJ9xCRfRy70TaSmBaJwjRO0Zip85jN984Y1F2qo,4176
631
+ omlish-0.0.0.dev216.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
632
+ omlish-0.0.0.dev216.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
633
+ omlish-0.0.0.dev216.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
634
+ omlish-0.0.0.dev216.dist-info/RECORD,,