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 +2 -2
- omlish/lite/marshal.py +20 -9
- omlish/lite/reflect.py +4 -0
- {omlish-0.0.0.dev159.dist-info → omlish-0.0.0.dev160.dist-info}/METADATA +1 -1
- {omlish-0.0.0.dev159.dist-info → omlish-0.0.0.dev160.dist-info}/RECORD +9 -9
- {omlish-0.0.0.dev159.dist-info → omlish-0.0.0.dev160.dist-info}/LICENSE +0 -0
- {omlish-0.0.0.dev159.dist-info → omlish-0.0.0.dev160.dist-info}/WHEEL +0 -0
- {omlish-0.0.0.dev159.dist-info → omlish-0.0.0.dev160.dist-info}/entry_points.txt +0 -0
- {omlish-0.0.0.dev159.dist-info → omlish-0.0.0.dev160.dist-info}/top_level.txt +0 -0
omlish/__about__.py
CHANGED
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
|
-
|
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
|
170
|
+
class FieldsObjMarshaler(ObjMarshaler):
|
170
171
|
ty: type
|
171
172
|
fs: ta.Mapping[str, ObjMarshaler]
|
172
|
-
|
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.
|
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
|
-
|
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
|
339
|
+
return FieldsObjMarshaler(
|
339
340
|
ty,
|
340
341
|
{f.name: rec(f.type) for f in dc.fields(ty)},
|
341
|
-
|
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,5 +1,5 @@
|
|
1
1
|
omlish/.manifests.json,sha256=RX24SRc6DCEg77PUVnaXOKCWa5TF_c9RQJdGIf7gl9c,1135
|
2
|
-
omlish/__about__.py,sha256=
|
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=
|
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=
|
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.
|
529
|
-
omlish-0.0.0.
|
530
|
-
omlish-0.0.0.
|
531
|
-
omlish-0.0.0.
|
532
|
-
omlish-0.0.0.
|
533
|
-
omlish-0.0.0.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|