datahold 4.0.0.dev9__tar.gz → 4.0.0.dev20__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.dev20}/PKG-INFO +3 -7
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/pyproject.toml +3 -7
- datahold-4.0.0.dev20/src/datahold/__init__.py +468 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/src/datahold.egg-info/PKG-INFO +3 -7
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/src/datahold.egg-info/SOURCES.txt +13 -7
- datahold-4.0.0.dev20/src/datahold.egg-info/requires.txt +1 -0
- datahold-4.0.0.dev20/tests/test_FrozenListSlot.py +575 -0
- datahold-4.0.0.dev20/tests/test_MutableListHold.py +1022 -0
- datahold-4.0.0.dev20/tests/test_abstractmethods.py +34 -0
- datahold-4.0.0.dev20/tests/test_all.py +27 -0
- datahold-4.0.0.dev20/tests/test_attributes.py +41 -0
- datahold-4.0.0.dev20/tests/test_docs.py +39 -0
- datahold-4.0.0.dev20/tests/test_generic.py +34 -0
- datahold-4.0.0.dev20/tests/test_internal_comparison.py +50 -0
- datahold-4.0.0.dev20/tests/test_issubclass.py +29 -0
- datahold-4.0.0.dev20/tests/test_nested.py +32 -0
- datahold-4.0.0.dev20/tests/test_prefix.py +41 -0
- datahold-4.0.0.dev20/tests/test_sorted.py +46 -0
- datahold-4.0.0.dev20/tests/test_variance.py +42 -0
- datahold-4.0.0.dev20/tests/testdata.toml +257 -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.dev20}/LICENSE.txt +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/MANIFEST.in +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/README.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v1.1.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v1.2.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v2.0.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v2.1.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v2.2.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v2.3.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v3.0.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v4.0.rst +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/run_tests.py +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/setup.cfg +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/src/datahold/py.typed +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/src/datahold.egg-info/dependency_links.txt +0 -0
- {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/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.dev20
|
|
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.dev20"
|
|
38
34
|
|
|
39
35
|
[project.urls]
|
|
40
36
|
Download = "https://pypi.org/project/datahold/#files"
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
"""Provide provides base classes for customized collections."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__: list[str] = [
|
|
6
|
+
"Collection",
|
|
7
|
+
"FrozenListLike",
|
|
8
|
+
"FrozenListSlot",
|
|
9
|
+
"ListLike",
|
|
10
|
+
"ListSlot",
|
|
11
|
+
"MutableListLike",
|
|
12
|
+
"MutableListSlot",
|
|
13
|
+
"MutableSequence",
|
|
14
|
+
"Sequence",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
from abc import abstractmethod
|
|
18
|
+
from collections import abc
|
|
19
|
+
from contextlib import contextmanager
|
|
20
|
+
from types import NotImplementedType, TracebackType
|
|
21
|
+
from typing import (
|
|
22
|
+
Any,
|
|
23
|
+
Never,
|
|
24
|
+
Optional,
|
|
25
|
+
Protocol,
|
|
26
|
+
Self,
|
|
27
|
+
SupportsIndex,
|
|
28
|
+
overload,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
import setdoc
|
|
32
|
+
|
|
33
|
+
### UTILS ###
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ContextManager[Enter](Protocol):
|
|
37
|
+
"""Provide context manager protocol."""
|
|
38
|
+
|
|
39
|
+
@setdoc.basic
|
|
40
|
+
def __enter__(self: Self, /) -> Enter: ...
|
|
41
|
+
|
|
42
|
+
@setdoc.basic
|
|
43
|
+
def __exit__(
|
|
44
|
+
self: Self,
|
|
45
|
+
exc_type: type[BaseException] | None,
|
|
46
|
+
exc_value: BaseException | None,
|
|
47
|
+
traceback: TracebackType | None,
|
|
48
|
+
/,
|
|
49
|
+
) -> object: ...
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
type Slice[Index] = slice[Optional[Index], Optional[Index], Optional[Index]]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
### COLLECTION ###
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class Collection[Item](
|
|
59
|
+
abc.Sized,
|
|
60
|
+
abc.Iterable[Item],
|
|
61
|
+
abc.Container[object],
|
|
62
|
+
):
|
|
63
|
+
"""Provide abc for custom collections."""
|
|
64
|
+
|
|
65
|
+
@setdoc.basic
|
|
66
|
+
class __Frozen__[FrozenItem](
|
|
67
|
+
abc.Sized,
|
|
68
|
+
abc.Iterable[FrozenItem],
|
|
69
|
+
Protocol,
|
|
70
|
+
):
|
|
71
|
+
@setdoc.basic
|
|
72
|
+
def __contains__(self: Self, other: Never, /) -> bool: ...
|
|
73
|
+
|
|
74
|
+
@setdoc.basic
|
|
75
|
+
def __contains__(self: Self, other: object, /) -> bool:
|
|
76
|
+
try:
|
|
77
|
+
return other in self.__frozen__() # type: ignore[operator]
|
|
78
|
+
except TypeError:
|
|
79
|
+
return other in (x for x in self) # type: ignore[operator]
|
|
80
|
+
|
|
81
|
+
@abstractmethod
|
|
82
|
+
@setdoc.basic
|
|
83
|
+
def __frozen__(self: Self, /) -> __Frozen__[Item]: ...
|
|
84
|
+
|
|
85
|
+
@setdoc.basic
|
|
86
|
+
def __iter__(self: Self) -> abc.Iterator[Item]:
|
|
87
|
+
return iter(self.__frozen__())
|
|
88
|
+
|
|
89
|
+
@setdoc.basic
|
|
90
|
+
def __len__(self: Self, /) -> int:
|
|
91
|
+
return len(self.__frozen__())
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
### SEQUENCE ###
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class Sequence[Item](Collection[Item], abc.Sequence[Item]):
|
|
98
|
+
"""Provide a base class for customized sequence."""
|
|
99
|
+
|
|
100
|
+
__slots__ = ()
|
|
101
|
+
|
|
102
|
+
@setdoc.basic
|
|
103
|
+
class __Frozen__[FrozenItem](
|
|
104
|
+
Collection.__Frozen__[FrozenItem],
|
|
105
|
+
Protocol,
|
|
106
|
+
):
|
|
107
|
+
@overload
|
|
108
|
+
@setdoc.basic
|
|
109
|
+
def __getitem__(self: Self, key: int, /) -> FrozenItem: ...
|
|
110
|
+
@overload
|
|
111
|
+
@setdoc.basic
|
|
112
|
+
def __getitem__(
|
|
113
|
+
self: Self, key: Slice[int], /
|
|
114
|
+
) -> abc.Sequence[FrozenItem]: ...
|
|
115
|
+
@setdoc.basic
|
|
116
|
+
def __getitem__(
|
|
117
|
+
self: Self,
|
|
118
|
+
key: int | Slice[int],
|
|
119
|
+
/,
|
|
120
|
+
) -> FrozenItem | abc.Sequence[FrozenItem]: ...
|
|
121
|
+
|
|
122
|
+
@abstractmethod
|
|
123
|
+
@setdoc.basic
|
|
124
|
+
def __frozen__(self: Self, /) -> __Frozen__[Item]: ...
|
|
125
|
+
|
|
126
|
+
@overload
|
|
127
|
+
@setdoc.basic
|
|
128
|
+
def __getitem__(self: Self, key: int, /) -> Item: ...
|
|
129
|
+
@overload
|
|
130
|
+
@setdoc.basic
|
|
131
|
+
def __getitem__(self: Self, key: Slice[int], /) -> abc.Sequence[Item]: ...
|
|
132
|
+
@setdoc.basic
|
|
133
|
+
def __getitem__(
|
|
134
|
+
self: Self, key: int | Slice[int], /
|
|
135
|
+
) -> Item | abc.Sequence[Item]:
|
|
136
|
+
return self.__frozen__()[key]
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class MutableSequence[Item](Sequence[Item], abc.MutableSequence[Item]):
|
|
140
|
+
"""Provide a base class for customized mutable list-likes."""
|
|
141
|
+
|
|
142
|
+
__slots__ = ()
|
|
143
|
+
|
|
144
|
+
@setdoc.basic
|
|
145
|
+
class __Mutable__[MutableItem](Protocol):
|
|
146
|
+
|
|
147
|
+
@overload
|
|
148
|
+
@setdoc.basic
|
|
149
|
+
def __delitem__(self: Self, key: SupportsIndex, /) -> None: ...
|
|
150
|
+
@overload
|
|
151
|
+
@setdoc.basic
|
|
152
|
+
def __delitem__(self: Self, key: Slice[SupportsIndex], /) -> None: ...
|
|
153
|
+
@setdoc.basic
|
|
154
|
+
def __delitem__(
|
|
155
|
+
self: Self, key: SupportsIndex | Slice[SupportsIndex], /
|
|
156
|
+
) -> None: ...
|
|
157
|
+
|
|
158
|
+
@overload
|
|
159
|
+
@setdoc.basic
|
|
160
|
+
def __getitem__(self: Self, key: int, /) -> MutableItem: ...
|
|
161
|
+
@overload
|
|
162
|
+
@setdoc.basic
|
|
163
|
+
def __getitem__(
|
|
164
|
+
self: Self, key: Slice[int], /
|
|
165
|
+
) -> abc.MutableSequence[MutableItem]: ...
|
|
166
|
+
@setdoc.basic
|
|
167
|
+
def __getitem__(
|
|
168
|
+
self: Self,
|
|
169
|
+
key: int | Slice[int],
|
|
170
|
+
/,
|
|
171
|
+
) -> MutableItem | abc.MutableSequence[MutableItem]: ...
|
|
172
|
+
|
|
173
|
+
@overload
|
|
174
|
+
@setdoc.basic
|
|
175
|
+
def __setitem__(
|
|
176
|
+
self: Self, key: int, value: MutableItem, /
|
|
177
|
+
) -> None: ...
|
|
178
|
+
@overload
|
|
179
|
+
@setdoc.basic
|
|
180
|
+
def __setitem__(
|
|
181
|
+
self: Self, key: Slice[int], value: abc.Iterable[MutableItem], /
|
|
182
|
+
) -> None: ...
|
|
183
|
+
@setdoc.basic
|
|
184
|
+
def __setitem__(
|
|
185
|
+
self: Self,
|
|
186
|
+
key: int | Slice[int],
|
|
187
|
+
value: MutableItem | abc.Iterable[MutableItem],
|
|
188
|
+
/,
|
|
189
|
+
) -> None: ...
|
|
190
|
+
|
|
191
|
+
@setdoc.basic
|
|
192
|
+
def insert(self: Self, index: int, item: MutableItem, /) -> None: ...
|
|
193
|
+
|
|
194
|
+
@overload
|
|
195
|
+
@setdoc.basic
|
|
196
|
+
def __delitem__(self: Self, key: int, /) -> None: ...
|
|
197
|
+
@overload
|
|
198
|
+
@setdoc.basic
|
|
199
|
+
def __delitem__(self: Self, key: Slice[int], /) -> None: ...
|
|
200
|
+
@setdoc.basic
|
|
201
|
+
def __delitem__(self: Self, key: int | Slice[int], /) -> None:
|
|
202
|
+
with self.__mutate__() as mutable:
|
|
203
|
+
del mutable[key]
|
|
204
|
+
|
|
205
|
+
@overload
|
|
206
|
+
@setdoc.basic
|
|
207
|
+
def __getitem__(self: Self, key: int, /) -> Item: ...
|
|
208
|
+
@overload
|
|
209
|
+
@setdoc.basic
|
|
210
|
+
def __getitem__(
|
|
211
|
+
self: Self, key: Slice[int], /
|
|
212
|
+
) -> abc.MutableSequence[Item]: ...
|
|
213
|
+
@setdoc.basic
|
|
214
|
+
def __getitem__(
|
|
215
|
+
self: Self, key: int | Slice[int], /
|
|
216
|
+
) -> Item | abc.MutableSequence[Item]:
|
|
217
|
+
with self.__mutate__() as mutable:
|
|
218
|
+
return mutable[key]
|
|
219
|
+
|
|
220
|
+
@abstractmethod
|
|
221
|
+
@setdoc.basic
|
|
222
|
+
def __mutate__(self: Self, /) -> ContextManager[__Mutable__[Item]]: ...
|
|
223
|
+
|
|
224
|
+
@overload
|
|
225
|
+
@setdoc.basic
|
|
226
|
+
def __setitem__(self: Self, key: int, value: Item, /) -> None: ...
|
|
227
|
+
@overload
|
|
228
|
+
@setdoc.basic
|
|
229
|
+
def __setitem__(
|
|
230
|
+
self: Self, key: Slice[int], value: abc.Iterable[Item], /
|
|
231
|
+
) -> None: ...
|
|
232
|
+
@setdoc.basic
|
|
233
|
+
def __setitem__(
|
|
234
|
+
self: Self,
|
|
235
|
+
key: int | Slice[int],
|
|
236
|
+
value: Item | abc.Iterable[Item],
|
|
237
|
+
/,
|
|
238
|
+
) -> None:
|
|
239
|
+
with self.__mutate__() as mutable:
|
|
240
|
+
mutable[key] = value # type: ignore
|
|
241
|
+
|
|
242
|
+
@setdoc.basic
|
|
243
|
+
def insert(self: Self, index: int, item: Item, /) -> None:
|
|
244
|
+
with self.__mutate__() as mutable:
|
|
245
|
+
mutable.insert(index, item)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
### LIST-LIKE ###
|
|
249
|
+
class ListLike[Item](Sequence[Item]):
|
|
250
|
+
"""Provide a base class for customized list-likes."""
|
|
251
|
+
|
|
252
|
+
__slots__ = ()
|
|
253
|
+
|
|
254
|
+
type __Frozen__[FrozenItem] = tuple[FrozenItem, ...]
|
|
255
|
+
# Frozen has to be tuple to allow covariance
|
|
256
|
+
|
|
257
|
+
type Init[InitItem] = abc.Iterable[InitItem]
|
|
258
|
+
|
|
259
|
+
@setdoc.basic
|
|
260
|
+
def __add__[Item_](
|
|
261
|
+
self: Self, other: ListLike[Item_], /
|
|
262
|
+
) -> ListLike[Item | Item_]:
|
|
263
|
+
if isinstance(other, ListLike):
|
|
264
|
+
return type(self)(self.__frozen__() + other.__frozen__()) # type: ignore[operator]
|
|
265
|
+
else:
|
|
266
|
+
raise TypeError
|
|
267
|
+
|
|
268
|
+
@setdoc.basic
|
|
269
|
+
def __eq__(self: Self, other: object, /) -> NotImplementedType | bool:
|
|
270
|
+
if isinstance(other, ListLike):
|
|
271
|
+
return self.__frozen__() == other.__frozen__()
|
|
272
|
+
else:
|
|
273
|
+
return NotImplemented
|
|
274
|
+
|
|
275
|
+
@abstractmethod
|
|
276
|
+
@setdoc.basic
|
|
277
|
+
def __frozen__(self: Self, /) -> __Frozen__[Item]: ...
|
|
278
|
+
|
|
279
|
+
@setdoc.basic
|
|
280
|
+
def __ge__(self: Self, other: ListLike[Any], /) -> bool:
|
|
281
|
+
if isinstance(other, ListLike):
|
|
282
|
+
return self.__frozen__() >= other.__frozen__()
|
|
283
|
+
else:
|
|
284
|
+
return NotImplemented
|
|
285
|
+
|
|
286
|
+
@overload
|
|
287
|
+
@setdoc.basic
|
|
288
|
+
def __getitem__(self: Self, key: SupportsIndex, /) -> Item: ...
|
|
289
|
+
|
|
290
|
+
@overload
|
|
291
|
+
@setdoc.basic
|
|
292
|
+
def __getitem__(self: Self, key: Slice[SupportsIndex], /) -> Self: ...
|
|
293
|
+
|
|
294
|
+
@setdoc.basic
|
|
295
|
+
def __getitem__(
|
|
296
|
+
self: Self,
|
|
297
|
+
key: SupportsIndex | Slice[SupportsIndex],
|
|
298
|
+
/,
|
|
299
|
+
) -> Item | Self:
|
|
300
|
+
if isinstance(key, SupportsIndex):
|
|
301
|
+
return self.__frozen__()[key]
|
|
302
|
+
else:
|
|
303
|
+
return type(self)(self.__frozen__()[key])
|
|
304
|
+
|
|
305
|
+
@setdoc.basic
|
|
306
|
+
def __gt__(self: Self, other: ListLike[Any], /) -> bool:
|
|
307
|
+
if isinstance(other, ListLike):
|
|
308
|
+
return self.__frozen__() > other.__frozen__()
|
|
309
|
+
else:
|
|
310
|
+
return NotImplemented
|
|
311
|
+
|
|
312
|
+
@abstractmethod
|
|
313
|
+
@setdoc.basic
|
|
314
|
+
def __init__(self: Self, data: Init[Item] = (), /) -> None: ...
|
|
315
|
+
|
|
316
|
+
@setdoc.basic
|
|
317
|
+
def __le__(self: Self, other: ListLike[Any], /) -> bool:
|
|
318
|
+
if isinstance(other, ListLike):
|
|
319
|
+
return self.__frozen__() <= other.__frozen__()
|
|
320
|
+
else:
|
|
321
|
+
return NotImplemented
|
|
322
|
+
|
|
323
|
+
@setdoc.basic
|
|
324
|
+
def __lt__(self: Self, other: ListLike[Any], /) -> bool:
|
|
325
|
+
if isinstance(other, ListLike):
|
|
326
|
+
return self.__frozen__() < other.__frozen__()
|
|
327
|
+
else:
|
|
328
|
+
return NotImplemented
|
|
329
|
+
|
|
330
|
+
@setdoc.basic
|
|
331
|
+
def __mul__(self: Self, other: SupportsIndex, /) -> Self:
|
|
332
|
+
if isinstance(other, SupportsIndex):
|
|
333
|
+
return type(self)(self.__frozen__() * other)
|
|
334
|
+
else:
|
|
335
|
+
raise TypeError
|
|
336
|
+
|
|
337
|
+
__rmul__ = __mul__
|
|
338
|
+
|
|
339
|
+
@setdoc.basic
|
|
340
|
+
def __repr__(self: Self, /) -> str:
|
|
341
|
+
return f"{type(self).__name__}({list(self)!r})"
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
class FrozenListLike[Item](ListLike[Item], abc.Hashable):
|
|
345
|
+
"""Provide a base class for customized frozen list-likes."""
|
|
346
|
+
|
|
347
|
+
__slots__ = ()
|
|
348
|
+
|
|
349
|
+
@setdoc.basic
|
|
350
|
+
def __hash__(self: Self) -> int:
|
|
351
|
+
return hash(self.__frozen__())
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
class MutableListLike[Item](ListLike[Item], MutableSequence[Item]):
|
|
355
|
+
"""Provide a base class for customized mutable list-likes."""
|
|
356
|
+
|
|
357
|
+
__slots__ = ()
|
|
358
|
+
|
|
359
|
+
type __Mutable__[MutableItem] = list[MutableItem]
|
|
360
|
+
|
|
361
|
+
@overload
|
|
362
|
+
@setdoc.basic
|
|
363
|
+
def __delitem__(self: Self, key: SupportsIndex, /) -> None: ...
|
|
364
|
+
@overload
|
|
365
|
+
@setdoc.basic
|
|
366
|
+
def __delitem__(self: Self, key: Slice[SupportsIndex], /) -> None: ...
|
|
367
|
+
@setdoc.basic
|
|
368
|
+
def __delitem__(
|
|
369
|
+
self: Self, key: SupportsIndex | Slice[SupportsIndex], /
|
|
370
|
+
) -> None:
|
|
371
|
+
with self.__mutate__() as mutable:
|
|
372
|
+
del mutable[key]
|
|
373
|
+
|
|
374
|
+
@setdoc.basic
|
|
375
|
+
def __frozen__(self: Self) -> MutableListLike.__Frozen__[Item]:
|
|
376
|
+
with self.__mutate__() as mutable:
|
|
377
|
+
return tuple(mutable)
|
|
378
|
+
|
|
379
|
+
@setdoc.basic
|
|
380
|
+
def __imul__(self: Self, other: SupportsIndex, /) -> Self:
|
|
381
|
+
with self.__mutate__() as mutable:
|
|
382
|
+
mutable *= other
|
|
383
|
+
return self
|
|
384
|
+
|
|
385
|
+
@setdoc.basic
|
|
386
|
+
def __init__(self: Self, data: abc.Iterable[Item] = (), /) -> None:
|
|
387
|
+
with self.__mutate__() as mutable:
|
|
388
|
+
mutable.extend(data)
|
|
389
|
+
|
|
390
|
+
@abstractmethod
|
|
391
|
+
@setdoc.basic
|
|
392
|
+
def __mutate__(self: Self, /) -> ContextManager[__Mutable__[Item]]: ...
|
|
393
|
+
|
|
394
|
+
@overload
|
|
395
|
+
@setdoc.basic
|
|
396
|
+
def __setitem__(
|
|
397
|
+
self: Self, key: SupportsIndex, value: Item, /
|
|
398
|
+
) -> None: ...
|
|
399
|
+
@overload
|
|
400
|
+
@setdoc.basic
|
|
401
|
+
def __setitem__(
|
|
402
|
+
self: Self, key: Slice[SupportsIndex], value: abc.Iterable[Item], /
|
|
403
|
+
) -> None: ...
|
|
404
|
+
@setdoc.basic
|
|
405
|
+
def __setitem__(
|
|
406
|
+
self: Self,
|
|
407
|
+
key: SupportsIndex | Slice[SupportsIndex],
|
|
408
|
+
value: Item | abc.Iterable[Item],
|
|
409
|
+
/,
|
|
410
|
+
) -> None:
|
|
411
|
+
with self.__mutate__() as mutable:
|
|
412
|
+
mutable[key] = value # type: ignore
|
|
413
|
+
|
|
414
|
+
@setdoc.basic
|
|
415
|
+
def copy(self: Self) -> Self:
|
|
416
|
+
return type(self)(self)
|
|
417
|
+
|
|
418
|
+
@setdoc.basic
|
|
419
|
+
def insert(self: Self, index: SupportsIndex, item: Item, /) -> None:
|
|
420
|
+
with self.__mutate__() as mutable:
|
|
421
|
+
mutable.insert(index, item)
|
|
422
|
+
|
|
423
|
+
@setdoc.basic
|
|
424
|
+
def sort(self: Self, /, *, key: Any = None, reverse: bool = False) -> None:
|
|
425
|
+
# list.sort reveals Overload(
|
|
426
|
+
# def [_T, SupportsRichComparisonT <: _typeshed.SupportsDunderLT[Any] | _typeshed.SupportsDunderGT[Any]] (self: list[SupportsRichComparisonT], *, key: None =, reverse: bool =),
|
|
427
|
+
# def [_T] (self: list[_T], *, key: def (_T) -> _typeshed.SupportsDunderLT[Any] | _typeshed.SupportsDunderGT[Any], reverse: bool =),
|
|
428
|
+
# )
|
|
429
|
+
with self.__mutate__() as mutable:
|
|
430
|
+
mutable.sort(key=key, reverse=reverse)
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
### LIST-SLOT ###
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
class ListSlot[Item](ListLike[Item]):
|
|
437
|
+
"""Provide slotted list-like class."""
|
|
438
|
+
|
|
439
|
+
__slots__ = ("_slot",)
|
|
440
|
+
|
|
441
|
+
_slot: ListSlot.__Frozen__[Item]
|
|
442
|
+
|
|
443
|
+
@setdoc.basic
|
|
444
|
+
def __frozen__(self: Self) -> ListSlot.__Frozen__[Item]:
|
|
445
|
+
return self._slot
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
class FrozenListSlot[Item](ListSlot[Item], FrozenListLike[Item]):
|
|
449
|
+
"""Provide a base class for customized frozen data-holds."""
|
|
450
|
+
|
|
451
|
+
__slots__ = ()
|
|
452
|
+
|
|
453
|
+
@setdoc.basic
|
|
454
|
+
def __init__(self: Self, data: abc.Iterable[Item] = (), /) -> None:
|
|
455
|
+
self._slot = tuple(data)
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
class MutableListSlot[Item](ListSlot[Item], MutableListLike[Item]):
|
|
459
|
+
"""Provide slotted mutable list-like class."""
|
|
460
|
+
|
|
461
|
+
__slots__ = ()
|
|
462
|
+
|
|
463
|
+
@contextmanager
|
|
464
|
+
@setdoc.basic
|
|
465
|
+
def __mutate__(self: Self, /) -> abc.Generator[list[Item], None, None]:
|
|
466
|
+
slot = list(getattr(self, "_slot", ()))
|
|
467
|
+
yield slot
|
|
468
|
+
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.dev20
|
|
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,17 @@ 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_prefix.py
|
|
33
|
+
tests/test_sorted.py
|
|
34
|
+
tests/test_variance.py
|
|
29
35
|
tests/testdata.toml
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
setdoc<2,>=1.3.24
|