datahold 3.0.33__tar.gz → 3.0.34.dev0__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 (68) hide show
  1. {datahold-3.0.33 → datahold-3.0.34.dev0}/PKG-INFO +1 -1
  2. {datahold-3.0.33 → datahold-3.0.34.dev0}/pyproject.toml +1 -1
  3. datahold-3.0.34.dev0/src/datahold/base/BaseDataCollection.py +32 -0
  4. datahold-3.0.34.dev0/src/datahold/base/BaseDataDict.py +102 -0
  5. datahold-3.0.34.dev0/src/datahold/base/BaseDataList.py +78 -0
  6. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/base/BaseDataObject.py +22 -13
  7. datahold-3.0.34.dev0/src/datahold/base/BaseDataSet.py +96 -0
  8. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/base/BaseHoldDict.py +3 -3
  9. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/base/BaseHoldList.py +2 -2
  10. datahold-3.0.34.dev0/src/datahold/core/DataDict.py +146 -0
  11. datahold-3.0.34.dev0/src/datahold/core/DataList.py +117 -0
  12. datahold-3.0.34.dev0/src/datahold/core/DataSet.py +126 -0
  13. datahold-3.0.34.dev0/src/datahold/core/HoldDict.py +35 -0
  14. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenDataDict.py +2 -1
  15. datahold-3.0.34.dev0/src/datahold/frozen/FrozenHoldDict.py +34 -0
  16. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestCopy.py +5 -5
  17. datahold-3.0.34.dev0/src/datahold/typing/HashableCollection.py +9 -0
  18. datahold-3.0.34.dev0/src/datahold/typing/SupportsKeysAndGetitem.py +11 -0
  19. datahold-3.0.34.dev0/src/datahold/typing/__init__.py +0 -0
  20. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold.egg-info/PKG-INFO +1 -1
  21. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold.egg-info/SOURCES.txt +5 -1
  22. datahold-3.0.33/src/datahold/base/BaseDataDict.py +0 -102
  23. datahold-3.0.33/src/datahold/base/BaseDataList.py +0 -78
  24. datahold-3.0.33/src/datahold/base/BaseDataSet.py +0 -202
  25. datahold-3.0.33/src/datahold/core/DataDict.py +0 -113
  26. datahold-3.0.33/src/datahold/core/DataList.py +0 -112
  27. datahold-3.0.33/src/datahold/core/DataSet.py +0 -131
  28. datahold-3.0.33/src/datahold/core/HoldDict.py +0 -30
  29. datahold-3.0.33/src/datahold/frozen/FrozenHoldDict.py +0 -24
  30. {datahold-3.0.33 → datahold-3.0.34.dev0}/LICENSE.txt +0 -0
  31. {datahold-3.0.33 → datahold-3.0.34.dev0}/MANIFEST.in +0 -0
  32. {datahold-3.0.33 → datahold-3.0.34.dev0}/README.rst +0 -0
  33. {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v1.1.rst +0 -0
  34. {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v1.2.rst +0 -0
  35. {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v2.0.rst +0 -0
  36. {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v2.1.rst +0 -0
  37. {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v2.2.rst +0 -0
  38. {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v2.3.rst +0 -0
  39. {datahold-3.0.33 → datahold-3.0.34.dev0}/docs/v3.0.rst +0 -0
  40. {datahold-3.0.33 → datahold-3.0.34.dev0}/setup.cfg +0 -0
  41. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/__init__.py +0 -0
  42. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/base/BaseHoldObject.py +0 -0
  43. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/base/BaseHoldSet.py +0 -0
  44. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/core/DataObject.py +0 -0
  45. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/core/HoldList.py +0 -0
  46. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/core/HoldObject.py +0 -0
  47. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/core/HoldSet.py +0 -0
  48. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/core/__init__.py +0 -0
  49. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenDataList.py +0 -0
  50. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenDataObject.py +0 -0
  51. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenDataSet.py +0 -0
  52. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenHoldList.py +0 -0
  53. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenHoldObject.py +0 -0
  54. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/frozen/FrozenHoldSet.py +0 -0
  55. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/py.typed +0 -0
  56. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/__init__.py +0 -0
  57. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_0.py +0 -0
  58. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestAbstractness.py +0 -0
  59. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestDataAttribute.py +0 -0
  60. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestFrozenMutability.py +0 -0
  61. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestInheritance.py +0 -0
  62. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestMutableBehavior.py +0 -0
  63. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_datahold_TestProtocols.py +0 -0
  64. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_generic.py +0 -0
  65. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold/tests/test_object.py +0 -0
  66. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold.egg-info/dependency_links.txt +0 -0
  67. {datahold-3.0.33 → datahold-3.0.34.dev0}/src/datahold.egg-info/requires.txt +0 -0
  68. {datahold-3.0.33 → datahold-3.0.34.dev0}/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: 3.0.33
3
+ Version: 3.0.34.dev0
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
@@ -35,7 +35,7 @@ license-files = [
35
35
  name = "datahold"
36
36
  readme = "README.rst"
37
37
  requires-python = ">=3.11"
38
- version = "3.0.33"
38
+ version = "3.0.34.dev0"
39
39
 
40
40
  [project.urls]
41
41
  Download = "https://pypi.org/project/datahold/#files"
@@ -0,0 +1,32 @@
1
+ from abc import abstractmethod
2
+ from collections.abc import Collection, Iterator
3
+ from typing import Self, TypeVar
4
+
5
+ import setdoc
6
+
7
+ from ..typing.HashableCollection import HashableCollection
8
+ from .BaseDataObject import BaseDataObject
9
+
10
+ __all__ = ["BaseDataCollection"]
11
+
12
+ Item = TypeVar("Item", covariant=True)
13
+
14
+
15
+ class BaseDataCollection(BaseDataObject, Collection[Item]):
16
+ __slots__ = ()
17
+
18
+ @setdoc.basic
19
+ def __contains__(self: Self, other: object, /) -> bool:
20
+ return other in self.data
21
+
22
+ @setdoc.basic
23
+ def __iter__(self: Self, /) -> Iterator[Item]:
24
+ return iter(self.data)
25
+
26
+ @setdoc.basic
27
+ def __len__(self: Self, /) -> int:
28
+ return len(self.data)
29
+
30
+ @property
31
+ @abstractmethod
32
+ def data(self: Self) -> HashableCollection[Item]: ...
@@ -0,0 +1,102 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import abstractmethod
4
+ from collections.abc import (
5
+ Hashable,
6
+ ItemsView,
7
+ Iterable,
8
+ Iterator,
9
+ KeysView,
10
+ Mapping,
11
+ ValuesView,
12
+ )
13
+ from typing import Optional, Self, TypeVar
14
+
15
+ import setdoc
16
+ from frozendict import frozendict
17
+
18
+ from ..typing.SupportsKeysAndGetitem import SupportsKeysAndGetitem
19
+ from .BaseDataCollection import BaseDataCollection
20
+
21
+ __all__ = ["BaseDataDict"]
22
+
23
+ Key = TypeVar("Key", bound=Hashable, covariant=True)
24
+ Value = TypeVar("Value", covariant=True)
25
+ Value_ = TypeVar("Value_")
26
+
27
+
28
+ class BaseDataDict(
29
+ BaseDataCollection[Key | str], Mapping[Key | str, Optional[Value]]
30
+ ):
31
+
32
+ __slots__ = ()
33
+
34
+ @setdoc.setdoc(dict.__getitem__.__doc__)
35
+ def __getitem__(self: Self, key: Hashable, /) -> Optional[Value]:
36
+ return self.data[key] # type: ignore[index]
37
+
38
+ @abstractmethod
39
+ @setdoc.setdoc(dict.__init__.__doc__)
40
+ def __init__(
41
+ self: Self,
42
+ data: (
43
+ SupportsKeysAndGetitem[Key | str, Optional[Value]]
44
+ | Iterable[tuple[Key | str, Optional[Value]]]
45
+ ) = (),
46
+ /,
47
+ **kwargs: Optional[Value],
48
+ ) -> None: ...
49
+
50
+ @setdoc.basic
51
+ def __or__(
52
+ self: Self,
53
+ other: BaseDataDict[Key, Value],
54
+ /,
55
+ ) -> Self:
56
+ return type(self)(self.data | other.data)
57
+
58
+ @setdoc.setdoc(dict.__repr__.__doc__)
59
+ def __repr__(self: Self, /) -> str:
60
+ return f"{type(self).__name__}({dict(self)})"
61
+
62
+ @setdoc.setdoc(dict.__reversed__.__doc__)
63
+ def __reversed__(self: Self, /) -> Iterator[Key | str]:
64
+ return reversed(self.data)
65
+
66
+ @property
67
+ @abstractmethod
68
+ def data(self: Self) -> frozendict[Key | str, Optional[Value]]: ...
69
+
70
+ @classmethod
71
+ @setdoc.setdoc(dict.fromkeys.__doc__)
72
+ def fromkeys(
73
+ cls: type[Self],
74
+ iterable: Iterable[Key | str],
75
+ value: Optional[Value] = None,
76
+ /,
77
+ ) -> Self:
78
+ return cls(dict.fromkeys(iterable, value))
79
+
80
+ @setdoc.setdoc(dict.get.__doc__)
81
+ def get(
82
+ self: Self,
83
+ key: Hashable,
84
+ default: Optional[Value_] = None,
85
+ /,
86
+ ) -> Optional[Value | Value_]:
87
+ return self.data.get(key, default) # type: ignore[arg-type]
88
+
89
+ @setdoc.basic
90
+ def items(
91
+ self: Self,
92
+ /,
93
+ ) -> ItemsView[Key | str, Optional[Value]]:
94
+ return dict(self.data).items()
95
+
96
+ @setdoc.basic
97
+ def keys(self: Self, /) -> KeysView[Key | str]:
98
+ return dict(self.data).keys()
99
+
100
+ @setdoc.basic
101
+ def values(self: Self, /) -> ValuesView[Optional[Value]]:
102
+ return dict(self.data).values()
@@ -0,0 +1,78 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+ from abc import abstractmethod
5
+ from collections.abc import Hashable, Iterable, Iterator, Sequence
6
+ from typing import Any, Self, SupportsIndex, TypeVar, cast, overload
7
+
8
+ import setdoc
9
+
10
+ from .BaseDataCollection import BaseDataCollection
11
+
12
+ __all__ = ["BaseDataList"]
13
+
14
+ Item = TypeVar("Item", covariant=True)
15
+ Item_ = TypeVar("Item_")
16
+
17
+
18
+ class BaseDataList(BaseDataCollection[Item], Sequence[Item]):
19
+ __slots__ = ()
20
+
21
+ @setdoc.basic
22
+ def __add__(self: Self, other: Iterable[Item], /) -> Self:
23
+ return type(self)(self.data + tuple(other))
24
+
25
+ @overload
26
+ @setdoc.basic
27
+ def __getitem__(self: Self, index: SupportsIndex, /) -> Item: ...
28
+
29
+ @overload
30
+ @setdoc.basic
31
+ def __getitem__(self: Self, index: slice, /) -> Self: ...
32
+
33
+ @setdoc.basic
34
+ def __getitem__(
35
+ self: Self, index: SupportsIndex | slice, /
36
+ ) -> Item | Self:
37
+ if isinstance(index, SupportsIndex):
38
+ return self.data[index]
39
+ else:
40
+ return type(self)(self.data[index])
41
+
42
+ @abstractmethod
43
+ @setdoc.basic
44
+ def __init__(self: Self, data: Iterable[Item] = (), /) -> None: ...
45
+
46
+ @setdoc.basic
47
+ def __mul__(self: Self, other: SupportsIndex, /) -> Self:
48
+ return type(self)(self.data * other)
49
+
50
+ @setdoc.basic
51
+ def __repr__(self: Self, /) -> str:
52
+ return f"{type(self).__name__}({list(self.data)})"
53
+
54
+ @setdoc.basic
55
+ def __reversed__(self: Self, /) -> Iterator[Item]:
56
+ return reversed(self.data)
57
+
58
+ @setdoc.basic
59
+ def __rmul__(self: Self, other: SupportsIndex, /) -> Self:
60
+ return type(self)(other * self.data)
61
+
62
+ @setdoc.setdoc(list.count.__doc__)
63
+ def count(self: Self, value: Hashable, /) -> int:
64
+ return self.data.count(cast(Any, value))
65
+
66
+ @property
67
+ @abstractmethod
68
+ def data(self: Self) -> tuple[Item, ...]: ...
69
+
70
+ @setdoc.setdoc(list.index.__doc__)
71
+ def index(
72
+ self: Self,
73
+ value: Hashable,
74
+ start: SupportsIndex = 0,
75
+ end: SupportsIndex = sys.maxsize,
76
+ /,
77
+ ) -> int:
78
+ return self.data.index(cast(Any, value), start, end)
@@ -1,4 +1,5 @@
1
1
  from abc import ABCMeta, abstractmethod
2
+ from collections.abc import Hashable
2
3
  from typing import Any, Self
3
4
 
4
5
  import setdoc
@@ -19,16 +20,20 @@ class BaseDataObject(metaclass=ABCMeta):
19
20
 
20
21
  @setdoc.basic
21
22
  def __ge__(self: Self, other: Any, /) -> Any:
22
- if isinstance(other, BaseDataObject):
23
- return self.data.__ge__(other.data)
24
- else:
23
+ if not isinstance(other, BaseDataObject):
24
+ return NotImplemented
25
+ try:
26
+ return self.data.__ge__(other.data) # type: ignore[operator]
27
+ except Exception:
25
28
  return NotImplemented
26
29
 
27
30
  @setdoc.basic
28
31
  def __gt__(self: Self, other: Any, /) -> Any:
29
- if isinstance(other, BaseDataObject):
30
- return self.data.__gt__(other.data)
31
- else:
32
+ if not isinstance(other, BaseDataObject):
33
+ return NotImplemented
34
+ try:
35
+ return self.data.__gt__(other.data) # type: ignore[operator]
36
+ except Exception:
32
37
  return NotImplemented
33
38
 
34
39
  @abstractmethod
@@ -37,16 +42,20 @@ class BaseDataObject(metaclass=ABCMeta):
37
42
 
38
43
  @setdoc.basic
39
44
  def __le__(self: Self, other: Any, /) -> Any:
40
- if isinstance(other, BaseDataObject):
41
- return self.data.__le__(other.data)
42
- else:
45
+ if not isinstance(other, BaseDataObject):
46
+ return NotImplemented
47
+ try:
48
+ return self.data.__le__(other.data) # type: ignore[operator]
49
+ except Exception:
43
50
  return NotImplemented
44
51
 
45
52
  @setdoc.basic
46
53
  def __lt__(self: Self, other: Any, /) -> Any:
47
- if isinstance(other, BaseDataObject):
48
- return self.data.__lt__(other.data)
49
- else:
54
+ if not isinstance(other, BaseDataObject):
55
+ return NotImplemented
56
+ try:
57
+ return self.data.__lt__(other.data) # type: ignore[operator]
58
+ except Exception:
50
59
  return NotImplemented
51
60
 
52
61
  @setdoc.basic
@@ -58,4 +67,4 @@ class BaseDataObject(metaclass=ABCMeta):
58
67
 
59
68
  @property
60
69
  @abstractmethod
61
- def data(self: Self) -> Any: ...
70
+ def data(self: Self) -> Hashable: ...
@@ -0,0 +1,96 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import abstractmethod
4
+ from collections.abc import Hashable, Iterable, Set
5
+ from typing import Generic, Self, TypeVar
6
+
7
+ import setdoc
8
+
9
+ from .BaseDataCollection import BaseDataCollection
10
+
11
+ __all__ = ["BaseDataSet"]
12
+
13
+ Item = TypeVar("Item", bound=Hashable, covariant=True)
14
+
15
+
16
+ class BaseDataSet(BaseDataCollection[Item], Generic[Item]):
17
+ __slots__ = ()
18
+
19
+ @setdoc.basic
20
+ def __and__(
21
+ self: Self,
22
+ other: BaseDataSet[Hashable],
23
+ /,
24
+ ) -> Self:
25
+ return type(self)(self.data & other.data)
26
+
27
+ @abstractmethod
28
+ @setdoc.basic
29
+ def __init__(self: Self, data: Iterable[Item] = (), /) -> None: ...
30
+
31
+ @setdoc.basic
32
+ def __or__(
33
+ self: Self,
34
+ other: BaseDataSet[Item],
35
+ /,
36
+ ) -> Self:
37
+ return type(self)(self.data | other.data)
38
+
39
+ @setdoc.setdoc(set.__repr__.__doc__)
40
+ def __repr__(self: Self, /) -> str:
41
+ return f"{type(self).__name__}({set(self.data)})"
42
+
43
+ @setdoc.basic
44
+ def __sub__(
45
+ self: Self,
46
+ other: BaseDataSet[Hashable],
47
+ /,
48
+ ) -> Self:
49
+ return type(self)(self.data - other.data)
50
+
51
+ @setdoc.basic
52
+ def __xor__(
53
+ self: Self,
54
+ other: BaseDataSet[Item],
55
+ /,
56
+ ) -> Self:
57
+ return type(self)(self.data ^ other.data)
58
+
59
+ @property
60
+ @abstractmethod
61
+ def data(self: Self) -> frozenset[Item]: ...
62
+
63
+ @setdoc.setdoc(set.difference.__doc__)
64
+ def difference(self: Self, /, *others: Iterable[Hashable]) -> Self:
65
+ return type(self)(self.data.difference(*others))
66
+
67
+ @setdoc.setdoc(set.intersection.__doc__)
68
+ def intersection(self: Self, /, *others: Iterable[Hashable]) -> Self:
69
+ return type(self)(self.data.intersection(*others))
70
+
71
+ @setdoc.setdoc(set.isdisjoint.__doc__)
72
+ def isdisjoint(self: Self, other: Iterable[Hashable], /) -> bool:
73
+ return self.data.isdisjoint(other)
74
+
75
+ @setdoc.setdoc(set.issubset.__doc__)
76
+ def issubset(self: Self, other: Iterable[Hashable], /) -> bool:
77
+ return self.data.issubset(other)
78
+
79
+ @setdoc.setdoc(set.issuperset.__doc__)
80
+ def issuperset(self: Self, other: Iterable[Hashable], /) -> bool:
81
+ return self.data.issuperset(other)
82
+
83
+ @setdoc.setdoc(set.symmetric_difference.__doc__)
84
+ def symmetric_difference(
85
+ self: Self,
86
+ other: Iterable[Item],
87
+ /,
88
+ ) -> Self:
89
+ return type(self)(self.data.symmetric_difference(other))
90
+
91
+ @setdoc.setdoc(set.union.__doc__)
92
+ def union(self: Self, /, *others: Iterable[Item]) -> Self:
93
+ return type(self)(self.data.union(*others))
94
+
95
+
96
+ Set.register(BaseDataSet) # type: ignore[type-abstract]
@@ -1,12 +1,12 @@
1
- import typing
1
+ from typing import TypeVar
2
2
 
3
3
  from .BaseDataDict import BaseDataDict
4
4
  from .BaseHoldObject import BaseHoldObject
5
5
 
6
6
  __all__ = ["BaseHoldDict"]
7
7
 
8
- Key = typing.TypeVar("Key", covariant=True)
9
- Value = typing.TypeVar("Value", covariant=True)
8
+ Key = TypeVar("Key", covariant=True)
9
+ Value = TypeVar("Value", covariant=True)
10
10
 
11
11
 
12
12
  class BaseHoldDict(BaseHoldObject, BaseDataDict[Key, Value]):
@@ -1,11 +1,11 @@
1
- import typing
1
+ from typing import TypeVar
2
2
 
3
3
  from .BaseDataList import BaseDataList
4
4
  from .BaseHoldObject import BaseHoldObject
5
5
 
6
6
  __all__ = ["BaseHoldList"]
7
7
 
8
- Item = typing.TypeVar("Item", covariant=True)
8
+ Item = TypeVar("Item", covariant=True)
9
9
 
10
10
 
11
11
  class BaseHoldList(BaseHoldObject, BaseDataList[Item]):
@@ -0,0 +1,146 @@
1
+ from abc import abstractmethod
2
+ from collections.abc import Hashable, Iterable, MutableMapping
3
+ from typing import Any, Final, Optional, Self, TypeVar, overload
4
+
5
+ import setdoc
6
+ from frozendict import frozendict
7
+
8
+ from ..base.BaseDataDict import BaseDataDict
9
+ from ..typing.SupportsKeysAndGetitem import SupportsKeysAndGetitem
10
+ from .DataObject import DataObject
11
+
12
+ __all__ = ["DataDict"]
13
+
14
+ Key = TypeVar("Key", bound=Hashable)
15
+ Value = TypeVar("Value")
16
+ Value_ = TypeVar("Value_")
17
+
18
+ MISSING: Final[object] = object()
19
+
20
+
21
+ class DataDict(
22
+ DataObject,
23
+ BaseDataDict[Key, Value],
24
+ MutableMapping[Key | str, Optional[Value]],
25
+ ):
26
+ __slots__ = ()
27
+
28
+ @setdoc.basic
29
+ def __delitem__(self: Self, key: Hashable, /) -> None:
30
+ self.data = self.data.delete(key) # type: ignore[arg-type]
31
+
32
+ @setdoc.basic
33
+ def __init__(
34
+ self: Self,
35
+ data: (
36
+ SupportsKeysAndGetitem[Key | str, Optional[Value]]
37
+ | Iterable[tuple[Key | str, Optional[Value]]]
38
+ ) = (),
39
+ /,
40
+ **kwargs: Optional[Value],
41
+ ) -> None:
42
+ self.data = frozendict(data, **kwargs) # type: ignore[arg-type]
43
+
44
+ @setdoc.basic
45
+ def __ior__(
46
+ self: Self,
47
+ other: BaseDataDict[Key, Value],
48
+ /,
49
+ ) -> Self:
50
+ self.data |= other.data
51
+ return self
52
+
53
+ @setdoc.setdoc(dict.__setitem__.__doc__)
54
+ def __setitem__(
55
+ self: Self,
56
+ key: Key | str,
57
+ value: Optional[Value],
58
+ /,
59
+ ) -> None:
60
+ self.data = self.data.set(key, value)
61
+
62
+ @setdoc.setdoc(dict.clear.__doc__)
63
+ def clear(self: Self, /) -> None:
64
+ self.data = frozendict()
65
+
66
+ @property
67
+ @abstractmethod
68
+ def data(self: Self) -> frozendict[Key | str, Optional[Value]]: ...
69
+
70
+ @data.setter
71
+ @abstractmethod
72
+ def data(
73
+ self: Self,
74
+ value: (
75
+ SupportsKeysAndGetitem[Key | str, Optional[Value]]
76
+ | Iterable[tuple[Key | str, Optional[Value]]]
77
+ ),
78
+ ) -> None: ...
79
+
80
+ @overload
81
+ @setdoc.setdoc(dict.pop.__doc__)
82
+ def pop(self: Self, key: Hashable, /) -> Optional[Value]: ...
83
+
84
+ @overload
85
+ @setdoc.setdoc(dict.pop.__doc__)
86
+ def pop(
87
+ self: Self,
88
+ key: Hashable,
89
+ default: Value_,
90
+ /,
91
+ ) -> Optional[Value | Value_]: ...
92
+
93
+ @setdoc.setdoc(dict.pop.__doc__)
94
+ def pop(
95
+ self: Self,
96
+ key: Hashable,
97
+ default: Any = MISSING,
98
+ /,
99
+ ) -> Optional[Value | Value_]:
100
+ ans: Optional[Value | Value_]
101
+ data: dict[Key | str, Optional[Value]]
102
+ data = dict(self.data)
103
+ if default is MISSING:
104
+ ans = data.pop(key) # type: ignore[arg-type]
105
+ else:
106
+ ans = data.pop(key, default) # type: ignore[arg-type]
107
+ self.data = frozendict(data)
108
+ return ans
109
+
110
+ @setdoc.setdoc(dict.popitem.__doc__)
111
+ def popitem(self: Self, /) -> tuple[Key | str, Optional[Value]]:
112
+ ans: tuple[Key | str, Optional[Value]]
113
+ data: dict[Key | str, Optional[Value]]
114
+ data = dict(self.data)
115
+ ans = data.popitem()
116
+ self.data = frozendict(data)
117
+ return ans
118
+
119
+ @setdoc.setdoc(dict.setdefault.__doc__)
120
+ def setdefault(
121
+ self: Self,
122
+ key: Key | str,
123
+ default: Optional[Value] = None,
124
+ /,
125
+ ) -> Optional[Value]:
126
+ ans: Optional[Value]
127
+ data: dict[Key | str, Optional[Value]]
128
+ data = dict(self.data)
129
+ ans = data.setdefault(key, default)
130
+ self.data = frozendict(data)
131
+ return ans
132
+
133
+ @setdoc.setdoc(dict.update.__doc__)
134
+ def update(
135
+ self: Self,
136
+ other: (
137
+ SupportsKeysAndGetitem[Key | str, Optional[Value]]
138
+ | Iterable[tuple[Key | str, Optional[Value]]]
139
+ ) = (),
140
+ /,
141
+ **kwargs: Optional[Value],
142
+ ) -> None:
143
+ data: dict[Key | str, Optional[Value]]
144
+ data = dict(self.data)
145
+ data.update(other, **kwargs)
146
+ self.data = frozendict(data)
@@ -0,0 +1,117 @@
1
+ from collections.abc import Iterable, MutableSequence
2
+ from typing import Any, Optional, Self, SupportsIndex, TypeVar, overload
3
+
4
+ import setdoc
5
+
6
+ from ..base.BaseDataList import BaseDataList
7
+ from .DataObject import DataObject
8
+
9
+ __all__ = ["DataList"]
10
+
11
+ Item = TypeVar("Item")
12
+
13
+
14
+ class DataList(
15
+ DataObject,
16
+ BaseDataList[Item],
17
+ MutableSequence[Item],
18
+ ):
19
+ __slots__ = ()
20
+
21
+ @setdoc.basic
22
+ def __delitem__(self: Self, other: SupportsIndex | slice, /) -> None:
23
+ data: list[Item]
24
+ data = list(self.data)
25
+ del data[other]
26
+ self.data = tuple(data)
27
+
28
+ @setdoc.basic
29
+ def __iadd__(self: Self, other: Iterable[Item], /) -> Self:
30
+ self.data += tuple(other)
31
+ return self
32
+
33
+ @setdoc.basic
34
+ def __imul__(self: Self, other: SupportsIndex, /) -> Self:
35
+ self.data *= other
36
+ return self
37
+
38
+ @setdoc.basic
39
+ def __init__(
40
+ self: Self,
41
+ data: Iterable[Item] = (),
42
+ /,
43
+ ) -> None:
44
+ self.data = tuple(data)
45
+
46
+ @overload
47
+ @setdoc.basic
48
+ def __setitem__(
49
+ self: Self, key: SupportsIndex, value: Item, /
50
+ ) -> None: ...
51
+
52
+ @overload
53
+ @setdoc.basic
54
+ def __setitem__(
55
+ self: Self,
56
+ key: slice,
57
+ value: Iterable[Item],
58
+ /,
59
+ ) -> None: ...
60
+
61
+ @setdoc.basic
62
+ def __setitem__(
63
+ self: Self,
64
+ key: SupportsIndex | slice,
65
+ value: Item | Iterable[Item],
66
+ /,
67
+ ) -> None:
68
+ data: Any
69
+ data = list(self.data)
70
+ data[key] = value
71
+ self.data = tuple(data)
72
+
73
+ @setdoc.setdoc(list.append.__doc__)
74
+ def append(self: Self, value: Item, /) -> None:
75
+ self.data += (value,)
76
+
77
+ @setdoc.setdoc(list.clear.__doc__)
78
+ def clear(self: Self, /) -> None:
79
+ self.data = ()
80
+
81
+ @setdoc.setdoc(list.extend.__doc__)
82
+ def extend(self: Self, iterable: Iterable[Item], /) -> None:
83
+ self.data += tuple(iterable)
84
+
85
+ @setdoc.setdoc(list.insert.__doc__)
86
+ def insert(self: Self, index: SupportsIndex, object: Item, /) -> None:
87
+ data: list[Item]
88
+ data = list(self.data)
89
+ data.insert(index, object)
90
+ self.data = tuple(data)
91
+
92
+ @setdoc.setdoc(list.pop.__doc__)
93
+ def pop(self: Self, index: SupportsIndex = -1, /) -> Item:
94
+ ans: Item
95
+ data: list[Item]
96
+ data = list(self.data)
97
+ ans = data.pop(index)
98
+ self.data = tuple(data)
99
+ return ans
100
+
101
+ @setdoc.setdoc(list.remove.__doc__)
102
+ def remove(self: Self, value: object) -> None:
103
+ data: list[Item]
104
+ data = list(self.data)
105
+ data.remove(value) # type: ignore[arg-type]
106
+ self.data = tuple(data)
107
+
108
+ @setdoc.setdoc(list.reverse.__doc__)
109
+ def reverse(self: Self) -> None:
110
+ self.data = tuple(self.data[::-1])
111
+
112
+ @setdoc.setdoc(list.sort.__doc__)
113
+ def sort(self: Self, key: Any = None, reverse: bool = False) -> None:
114
+ data: list[Item]
115
+ data = list(self.data)
116
+ data.sort(key=key, reverse=reverse)
117
+ self.data = tuple(data)