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.
Files changed (78) hide show
  1. datamodel/__init__.py +13 -0
  2. datamodel/abstract.py +383 -0
  3. datamodel/adaptive/__init__.py +0 -0
  4. datamodel/adaptive/models.py +598 -0
  5. datamodel/aliases/__init__.py +26 -0
  6. datamodel/base.py +180 -0
  7. datamodel/converters.c +43471 -0
  8. datamodel/converters.cp313-win32.pyd +0 -0
  9. datamodel/converters.html +17387 -0
  10. datamodel/converters.pyx +1489 -0
  11. datamodel/exceptions.c +13455 -0
  12. datamodel/exceptions.cp313-win32.pyd +0 -0
  13. datamodel/exceptions.html +1261 -0
  14. datamodel/exceptions.pxd +13 -0
  15. datamodel/exceptions.pyx +50 -0
  16. datamodel/fields.cp313-win32.pyd +0 -0
  17. datamodel/fields.cpp +17401 -0
  18. datamodel/fields.html +3912 -0
  19. datamodel/fields.pyx +309 -0
  20. datamodel/functions.cp313-win32.pyd +0 -0
  21. datamodel/functions.cpp +9068 -0
  22. datamodel/functions.html +1766 -0
  23. datamodel/functions.pxd +9 -0
  24. datamodel/functions.pyx +82 -0
  25. datamodel/jsonld/__init__.py +45 -0
  26. datamodel/jsonld/models.py +500 -0
  27. datamodel/libs/__init__.py +1 -0
  28. datamodel/libs/mapping.c +15067 -0
  29. datamodel/libs/mapping.cp313-win32.pyd +0 -0
  30. datamodel/libs/mapping.html +2618 -0
  31. datamodel/libs/mapping.pxd +11 -0
  32. datamodel/libs/mapping.pyx +135 -0
  33. datamodel/libs/mutables.py +127 -0
  34. datamodel/models.py +814 -0
  35. datamodel/parsers/__init__.py +0 -0
  36. datamodel/parsers/encoders.py +15 -0
  37. datamodel/parsers/json.cp313-win32.pyd +0 -0
  38. datamodel/parsers/json.cpp +17004 -0
  39. datamodel/parsers/json.html +3365 -0
  40. datamodel/parsers/json.pyx +250 -0
  41. datamodel/profiler.py +21 -0
  42. datamodel/py.typed +0 -0
  43. datamodel/rs_core/Cargo.toml +17 -0
  44. datamodel/rs_core/src/lib.rs +294 -0
  45. datamodel/rs_parsers/Cargo.toml +22 -0
  46. datamodel/rs_parsers/src/lib.rs +571 -0
  47. datamodel/rs_parsers.cp313-win32.pyd +0 -0
  48. datamodel/rs_validators/Cargo.toml +17 -0
  49. datamodel/rs_validators/src/lib.rs +0 -0
  50. datamodel/typedefs/__init__.py +9 -0
  51. datamodel/typedefs/singleton.c +9169 -0
  52. datamodel/typedefs/singleton.cp313-win32.pyd +0 -0
  53. datamodel/typedefs/singleton.html +629 -0
  54. datamodel/typedefs/singleton.pxd +9 -0
  55. datamodel/typedefs/singleton.pyx +24 -0
  56. datamodel/typedefs/types.c +11716 -0
  57. datamodel/typedefs/types.cp313-win32.pyd +0 -0
  58. datamodel/typedefs/types.html +732 -0
  59. datamodel/typedefs/types.pxd +11 -0
  60. datamodel/typedefs/types.pyx +39 -0
  61. datamodel/types.c +7165 -0
  62. datamodel/types.cp313-win32.pyd +0 -0
  63. datamodel/types.html +716 -0
  64. datamodel/types.pyx +100 -0
  65. datamodel/validation.cp313-win32.pyd +0 -0
  66. datamodel/validation.cpp +17085 -0
  67. datamodel/validation.html +4769 -0
  68. datamodel/validation.pyx +315 -0
  69. datamodel/version.py +13 -0
  70. examples/nn/examples.py +311 -0
  71. examples/nn/stores.py +151 -0
  72. examples/tests/sp_types.py +294 -0
  73. examples/tests/speed_dates.py +26 -0
  74. python_datamodel-0.10.1.dist-info/LICENSE +29 -0
  75. python_datamodel-0.10.1.dist-info/METADATA +320 -0
  76. python_datamodel-0.10.1.dist-info/RECORD +78 -0
  77. python_datamodel-0.10.1.dist-info/WHEEL +5 -0
  78. 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