python-datamodel 0.10.1__cp313-cp313-win32.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.
- datamodel/__init__.py +13 -0
- datamodel/abstract.py +383 -0
- datamodel/adaptive/__init__.py +0 -0
- datamodel/adaptive/models.py +598 -0
- datamodel/aliases/__init__.py +26 -0
- datamodel/base.py +180 -0
- datamodel/converters.c +43471 -0
- datamodel/converters.cp313-win32.pyd +0 -0
- datamodel/converters.html +17387 -0
- datamodel/converters.pyx +1489 -0
- datamodel/exceptions.c +13455 -0
- datamodel/exceptions.cp313-win32.pyd +0 -0
- datamodel/exceptions.html +1261 -0
- datamodel/exceptions.pxd +13 -0
- datamodel/exceptions.pyx +50 -0
- datamodel/fields.cp313-win32.pyd +0 -0
- datamodel/fields.cpp +17401 -0
- datamodel/fields.html +3912 -0
- datamodel/fields.pyx +309 -0
- datamodel/functions.cp313-win32.pyd +0 -0
- datamodel/functions.cpp +9068 -0
- datamodel/functions.html +1766 -0
- datamodel/functions.pxd +9 -0
- datamodel/functions.pyx +82 -0
- datamodel/jsonld/__init__.py +45 -0
- datamodel/jsonld/models.py +500 -0
- datamodel/libs/__init__.py +1 -0
- datamodel/libs/mapping.c +15067 -0
- datamodel/libs/mapping.cp313-win32.pyd +0 -0
- datamodel/libs/mapping.html +2618 -0
- datamodel/libs/mapping.pxd +11 -0
- datamodel/libs/mapping.pyx +135 -0
- datamodel/libs/mutables.py +127 -0
- datamodel/models.py +814 -0
- datamodel/parsers/__init__.py +0 -0
- datamodel/parsers/encoders.py +15 -0
- datamodel/parsers/json.cp313-win32.pyd +0 -0
- datamodel/parsers/json.cpp +17004 -0
- datamodel/parsers/json.html +3365 -0
- datamodel/parsers/json.pyx +250 -0
- datamodel/profiler.py +21 -0
- datamodel/py.typed +0 -0
- datamodel/rs_core/Cargo.toml +17 -0
- datamodel/rs_core/src/lib.rs +294 -0
- datamodel/rs_parsers/Cargo.toml +22 -0
- datamodel/rs_parsers/src/lib.rs +571 -0
- datamodel/rs_parsers.cp313-win32.pyd +0 -0
- datamodel/rs_validators/Cargo.toml +17 -0
- datamodel/rs_validators/src/lib.rs +0 -0
- datamodel/typedefs/__init__.py +9 -0
- datamodel/typedefs/singleton.c +9169 -0
- datamodel/typedefs/singleton.cp313-win32.pyd +0 -0
- datamodel/typedefs/singleton.html +629 -0
- datamodel/typedefs/singleton.pxd +9 -0
- datamodel/typedefs/singleton.pyx +24 -0
- datamodel/typedefs/types.c +11716 -0
- datamodel/typedefs/types.cp313-win32.pyd +0 -0
- datamodel/typedefs/types.html +732 -0
- datamodel/typedefs/types.pxd +11 -0
- datamodel/typedefs/types.pyx +39 -0
- datamodel/types.c +7165 -0
- datamodel/types.cp313-win32.pyd +0 -0
- datamodel/types.html +716 -0
- datamodel/types.pyx +100 -0
- datamodel/validation.cp313-win32.pyd +0 -0
- datamodel/validation.cpp +17085 -0
- datamodel/validation.html +4769 -0
- datamodel/validation.pyx +315 -0
- datamodel/version.py +13 -0
- examples/nn/examples.py +311 -0
- examples/nn/stores.py +151 -0
- examples/tests/sp_types.py +294 -0
- examples/tests/speed_dates.py +26 -0
- python_datamodel-0.10.1.dist-info/LICENSE +29 -0
- python_datamodel-0.10.1.dist-info/METADATA +320 -0
- python_datamodel-0.10.1.dist-info/RECORD +78 -0
- python_datamodel-0.10.1.dist-info/WHEEL +5 -0
- python_datamodel-0.10.1.dist-info/top_level.txt +7 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# cython: language_level=3, embedsignature=True, boundscheck=False, wraparound=False, initializedcheck=False
|
|
2
|
+
# Copyright (C) 2018-present Jesus Lara
|
|
3
|
+
|
|
4
|
+
cdef class ClassDictConfig:
|
|
5
|
+
pass
|
|
6
|
+
|
|
7
|
+
cdef class ClassDict(dict):
|
|
8
|
+
cdef dict mapping
|
|
9
|
+
cdef list _columns
|
|
10
|
+
cdef object default
|
|
11
|
+
cdef ClassDictConfig config
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# cython: language_level=3, embedsignature=True, boundscheck=False, wraparound=False, initializedcheck=False
|
|
2
|
+
# Copyright (C) 2018-present Jesus Lara
|
|
3
|
+
#
|
|
4
|
+
import sys
|
|
5
|
+
from typing import Optional, Union, Any
|
|
6
|
+
from collections.abc import Iterator, Iterable
|
|
7
|
+
if sys.version_info < (3, 10):
|
|
8
|
+
from typing_extensions import ParamSpec, TypedDict, get_type_hints
|
|
9
|
+
else:
|
|
10
|
+
from typing import ParamSpec, TypedDict
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
P = ParamSpec("P")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
cdef class ClassDict(dict):
|
|
17
|
+
"""
|
|
18
|
+
ClassDict is a dictionary that allows to access keys as attributes
|
|
19
|
+
"""
|
|
20
|
+
def __cinit__(
|
|
21
|
+
self,
|
|
22
|
+
*args: P.args,
|
|
23
|
+
data: Optional[dict]=None,
|
|
24
|
+
default: Optional[Union[list,dict]]=None,
|
|
25
|
+
**kwargs: P.kwargs
|
|
26
|
+
):
|
|
27
|
+
self.mapping = {}
|
|
28
|
+
self._columns = []
|
|
29
|
+
self.default = default
|
|
30
|
+
self.mapping.update(*args, **kwargs)
|
|
31
|
+
self.update(data, **kwargs)
|
|
32
|
+
|
|
33
|
+
def update(self, items: Optional[dict]=None, **kwargs: P.kwargs):
|
|
34
|
+
if isinstance(items, dict):
|
|
35
|
+
for key, value in items.items():
|
|
36
|
+
self.mapping[key] = value
|
|
37
|
+
else:
|
|
38
|
+
for k, v in kwargs.items():
|
|
39
|
+
attr = getattr(self, k, None)
|
|
40
|
+
if fn := getattr(attr, 'default', None):
|
|
41
|
+
try:
|
|
42
|
+
if callable(fn):
|
|
43
|
+
v = fn(v)
|
|
44
|
+
else:
|
|
45
|
+
v = fn
|
|
46
|
+
setattr(self, k, v)
|
|
47
|
+
except (TypeError, KeyError):
|
|
48
|
+
pass
|
|
49
|
+
self.mapping[k] = v
|
|
50
|
+
self._columns = list(self.mapping.keys())
|
|
51
|
+
|
|
52
|
+
def __missing__(self, key):
|
|
53
|
+
return self.default
|
|
54
|
+
|
|
55
|
+
def __len__(self):
|
|
56
|
+
return len(self.mapping)
|
|
57
|
+
|
|
58
|
+
def __str__(self):
|
|
59
|
+
return f"<{type(self).__name__}({self.mapping})>"
|
|
60
|
+
|
|
61
|
+
def __repr__(self):
|
|
62
|
+
return f"<{type(self).__name__}({self.mapping})>"
|
|
63
|
+
|
|
64
|
+
def __contains__(self, key):
|
|
65
|
+
return key in self._columns
|
|
66
|
+
|
|
67
|
+
def get(self, key, default=None):
|
|
68
|
+
return self.mapping.get(key, default)
|
|
69
|
+
|
|
70
|
+
def __delitem__(self, key):
|
|
71
|
+
if key in self.mapping:
|
|
72
|
+
self.mapping.pop(key, None)
|
|
73
|
+
self._columns.remove(key)
|
|
74
|
+
if hasattr(self, key):
|
|
75
|
+
setattr(self, key, None)
|
|
76
|
+
else:
|
|
77
|
+
raise KeyError(key)
|
|
78
|
+
|
|
79
|
+
def __setitem__(self, key, value):
|
|
80
|
+
self.mapping[key] = value
|
|
81
|
+
if key not in self._columns:
|
|
82
|
+
self._columns.append(key)
|
|
83
|
+
|
|
84
|
+
def __getitem__(self, key):
|
|
85
|
+
if isinstance(key, list):
|
|
86
|
+
return [self.mapping[k] for k in key]
|
|
87
|
+
try:
|
|
88
|
+
try:
|
|
89
|
+
return self.mapping[key]
|
|
90
|
+
except KeyError:
|
|
91
|
+
return None
|
|
92
|
+
except KeyError:
|
|
93
|
+
return self.default
|
|
94
|
+
|
|
95
|
+
def keys(self):
|
|
96
|
+
return self.mapping.keys()
|
|
97
|
+
|
|
98
|
+
def values(self):
|
|
99
|
+
return self.mapping.values()
|
|
100
|
+
|
|
101
|
+
def items(self):
|
|
102
|
+
return self.mapping.items()
|
|
103
|
+
|
|
104
|
+
def pop(self, key, default=None):
|
|
105
|
+
try:
|
|
106
|
+
value = self[key]
|
|
107
|
+
del self[key]
|
|
108
|
+
return value
|
|
109
|
+
except KeyError:
|
|
110
|
+
return default
|
|
111
|
+
|
|
112
|
+
def clear(self):
|
|
113
|
+
self.mapping.clear()
|
|
114
|
+
self._columns = []
|
|
115
|
+
|
|
116
|
+
def __iter__(self) -> Iterator:
|
|
117
|
+
for value in self.mapping:
|
|
118
|
+
yield value
|
|
119
|
+
|
|
120
|
+
def __getattr__(self, attr: str) -> Any:
|
|
121
|
+
"""
|
|
122
|
+
Attributes for dict keys
|
|
123
|
+
"""
|
|
124
|
+
if attr in self.mapping:
|
|
125
|
+
return self.mapping[attr]
|
|
126
|
+
elif attr in self._columns:
|
|
127
|
+
return self.mapping[attr]
|
|
128
|
+
|
|
129
|
+
raise KeyError(
|
|
130
|
+
f"User Error: invalid field name {attr} on {self.mapping!r}"
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
def __delattr__(self, name: str) -> None:
|
|
134
|
+
if name in self.mapping:
|
|
135
|
+
self.pop(name, None)
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from collections.abc import MutableMapping, Iterator, Iterable
|
|
3
|
+
from typing import Any, Optional, Union, Literal
|
|
4
|
+
from typing_extensions import TypedDict
|
|
5
|
+
from datamodel import Field
|
|
6
|
+
|
|
7
|
+
if sys.version_info < (3, 10):
|
|
8
|
+
from typing_extensions import ParamSpec
|
|
9
|
+
else:
|
|
10
|
+
from typing import ParamSpec
|
|
11
|
+
P = ParamSpec("P")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ClassDictConfig(TypedDict, total=False):
|
|
15
|
+
"""
|
|
16
|
+
Configuration dictionary for ClassDict-based classes.
|
|
17
|
+
`total=False` means all keys are optional.
|
|
18
|
+
"""
|
|
19
|
+
extra: Literal['allow', 'ignore', 'forbid']
|
|
20
|
+
validate_assignment: bool
|
|
21
|
+
parse_values: bool
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ClassDict(dict, MutableMapping):
|
|
25
|
+
"""ClassDict.
|
|
26
|
+
|
|
27
|
+
Mapping that works like both a simple Dictionary or a Mutable Object.
|
|
28
|
+
"""
|
|
29
|
+
def __init__(self, *args: P.args, data: Optional[Union[tuple, dict]] = None, default: Any = None, **kwargs: P.kwargs): # noqa
|
|
30
|
+
self._columns: list = []
|
|
31
|
+
self.mapping = {}
|
|
32
|
+
self.default = default
|
|
33
|
+
self.mapping.update(*args, **kwargs)
|
|
34
|
+
self.update(data, **kwargs)
|
|
35
|
+
|
|
36
|
+
def update(self, items: Optional[Iterable] = None, **kwargs): # pylint: disable=W0221 # noqa
|
|
37
|
+
if isinstance(items, dict):
|
|
38
|
+
for key, value in items.items():
|
|
39
|
+
# self.mapping[key] = value
|
|
40
|
+
self.mapping[key] = value
|
|
41
|
+
else:
|
|
42
|
+
for k, v in kwargs.items():
|
|
43
|
+
attr = getattr(self, k)
|
|
44
|
+
if isinstance(attr, Field):
|
|
45
|
+
try:
|
|
46
|
+
fn = attr.default
|
|
47
|
+
if callable(fn):
|
|
48
|
+
v = fn(v)
|
|
49
|
+
setattr(self, k, v)
|
|
50
|
+
else:
|
|
51
|
+
setattr(self, k, fn)
|
|
52
|
+
except KeyError:
|
|
53
|
+
pass
|
|
54
|
+
# self.mapping[k] = v
|
|
55
|
+
self.mapping[k] = v
|
|
56
|
+
self._columns = list(self.mapping.keys())
|
|
57
|
+
|
|
58
|
+
def __missing__(self, key):
|
|
59
|
+
return self.default
|
|
60
|
+
|
|
61
|
+
def items(self) -> zip: # type: ignore
|
|
62
|
+
return zip(self._columns, self.mapping)
|
|
63
|
+
|
|
64
|
+
def keys(self) -> list:
|
|
65
|
+
return self._columns
|
|
66
|
+
|
|
67
|
+
def set(self, key, value) -> None:
|
|
68
|
+
self.mapping[key] = value
|
|
69
|
+
if key not in self._columns:
|
|
70
|
+
self._columns.append(key)
|
|
71
|
+
|
|
72
|
+
### Section: Simple magic methods
|
|
73
|
+
def __len__(self) -> int:
|
|
74
|
+
return len(self.mapping)
|
|
75
|
+
|
|
76
|
+
def __str__(self) -> str:
|
|
77
|
+
return f"<{type(self).__name__}({self.mapping})>"
|
|
78
|
+
|
|
79
|
+
def __repr__(self) -> str:
|
|
80
|
+
return f"<{type(self).__name__}({self.mapping})>"
|
|
81
|
+
|
|
82
|
+
def __contains__(self, key: str) -> bool:
|
|
83
|
+
return key in self._columns
|
|
84
|
+
|
|
85
|
+
def __delitem__(self, key) -> None:
|
|
86
|
+
value = self[key]
|
|
87
|
+
del self.mapping[key]
|
|
88
|
+
self._columns.remove(key)
|
|
89
|
+
self.pop(value, None)
|
|
90
|
+
|
|
91
|
+
def __delattr__(self, name: str) -> None:
|
|
92
|
+
value = self[name]
|
|
93
|
+
del self.mapping[name]
|
|
94
|
+
self._columns.remove(name)
|
|
95
|
+
self.pop(value, None)
|
|
96
|
+
|
|
97
|
+
def __setitem__(self, key, value):
|
|
98
|
+
self.mapping[key] = value
|
|
99
|
+
if key not in self._columns:
|
|
100
|
+
self._columns.append(key)
|
|
101
|
+
|
|
102
|
+
def __getitem__(self, key: Union[str, int]) -> Any:
|
|
103
|
+
"""
|
|
104
|
+
Sequence-like operators
|
|
105
|
+
"""
|
|
106
|
+
try:
|
|
107
|
+
return self.mapping[key]
|
|
108
|
+
except (KeyError, TypeError):
|
|
109
|
+
return None
|
|
110
|
+
|
|
111
|
+
def __getattr__(self, attr: str) -> Any:
|
|
112
|
+
"""
|
|
113
|
+
Attributes for dict keys
|
|
114
|
+
"""
|
|
115
|
+
try:
|
|
116
|
+
return self.__getitem__(attr)
|
|
117
|
+
except KeyError as ex:
|
|
118
|
+
raise KeyError(
|
|
119
|
+
f"User Error: invalid field name {attr} on {self.mapping!r}"
|
|
120
|
+
) from ex
|
|
121
|
+
except TypeError as ex:
|
|
122
|
+
raise TypeError(
|
|
123
|
+
f"User Error: invalid attribute value on {self.mapping!r} for {attr}"
|
|
124
|
+
) from ex
|
|
125
|
+
|
|
126
|
+
def __iter__(self) -> Iterator:
|
|
127
|
+
yield from self.mapping
|