datahold 4.0.0.dev10__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.
Files changed (37) hide show
  1. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/PKG-INFO +1 -1
  2. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/pyproject.toml +1 -1
  3. datahold-4.0.0.dev20/src/datahold/__init__.py +468 -0
  4. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold.egg-info/PKG-INFO +1 -1
  5. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold.egg-info/SOURCES.txt +1 -0
  6. datahold-4.0.0.dev20/tests/test_prefix.py +41 -0
  7. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/testdata.toml +35 -15
  8. datahold-4.0.0.dev10/src/datahold/__init__.py +0 -258
  9. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/LICENSE.txt +0 -0
  10. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/MANIFEST.in +0 -0
  11. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/README.rst +0 -0
  12. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v1.1.rst +0 -0
  13. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v1.2.rst +0 -0
  14. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v2.0.rst +0 -0
  15. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v2.1.rst +0 -0
  16. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v2.2.rst +0 -0
  17. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v2.3.rst +0 -0
  18. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v3.0.rst +0 -0
  19. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/docs/v4.0.rst +0 -0
  20. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/run_tests.py +0 -0
  21. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/setup.cfg +0 -0
  22. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold/py.typed +0 -0
  23. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold.egg-info/dependency_links.txt +0 -0
  24. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold.egg-info/requires.txt +0 -0
  25. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/src/datahold.egg-info/top_level.txt +0 -0
  26. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_FrozenListSlot.py +0 -0
  27. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_MutableListHold.py +0 -0
  28. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_abstractmethods.py +0 -0
  29. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_all.py +0 -0
  30. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_attributes.py +0 -0
  31. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_docs.py +0 -0
  32. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_generic.py +0 -0
  33. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_internal_comparison.py +0 -0
  34. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_issubclass.py +0 -0
  35. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_nested.py +0 -0
  36. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_sorted.py +0 -0
  37. {datahold-4.0.0.dev10 → datahold-4.0.0.dev20}/tests/test_variance.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datahold
3
- Version: 4.0.0.dev10
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
@@ -30,7 +30,7 @@ license-files = [
30
30
  name = "datahold"
31
31
  readme = "README.rst"
32
32
  requires-python = ">=3.11"
33
- version = "4.0.0.dev10"
33
+ version = "4.0.0.dev20"
34
34
 
35
35
  [project.urls]
36
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.dev10
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
@@ -29,6 +29,7 @@ tests/test_generic.py
29
29
  tests/test_internal_comparison.py
30
30
  tests/test_issubclass.py
31
31
  tests/test_nested.py
32
+ tests/test_prefix.py
32
33
  tests/test_sorted.py
33
34
  tests/test_variance.py
34
35
  tests/testdata.toml
@@ -0,0 +1,41 @@
1
+ from __future__ import annotations
2
+
3
+ __all__: list[str] = ["TestPrefix"]
4
+
5
+ import unittest
6
+ from collections import abc
7
+ from typing import Self
8
+
9
+ from Lazy import Lazy
10
+
11
+ import datahold
12
+
13
+
14
+ class TestPrefix(unittest.TestCase):
15
+ def _test_prefix(self: Self, name: str, /) -> None:
16
+ datatype = getattr(datahold, name)
17
+ self.assertEqual(datatype.__name__, name)
18
+ self.assertTrue(hasattr(datatype, "__Frozen__"))
19
+ self.assertTrue(hasattr(datatype, "__frozen__"))
20
+ if name.startswith("Frozen"):
21
+ self.assertIsNot(datatype.__hash__, object.__hash__)
22
+ self.assertTrue(issubclass(datatype, abc.Hashable))
23
+ self.assertFalse(hasattr(datatype, "__Mutable__"))
24
+ self.assertFalse(hasattr(datatype, "__mutate__"))
25
+ return
26
+ self.assertIn(datatype.__hash__, [None, object.__hash__])
27
+ if name.startswith("Mutable"):
28
+ self.assertTrue(hasattr(datatype, "__Mutable__"))
29
+ self.assertTrue(hasattr(datatype, "__mutate__"))
30
+ return
31
+ self.assertFalse(hasattr(datatype, "__Mutable__"))
32
+ self.assertFalse(hasattr(datatype, "__mutate__"))
33
+
34
+ def test_prefix(self: Self, /) -> None:
35
+ for name in Lazy.lazy.datatypes.keys():
36
+ with self.subTest(datatype=name):
37
+ self._test_prefix(name)
38
+
39
+
40
+ if __name__ == "__main__":
41
+ unittest.main(verbosity=2)
@@ -1,3 +1,5 @@
1
+ [datatypes.Collection]
2
+
1
3
  [datatypes.FrozenListLike]
2
4
  abstractmethods = [
3
5
  "__frozen__",
@@ -16,9 +18,9 @@ __init__ = "datahold.ListLike"
16
18
  "collections.abc.Sequence" = true
17
19
 
18
20
  [datatypes.FrozenListLike.nested]
19
- Frozen = "builtins.tuple"
20
21
  Init = "collections.abc.Iterable"
21
- Mutable = ""
22
+ __Frozen__ = "builtins.tuple"
23
+ __Mutable__ = ""
22
24
 
23
25
  [datatypes.FrozenListLike.varia]
24
26
  generic = 1
@@ -131,9 +133,9 @@ args = [
131
133
  ]
132
134
 
133
135
  [datatypes.FrozenListSlot.nested]
134
- Frozen = "builtins.tuple"
135
136
  Init = "collections.abc.Iterable"
136
- Mutable = ""
137
+ __Frozen__ = "builtins.tuple"
138
+ __Mutable__ = ""
137
139
 
138
140
  [datatypes.FrozenListSlot.varia]
139
141
  generic = 1
@@ -147,7 +149,7 @@ abstractmethods = [
147
149
  [datatypes.ListLike.attributes]
148
150
  __frozen__ = "datahold.ListLike"
149
151
  __init__ = "datahold.ListLike"
150
- __mutable__ = ""
152
+ __mutate__ = ""
151
153
  __reversed__ = "collections.abc.Sequence"
152
154
  count = "collections.abc.Sequence"
153
155
  index = "collections.abc.Sequence"
@@ -157,11 +159,12 @@ index = "collections.abc.Sequence"
157
159
  "collections.abc.MutableSequence" = false
158
160
  "collections.abc.Sequence" = true
159
161
  "datahold.ListLike" = true
162
+ "datahold.MutableSequence" = false
160
163
 
161
164
  [datatypes.ListLike.nested]
162
- Frozen = "builtins.tuple"
163
165
  Init = "collections.abc.Iterable"
164
- Mutable = ""
166
+ __Frozen__ = "builtins.tuple"
167
+ __Mutable__ = ""
165
168
 
166
169
  [datatypes.ListLike.varia]
167
170
  generic = 1
@@ -172,26 +175,25 @@ abstractmethods = [
172
175
  ]
173
176
 
174
177
  [datatypes.ListSlot.nested]
175
- Frozen = "builtins.tuple"
176
178
  Init = "collections.abc.Iterable"
177
- Mutable = ""
179
+ __Frozen__ = "builtins.tuple"
180
+ __Mutable__ = ""
178
181
 
179
182
  [datatypes.ListSlot.varia]
180
183
  generic = 1
181
184
 
182
185
  [datatypes.MutableListLike]
183
186
  abstractmethods = [
184
- "__frozen__",
185
- "__mutable__",
187
+ "__mutate__",
186
188
  ]
187
189
 
188
190
  [datatypes.MutableListLike.attributes]
189
191
  __add__ = "datahold.MutableListLike"
190
- __frozen__ = "datahold.ListLike"
192
+ __frozen__ = "datahold.MutableListLike"
191
193
  __iadd__ = "collections.abc.MutableSequence"
192
194
  __imul__ = "datahold.MutableListLike"
193
195
  __init__ = "datahold.MutableListLike"
194
- __mutable__ = "datahold.MutableListLike"
196
+ __mutate__ = "datahold.MutableListLike"
195
197
  __reversed__ = "collections.abc.Sequence"
196
198
  append = "collections.abc.MutableSequence"
197
199
  clear = "collections.abc.MutableSequence"
@@ -199,6 +201,7 @@ count = "collections.abc.Sequence"
199
201
  extend = "collections.abc.MutableSequence"
200
202
  foo = ""
201
203
  index = "collections.abc.Sequence"
204
+ insert = "datahold.MutableListLike"
202
205
  pop = "collections.abc.MutableSequence"
203
206
  remove = "collections.abc.MutableSequence"
204
207
  reverse = "collections.abc.MutableSequence"
@@ -208,10 +211,11 @@ reverse = "collections.abc.MutableSequence"
208
211
  "collections.abc.Hashable" = false
209
212
  "collections.abc.MutableMapping" = false
210
213
  "collections.abc.MutableSequence" = true
214
+ "datahold.MutableSequence" = true
211
215
 
212
216
  [datatypes.MutableListLike.nested]
213
- Frozen = "builtins.tuple"
214
217
  Init = "collections.abc.Iterable"
218
+ __Frozen__ = "builtins.tuple"
215
219
  __hash__ = ""
216
220
 
217
221
  [datatypes.MutableListLike.varia]
@@ -227,11 +231,27 @@ abstractmethods = []
227
231
  "datahold.MutableListSlot" = true
228
232
 
229
233
  [datatypes.MutableListSlot.nested]
230
- Frozen = "builtins.tuple"
231
234
  Init = "collections.abc.Iterable"
235
+ __Frozen__ = "builtins.tuple"
232
236
  __hash__ = ""
233
237
 
234
238
  [datatypes.MutableListSlot.varia]
235
239
  generic = 1
236
240
 
241
+ [datatypes.MutableSequence.attributes]
242
+ __Frozen__ = "datahold.Sequence"
243
+ __Mutable__ = "datahold.MutableSequence"
244
+ __delitem__ = "datahold.MutableSequence"
245
+ __frozen__ = "datahold.Sequence"
246
+ __getitem__ = "datahold.MutableSequence"
247
+ __mutate__ = "datahold.MutableSequence"
248
+ __setitem__ = "datahold.MutableSequence"
249
+ insert = "datahold.MutableSequence"
250
+ sort = ""
251
+
252
+ [datatypes.Sequence]
253
+ abstractmethods = [
254
+ "__frozen__",
255
+ ]
256
+
237
257
  [non_datatypes]
@@ -1,258 +0,0 @@
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)
File without changes