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.
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/PKG-INFO +3 -7
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/pyproject.toml +3 -7
- datahold-4.0.0.dev10/src/datahold/__init__.py +258 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/src/datahold.egg-info/PKG-INFO +3 -7
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/src/datahold.egg-info/SOURCES.txt +12 -7
- datahold-4.0.0.dev10/src/datahold.egg-info/requires.txt +1 -0
- datahold-4.0.0.dev10/tests/test_FrozenListSlot.py +575 -0
- datahold-4.0.0.dev10/tests/test_MutableListHold.py +1022 -0
- datahold-4.0.0.dev10/tests/test_abstractmethods.py +34 -0
- datahold-4.0.0.dev10/tests/test_all.py +27 -0
- datahold-4.0.0.dev10/tests/test_attributes.py +41 -0
- datahold-4.0.0.dev10/tests/test_docs.py +39 -0
- datahold-4.0.0.dev10/tests/test_generic.py +34 -0
- datahold-4.0.0.dev10/tests/test_internal_comparison.py +50 -0
- datahold-4.0.0.dev10/tests/test_issubclass.py +29 -0
- datahold-4.0.0.dev10/tests/test_nested.py +32 -0
- datahold-4.0.0.dev10/tests/test_sorted.py +46 -0
- datahold-4.0.0.dev10/tests/test_variance.py +42 -0
- datahold-4.0.0.dev10/tests/testdata.toml +237 -0
- datahold-4.0.0.dev9/src/datahold/__init__.py +0 -636
- datahold-4.0.0.dev9/src/datahold.egg-info/requires.txt +0 -5
- datahold-4.0.0.dev9/tests/test_FrozenHoldDict.py +0 -185
- datahold-4.0.0.dev9/tests/test_FrozenHoldList.py +0 -201
- datahold-4.0.0.dev9/tests/test_FrozenHoldSet.py +0 -246
- datahold-4.0.0.dev9/tests/test_HoldDict.py +0 -214
- datahold-4.0.0.dev9/tests/test_HoldList.py +0 -262
- datahold-4.0.0.dev9/tests/test_HoldSet.py +0 -285
- datahold-4.0.0.dev9/tests/test_testdata.py +0 -318
- datahold-4.0.0.dev9/tests/testdata.toml +0 -145
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/LICENSE.txt +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/MANIFEST.in +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/README.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v1.1.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v1.2.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v2.0.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v2.1.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v2.2.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v2.3.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v3.0.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/docs/v4.0.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/run_tests.py +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/setup.cfg +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/src/datahold/py.typed +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev10}/src/datahold.egg-info/dependency_links.txt +0 -0
- {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.
|
|
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.
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
20
|
Description-Content-Type: text/x-rst
|
|
21
21
|
License-File: LICENSE.txt
|
|
22
|
-
Requires-Dist:
|
|
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
|
-
"
|
|
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.
|
|
37
|
-
version = "4.0.0.
|
|
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.
|
|
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.
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
20
|
Description-Content-Type: text/x-rst
|
|
21
21
|
License-File: LICENSE.txt
|
|
22
|
-
Requires-Dist:
|
|
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/
|
|
23
|
-
tests/
|
|
24
|
-
tests/
|
|
25
|
-
tests/
|
|
26
|
-
tests/
|
|
27
|
-
tests/
|
|
28
|
-
tests/
|
|
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
|