omlish 0.0.0.dev159__py3-none-any.whl → 0.0.0.dev160__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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
|