serialite 0.3.2__tar.gz → 0.3.3__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.
- {serialite-0.3.2 → serialite-0.3.3}/PKG-INFO +3 -1
- {serialite-0.3.2 → serialite-0.3.3}/pyproject.toml +3 -1
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_dispatcher.py +20 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/__init__.py +6 -0
- serialite-0.3.3/src/serialite/_implementations/_ordered_set.py +56 -0
- serialite-0.3.3/src/serialite/_implementations/_set.py +54 -0
- {serialite-0.3.2 → serialite-0.3.3}/LICENSE +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/README.md +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/__init__.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_base.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_dataclass.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_decorators.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_descriptors.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_fields_serializer.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_array.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_boolean.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_date_time.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_dictionary.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_float.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_integer.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_json.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_list.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_literal.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_none.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_path.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_reserved.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_string.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_tuple.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_union.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_uuid.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_mixins.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_monkey_patches.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_numeric_check.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_result.py +0 -0
- {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_stable_set.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: serialite
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: A serialization library for Python
|
|
5
5
|
Home-page: https://github.com/drhagen/serialite
|
|
6
6
|
License: MIT
|
|
@@ -18,8 +18,10 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
18
18
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
19
19
|
Provides-Extra: fastapi
|
|
20
20
|
Provides-Extra: numpy
|
|
21
|
+
Provides-Extra: ordered-set
|
|
21
22
|
Requires-Dist: fastapi (>=0.100,<0.101) ; extra == "fastapi"
|
|
22
23
|
Requires-Dist: numpy (>=1.25,<2.0) ; (python_version < "3.13") and (extra == "numpy")
|
|
24
|
+
Requires-Dist: ordered-set (>=4.1,<5.0) ; extra == "ordered-set"
|
|
23
25
|
Requires-Dist: pydantic (>=1.10,<2.0) ; extra == "fastapi"
|
|
24
26
|
Requires-Dist: typing_extensions (>=4.3,<5.0)
|
|
25
27
|
Project-URL: Repository, https://github.com/drhagen/serialite
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "serialite"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.3"
|
|
4
4
|
description = "A serialization library for Python"
|
|
5
5
|
authors = ["David Hagen <david@drhagen.com>"]
|
|
6
6
|
license = "MIT"
|
|
@@ -20,6 +20,7 @@ python = "^3.10"
|
|
|
20
20
|
typing_extensions = "^4.3"
|
|
21
21
|
fastapi = { version = "^0.100", optional = true }
|
|
22
22
|
pydantic = { version = "^1.10", optional = true }
|
|
23
|
+
ordered-set = { version = "^4.1", optional = true }
|
|
23
24
|
# Lie about numpy only being needed below 3.13 in order to satisfy its Python ceiling
|
|
24
25
|
numpy = { version = "^1.25", optional = true, python = "<3.13" }
|
|
25
26
|
|
|
@@ -38,6 +39,7 @@ ruff = ">=0.0.275"
|
|
|
38
39
|
[tool.poetry.extras]
|
|
39
40
|
fastapi = ["fastapi", "pydantic"]
|
|
40
41
|
numpy = ["numpy"]
|
|
42
|
+
ordered-set = ["ordered-set"]
|
|
41
43
|
|
|
42
44
|
|
|
43
45
|
[tool.coverage.run]
|
|
@@ -196,6 +196,13 @@ def list_to_data(cls):
|
|
|
196
196
|
return ListSerializer(serializer(cls.__args__[0]))
|
|
197
197
|
|
|
198
198
|
|
|
199
|
+
@serializer.register(set)
|
|
200
|
+
def set_to_data(cls):
|
|
201
|
+
from ._implementations import SetSerializer
|
|
202
|
+
|
|
203
|
+
return SetSerializer(serializer(cls.__args__[0]))
|
|
204
|
+
|
|
205
|
+
|
|
199
206
|
@serializer.register(tuple)
|
|
200
207
|
def tuple_to_data(cls):
|
|
201
208
|
from ._implementations import TupleSerializer
|
|
@@ -261,3 +268,16 @@ else:
|
|
|
261
268
|
from ._implementations import ArraySerializer
|
|
262
269
|
|
|
263
270
|
return ArraySerializer(dtype=float)
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
try:
|
|
274
|
+
from ordered_set import OrderedSet
|
|
275
|
+
except ImportError:
|
|
276
|
+
pass
|
|
277
|
+
else:
|
|
278
|
+
|
|
279
|
+
@serializer.register(OrderedSet)
|
|
280
|
+
def ordered_set_to_data(cls):
|
|
281
|
+
from ._implementations import OrderedSetSerializer
|
|
282
|
+
|
|
283
|
+
return OrderedSetSerializer(serializer(cls.__args__[0]))
|
|
@@ -13,6 +13,7 @@ from ._literal import LiteralSerializer
|
|
|
13
13
|
from ._none import NoneSerializer
|
|
14
14
|
from ._path import PathSerializer
|
|
15
15
|
from ._reserved import ReservedSerializer
|
|
16
|
+
from ._set import SetSerializer
|
|
16
17
|
from ._string import StringSerializer
|
|
17
18
|
from ._tuple import TupleSerializer
|
|
18
19
|
from ._union import OptionalSerializer, TryUnionSerializer
|
|
@@ -22,3 +23,8 @@ try:
|
|
|
22
23
|
from ._array import ArraySerializer
|
|
23
24
|
except ImportError:
|
|
24
25
|
pass
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
from ._ordered_set import OrderedSetSerializer
|
|
29
|
+
except ImportError:
|
|
30
|
+
pass
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
__all__ = ["OrderedSetSerializer"]
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
from typing import Generic, TypeVar
|
|
5
|
+
|
|
6
|
+
from ordered_set import OrderedSet
|
|
7
|
+
|
|
8
|
+
from .._base import Serializer
|
|
9
|
+
from .._result import DeserializationFailure, DeserializationResult, DeserializationSuccess
|
|
10
|
+
from .._stable_set import StableSet
|
|
11
|
+
|
|
12
|
+
Element = TypeVar("Element")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class OrderedSetSerializer(Generic[Element], Serializer[OrderedSet[Element]]):
|
|
16
|
+
def __init__(self, element_serializer: Serializer[Element]):
|
|
17
|
+
self.element_serializer = element_serializer
|
|
18
|
+
|
|
19
|
+
def from_data(self, data) -> DeserializationResult[OrderedSet[Element]]:
|
|
20
|
+
# Return early if the data isn't even a list
|
|
21
|
+
if not isinstance(data, list):
|
|
22
|
+
return DeserializationFailure(f"Not a valid list: {data!r}")
|
|
23
|
+
|
|
24
|
+
# Validate values
|
|
25
|
+
errors = {}
|
|
26
|
+
values = OrderedSet()
|
|
27
|
+
for i, value in enumerate(data):
|
|
28
|
+
value_or_error = self.element_serializer.from_data(value)
|
|
29
|
+
if isinstance(value_or_error, DeserializationFailure):
|
|
30
|
+
errors[str(i)] = value_or_error.error
|
|
31
|
+
elif value_or_error.value in values:
|
|
32
|
+
errors[str(i)] = (
|
|
33
|
+
f"Duplicated value found: {value_or_error.value!r}. "
|
|
34
|
+
"Expected a list of unique values."
|
|
35
|
+
)
|
|
36
|
+
else:
|
|
37
|
+
values.add(value_or_error.value)
|
|
38
|
+
|
|
39
|
+
if len(errors) > 0:
|
|
40
|
+
return DeserializationFailure(errors)
|
|
41
|
+
else:
|
|
42
|
+
return DeserializationSuccess(values)
|
|
43
|
+
|
|
44
|
+
def to_data(self, value: OrderedSet[Element]):
|
|
45
|
+
if not isinstance(value, OrderedSet):
|
|
46
|
+
raise ValueError(f"Not an OrderedSet: {value!r}")
|
|
47
|
+
|
|
48
|
+
return [self.element_serializer.to_data(item) for item in value]
|
|
49
|
+
|
|
50
|
+
def collect_openapi_models(
|
|
51
|
+
self, parent_models: StableSet[Serializer]
|
|
52
|
+
) -> StableSet[Serializer]:
|
|
53
|
+
return self.element_serializer.collect_openapi_models(parent_models)
|
|
54
|
+
|
|
55
|
+
def to_openapi_schema(self, refs: dict[Serializer, str], force: bool = False):
|
|
56
|
+
return {"type": "array", "items": self.element_serializer.to_openapi_schema(refs)}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
__all__ = ["SetSerializer"]
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
from typing import Generic, TypeVar
|
|
5
|
+
|
|
6
|
+
from .._base import Serializer
|
|
7
|
+
from .._result import DeserializationFailure, DeserializationResult, DeserializationSuccess
|
|
8
|
+
from .._stable_set import StableSet
|
|
9
|
+
|
|
10
|
+
Element = TypeVar("Element")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SetSerializer(Generic[Element], Serializer[set[Element]]):
|
|
14
|
+
def __init__(self, element_serializer: Serializer[Element]):
|
|
15
|
+
self.element_serializer = element_serializer
|
|
16
|
+
|
|
17
|
+
def from_data(self, data) -> DeserializationResult[set[Element]]:
|
|
18
|
+
# Return early if the data isn't even a list
|
|
19
|
+
if not isinstance(data, list):
|
|
20
|
+
return DeserializationFailure(f"Not a valid list: {data!r}")
|
|
21
|
+
|
|
22
|
+
# Validate values
|
|
23
|
+
errors = {}
|
|
24
|
+
values = set()
|
|
25
|
+
for i, value in enumerate(data):
|
|
26
|
+
value_or_error = self.element_serializer.from_data(value)
|
|
27
|
+
if isinstance(value_or_error, DeserializationFailure):
|
|
28
|
+
errors[str(i)] = value_or_error.error
|
|
29
|
+
elif value_or_error.value in values:
|
|
30
|
+
errors[str(i)] = (
|
|
31
|
+
f"Duplicated value found: {value_or_error.value!r}. "
|
|
32
|
+
"Expected a list of unique values."
|
|
33
|
+
)
|
|
34
|
+
else:
|
|
35
|
+
values.add(value_or_error.value)
|
|
36
|
+
|
|
37
|
+
if len(errors) > 0:
|
|
38
|
+
return DeserializationFailure(errors)
|
|
39
|
+
else:
|
|
40
|
+
return DeserializationSuccess(values)
|
|
41
|
+
|
|
42
|
+
def to_data(self, value: set[Element]):
|
|
43
|
+
if not isinstance(value, set):
|
|
44
|
+
raise ValueError(f"Not a set: {value!r}")
|
|
45
|
+
|
|
46
|
+
return [self.element_serializer.to_data(item) for item in value]
|
|
47
|
+
|
|
48
|
+
def collect_openapi_models(
|
|
49
|
+
self, parent_models: StableSet[Serializer]
|
|
50
|
+
) -> StableSet[Serializer]:
|
|
51
|
+
return self.element_serializer.collect_openapi_models(parent_models)
|
|
52
|
+
|
|
53
|
+
def to_openapi_schema(self, refs: dict[Serializer, str], force: bool = False):
|
|
54
|
+
return {"type": "array", "items": self.element_serializer.to_openapi_schema(refs)}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|