omlish 0.0.0.dev214__py3-none-any.whl → 0.0.0.dev215__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.dev215'
2
+ __revision__ = 'c5c874e5a29ecc0725c701f47a3a498d9d5745f1'
3
3
 
4
4
 
5
5
  #
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
 
@@ -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.dev215
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=Z_q3fQprjpJxjsLLgSeWVB1UJcxxPVoYEpw8Zkc85bs,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
@@ -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
@@ -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.dev215.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
630
+ omlish-0.0.0.dev215.dist-info/METADATA,sha256=sgYLWshnIstVsakEiP6G0Nytn1GDKeCvZGuP0wKtIgU,4176
631
+ omlish-0.0.0.dev215.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
632
+ omlish-0.0.0.dev215.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
633
+ omlish-0.0.0.dev215.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
634
+ omlish-0.0.0.dev215.dist-info/RECORD,,