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.
Files changed (46) hide show
  1. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/PKG-INFO +3 -7
  2. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/pyproject.toml +3 -7
  3. datahold-4.0.0.dev20/src/datahold/__init__.py +468 -0
  4. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/src/datahold.egg-info/PKG-INFO +3 -7
  5. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/src/datahold.egg-info/SOURCES.txt +13 -7
  6. datahold-4.0.0.dev20/src/datahold.egg-info/requires.txt +1 -0
  7. datahold-4.0.0.dev20/tests/test_FrozenListSlot.py +575 -0
  8. datahold-4.0.0.dev20/tests/test_MutableListHold.py +1022 -0
  9. datahold-4.0.0.dev20/tests/test_abstractmethods.py +34 -0
  10. datahold-4.0.0.dev20/tests/test_all.py +27 -0
  11. datahold-4.0.0.dev20/tests/test_attributes.py +41 -0
  12. datahold-4.0.0.dev20/tests/test_docs.py +39 -0
  13. datahold-4.0.0.dev20/tests/test_generic.py +34 -0
  14. datahold-4.0.0.dev20/tests/test_internal_comparison.py +50 -0
  15. datahold-4.0.0.dev20/tests/test_issubclass.py +29 -0
  16. datahold-4.0.0.dev20/tests/test_nested.py +32 -0
  17. datahold-4.0.0.dev20/tests/test_prefix.py +41 -0
  18. datahold-4.0.0.dev20/tests/test_sorted.py +46 -0
  19. datahold-4.0.0.dev20/tests/test_variance.py +42 -0
  20. datahold-4.0.0.dev20/tests/testdata.toml +257 -0
  21. datahold-4.0.0.dev9/src/datahold/__init__.py +0 -636
  22. datahold-4.0.0.dev9/src/datahold.egg-info/requires.txt +0 -5
  23. datahold-4.0.0.dev9/tests/test_FrozenHoldDict.py +0 -185
  24. datahold-4.0.0.dev9/tests/test_FrozenHoldList.py +0 -201
  25. datahold-4.0.0.dev9/tests/test_FrozenHoldSet.py +0 -246
  26. datahold-4.0.0.dev9/tests/test_HoldDict.py +0 -214
  27. datahold-4.0.0.dev9/tests/test_HoldList.py +0 -262
  28. datahold-4.0.0.dev9/tests/test_HoldSet.py +0 -285
  29. datahold-4.0.0.dev9/tests/test_testdata.py +0 -318
  30. datahold-4.0.0.dev9/tests/testdata.toml +0 -145
  31. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/LICENSE.txt +0 -0
  32. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/MANIFEST.in +0 -0
  33. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/README.rst +0 -0
  34. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v1.1.rst +0 -0
  35. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v1.2.rst +0 -0
  36. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v2.0.rst +0 -0
  37. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v2.1.rst +0 -0
  38. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v2.2.rst +0 -0
  39. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v2.3.rst +0 -0
  40. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v3.0.rst +0 -0
  41. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/docs/v4.0.rst +0 -0
  42. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/run_tests.py +0 -0
  43. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/setup.cfg +0 -0
  44. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/src/datahold/py.typed +0 -0
  45. {datahold-4.0.0.dev9 → datahold-4.0.0.dev20}/src/datahold.egg-info/dependency_links.txt +0 -0
  46. {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.dev9
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.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.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.dev9
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.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,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/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_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