omlish 0.0.0.dev159__py3-none-any.whl → 0.0.0.dev160__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.
omlish/__about__.py CHANGED
@@ -1,5 +1,5 @@
1
- __version__ = '0.0.0.dev159'
2
- __revision__ = '57ad3a7d9b338af6a708812632c3d64969a1b9ef'
1
+ __version__ = '0.0.0.dev160'
2
+ __revision__ = '7a7f89f635d413c2afb755bed939daa26703116f'
3
3
 
4
4
 
5
5
  #
omlish/lite/marshal.py CHANGED
@@ -1,9 +1,7 @@
1
1
  """
2
2
  TODO:
3
3
  - pickle stdlib objs? have to pin to 3.8 pickle protocol, will be cross-version
4
- - namedtuple
5
4
  - literals
6
- - newtypes?
7
5
  """
8
6
  # ruff: noqa: UP006 UP007
9
7
  import abc
@@ -15,6 +13,7 @@ import decimal
15
13
  import enum
16
14
  import fractions
17
15
  import functools
16
+ import inspect
18
17
  import threading
19
18
  import typing as ta
20
19
  import uuid
@@ -22,8 +21,10 @@ import weakref # noqa
22
21
 
23
22
  from .check import check
24
23
  from .reflect import deep_subclasses
24
+ from .reflect import get_new_type_supertype
25
25
  from .reflect import get_optional_alias_arg
26
26
  from .reflect import is_generic_alias
27
+ from .reflect import is_new_type
27
28
  from .reflect import is_union_alias
28
29
  from .strings import snake_case
29
30
 
@@ -37,7 +38,7 @@ T = ta.TypeVar('T')
37
38
  @dc.dataclass(frozen=True)
38
39
  class ObjMarshalOptions:
39
40
  raw_bytes: bool = False
40
- nonstrict_dataclasses: bool = False
41
+ non_strict_fields: bool = False
41
42
 
42
43
 
43
44
  class ObjMarshaler(abc.ABC):
@@ -166,10 +167,10 @@ class IterableObjMarshaler(ObjMarshaler):
166
167
 
167
168
 
168
169
  @dc.dataclass(frozen=True)
169
- class DataclassObjMarshaler(ObjMarshaler):
170
+ class FieldsObjMarshaler(ObjMarshaler):
170
171
  ty: type
171
172
  fs: ta.Mapping[str, ObjMarshaler]
172
- nonstrict: bool = False
173
+ non_strict: bool = False
173
174
 
174
175
  def marshal(self, o: ta.Any, ctx: 'ObjMarshalContext') -> ta.Any:
175
176
  return {
@@ -181,7 +182,7 @@ class DataclassObjMarshaler(ObjMarshaler):
181
182
  return self.ty(**{
182
183
  k: self.fs[k].unmarshal(v, ctx)
183
184
  for k, v in o.items()
184
- if not (self.nonstrict or ctx.options.nonstrict_dataclasses) or k in self.fs
185
+ if not (self.non_strict or ctx.options.non_strict_fields) or k in self.fs
185
186
  })
186
187
 
187
188
 
@@ -313,7 +314,7 @@ class ObjMarshalerManager:
313
314
  ty: ta.Any,
314
315
  rec: ta.Callable[[ta.Any], ObjMarshaler],
315
316
  *,
316
- nonstrict_dataclasses: bool = False,
317
+ non_strict_fields: bool = False,
317
318
  ) -> ObjMarshaler:
318
319
  if isinstance(ty, type):
319
320
  if abc.ABC in ty.__bases__:
@@ -335,12 +336,22 @@ class ObjMarshalerManager:
335
336
  return EnumObjMarshaler(ty)
336
337
 
337
338
  if dc.is_dataclass(ty):
338
- return DataclassObjMarshaler(
339
+ return FieldsObjMarshaler(
339
340
  ty,
340
341
  {f.name: rec(f.type) for f in dc.fields(ty)},
341
- nonstrict=nonstrict_dataclasses,
342
+ non_strict=non_strict_fields,
342
343
  )
343
344
 
345
+ if issubclass(ty, tuple) and hasattr(ty, '_fields'):
346
+ return FieldsObjMarshaler(
347
+ ty,
348
+ {p.name: rec(p.annotation) for p in inspect.signature(ty).parameters.values()},
349
+ non_strict=non_strict_fields,
350
+ )
351
+
352
+ if is_new_type(ty):
353
+ return rec(get_new_type_supertype(ty))
354
+
344
355
  if is_generic_alias(ty):
345
356
  try:
346
357
  mt = self._generic_mapping_types[ta.get_origin(ty)]
omlish/lite/reflect.py CHANGED
@@ -46,6 +46,10 @@ def is_new_type(spec: ta.Any) -> bool:
46
46
  return isinstance(spec, types.FunctionType) and spec.__code__ is ta.NewType.__code__.co_consts[1] # type: ignore # noqa
47
47
 
48
48
 
49
+ def get_new_type_supertype(spec: ta.Any) -> ta.Any:
50
+ return spec.__supertype__
51
+
52
+
49
53
  def deep_subclasses(cls: ta.Type[T]) -> ta.Iterator[ta.Type[T]]:
50
54
  seen = set()
51
55
  todo = list(reversed(cls.__subclasses__()))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omlish
3
- Version: 0.0.0.dev159
3
+ Version: 0.0.0.dev160
4
4
  Summary: omlish
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -1,5 +1,5 @@
1
1
  omlish/.manifests.json,sha256=RX24SRc6DCEg77PUVnaXOKCWa5TF_c9RQJdGIf7gl9c,1135
2
- omlish/__about__.py,sha256=Oft5eCVCcnEMK8rYnJP3QHL7ISL4-IJeS8mYfuDtxXI,3409
2
+ omlish/__about__.py,sha256=YIDkVlJyMJUrEtEf00ng1bGGafE3fLQ7pZzCbPUNOjE,3409
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
@@ -342,10 +342,10 @@ omlish/lite/contextmanagers.py,sha256=m9JO--p7L7mSl4cycXysH-1AO27weDKjP3DZG61cww
342
342
  omlish/lite/inject.py,sha256=729Qi0TLbQgBtkvx97q1EUMe73VFYA1hu4woXkOTcwM,23572
343
343
  omlish/lite/json.py,sha256=7-02Ny4fq-6YAu5ynvqoijhuYXWpLmfCI19GUeZnb1c,740
344
344
  omlish/lite/logs.py,sha256=CWFG0NKGhqNeEgryF5atN2gkPYbUdTINEw_s1phbINM,51
345
- omlish/lite/marshal.py,sha256=u5n43bEbct1ps8oIR7wjFCSWeyOhfHAF7LxUjELh8Jk,13830
345
+ omlish/lite/marshal.py,sha256=ldoZs_yiQIUpOjBviV9f4mwm7hSZy0hRLXrvQA-6POU,14257
346
346
  omlish/lite/maybes.py,sha256=7OlHJ8Q2r4wQ-aRbZSlJY7x0e8gDvufFdlohGEIJ3P4,833
347
347
  omlish/lite/pycharm.py,sha256=pUOJevrPClSqTCEOkQBO11LKX2003tfDcp18a03QFrc,1163
348
- omlish/lite/reflect.py,sha256=ad_ya_zZJOQB8HoNjs9yc66R54zgflwJVPJqiBXMzqA,1681
348
+ omlish/lite/reflect.py,sha256=L5_9gNp_BmAZ3l9PVezDmiXFg_6BOHbfQNB98tUULW0,1765
349
349
  omlish/lite/resources.py,sha256=YNSmX1Ohck1aoWRs55a-o5ChVbFJIQhtbqE-XwF55Oc,326
350
350
  omlish/lite/runtime.py,sha256=XQo408zxTdJdppUZqOWHyeUR50VlCpNIExNGHz4U6O4,459
351
351
  omlish/lite/secrets.py,sha256=3Mz3V2jf__XU9qNHcH56sBSw95L3U2UPL24bjvobG0c,816
@@ -525,9 +525,9 @@ omlish/text/glyphsplit.py,sha256=Ug-dPRO7x-OrNNr8g1y6DotSZ2KH0S-VcOmUobwa4B0,329
525
525
  omlish/text/indent.py,sha256=6Jj6TFY9unaPa4xPzrnZemJ-fHsV53IamP93XGjSUHs,1274
526
526
  omlish/text/parts.py,sha256=7vPF1aTZdvLVYJ4EwBZVzRSy8XB3YqPd7JwEnNGGAOo,6495
527
527
  omlish/text/random.py,sha256=jNWpqiaKjKyTdMXC-pWAsSC10AAP-cmRRPVhm59ZWLk,194
528
- omlish-0.0.0.dev159.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
529
- omlish-0.0.0.dev159.dist-info/METADATA,sha256=5v5tXuLmc6Vhu3AbvfFi0Gt4uKcFAqMr5g2Ca5t_CeA,4264
530
- omlish-0.0.0.dev159.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
531
- omlish-0.0.0.dev159.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
532
- omlish-0.0.0.dev159.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
533
- omlish-0.0.0.dev159.dist-info/RECORD,,
528
+ omlish-0.0.0.dev160.dist-info/LICENSE,sha256=B_hVtavaA8zCYDW99DYdcpDLKz1n3BBRjZrcbv8uG8c,1451
529
+ omlish-0.0.0.dev160.dist-info/METADATA,sha256=CZH9L3qhAM-tYsJfEokB-s2fTLnRy-QMkOSnErJHumc,4264
530
+ omlish-0.0.0.dev160.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
531
+ omlish-0.0.0.dev160.dist-info/entry_points.txt,sha256=Lt84WvRZJskWCAS7xnQGZIeVWksprtUHj0llrvVmod8,35
532
+ omlish-0.0.0.dev160.dist-info/top_level.txt,sha256=pePsKdLu7DvtUiecdYXJ78iO80uDNmBlqe-8hOzOmfs,7
533
+ omlish-0.0.0.dev160.dist-info/RECORD,,