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.
Files changed (35) hide show
  1. {serialite-0.3.2 → serialite-0.3.3}/PKG-INFO +3 -1
  2. {serialite-0.3.2 → serialite-0.3.3}/pyproject.toml +3 -1
  3. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_dispatcher.py +20 -0
  4. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/__init__.py +6 -0
  5. serialite-0.3.3/src/serialite/_implementations/_ordered_set.py +56 -0
  6. serialite-0.3.3/src/serialite/_implementations/_set.py +54 -0
  7. {serialite-0.3.2 → serialite-0.3.3}/LICENSE +0 -0
  8. {serialite-0.3.2 → serialite-0.3.3}/README.md +0 -0
  9. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/__init__.py +0 -0
  10. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_base.py +0 -0
  11. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_dataclass.py +0 -0
  12. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_decorators.py +0 -0
  13. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_descriptors.py +0 -0
  14. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_fields_serializer.py +0 -0
  15. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_array.py +0 -0
  16. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_boolean.py +0 -0
  17. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_date_time.py +0 -0
  18. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_dictionary.py +0 -0
  19. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_float.py +0 -0
  20. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_integer.py +0 -0
  21. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_json.py +0 -0
  22. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_list.py +0 -0
  23. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_literal.py +0 -0
  24. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_none.py +0 -0
  25. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_path.py +0 -0
  26. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_reserved.py +0 -0
  27. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_string.py +0 -0
  28. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_tuple.py +0 -0
  29. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_union.py +0 -0
  30. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_implementations/_uuid.py +0 -0
  31. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_mixins.py +0 -0
  32. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_monkey_patches.py +0 -0
  33. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_numeric_check.py +0 -0
  34. {serialite-0.3.2 → serialite-0.3.3}/src/serialite/_result.py +0 -0
  35. {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.2
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.2"
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