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
datamodel/fields.pyx
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
# cython: language_level=3, embedsignature=True, initializedcheck=False
|
|
2
|
+
# Copyright (C) 2018-present Jesus Lara
|
|
3
|
+
#
|
|
4
|
+
from sys import version_info
|
|
5
|
+
from typing import (
|
|
6
|
+
Optional,
|
|
7
|
+
Union,
|
|
8
|
+
Any
|
|
9
|
+
)
|
|
10
|
+
from functools import wraps
|
|
11
|
+
from collections.abc import Callable
|
|
12
|
+
from dataclasses import (
|
|
13
|
+
_FIELD,
|
|
14
|
+
MISSING,
|
|
15
|
+
_MISSING_TYPE,
|
|
16
|
+
_EMPTY_METADATA
|
|
17
|
+
)
|
|
18
|
+
from dataclasses import Field as ff
|
|
19
|
+
import _thread
|
|
20
|
+
from types import FunctionType, GenericAlias, MappingProxyType
|
|
21
|
+
from datamodel.types import (
|
|
22
|
+
DB_TYPES
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def fields(obj: Any):
|
|
27
|
+
"""Return a tuple describing the fields of this dataclass.
|
|
28
|
+
|
|
29
|
+
Accepts a dataclass or an instance of one. Tuple elements are of
|
|
30
|
+
type Field.
|
|
31
|
+
"""
|
|
32
|
+
# Might it be worth caching this, per class?
|
|
33
|
+
try:
|
|
34
|
+
_fields = getattr(obj, '__dataclass_fields__')
|
|
35
|
+
except AttributeError as exc:
|
|
36
|
+
raise TypeError(
|
|
37
|
+
'must be called with a dataclass type or instance'
|
|
38
|
+
) from exc
|
|
39
|
+
# Exclude pseudo-fields. Note that fields is sorted by insertion
|
|
40
|
+
# order, so the order of the tuple is as the fields were defined.
|
|
41
|
+
return tuple(f for f in _fields.values() if f._field_type is _FIELD)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# This function's logic is copied from "recursive_repr" function in
|
|
45
|
+
# reprlib module to avoid dependency.
|
|
46
|
+
def _recursive_repr(user_function):
|
|
47
|
+
# Decorator to make a repr function return "..." for a recursive
|
|
48
|
+
# call.
|
|
49
|
+
repr_running = set()
|
|
50
|
+
|
|
51
|
+
@wraps(user_function)
|
|
52
|
+
def wrapper(self):
|
|
53
|
+
key = id(self), _thread.get_ident()
|
|
54
|
+
if key in repr_running:
|
|
55
|
+
return '...'
|
|
56
|
+
repr_running.add(key)
|
|
57
|
+
try:
|
|
58
|
+
result = user_function(self)
|
|
59
|
+
finally:
|
|
60
|
+
repr_running.discard(key)
|
|
61
|
+
return result
|
|
62
|
+
return wrapper
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class Field(ff):
|
|
66
|
+
"""
|
|
67
|
+
Field.
|
|
68
|
+
description: Extending Field definition from Dataclass Field to DataModel.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
__slots__ = (
|
|
72
|
+
'is_dc',
|
|
73
|
+
'is_primitive',
|
|
74
|
+
'is_typing',
|
|
75
|
+
'origin',
|
|
76
|
+
'args',
|
|
77
|
+
'type_args',
|
|
78
|
+
'name',
|
|
79
|
+
'type',
|
|
80
|
+
'_type_category',
|
|
81
|
+
'description',
|
|
82
|
+
'default',
|
|
83
|
+
'default_factory',
|
|
84
|
+
'_typeinfo_',
|
|
85
|
+
'repr',
|
|
86
|
+
'hash',
|
|
87
|
+
'init',
|
|
88
|
+
'compare',
|
|
89
|
+
'metadata',
|
|
90
|
+
'_meta',
|
|
91
|
+
'kw_only',
|
|
92
|
+
'_field_type', # Private: not to be used by user code.
|
|
93
|
+
'_typing_args',
|
|
94
|
+
'_inner_origin',
|
|
95
|
+
'_inner_type',
|
|
96
|
+
'_inner_is_dc',
|
|
97
|
+
'validator',
|
|
98
|
+
'_required',
|
|
99
|
+
'_nullable',
|
|
100
|
+
'_primary',
|
|
101
|
+
'_dbtype',
|
|
102
|
+
'_alias',
|
|
103
|
+
'_pattern',
|
|
104
|
+
'gt',
|
|
105
|
+
'eq',
|
|
106
|
+
'lt',
|
|
107
|
+
'le',
|
|
108
|
+
'ge',
|
|
109
|
+
'schema_extra',
|
|
110
|
+
'alias',
|
|
111
|
+
'_encoder_fn',
|
|
112
|
+
'parser'
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
def __init__(
|
|
116
|
+
self,
|
|
117
|
+
default: Optional[Union[Any, Callable]] = None,
|
|
118
|
+
nullable: bool = True,
|
|
119
|
+
required: bool = False,
|
|
120
|
+
factory: Optional[Callable] = None,
|
|
121
|
+
min: Union[int, float] = None,
|
|
122
|
+
max: Union[int, float] = None,
|
|
123
|
+
validator: Optional[Callable] = None,
|
|
124
|
+
pattern: Optional[str] = None,
|
|
125
|
+
alias: Optional[str] = None,
|
|
126
|
+
kw_only: bool = False,
|
|
127
|
+
**kwargs,
|
|
128
|
+
):
|
|
129
|
+
self.name = None
|
|
130
|
+
self.type = None
|
|
131
|
+
self._typeinfo_ = {}
|
|
132
|
+
self._type_category = 'complex'
|
|
133
|
+
self.parser: Optional[callable] = None
|
|
134
|
+
self.is_dc: bool = False
|
|
135
|
+
self.is_primitive: bool = False
|
|
136
|
+
self._encoder_fn: Optional[callable] = None
|
|
137
|
+
self.validator: Optional[callable] = None
|
|
138
|
+
self._typing_args = None
|
|
139
|
+
self._inner_type = None
|
|
140
|
+
self._inner_is_dc = None
|
|
141
|
+
self._inner_origin = None
|
|
142
|
+
self.is_typing: bool = False
|
|
143
|
+
self.type_args: Any = None
|
|
144
|
+
self.origin: Any = None
|
|
145
|
+
self.args: Any = None
|
|
146
|
+
self.compare = kwargs.pop("compare", True)
|
|
147
|
+
self.init = kwargs.pop("init", True)
|
|
148
|
+
self.repr = kwargs.pop("repr", True)
|
|
149
|
+
self.hash = kwargs.pop("hash", True)
|
|
150
|
+
self.default = default
|
|
151
|
+
self._nullable = nullable
|
|
152
|
+
self.kw_only = kw_only
|
|
153
|
+
# set field type and dbtype
|
|
154
|
+
self._field_type = None
|
|
155
|
+
self._dbtype = kwargs.pop("db_type", None)
|
|
156
|
+
self._required = required
|
|
157
|
+
self.description = kwargs.pop('description', None)
|
|
158
|
+
self._primary = kwargs.pop('primary_key', False)
|
|
159
|
+
self._alias = alias
|
|
160
|
+
self._pattern = pattern
|
|
161
|
+
meta = {
|
|
162
|
+
"required": required,
|
|
163
|
+
"nullable": nullable,
|
|
164
|
+
"primary": self._primary,
|
|
165
|
+
"validator": validator,
|
|
166
|
+
"alias": self._alias
|
|
167
|
+
}
|
|
168
|
+
_range = {}
|
|
169
|
+
if min is not None:
|
|
170
|
+
_range["min"] = min
|
|
171
|
+
if max is not None:
|
|
172
|
+
_range["max"] = max
|
|
173
|
+
# representation:
|
|
174
|
+
if required is True:
|
|
175
|
+
self.init = True
|
|
176
|
+
if self.init is False:
|
|
177
|
+
self.repr = False
|
|
178
|
+
metadata = kwargs.pop("metadata", {})
|
|
179
|
+
meta = {**meta, **metadata}
|
|
180
|
+
## Encoder, decoder and widget:
|
|
181
|
+
meta["widget"] = kwargs.pop('widget', {})
|
|
182
|
+
# Encoder and Decoder:
|
|
183
|
+
meta["encoder"] = kwargs.pop('encoder', None)
|
|
184
|
+
meta["decoder"] = kwargs.pop('decoder', None)
|
|
185
|
+
# Future TODO: add more json-schema attributes
|
|
186
|
+
self.schema_extra = kwargs.pop('schema_extra', None)
|
|
187
|
+
## field is read-only
|
|
188
|
+
meta["readonly"] = bool(kwargs.pop('readonly', False))
|
|
189
|
+
self._meta = {**meta, **_range, **kwargs}
|
|
190
|
+
self.default_factory = MISSING
|
|
191
|
+
if default is None:
|
|
192
|
+
## Default Factory:
|
|
193
|
+
default_factory = kwargs.get('default_factory', None)
|
|
194
|
+
if factory is not None and default_factory is not None:
|
|
195
|
+
raise ValueError(
|
|
196
|
+
"Cannot specify both factory and default_factory"
|
|
197
|
+
)
|
|
198
|
+
if factory is not None:
|
|
199
|
+
self.default_factory = factory
|
|
200
|
+
self.default = MISSING
|
|
201
|
+
elif default_factory is not None:
|
|
202
|
+
self.default_factory = default_factory
|
|
203
|
+
if self.default_factory is not MISSING:
|
|
204
|
+
self.default = MISSING
|
|
205
|
+
args = {
|
|
206
|
+
"init": self.init,
|
|
207
|
+
"repr": self.repr,
|
|
208
|
+
"hash": self.hash,
|
|
209
|
+
"compare": self.compare,
|
|
210
|
+
"metadata": self._meta,
|
|
211
|
+
"kw_only": self.kw_only
|
|
212
|
+
}
|
|
213
|
+
ff.__init__(
|
|
214
|
+
self,
|
|
215
|
+
default=self.default,
|
|
216
|
+
default_factory=self.default_factory,
|
|
217
|
+
**args
|
|
218
|
+
)
|
|
219
|
+
# set field type and dbtype
|
|
220
|
+
self._field_type = self.type
|
|
221
|
+
|
|
222
|
+
@_recursive_repr
|
|
223
|
+
def __repr__(self):
|
|
224
|
+
if self._alias is None:
|
|
225
|
+
return (
|
|
226
|
+
"Field("
|
|
227
|
+
f"column={self.name!r}, "
|
|
228
|
+
f"type={self.type!r}, "
|
|
229
|
+
f"default={self.default!r})"
|
|
230
|
+
)
|
|
231
|
+
return (
|
|
232
|
+
"Field("
|
|
233
|
+
f"column={self.name!r}, "
|
|
234
|
+
f"type={self.type!r}, "
|
|
235
|
+
f"alias={self._alias!r}, "
|
|
236
|
+
f"default={self.default!r})"
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
def get_metadata(self) -> dict:
|
|
240
|
+
return self._meta
|
|
241
|
+
|
|
242
|
+
def required(self) -> bool:
|
|
243
|
+
return self._required
|
|
244
|
+
|
|
245
|
+
def nullable(self) -> bool:
|
|
246
|
+
return self._nullable
|
|
247
|
+
|
|
248
|
+
def get_dbtype(self):
|
|
249
|
+
return self._dbtype
|
|
250
|
+
|
|
251
|
+
def to_dict(self):
|
|
252
|
+
return {
|
|
253
|
+
"name": self.name,
|
|
254
|
+
"type": str(self.type),
|
|
255
|
+
"default": self.default,
|
|
256
|
+
"required": self._required,
|
|
257
|
+
"primary": self._primary
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
def db_type(self):
|
|
261
|
+
if self._dbtype is not None:
|
|
262
|
+
if self._dbtype == "array":
|
|
263
|
+
t = DB_TYPES[self.type]
|
|
264
|
+
return f"{t}[]"
|
|
265
|
+
else:
|
|
266
|
+
return self._dbtype
|
|
267
|
+
else:
|
|
268
|
+
try:
|
|
269
|
+
return DB_TYPES[self.type]
|
|
270
|
+
except KeyError:
|
|
271
|
+
return 'varchar'
|
|
272
|
+
|
|
273
|
+
@property
|
|
274
|
+
def typeinfo(self) -> dict:
|
|
275
|
+
return self._typeinfo_
|
|
276
|
+
|
|
277
|
+
@property
|
|
278
|
+
def primary_key(self):
|
|
279
|
+
return self._primary
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def Column(
|
|
283
|
+
default: Optional[Callable] = None,
|
|
284
|
+
nullable: bool = True,
|
|
285
|
+
required: bool = False,
|
|
286
|
+
factory: Optional[Callable] = None,
|
|
287
|
+
min: Union[int, float] = None,
|
|
288
|
+
max: Union[int, float] = None,
|
|
289
|
+
validator: Optional[Callable] = None,
|
|
290
|
+
kw_only: bool = False,
|
|
291
|
+
alias: Optional[str] = None,
|
|
292
|
+
**kwargs
|
|
293
|
+
):
|
|
294
|
+
"""
|
|
295
|
+
Column.
|
|
296
|
+
DataModel Function that returns a Field() object
|
|
297
|
+
"""
|
|
298
|
+
return Field(
|
|
299
|
+
default=default,
|
|
300
|
+
nullable=nullable,
|
|
301
|
+
required=required,
|
|
302
|
+
factory=factory,
|
|
303
|
+
min=min,
|
|
304
|
+
max=max,
|
|
305
|
+
validator=validator,
|
|
306
|
+
kw_only=kw_only,
|
|
307
|
+
alias=alias,
|
|
308
|
+
**kwargs,
|
|
309
|
+
)
|
|
Binary file
|