datahold 4.0.0.dev20__tar.gz → 4.0.0.dev21__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 (36) hide show
  1. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/PKG-INFO +1 -1
  2. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/pyproject.toml +1 -1
  3. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/src/datahold/__init__.py +181 -0
  4. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/src/datahold.egg-info/PKG-INFO +1 -1
  5. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/testdata.toml +48 -0
  6. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/LICENSE.txt +0 -0
  7. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/MANIFEST.in +0 -0
  8. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/README.rst +0 -0
  9. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/docs/v1.1.rst +0 -0
  10. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/docs/v1.2.rst +0 -0
  11. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/docs/v2.0.rst +0 -0
  12. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/docs/v2.1.rst +0 -0
  13. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/docs/v2.2.rst +0 -0
  14. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/docs/v2.3.rst +0 -0
  15. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/docs/v3.0.rst +0 -0
  16. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/docs/v4.0.rst +0 -0
  17. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/run_tests.py +0 -0
  18. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/setup.cfg +0 -0
  19. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/src/datahold/py.typed +0 -0
  20. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/src/datahold.egg-info/SOURCES.txt +0 -0
  21. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/src/datahold.egg-info/dependency_links.txt +0 -0
  22. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/src/datahold.egg-info/requires.txt +0 -0
  23. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/src/datahold.egg-info/top_level.txt +0 -0
  24. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_FrozenListSlot.py +0 -0
  25. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_MutableListHold.py +0 -0
  26. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_abstractmethods.py +0 -0
  27. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_all.py +0 -0
  28. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_attributes.py +0 -0
  29. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_docs.py +0 -0
  30. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_generic.py +0 -0
  31. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_internal_comparison.py +0 -0
  32. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_issubclass.py +0 -0
  33. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_nested.py +0 -0
  34. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_prefix.py +0 -0
  35. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/tests/test_sorted.py +0 -0
  36. {datahold-4.0.0.dev20 → datahold-4.0.0.dev21}/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.dev20
3
+ Version: 4.0.0.dev21
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.dev20"
33
+ version = "4.0.0.dev21"
34
34
 
35
35
  [project.urls]
36
36
  Download = "https://pypi.org/project/datahold/#files"
@@ -6,12 +6,20 @@ __all__: list[str] = [
6
6
  "Collection",
7
7
  "FrozenListLike",
8
8
  "FrozenListSlot",
9
+ "FrozenSetLike",
10
+ "FrozenSetSlot",
9
11
  "ListLike",
10
12
  "ListSlot",
11
13
  "MutableListLike",
12
14
  "MutableListSlot",
13
15
  "MutableSequence",
16
+ "MutableSet",
17
+ "MutableSetLike",
18
+ "MutableSetSlot",
14
19
  "Sequence",
20
+ "Set",
21
+ "SetLike",
22
+ "SetSlot",
15
23
  ]
16
24
 
17
25
  from abc import abstractmethod
@@ -91,6 +99,179 @@ class Collection[Item](
91
99
  return len(self.__frozen__())
92
100
 
93
101
 
102
+ ### SET ###
103
+
104
+
105
+ class Set[Item: abc.Hashable](Collection[Item], abc.Set[Item]):
106
+ """Provide abc for custom set."""
107
+
108
+ __slots__ = ()
109
+
110
+
111
+ class MutableSet[Item: abc.Hashable](Set[Item], abc.MutableSet[Item]):
112
+ """Provide abc for custom mutable set."""
113
+
114
+ __slots__ = ()
115
+
116
+ @setdoc.basic
117
+ class __Mutable__[MutableItem: abc.Hashable](Protocol):
118
+ @setdoc.basic
119
+ def add(self: Self, item: MutableItem, /) -> object: ...
120
+ @setdoc.basic
121
+ def discard(self: Self, item: abc.Hashable, /) -> object: ...
122
+ @abstractmethod
123
+ @setdoc.basic
124
+ def __mutate__(self: Self) -> ContextManager[__Mutable__[Item]]: ...
125
+ @setdoc.basic
126
+ def add(self: Self, item: Item, /) -> None:
127
+ with self.__mutate__() as mutable:
128
+ mutable.add(item)
129
+
130
+ @setdoc.basic
131
+ def discard(self: Self, item: abc.Hashable, /) -> None:
132
+ with self.__mutate__() as mutable:
133
+ mutable.discard(item)
134
+
135
+
136
+ ### SET-LIKE ###
137
+
138
+
139
+ class SetLike[Item: abc.Hashable](Set[Item]):
140
+ """Provide abc for custom set-like."""
141
+
142
+ __slots__ = ()
143
+ type __Frozen__[FrozenItem] = frozenset[FrozenItem]
144
+ type Init[FrozenItem] = abc.Iterable[FrozenItem]
145
+
146
+ @abstractmethod
147
+ @setdoc.basic
148
+ def __frozen__(self: Self, /) -> __Frozen__[Item]: ...
149
+ @abstractmethod
150
+ @setdoc.basic
151
+ def __init__(self: Self, data: Init[Item] = (), /) -> None: ...
152
+ @setdoc.basic
153
+ def difference(self: Self, /, *others: abc.Iterable[abc.Hashable]) -> Self:
154
+ return type(self)(self.__frozen__().difference(*others))
155
+
156
+ @setdoc.basic
157
+ def intersection(
158
+ self: Self, /, *others: abc.Iterable[abc.Hashable]
159
+ ) -> Self:
160
+ return type(self)(self.__frozen__().intersection(*others))
161
+
162
+ @setdoc.basic
163
+ def issubset(self: Self, other: abc.Iterable[abc.Hashable], /) -> Self:
164
+ return type(self)(self.__frozen__().issubset(other)) # type: ignore
165
+
166
+ @setdoc.basic
167
+ def issuperset(self: Self, other: abc.Iterable[abc.Hashable], /) -> Self:
168
+ return type(self)(self.__frozen__().issuperset(other)) # type: ignore
169
+
170
+ @setdoc.basic
171
+ def symmetric_difference(self: Self, other: abc.Iterable[Item], /) -> Self:
172
+ return type(self)(self.__frozen__().symmetric_difference(other))
173
+
174
+ @setdoc.basic
175
+ def union(self: Self, /, *others: abc.Iterable[Item]) -> Self:
176
+ return type(self)(self.__frozen__().union(others)) # type: ignore
177
+
178
+
179
+ class FrozenSetLike[Item: abc.Hashable](SetLike[Item], abc.Hashable):
180
+ """Provide abc for custom frozen set-like."""
181
+
182
+ __slots__ = ()
183
+
184
+ @setdoc.basic
185
+ def __hash__(self: Self) -> int:
186
+ return hash(self.__frozen__())
187
+
188
+
189
+ class MutableSetLike[Item: abc.Hashable](SetLike[Item], MutableSet[Item]):
190
+ """Provide abc for custom mutable set-like."""
191
+
192
+ __slots__ = ()
193
+
194
+ type __Mutable__[MutableItem] = set[MutableItem]
195
+
196
+ @setdoc.basic
197
+ def __frozen__(self: Self, /) -> MutableSetLike.__Frozen__[Item]:
198
+ with self.__mutate__() as mutable:
199
+ return frozenset(mutable)
200
+
201
+ @abstractmethod
202
+ @setdoc.basic
203
+ def __init__(self: Self, data: MutableSetLike.Init[Item] = (), /) -> None:
204
+ with self.__mutate__() as mutable:
205
+ mutable.update(data)
206
+
207
+ @abstractmethod
208
+ @setdoc.basic
209
+ def __mutate__(self: Self) -> ContextManager[__Mutable__[Item]]: ...
210
+ @setdoc.basic
211
+ def difference_update(
212
+ self: Self, /, *others: abc.Iterable[abc.Hashable]
213
+ ) -> None:
214
+ with self.__mutate__() as mutable:
215
+ mutable.difference_update(*others)
216
+
217
+ @setdoc.basic
218
+ def intersection_update(
219
+ self: Self, /, *others: abc.Iterable[abc.Hashable]
220
+ ) -> None:
221
+ with self.__mutate__() as mutable:
222
+ mutable.intersection_update(*others)
223
+
224
+ @setdoc.basic
225
+ def symmetric_difference_update(
226
+ self: Self, other: abc.Iterable[Item], /
227
+ ) -> None:
228
+ with self.__mutate__() as mutable:
229
+ mutable.symmetric_difference_update(other)
230
+
231
+ @setdoc.basic
232
+ def update(self: Self, /, *others: abc.Iterable[Item]) -> None:
233
+ with self.__mutate__() as mutable:
234
+ mutable.update(*others)
235
+
236
+
237
+ ### SET-SLOT ###
238
+
239
+
240
+ class SetSlot[Item: abc.Hashable](SetLike[Item]):
241
+ """Provide slotted set-like."""
242
+
243
+ __slots__ = ("_slot",)
244
+
245
+ _slot: SetSlot.__Frozen__[Item]
246
+
247
+ @setdoc.basic
248
+ def __frozen__(self: Self) -> SetSlot.__Frozen__[Item]:
249
+ return self._slot
250
+
251
+
252
+ class FrozenSetSlot[Item](SetSlot[Item], FrozenSetLike[Item]):
253
+ """Provide slotted frozen set-like."""
254
+
255
+ __slots__ = ()
256
+
257
+ @setdoc.basic
258
+ def __init__(self: Self, data: FrozenSetSlot.Init[Item] = (), /) -> None:
259
+ self._slot = frozenset(data)
260
+
261
+
262
+ class MutableSetSlot[Item](SetSlot[Item], MutableSetLike[Item]):
263
+ """Provide slotted mutable set-like."""
264
+
265
+ __slots__ = ()
266
+
267
+ @contextmanager
268
+ @setdoc.basic
269
+ def __mutate__(self: Self, /) -> abc.Generator[set[Item], None, None]:
270
+ slot = set(getattr(self, "_slot", ()))
271
+ yield slot
272
+ self._slot = frozenset(slot)
273
+
274
+
94
275
  ### SEQUENCE ###
95
276
 
96
277
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datahold
3
- Version: 4.0.0.dev20
3
+ Version: 4.0.0.dev21
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
@@ -140,6 +140,18 @@ __Mutable__ = ""
140
140
  [datatypes.FrozenListSlot.varia]
141
141
  generic = 1
142
142
 
143
+ [datatypes.FrozenSetLike.issubclass]
144
+ "collections.abc.Hashable" = true
145
+ "collections.abc.Set" = true
146
+ "datahold.Collection" = true
147
+ "datahold.SetLike" = true
148
+
149
+ [datatypes.FrozenSetSlot.issubclass]
150
+ "collections.abc.Collection" = true
151
+ "collections.abc.MutableSet" = false
152
+ "collections.abc.Set" = true
153
+ "datahold.Collection" = true
154
+
143
155
  [datatypes.ListLike]
144
156
  abstractmethods = [
145
157
  "__frozen__",
@@ -249,9 +261,45 @@ __setitem__ = "datahold.MutableSequence"
249
261
  insert = "datahold.MutableSequence"
250
262
  sort = ""
251
263
 
264
+ [datatypes.MutableSet.issubclass]
265
+ "collections.abc.MutableSet" = true
266
+ "collections.abc.Set" = true
267
+ "datahold.Collection" = true
268
+
269
+ [datatypes.MutableSetLike.issubclass]
270
+ "collections.abc.Hashable" = false
271
+ "collections.abc.MutableSet" = true
272
+ "collections.abc.Set" = true
273
+ "datahold.Collection" = true
274
+ "datahold.MutableSet" = true
275
+ "datahold.SetLike" = true
276
+
277
+ [datatypes.MutableSetSlot.issubclass]
278
+ "collections.abc.MutableSet" = true
279
+ "collections.abc.Set" = true
280
+ "datahold.Collection" = true
281
+ "datahold.MutableSet" = true
282
+ "datahold.MutableSetLike" = true
283
+ "datahold.SetSlot" = true
284
+
252
285
  [datatypes.Sequence]
253
286
  abstractmethods = [
254
287
  "__frozen__",
255
288
  ]
256
289
 
290
+ [datatypes.Set.issubclass]
291
+ "collections.abc.Set" = true
292
+ "datahold.Collection" = true
293
+
294
+ [datatypes.SetLike.issubclass]
295
+ "collections.abc.Set" = true
296
+ "datahold.Collection" = true
297
+ "datahold.Set" = true
298
+ "datahold.SetLike" = true
299
+
300
+ [datatypes.SetSlot.issubclass]
301
+ "collections.abc.Set" = true
302
+ "datahold.Collection" = true
303
+ "datahold.SetLike" = true
304
+
257
305
  [non_datatypes]
File without changes