python-datamodel 0.10.2__tar.gz → 0.10.4__tar.gz
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.
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/PKG-INFO +1 -1
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/abstract.py +33 -14
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/base.py +4 -3
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/converters.c +8187 -5803
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/converters.html +5478 -4262
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/converters.pyx +260 -122
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/fields.cpp +1447 -850
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/fields.html +1111 -801
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/fields.pyx +50 -21
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/models.py +145 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/rs_parsers/src/lib.rs +31 -1
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/validation.cpp +596 -532
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/validation.html +527 -497
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/validation.pyx +30 -4
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/version.py +1 -1
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/python_datamodel.egg-info/PKG-INFO +1 -1
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/python_datamodel.egg-info/SOURCES.txt +1 -0
- python_datamodel-0.10.4/tests/test_dashboards.py +274 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/CHANGELOG.md +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/CONTRIBUTING.md +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/LICENSE +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/MANIFEST.in +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/Makefile +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/README.md +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/SECURITY.md +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/__init__.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/adaptive/__init__.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/adaptive/models.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/aliases/__init__.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/exceptions.c +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/exceptions.html +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/exceptions.pxd +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/exceptions.pyx +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/functions.cpp +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/functions.html +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/functions.pxd +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/functions.pyx +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/jsonld/__init__.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/jsonld/models.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/libs/__init__.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/libs/mapping.c +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/libs/mapping.html +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/libs/mapping.pxd +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/libs/mapping.pyx +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/libs/mutables.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/parsers/__init__.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/parsers/encoders.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/parsers/json.cpp +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/parsers/json.html +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/parsers/json.pyx +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/profiler.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/py.typed +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/rs_core/Cargo.toml +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/rs_core/src/lib.rs +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/rs_parsers/Cargo.toml +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/rs_validators/Cargo.toml +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/rs_validators/src/lib.rs +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/typedefs/__init__.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/typedefs/singleton.c +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/typedefs/singleton.html +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/typedefs/singleton.pxd +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/typedefs/singleton.pyx +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/typedefs/types.c +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/typedefs/types.html +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/typedefs/types.pxd +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/typedefs/types.pyx +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/types.c +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/types.html +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/datamodel/types.pyx +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/pyproject.toml +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/python_datamodel.egg-info/dependency_links.txt +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/python_datamodel.egg-info/not-zip-safe +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/python_datamodel.egg-info/requires.txt +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/python_datamodel.egg-info/top_level.txt +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/setup.cfg +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/setup.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/__init__.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_aliases.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_classdict.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_converter.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_data.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_descriptors.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_dict.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_field.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_inherit.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_json.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_method.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_model.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_primitives.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_qsdriver.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_qsmodel.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_qsobject.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_ticket.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_tickets.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_tuples.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_type_user.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_types.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_valid_callables.py +0 -0
- {python_datamodel-0.10.2 → python_datamodel-0.10.4}/tests/test_validations.py +0 -0
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import contextlib
|
|
2
2
|
import logging
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import (
|
|
4
|
+
Optional,
|
|
5
|
+
Any,
|
|
6
|
+
List,
|
|
7
|
+
Dict,
|
|
8
|
+
Union,
|
|
9
|
+
get_args,
|
|
10
|
+
get_origin,
|
|
11
|
+
ClassVar,
|
|
12
|
+
NewType
|
|
13
|
+
)
|
|
4
14
|
from types import GenericAlias
|
|
5
15
|
from collections import OrderedDict
|
|
6
16
|
from collections.abc import Callable
|
|
@@ -59,9 +69,10 @@ def _dc_method_setattr_(self, name: str, value: Any) -> None:
|
|
|
59
69
|
This version separates the known-field assignment (with optional validation)
|
|
60
70
|
from the “extra field” assignment and uses a helper to perform conversion/validation.
|
|
61
71
|
"""
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
object.__setattr__(self,
|
|
72
|
+
if (name.startswith('__') and name.endswith('__')):
|
|
73
|
+
# or check explicitly if name in ('__values__', '__valid__', ...)
|
|
74
|
+
object.__setattr__(self, name, value)
|
|
75
|
+
return
|
|
65
76
|
|
|
66
77
|
# Check whether we are assigning to a known field.
|
|
67
78
|
if name in self.__fields__:
|
|
@@ -84,8 +95,6 @@ def _dc_method_setattr_(self, name: str, value: Any) -> None:
|
|
|
84
95
|
# For extra attributes, store them as usual.
|
|
85
96
|
# (Note: here we “neutralize” any callable value to None if needed.)
|
|
86
97
|
object.__setattr__(self, name, None if callable(value) else value)
|
|
87
|
-
if name == '__values__':
|
|
88
|
-
return
|
|
89
98
|
|
|
90
99
|
# If the field isn’t known yet:
|
|
91
100
|
if name not in self.__fields__:
|
|
@@ -170,6 +179,10 @@ class ModelMeta(type):
|
|
|
170
179
|
# Skip InitVar fields;
|
|
171
180
|
# they should not be part of the dataclass instance
|
|
172
181
|
continue
|
|
182
|
+
if isinstance(_type, NewType):
|
|
183
|
+
# Get the corresponding type of the NewType.
|
|
184
|
+
_type = _type.__supertype__
|
|
185
|
+
|
|
173
186
|
origin = get_origin(_type)
|
|
174
187
|
if origin is ClassVar:
|
|
175
188
|
continue
|
|
@@ -218,10 +231,7 @@ class ModelMeta(type):
|
|
|
218
231
|
df.origin = origin
|
|
219
232
|
df.args = args
|
|
220
233
|
df.type_args = getattr(_type, '__args__', None)
|
|
221
|
-
|
|
222
|
-
df._typeinfo_ = {
|
|
223
|
-
"default_callable": callable(_default)
|
|
224
|
-
}
|
|
234
|
+
df._default_callable = callable(_default)
|
|
225
235
|
# Current Field have an Encoder Function.
|
|
226
236
|
custom_encoder = df.metadata.get("encoder")
|
|
227
237
|
try:
|
|
@@ -245,6 +255,7 @@ class ModelMeta(type):
|
|
|
245
255
|
_type_category = 'dataclass'
|
|
246
256
|
elif _is_typing or _is_alias: # noqa
|
|
247
257
|
if df.origin is not None and (df.origin is list and df.args):
|
|
258
|
+
df._inner_targs = df.args
|
|
248
259
|
df._inner_type = args[0]
|
|
249
260
|
df._inner_origin = get_origin(df._inner_type)
|
|
250
261
|
df._typing_args = get_args(df._inner_type)
|
|
@@ -254,11 +265,19 @@ class ModelMeta(type):
|
|
|
254
265
|
except (TypeError, KeyError):
|
|
255
266
|
df._encoder_fn = None
|
|
256
267
|
if origin is list:
|
|
257
|
-
|
|
268
|
+
df._inner_targs = df.args
|
|
269
|
+
df._inner_type = args[0]
|
|
258
270
|
try:
|
|
259
|
-
df._encoder_fn = encoders[
|
|
271
|
+
df._encoder_fn = encoders[df._inner_type]
|
|
260
272
|
except (TypeError, KeyError):
|
|
261
273
|
df._encoder_fn = None
|
|
274
|
+
elif origin is Union:
|
|
275
|
+
df._inner_targs = df.args
|
|
276
|
+
df._inner_type = args[0]
|
|
277
|
+
df._inner_is_dc = is_dataclass(df._inner_type)
|
|
278
|
+
df._inner_priv = is_primitive(df._inner_type)
|
|
279
|
+
df._inner_origin = get_origin(df._inner_type)
|
|
280
|
+
df._typing_args = get_args(df._inner_type)
|
|
262
281
|
_type_category = 'typing'
|
|
263
282
|
elif isclass(_type):
|
|
264
283
|
_type_category = 'class'
|
|
@@ -341,10 +360,10 @@ class ModelMeta(type):
|
|
|
341
360
|
# Set additional attributes:
|
|
342
361
|
dc.__columns__ = cols
|
|
343
362
|
dc.__fields__ = list(_columns)
|
|
344
|
-
dc.__values__ = {}
|
|
345
363
|
dc.__encoder__ = JSONContent
|
|
346
364
|
dc.__valid__ = False
|
|
347
|
-
dc.__errors__ =
|
|
365
|
+
dc.__errors__ = {}
|
|
366
|
+
dc.__values__ = {}
|
|
348
367
|
dc.__frozen__ = strict
|
|
349
368
|
dc.__initialised__ = False
|
|
350
369
|
dc.__field_types__ = _types
|
|
@@ -47,10 +47,11 @@ class BaseModel(ModelMixin, metaclass=ModelMeta):
|
|
|
47
47
|
Hint: please check the "payload" attribute in the exception.""",
|
|
48
48
|
payload=errors
|
|
49
49
|
)
|
|
50
|
-
self
|
|
51
|
-
object.__setattr__(self,
|
|
50
|
+
object.__setattr__(self, '__errors__', errors)
|
|
51
|
+
object.__setattr__(self, '__valid__', False)
|
|
52
52
|
else:
|
|
53
|
-
object.__setattr__(self,
|
|
53
|
+
object.__setattr__(self, '__valid__', True)
|
|
54
|
+
return
|
|
54
55
|
|
|
55
56
|
@classmethod
|
|
56
57
|
def register_parser(
|