datahold 4.0.0.dev9__tar.gz → 4.0.0.dev10__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 (45) hide show
  1. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/PKG-INFO +3 -7
  2. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/pyproject.toml +3 -7
  3. datahold-4.0.0.dev10/src/datahold/__init__.py +258 -0
  4. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/src/datahold.egg-info/PKG-INFO +3 -7
  5. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/src/datahold.egg-info/SOURCES.txt +12 -7
  6. datahold-4.0.0.dev10/src/datahold.egg-info/requires.txt +1 -0
  7. datahold-4.0.0.dev10/tests/test_FrozenListSlot.py +575 -0
  8. datahold-4.0.0.dev10/tests/test_MutableListHold.py +1022 -0
  9. datahold-4.0.0.dev10/tests/test_abstractmethods.py +34 -0
  10. datahold-4.0.0.dev10/tests/test_all.py +27 -0
  11. datahold-4.0.0.dev10/tests/test_attributes.py +41 -0
  12. datahold-4.0.0.dev10/tests/test_docs.py +39 -0
  13. datahold-4.0.0.dev10/tests/test_generic.py +34 -0
  14. datahold-4.0.0.dev10/tests/test_internal_comparison.py +50 -0
  15. datahold-4.0.0.dev10/tests/test_issubclass.py +29 -0
  16. datahold-4.0.0.dev10/tests/test_nested.py +32 -0
  17. datahold-4.0.0.dev10/tests/test_sorted.py +46 -0
  18. datahold-4.0.0.dev10/tests/test_variance.py +42 -0
  19. datahold-4.0.0.dev10/tests/testdata.toml +237 -0
  20. datahold-4.0.0.dev9/src/datahold/__init__.py +0 -636
  21. datahold-4.0.0.dev9/src/datahold.egg-info/requires.txt +0 -5
  22. datahold-4.0.0.dev9/tests/test_FrozenHoldDict.py +0 -185
  23. datahold-4.0.0.dev9/tests/test_FrozenHoldList.py +0 -201
  24. datahold-4.0.0.dev9/tests/test_FrozenHoldSet.py +0 -246
  25. datahold-4.0.0.dev9/tests/test_HoldDict.py +0 -214
  26. datahold-4.0.0.dev9/tests/test_HoldList.py +0 -262
  27. datahold-4.0.0.dev9/tests/test_HoldSet.py +0 -285
  28. datahold-4.0.0.dev9/tests/test_testdata.py +0 -318
  29. datahold-4.0.0.dev9/tests/testdata.toml +0 -145
  30. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/LICENSE.txt +0 -0
  31. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/MANIFEST.in +0 -0
  32. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/README.rst +0 -0
  33. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v1.1.rst +0 -0
  34. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v1.2.rst +0 -0
  35. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v2.0.rst +0 -0
  36. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v2.1.rst +0 -0
  37. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v2.2.rst +0 -0
  38. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v2.3.rst +0 -0
  39. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v3.0.rst +0 -0
  40. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v4.0.rst +0 -0
  41. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/run_tests.py +0 -0
  42. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/setup.cfg +0 -0
  43. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/src/datahold/py.typed +0 -0
  44. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/src/datahold.egg-info/dependency_links.txt +0 -0
  45. {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/src/datahold.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datahold
3
- Version: 4.0.0.dev9
3
+ Version: 4.0.0.dev10
4
4
  Summary: This project wraps common mutable datastructures for inheritance with modification.
5
5
  Author-email: Johannes <johannes.programming@gmail.com>
6
6
  License-Expression: MIT
@@ -16,14 +16,10 @@ Classifier: Programming Language :: Python
16
16
  Classifier: Programming Language :: Python :: 3
17
17
  Classifier: Programming Language :: Python :: 3 :: Only
18
18
  Classifier: Typing :: Typed
19
- Requires-Python: >=3.12
19
+ Requires-Python: >=3.11
20
20
  Description-Content-Type: text/x-rst
21
21
  License-File: LICENSE.txt
22
- Requires-Dist: cmp3<2,>=1.1
23
- Requires-Dist: copyable<2,>=1.1
24
- Requires-Dist: frozendict<3,>=2.4.6
25
- Requires-Dist: iterprod<2,>=1.1
26
- Requires-Dist: setdoc<2,>=1.3.22
22
+ Requires-Dist: setdoc<2,>=1.3.24
27
23
  Dynamic: license-file
28
24
 
29
25
  ========
@@ -19,11 +19,7 @@ classifiers = [
19
19
  "Typing :: Typed",
20
20
  ]
21
21
  dependencies = [
22
- "cmp3>=1.1,<2",
23
- "copyable>=1.1,<2",
24
- "frozendict>=2.4.6,<3",
25
- "iterprod>=1.1,<2",
26
- "setdoc>=1.3.22,<2",
22
+ "setdoc>=1.3.24,<2",
27
23
  ]
28
24
  description = "This project wraps common mutable datastructures for inheritance with modification."
29
25
  keywords = []
@@ -33,8 +29,8 @@ license-files = [
33
29
  ]
34
30
  name = "datahold"
35
31
  readme = "README.rst"
36
- requires-python = ">=3.12"
37
- version = "4.0.0.dev9"
32
+ requires-python = ">=3.11"
33
+ version = "4.0.0.dev10"
38
34
 
39
35
  [project.urls]
40
36
  Download = "https://pypi.org/project/datahold/#files"
@@ -0,0 +1,258 @@
1
+ """Provide provides base classes for customized collections."""
2
+
3
+ from __future__ import annotations
4
+
5
+ __all__: list[str] = [
6
+ "FrozenListLike",
7
+ "FrozenListSlot",
8
+ "ListLike",
9
+ "ListSlot",
10
+ "MutableListLike",
11
+ "MutableListSlot",
12
+ ]
13
+
14
+ from abc import abstractmethod
15
+ from collections import abc
16
+ from contextlib import contextmanager
17
+ from types import NotImplementedType, TracebackType
18
+ from typing import Any, Optional, Protocol, Self, SupportsIndex, overload
19
+
20
+ import setdoc
21
+
22
+ ### UTILS ###
23
+
24
+ type Slice[Index] = slice[Optional[Index], Optional[Index], Optional[Index]]
25
+
26
+
27
+ ### LIST-LIKE ###
28
+ class ListLike[Item](abc.Sequence[Item]):
29
+ """Provide a base class for customized list-likes."""
30
+
31
+ __slots__ = ()
32
+
33
+ type Frozen[FrozenItem] = tuple[FrozenItem, ...]
34
+ # Frozen has to be tuple to allow covariance
35
+
36
+ type Init[InitItem] = abc.Iterable[InitItem]
37
+
38
+ @setdoc.basic
39
+ def __add__[Item_](
40
+ self: Self, other: ListLike[Item_], /
41
+ ) -> ListLike[Item | Item_]:
42
+ if isinstance(other, ListLike):
43
+ return type(self)(self.__frozen__() + other.__frozen__()) # type: ignore[operator]
44
+ else:
45
+ raise TypeError
46
+
47
+ @setdoc.basic
48
+ def __contains__(self: Self, other: object, /) -> bool:
49
+ return other in self.__frozen__()
50
+
51
+ @setdoc.basic
52
+ def __eq__(self: Self, other: object, /) -> NotImplementedType | bool:
53
+ if isinstance(other, ListLike):
54
+ return self.__frozen__() == other.__frozen__()
55
+ else:
56
+ return NotImplemented
57
+
58
+ @abstractmethod
59
+ @setdoc.basic
60
+ def __frozen__(self: Self, /) -> Frozen[Item]: ...
61
+
62
+ @setdoc.basic
63
+ def __ge__(self: Self, other: ListLike[Any], /) -> bool:
64
+ if isinstance(other, ListLike):
65
+ return self.__frozen__() >= other.__frozen__()
66
+ else:
67
+ return NotImplemented
68
+
69
+ @overload
70
+ @setdoc.basic
71
+ def __getitem__(self: Self, key: SupportsIndex, /) -> Item: ...
72
+
73
+ @overload
74
+ @setdoc.basic
75
+ def __getitem__(self: Self, key: Slice[SupportsIndex], /) -> Self: ...
76
+
77
+ @setdoc.basic
78
+ def __getitem__(
79
+ self: Self,
80
+ key: SupportsIndex | Slice[SupportsIndex],
81
+ /,
82
+ ) -> Item | Self:
83
+ if isinstance(key, SupportsIndex):
84
+ return self.__frozen__()[key]
85
+ else:
86
+ return type(self)(self.__frozen__()[key])
87
+
88
+ @setdoc.basic
89
+ def __gt__(self: Self, other: ListLike[Any], /) -> bool:
90
+ if isinstance(other, ListLike):
91
+ return self.__frozen__() > other.__frozen__()
92
+ else:
93
+ return NotImplemented
94
+
95
+ @abstractmethod
96
+ @setdoc.basic
97
+ def __init__(self: Self, data: Init[Item] = (), /) -> None: ...
98
+
99
+ @setdoc.basic
100
+ def __le__(self: Self, other: ListLike[Any], /) -> bool:
101
+ if isinstance(other, ListLike):
102
+ return self.__frozen__() <= other.__frozen__()
103
+ else:
104
+ return NotImplemented
105
+
106
+ @setdoc.basic
107
+ def __len__(self: Self, /) -> int:
108
+ return len(self.__frozen__())
109
+
110
+ @setdoc.basic
111
+ def __lt__(self: Self, other: ListLike[Any], /) -> bool:
112
+ if isinstance(other, ListLike):
113
+ return self.__frozen__() < other.__frozen__()
114
+ else:
115
+ return NotImplemented
116
+
117
+ @setdoc.basic
118
+ def __mul__(self: Self, other: SupportsIndex, /) -> Self:
119
+ if isinstance(other, SupportsIndex):
120
+ return type(self)(self.__frozen__() * other)
121
+ else:
122
+ raise TypeError
123
+
124
+ __rmul__ = __mul__
125
+
126
+ @setdoc.basic
127
+ def __repr__(self: Self, /) -> str:
128
+ return f"{type(self).__name__}({list(self)!r})"
129
+
130
+
131
+ class ListSlot[Item](ListLike[Item]):
132
+ """Provide slotted list-like class."""
133
+
134
+ __slots__ = ("_slot",)
135
+
136
+ _slot: ListSlot.Frozen[Item]
137
+
138
+ @setdoc.basic
139
+ def __frozen__(self: Self) -> ListSlot.Frozen[Item]:
140
+ return self._slot
141
+
142
+
143
+ class FrozenListLike[Item](ListLike[Item], abc.Hashable):
144
+ """Provide a base class for customized frozen list-likes."""
145
+
146
+ __slots__ = ()
147
+
148
+ @setdoc.basic
149
+ def __hash__(self: Self) -> int:
150
+ return hash(self.__frozen__())
151
+
152
+
153
+ class FrozenListSlot[Item](ListSlot[Item], FrozenListLike[Item]):
154
+ """Provide a base class for customized frozen data-holds."""
155
+
156
+ __slots__ = ()
157
+
158
+ @setdoc.basic
159
+ def __init__(self: Self, data: abc.Iterable[Item] = (), /) -> None:
160
+ self._slot = tuple(data)
161
+
162
+
163
+ class MutableListLike[Item](ListLike[Item], abc.MutableSequence[Item]):
164
+ """Provide a base class for customized mutable list-likes."""
165
+
166
+ __slots__ = ()
167
+
168
+ @setdoc.basic
169
+ class Mutable[MutableItem](Protocol):
170
+ @setdoc.basic
171
+ def __enter__(self: Self, /) -> list[MutableItem]: ...
172
+ @setdoc.basic
173
+ def __exit__(
174
+ self,
175
+ exc_type: type[BaseException] | None,
176
+ exc_value: BaseException | None,
177
+ traceback: TracebackType | None,
178
+ /,
179
+ ) -> object: ...
180
+
181
+ @overload
182
+ @setdoc.basic
183
+ def __delitem__(self: Self, key: SupportsIndex, /) -> None: ...
184
+ @overload
185
+ @setdoc.basic
186
+ def __delitem__(self: Self, key: Slice[SupportsIndex], /) -> None: ...
187
+ @setdoc.basic
188
+ def __delitem__(
189
+ self: Self, key: SupportsIndex | Slice[SupportsIndex], /
190
+ ) -> None:
191
+ with self.__mutable__() as mutable:
192
+ del mutable[key]
193
+
194
+ @setdoc.basic
195
+ def __imul__(self: Self, other: SupportsIndex, /) -> Self:
196
+ with self.__mutable__() as mutable:
197
+ mutable *= other
198
+ return self
199
+
200
+ @setdoc.basic
201
+ def __init__(self: Self, data: abc.Iterable[Item] = (), /) -> None:
202
+ with self.__mutable__() as mutable:
203
+ mutable.extend(data)
204
+
205
+ @abstractmethod
206
+ @setdoc.basic
207
+ def __mutable__(self: Self, /) -> Mutable[Item]: ...
208
+
209
+ @overload
210
+ @setdoc.basic
211
+ def __setitem__(
212
+ self: Self, key: SupportsIndex, value: Item, /
213
+ ) -> None: ...
214
+ @overload
215
+ @setdoc.basic
216
+ def __setitem__(
217
+ self: Self, key: Slice[SupportsIndex], value: abc.Iterable[Item], /
218
+ ) -> None: ...
219
+ @setdoc.basic
220
+ def __setitem__(
221
+ self: Self,
222
+ key: SupportsIndex | Slice[SupportsIndex],
223
+ value: Item | abc.Iterable[Item],
224
+ /,
225
+ ) -> None:
226
+ with self.__mutable__() as mutable:
227
+ mutable[key] = value # type: ignore
228
+
229
+ @setdoc.basic
230
+ def copy(self: Self) -> Self:
231
+ return type(self)(self.__frozen__())
232
+
233
+ @setdoc.basic
234
+ def insert(self: Self, index: SupportsIndex, item: Item, /) -> None:
235
+ with self.__mutable__() as mutable:
236
+ mutable.insert(index, item)
237
+
238
+ @setdoc.basic
239
+ def sort(self: Self, /, *, key: Any = None, reverse: bool = False) -> None:
240
+ # list.sort reveals Overload(
241
+ # def [_T, SupportsRichComparisonT <: _typeshed.SupportsDunderLT[Any] | _typeshed.SupportsDunderGT[Any]] (self: list[SupportsRichComparisonT], *, key: None =, reverse: bool =),
242
+ # def [_T] (self: list[_T], *, key: def (_T) -> _typeshed.SupportsDunderLT[Any] | _typeshed.SupportsDunderGT[Any], reverse: bool =),
243
+ # )
244
+ with self.__mutable__() as mutable:
245
+ mutable.sort(key=key, reverse=reverse)
246
+
247
+
248
+ class MutableListSlot[Item](ListSlot[Item], MutableListLike[Item]):
249
+ """Provide slotted mutable list-like class."""
250
+
251
+ __slots__ = ()
252
+
253
+ @contextmanager
254
+ @setdoc.basic
255
+ def __mutable__(self: Self, /) -> abc.Generator[list[Item], None, None]:
256
+ slot = list(getattr(self, "_slot", ()))
257
+ yield slot
258
+ self._slot = tuple(slot)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datahold
3
- Version: 4.0.0.dev9
3
+ Version: 4.0.0.dev10
4
4
  Summary: This project wraps common mutable datastructures for inheritance with modification.
5
5
  Author-email: Johannes <johannes.programming@gmail.com>
6
6
  License-Expression: MIT
@@ -16,14 +16,10 @@ Classifier: Programming Language :: Python
16
16
  Classifier: Programming Language :: Python :: 3
17
17
  Classifier: Programming Language :: Python :: 3 :: Only
18
18
  Classifier: Typing :: Typed
19
- Requires-Python: >=3.12
19
+ Requires-Python: >=3.11
20
20
  Description-Content-Type: text/x-rst
21
21
  License-File: LICENSE.txt
22
- Requires-Dist: cmp3<2,>=1.1
23
- Requires-Dist: copyable<2,>=1.1
24
- Requires-Dist: frozendict<3,>=2.4.6
25
- Requires-Dist: iterprod<2,>=1.1
26
- Requires-Dist: setdoc<2,>=1.3.22
22
+ Requires-Dist: setdoc<2,>=1.3.24
27
23
  Dynamic: license-file
28
24
 
29
25
  ========
@@ -19,11 +19,16 @@ src/datahold.egg-info/SOURCES.txt
19
19
  src/datahold.egg-info/dependency_links.txt
20
20
  src/datahold.egg-info/requires.txt
21
21
  src/datahold.egg-info/top_level.txt
22
- tests/test_FrozenHoldDict.py
23
- tests/test_FrozenHoldList.py
24
- tests/test_FrozenHoldSet.py
25
- tests/test_HoldDict.py
26
- tests/test_HoldList.py
27
- tests/test_HoldSet.py
28
- tests/test_testdata.py
22
+ tests/test_FrozenListSlot.py
23
+ tests/test_MutableListHold.py
24
+ tests/test_abstractmethods.py
25
+ tests/test_all.py
26
+ tests/test_attributes.py
27
+ tests/test_docs.py
28
+ tests/test_generic.py
29
+ tests/test_internal_comparison.py
30
+ tests/test_issubclass.py
31
+ tests/test_nested.py
32
+ tests/test_sorted.py
33
+ tests/test_variance.py
29
34
  tests/testdata.toml
@@ -0,0 +1 @@
1
+ setdoc<2,>=1.3.24