datahold 4.0.0.dev3__tar.gz → 4.0.0.dev4__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.dev3 → datahold-4.0.0.dev4}/PKG-INFO +1 -1
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/pyproject.toml +1 -1
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/src/datahold/__init__.py +70 -53
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/src/datahold.egg-info/PKG-INFO +1 -1
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/test_FrozenHoldDict.py +4 -4
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/test_FrozenHoldList.py +15 -10
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/test_FrozenHoldSet.py +4 -12
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/test_HoldDict.py +14 -9
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/test_HoldList.py +20 -16
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/test_HoldSet.py +31 -35
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/test_datahold_TestDataAttribute.py +3 -16
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/test_datahold_TestMutableBehavior.py +1 -1
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/LICENSE.txt +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/MANIFEST.in +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/README.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/docs/v1.1.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/docs/v1.2.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/docs/v2.0.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/docs/v2.1.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/docs/v2.2.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/docs/v2.3.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/docs/v3.0.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/docs/v4.0.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/run_tests.py +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/setup.cfg +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/src/datahold/py.typed +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/src/datahold.egg-info/SOURCES.txt +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/src/datahold.egg-info/dependency_links.txt +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/src/datahold.egg-info/requires.txt +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/src/datahold.egg-info/top_level.txt +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/test_datahold_TestCopy.py +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/test_datahold_TestFrozenMutability.py +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/test_testdata.py +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev4}/tests/testdata.toml +0 -0
|
@@ -52,6 +52,15 @@ class Missing(enum.Enum):
|
|
|
52
52
|
type Slice[Index] = slice[Optional[Index], Optional[Index], Optional[Index]]
|
|
53
53
|
|
|
54
54
|
|
|
55
|
+
class SupportsKeysAndGetitem[Key, Value](Protocol):
|
|
56
|
+
|
|
57
|
+
@setdoc.basic
|
|
58
|
+
def __getitem__(self: Self, key: Never, /) -> Value: ...
|
|
59
|
+
|
|
60
|
+
@setdoc.basic
|
|
61
|
+
def keys(self: Self) -> abc.Iterable[Key]: ...
|
|
62
|
+
|
|
63
|
+
|
|
55
64
|
### COLLECTION ###
|
|
56
65
|
|
|
57
66
|
|
|
@@ -70,7 +79,6 @@ class BaseDataCollection[Item](
|
|
|
70
79
|
abc.Sized,
|
|
71
80
|
abc.Iterable[DataItem],
|
|
72
81
|
abc.Container[Never],
|
|
73
|
-
abc.Hashable,
|
|
74
82
|
Protocol,
|
|
75
83
|
):
|
|
76
84
|
"""Provide collection data protocol."""
|
|
@@ -113,12 +121,15 @@ class BaseDataAbstractSet[Item](
|
|
|
113
121
|
__slots__ = ()
|
|
114
122
|
|
|
115
123
|
|
|
124
|
+
### SET ###
|
|
125
|
+
|
|
126
|
+
|
|
116
127
|
class BaseDataSet[Item: abc.Hashable](BaseDataAbstractSet[Item]):
|
|
117
128
|
"""Provide an easy abc for custom set-like."""
|
|
118
129
|
|
|
119
130
|
__slots__ = ()
|
|
120
131
|
|
|
121
|
-
type Data[DataItem] =
|
|
132
|
+
type Data[DataItem] = set[DataItem]
|
|
122
133
|
type Init[InitItem] = abc.Iterable[InitItem]
|
|
123
134
|
|
|
124
135
|
@abstractmethod
|
|
@@ -131,7 +142,7 @@ class BaseDataSet[Item: abc.Hashable](BaseDataAbstractSet[Item]):
|
|
|
131
142
|
|
|
132
143
|
@abstractmethod
|
|
133
144
|
@setdoc.basic
|
|
134
|
-
def __fget__(self: Self) ->
|
|
145
|
+
def __fget__(self: Self) -> set[Item]: ...
|
|
135
146
|
|
|
136
147
|
@setdoc.basic
|
|
137
148
|
def difference(self: Self, /, *others: abc.Iterable[abc.Hashable]) -> Self:
|
|
@@ -171,7 +182,7 @@ class FrozenDataSet[Item: abc.Hashable](BaseDataSet[Item], abc.Hashable):
|
|
|
171
182
|
|
|
172
183
|
@setdoc.basic
|
|
173
184
|
def __hash__(self: Self) -> int:
|
|
174
|
-
return hash(self.__fget__())
|
|
185
|
+
return hash(frozenset(self.__fget__()))
|
|
175
186
|
|
|
176
187
|
|
|
177
188
|
class FrozenHoldSet[Item: abc.Hashable](
|
|
@@ -184,7 +195,7 @@ class FrozenHoldSet[Item: abc.Hashable](
|
|
|
184
195
|
|
|
185
196
|
@setdoc.basic
|
|
186
197
|
def __fget__(self: Self) -> FrozenHoldSet.Data[Item]:
|
|
187
|
-
return self._data
|
|
198
|
+
return set(self._data)
|
|
188
199
|
|
|
189
200
|
@setdoc.basic
|
|
190
201
|
def __fset__(self: Self, data: FrozenHoldSet.Data[Item], /) -> None:
|
|
@@ -192,7 +203,7 @@ class FrozenHoldSet[Item: abc.Hashable](
|
|
|
192
203
|
|
|
193
204
|
@setdoc.basic
|
|
194
205
|
def __init__(self: Self, data: FrozenHoldSet.Init[Item] = (), /) -> None:
|
|
195
|
-
self.__fset__(
|
|
206
|
+
self.__fset__(set(data))
|
|
196
207
|
|
|
197
208
|
|
|
198
209
|
class DataSet[Item: abc.Hashable](
|
|
@@ -211,13 +222,13 @@ class DataSet[Item: abc.Hashable](
|
|
|
211
222
|
@setdoc.basic
|
|
212
223
|
def __fset__(
|
|
213
224
|
self: Self,
|
|
214
|
-
value: DataSet.
|
|
225
|
+
value: DataSet.Data[Item],
|
|
215
226
|
/,
|
|
216
227
|
) -> None: ...
|
|
217
228
|
|
|
218
229
|
@setdoc.basic
|
|
219
230
|
def __init__(self: Self, data: abc.Iterable[Item] = (), /) -> None:
|
|
220
|
-
self.__fset__(
|
|
231
|
+
self.__fset__(set(data))
|
|
221
232
|
|
|
222
233
|
@setdoc.basic
|
|
223
234
|
def add(self: Self, item: Item, /) -> None:
|
|
@@ -236,14 +247,14 @@ class DataSet[Item: abc.Hashable](
|
|
|
236
247
|
data: set[Item]
|
|
237
248
|
data = set(self.__fget__())
|
|
238
249
|
data.difference_update(*others)
|
|
239
|
-
self.__fset__(
|
|
250
|
+
self.__fset__(set(data))
|
|
240
251
|
|
|
241
252
|
@setdoc.basic
|
|
242
253
|
def discard(self: Self, item: abc.Hashable, /) -> None:
|
|
243
254
|
data: set[Item]
|
|
244
255
|
data = set(self.__fget__())
|
|
245
256
|
data.discard(item)
|
|
246
|
-
self.__fset__(
|
|
257
|
+
self.__fset__(set(data))
|
|
247
258
|
|
|
248
259
|
@setdoc.basic
|
|
249
260
|
def intersection_update(
|
|
@@ -252,7 +263,7 @@ class DataSet[Item: abc.Hashable](
|
|
|
252
263
|
data: set[Item]
|
|
253
264
|
data = set(self.__fget__())
|
|
254
265
|
data.intersection_update(*others)
|
|
255
|
-
self.__fset__(
|
|
266
|
+
self.__fset__(set(data))
|
|
256
267
|
|
|
257
268
|
@setdoc.basic
|
|
258
269
|
def symmetric_difference_update(
|
|
@@ -261,7 +272,7 @@ class DataSet[Item: abc.Hashable](
|
|
|
261
272
|
data: set[Item]
|
|
262
273
|
data = set(self.__fget__())
|
|
263
274
|
data.symmetric_difference_update(other)
|
|
264
|
-
self.__fset__(
|
|
275
|
+
self.__fset__(set(data))
|
|
265
276
|
|
|
266
277
|
@setdoc.basic
|
|
267
278
|
def update(self: Self, /, *others: abc.Iterable[Item]) -> None:
|
|
@@ -278,11 +289,11 @@ class HoldSet[Item: abc.Hashable](
|
|
|
278
289
|
|
|
279
290
|
@setdoc.basic
|
|
280
291
|
def __fget__(self: Self) -> HoldSet.Data[Item]:
|
|
281
|
-
return self._data
|
|
292
|
+
return set(self._data)
|
|
282
293
|
|
|
283
294
|
@setdoc.basic
|
|
284
|
-
def __fset__(self: Self, value:
|
|
285
|
-
self._data: HoldSet.Data[Item] =
|
|
295
|
+
def __fset__(self: Self, value: HoldSet.Data[Item], /) -> None:
|
|
296
|
+
self._data: HoldSet.Data[Item] = value
|
|
286
297
|
|
|
287
298
|
|
|
288
299
|
### MAPPING ###
|
|
@@ -314,13 +325,7 @@ class BaseDataMapping[Key, Value](
|
|
|
314
325
|
def __fget__(self: Self) -> Data[Key, Value]: ...
|
|
315
326
|
|
|
316
327
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
@setdoc.basic
|
|
320
|
-
def __getitem__(self: Self, key: Never, /) -> Value: ...
|
|
321
|
-
|
|
322
|
-
@setdoc.basic
|
|
323
|
-
def keys(self: Self) -> abc.Iterable[Key]: ...
|
|
328
|
+
### DICT ###
|
|
324
329
|
|
|
325
330
|
|
|
326
331
|
class BaseDataDict[Key: abc.Hashable, Value](
|
|
@@ -330,9 +335,7 @@ class BaseDataDict[Key: abc.Hashable, Value](
|
|
|
330
335
|
|
|
331
336
|
__slots__ = ()
|
|
332
337
|
|
|
333
|
-
type Data[DataKey, DataValue] =
|
|
334
|
-
DataKey | str, Optional[DataValue]
|
|
335
|
-
]
|
|
338
|
+
type Data[DataKey, DataValue] = dict[DataKey | str, Optional[DataValue]]
|
|
336
339
|
type Init[DataKey, DataValue] = (
|
|
337
340
|
SupportsKeysAndGetitem[DataKey | str, Optional[DataValue]]
|
|
338
341
|
| abc.Iterable[tuple[DataKey | str, Optional[DataValue]]]
|
|
@@ -386,7 +389,7 @@ class FrozenDataDict[Key: abc.Hashable, Value](
|
|
|
386
389
|
|
|
387
390
|
@setdoc.basic
|
|
388
391
|
def __hash__(self: Self) -> int:
|
|
389
|
-
return hash(self.__fget__())
|
|
392
|
+
return hash(frozendict(self.__fget__()))
|
|
390
393
|
|
|
391
394
|
|
|
392
395
|
class FrozenHoldDict[Key: abc.Hashable, Value](
|
|
@@ -405,7 +408,7 @@ class FrozenHoldDict[Key: abc.Hashable, Value](
|
|
|
405
408
|
**kwargs: Optional[Value],
|
|
406
409
|
) -> None:
|
|
407
410
|
self.__fset__(
|
|
408
|
-
|
|
411
|
+
dict(
|
|
409
412
|
data, # type: ignore[arg-type]
|
|
410
413
|
**kwargs,
|
|
411
414
|
)
|
|
@@ -413,7 +416,7 @@ class FrozenHoldDict[Key: abc.Hashable, Value](
|
|
|
413
416
|
|
|
414
417
|
@setdoc.basic
|
|
415
418
|
def __fget__(self: Self) -> FrozenHoldDict.Data[Key, Value]:
|
|
416
|
-
return self._data
|
|
419
|
+
return dict(self._data)
|
|
417
420
|
|
|
418
421
|
@setdoc.basic
|
|
419
422
|
def __fset__(self: Self, data: FrozenHoldDict.Data[Key, Value], /) -> None:
|
|
@@ -430,7 +433,10 @@ class DataDict[Key: abc.Hashable, Value](
|
|
|
430
433
|
|
|
431
434
|
@setdoc.basic
|
|
432
435
|
def __delitem__(self: Self, key: Key | str, /) -> None:
|
|
433
|
-
|
|
436
|
+
data: DataDict.Data[Key, Value]
|
|
437
|
+
data = self.__fget__()
|
|
438
|
+
del data[key]
|
|
439
|
+
self.__fset__(data)
|
|
434
440
|
|
|
435
441
|
@abstractmethod
|
|
436
442
|
@setdoc.basic
|
|
@@ -447,7 +453,12 @@ class DataDict[Key: abc.Hashable, Value](
|
|
|
447
453
|
/,
|
|
448
454
|
**kwargs: Optional[Value],
|
|
449
455
|
) -> None:
|
|
450
|
-
self.__fset__(
|
|
456
|
+
self.__fset__(
|
|
457
|
+
dict(
|
|
458
|
+
data, # type: ignore[arg-type]
|
|
459
|
+
**kwargs,
|
|
460
|
+
)
|
|
461
|
+
)
|
|
451
462
|
|
|
452
463
|
@setdoc.basic
|
|
453
464
|
def __ior__(
|
|
@@ -466,7 +477,10 @@ class DataDict[Key: abc.Hashable, Value](
|
|
|
466
477
|
/,
|
|
467
478
|
) -> None:
|
|
468
479
|
# what to do if Key includes unhashable types?
|
|
469
|
-
|
|
480
|
+
data: DataDict.Data[Key, Value]
|
|
481
|
+
data = self.__fget__()
|
|
482
|
+
data[key] = value
|
|
483
|
+
self.__fset__(data)
|
|
470
484
|
|
|
471
485
|
@setdoc.basic
|
|
472
486
|
def copy(self: Self) -> Self:
|
|
@@ -483,15 +497,15 @@ class HoldDict[Key: abc.Hashable, Value](
|
|
|
483
497
|
|
|
484
498
|
@setdoc.basic
|
|
485
499
|
def __fget__(self: Self) -> HoldDict.Data[Key, Value]:
|
|
486
|
-
return self._data
|
|
500
|
+
return dict(self._data)
|
|
487
501
|
|
|
488
502
|
@setdoc.basic
|
|
489
503
|
def __fset__(
|
|
490
504
|
self: Self,
|
|
491
|
-
value: HoldDict.
|
|
505
|
+
value: HoldDict.Data[Key, Value],
|
|
492
506
|
/,
|
|
493
507
|
) -> None:
|
|
494
|
-
self._data: HoldDict.Data[Key, Value] =
|
|
508
|
+
self._data: HoldDict.Data[Key, Value] = value
|
|
495
509
|
|
|
496
510
|
|
|
497
511
|
### SEQUENCE ###
|
|
@@ -542,12 +556,15 @@ class BaseDataSequence[Item](
|
|
|
542
556
|
def __fget__(self: Self) -> Data[Item]: ...
|
|
543
557
|
|
|
544
558
|
|
|
559
|
+
### LIST ###
|
|
560
|
+
|
|
561
|
+
|
|
545
562
|
class BaseDataList[Item](BaseDataSequence[Item]):
|
|
546
563
|
"""Provide an easy abc for custom list-like."""
|
|
547
564
|
|
|
548
565
|
__slots__ = ()
|
|
549
566
|
|
|
550
|
-
type Data[DataItem] =
|
|
567
|
+
type Data[DataItem] = list[DataItem]
|
|
551
568
|
type Init[InitItem] = abc.Iterable[InitItem]
|
|
552
569
|
|
|
553
570
|
@setdoc.basic
|
|
@@ -646,7 +663,7 @@ class FrozenDataList[Item](
|
|
|
646
663
|
|
|
647
664
|
@setdoc.basic
|
|
648
665
|
def __hash__(self: Self) -> int:
|
|
649
|
-
return hash(self.__fget__())
|
|
666
|
+
return hash(tuple(self.__fget__()))
|
|
650
667
|
|
|
651
668
|
|
|
652
669
|
class FrozenHoldList[Item](
|
|
@@ -659,7 +676,7 @@ class FrozenHoldList[Item](
|
|
|
659
676
|
|
|
660
677
|
@setdoc.basic
|
|
661
678
|
def __fget__(self: Self) -> FrozenHoldList.Data[Item]:
|
|
662
|
-
return self._data
|
|
679
|
+
return list(self._data)
|
|
663
680
|
|
|
664
681
|
@setdoc.basic
|
|
665
682
|
def __fset__(self: Self, data: FrozenHoldList.Data[Item], /) -> None:
|
|
@@ -667,7 +684,7 @@ class FrozenHoldList[Item](
|
|
|
667
684
|
|
|
668
685
|
@setdoc.basic
|
|
669
686
|
def __init__(self: Self, data: FrozenHoldList.Init[Item] = (), /) -> None:
|
|
670
|
-
self.__fset__(
|
|
687
|
+
self.__fset__(list(data))
|
|
671
688
|
|
|
672
689
|
|
|
673
690
|
class DataList[Item](
|
|
@@ -683,9 +700,9 @@ class DataList[Item](
|
|
|
683
700
|
self: Self, other: SupportsIndex | Slice[SupportsIndex], /
|
|
684
701
|
) -> None:
|
|
685
702
|
data: list[Item]
|
|
686
|
-
data =
|
|
703
|
+
data = self.__fget__()
|
|
687
704
|
del data[other]
|
|
688
|
-
self.__fset__(
|
|
705
|
+
self.__fset__(data)
|
|
689
706
|
|
|
690
707
|
@abstractmethod
|
|
691
708
|
@setdoc.basic
|
|
@@ -695,7 +712,7 @@ class DataList[Item](
|
|
|
695
712
|
@setdoc.basic
|
|
696
713
|
def __fset__(
|
|
697
714
|
self: Self,
|
|
698
|
-
value: DataList.
|
|
715
|
+
value: DataList.Data[Item],
|
|
699
716
|
/,
|
|
700
717
|
) -> None: ...
|
|
701
718
|
|
|
@@ -710,7 +727,7 @@ class DataList[Item](
|
|
|
710
727
|
data: abc.Iterable[Item] = (),
|
|
711
728
|
/,
|
|
712
729
|
) -> None:
|
|
713
|
-
self.__fset__(
|
|
730
|
+
self.__fset__(list(data))
|
|
714
731
|
|
|
715
732
|
@overload
|
|
716
733
|
@setdoc.basic
|
|
@@ -734,10 +751,10 @@ class DataList[Item](
|
|
|
734
751
|
value: Item | abc.Iterable[Item],
|
|
735
752
|
/,
|
|
736
753
|
) -> None:
|
|
737
|
-
data:
|
|
738
|
-
data =
|
|
739
|
-
data[key] = value
|
|
740
|
-
self.__fset__(
|
|
754
|
+
data: list[Item]
|
|
755
|
+
data = self.__fget__()
|
|
756
|
+
data[key] = value # type: ignore[index, assignment]
|
|
757
|
+
self.__fset__(data)
|
|
741
758
|
|
|
742
759
|
@setdoc.basic
|
|
743
760
|
def copy(self: Self) -> Self:
|
|
@@ -746,16 +763,16 @@ class DataList[Item](
|
|
|
746
763
|
@setdoc.basic
|
|
747
764
|
def insert(self: Self, index: SupportsIndex, item: Item, /) -> None:
|
|
748
765
|
data: list[Item]
|
|
749
|
-
data =
|
|
766
|
+
data = self.__fget__()
|
|
750
767
|
data.insert(index, item)
|
|
751
|
-
self.__fset__(
|
|
768
|
+
self.__fset__(data)
|
|
752
769
|
|
|
753
770
|
@setdoc.basic
|
|
754
771
|
def sort(self: Self, *, key: Any = None, reverse: bool = False) -> None:
|
|
755
772
|
data: list[Item]
|
|
756
|
-
data =
|
|
773
|
+
data = self.__fget__()
|
|
757
774
|
data.sort(key=key, reverse=reverse)
|
|
758
|
-
self.__fset__(
|
|
775
|
+
self.__fset__(data)
|
|
759
776
|
|
|
760
777
|
|
|
761
778
|
class HoldList[Item](
|
|
@@ -768,8 +785,8 @@ class HoldList[Item](
|
|
|
768
785
|
|
|
769
786
|
@setdoc.basic
|
|
770
787
|
def __fget__(self: Self) -> HoldList.Data[Item]:
|
|
771
|
-
return self._data
|
|
788
|
+
return list(self._data)
|
|
772
789
|
|
|
773
790
|
@setdoc.basic
|
|
774
|
-
def __fset__(self: Self, value:
|
|
775
|
-
self._data: HoldList.Data[Item] =
|
|
791
|
+
def __fset__(self: Self, value: HoldList.Data[Item], /) -> None:
|
|
792
|
+
self._data: HoldList.Data[Item] = value
|
|
@@ -19,12 +19,12 @@ class TestFrozenHoldDict(unittest.TestCase):
|
|
|
19
19
|
def test_init(self: Self) -> None:
|
|
20
20
|
obj: Any
|
|
21
21
|
obj = FrozenHoldDict({"x": 42})
|
|
22
|
-
self.assertEqual(obj.__fget__(),
|
|
22
|
+
self.assertEqual(obj.__fget__(), dict({"x": 42}))
|
|
23
23
|
|
|
24
24
|
# data property
|
|
25
25
|
def test_data(self: Self) -> None:
|
|
26
|
-
self.assertIsInstance(self.obj.__fget__(),
|
|
27
|
-
self.assertEqual(self.obj.__fget__(),
|
|
26
|
+
self.assertIsInstance(self.obj.__fget__(), dict)
|
|
27
|
+
self.assertEqual(self.obj.__fget__(), dict({"a": 1, "b": 2}))
|
|
28
28
|
|
|
29
29
|
# __contains__
|
|
30
30
|
def test_contains(self: Self) -> None:
|
|
@@ -55,7 +55,7 @@ class TestFrozenHoldDict(unittest.TestCase):
|
|
|
55
55
|
|
|
56
56
|
# __hash__
|
|
57
57
|
def test_hash(self: Self) -> None:
|
|
58
|
-
self.assertEqual(hash(self.obj), hash(self.obj.__fget__()))
|
|
58
|
+
self.assertEqual(hash(self.obj), hash(frozendict(self.obj.__fget__())))
|
|
59
59
|
self.assertEqual(hash(self.obj), hash(self.same))
|
|
60
60
|
|
|
61
61
|
# __or__
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
__all__: list[str] = ["TestFrozenHoldLists"]
|
|
2
2
|
import unittest
|
|
3
|
-
from typing import Self
|
|
3
|
+
from typing import Any, Self
|
|
4
4
|
|
|
5
5
|
from datahold import FrozenHoldList
|
|
6
6
|
|
|
@@ -14,13 +14,14 @@ class TestFrozenHoldList(unittest.TestCase):
|
|
|
14
14
|
|
|
15
15
|
# __init__
|
|
16
16
|
def test_init(self: Self) -> None:
|
|
17
|
+
obj: FrozenHoldList[int]
|
|
17
18
|
obj = FrozenHoldList([42])
|
|
18
|
-
self.assertEqual(obj.__fget__(),
|
|
19
|
+
self.assertEqual(obj.__fget__(), [42])
|
|
19
20
|
|
|
20
21
|
# data property
|
|
21
22
|
def test_data(self: Self) -> None:
|
|
22
|
-
self.assertIsInstance(self.obj.__fget__(),
|
|
23
|
-
self.assertEqual(self.obj.__fget__(),
|
|
23
|
+
self.assertIsInstance(self.obj.__fget__(), list)
|
|
24
|
+
self.assertEqual(self.obj.__fget__(), [1, 2, 3])
|
|
24
25
|
|
|
25
26
|
# __contains__
|
|
26
27
|
def test_contains(self: Self) -> None:
|
|
@@ -33,6 +34,7 @@ class TestFrozenHoldList(unittest.TestCase):
|
|
|
33
34
|
self.assertEqual(self.obj[-1], 3)
|
|
34
35
|
|
|
35
36
|
def test_getitem_slice(self: Self) -> None:
|
|
37
|
+
result: Any
|
|
36
38
|
result = self.obj[1:]
|
|
37
39
|
self.assertEqual(result, FrozenHoldList([2, 3]))
|
|
38
40
|
self.assertEqual(list(result), [2, 3])
|
|
@@ -57,33 +59,37 @@ class TestFrozenHoldList(unittest.TestCase):
|
|
|
57
59
|
|
|
58
60
|
# __lt__
|
|
59
61
|
def test_lt(self: Self) -> None:
|
|
62
|
+
expected: bool
|
|
60
63
|
expected = self.obj.__fget__() < self.other.__fget__()
|
|
61
64
|
self.assertEqual(self.obj < self.other, expected)
|
|
62
65
|
|
|
63
66
|
# __le__
|
|
64
67
|
def test_le(self: Self) -> None:
|
|
68
|
+
expected: bool
|
|
65
69
|
expected = self.obj.__fget__() <= self.same.__fget__()
|
|
66
70
|
self.assertEqual(self.obj <= self.same, expected)
|
|
67
71
|
|
|
68
72
|
# __gt__
|
|
69
73
|
def test_gt(self: Self) -> None:
|
|
74
|
+
expected: bool
|
|
70
75
|
expected = self.other.__fget__() > self.obj.__fget__()
|
|
71
76
|
self.assertEqual(self.other > self.obj, expected)
|
|
72
77
|
|
|
73
78
|
# __ge__
|
|
74
79
|
def test_ge(self: Self) -> None:
|
|
80
|
+
expected: bool
|
|
75
81
|
expected = self.obj.__fget__() >= self.same.__fget__()
|
|
76
82
|
self.assertEqual(self.obj >= self.same, expected)
|
|
77
83
|
|
|
78
84
|
# __hash__
|
|
79
85
|
def test_hash(self: Self) -> None:
|
|
80
|
-
self.assertEqual(hash(self.obj), hash(self.obj.__fget__()))
|
|
86
|
+
self.assertEqual(hash(self.obj), hash(tuple(self.obj.__fget__())))
|
|
81
87
|
self.assertEqual(hash(self.obj), hash(self.same))
|
|
82
88
|
|
|
83
89
|
# __add__
|
|
84
90
|
def test_add(self: Self) -> None:
|
|
91
|
+
result: Any
|
|
85
92
|
result = self.obj + FrozenHoldList([4, 5])
|
|
86
|
-
|
|
87
93
|
self.assertIsInstance(result, FrozenHoldList)
|
|
88
94
|
self.assertEqual(
|
|
89
95
|
result,
|
|
@@ -92,8 +98,8 @@ class TestFrozenHoldList(unittest.TestCase):
|
|
|
92
98
|
|
|
93
99
|
# __mul__
|
|
94
100
|
def test_mul(self: Self) -> None:
|
|
101
|
+
result: Any
|
|
95
102
|
result = self.obj * 2
|
|
96
|
-
|
|
97
103
|
self.assertIsInstance(result, FrozenHoldList)
|
|
98
104
|
self.assertEqual(
|
|
99
105
|
result,
|
|
@@ -102,8 +108,8 @@ class TestFrozenHoldList(unittest.TestCase):
|
|
|
102
108
|
|
|
103
109
|
# __rmul__
|
|
104
110
|
def test_rmul(self: Self) -> None:
|
|
111
|
+
result: Any
|
|
105
112
|
result = 2 * self.obj
|
|
106
|
-
|
|
107
113
|
self.assertIsInstance(result, FrozenHoldList)
|
|
108
114
|
self.assertEqual(
|
|
109
115
|
result,
|
|
@@ -126,15 +132,14 @@ class TestFrozenHoldList(unittest.TestCase):
|
|
|
126
132
|
|
|
127
133
|
# count
|
|
128
134
|
def test_count(self: Self) -> None:
|
|
135
|
+
obj: FrozenHoldList[int]
|
|
129
136
|
obj = FrozenHoldList([1, 2, 1, 3, 1])
|
|
130
|
-
|
|
131
137
|
self.assertEqual(obj.count(1), 3)
|
|
132
138
|
self.assertEqual(obj.count(99), 0)
|
|
133
139
|
|
|
134
140
|
# index
|
|
135
141
|
def test_index(self: Self) -> None:
|
|
136
142
|
self.assertEqual(self.obj.index(2), 1)
|
|
137
|
-
|
|
138
143
|
with self.assertRaises(ValueError):
|
|
139
144
|
self.obj.index(99)
|
|
140
145
|
|
|
@@ -15,12 +15,12 @@ class TestFrozenHoldSet(unittest.TestCase):
|
|
|
15
15
|
# __init__
|
|
16
16
|
def test_init(self: Self) -> None:
|
|
17
17
|
obj = FrozenHoldSet([1, 2, 3])
|
|
18
|
-
self.assertEqual(obj.__fget__(),
|
|
18
|
+
self.assertEqual(obj.__fget__(), {1, 2, 3})
|
|
19
19
|
|
|
20
20
|
# data property
|
|
21
21
|
def test_data(self: Self) -> None:
|
|
22
|
-
self.assertIsInstance(self.obj.__fget__(),
|
|
23
|
-
self.assertEqual(self.obj.__fget__(),
|
|
22
|
+
self.assertIsInstance(self.obj.__fget__(), set)
|
|
23
|
+
self.assertEqual(self.obj.__fget__(), {1, 2, 3})
|
|
24
24
|
|
|
25
25
|
# __contains__
|
|
26
26
|
def test_contains(self: Self) -> None:
|
|
@@ -66,12 +66,11 @@ class TestFrozenHoldSet(unittest.TestCase):
|
|
|
66
66
|
# __hash__
|
|
67
67
|
def test_hash(self: Self) -> None:
|
|
68
68
|
self.assertEqual(hash(self.obj), hash(self.same))
|
|
69
|
-
self.assertEqual(hash(self.obj), hash(self.obj.__fget__()))
|
|
69
|
+
self.assertEqual(hash(self.obj), hash(frozenset(self.obj.__fget__())))
|
|
70
70
|
|
|
71
71
|
# __or__
|
|
72
72
|
def test_or(self: Self) -> None:
|
|
73
73
|
result = FrozenHoldSet({1, 2}) | FrozenHoldSet({2, 3})
|
|
74
|
-
|
|
75
74
|
self.assertIsInstance(result, FrozenHoldSet)
|
|
76
75
|
self.assertEqual(
|
|
77
76
|
result,
|
|
@@ -88,7 +87,6 @@ class TestFrozenHoldSet(unittest.TestCase):
|
|
|
88
87
|
# union
|
|
89
88
|
def test_union(self: Self) -> None:
|
|
90
89
|
result = self.obj.union({4, 5})
|
|
91
|
-
|
|
92
90
|
self.assertIsInstance(result, FrozenHoldSet)
|
|
93
91
|
self.assertEqual(
|
|
94
92
|
result,
|
|
@@ -98,7 +96,6 @@ class TestFrozenHoldSet(unittest.TestCase):
|
|
|
98
96
|
# intersection
|
|
99
97
|
def test_intersection(self: Self) -> None:
|
|
100
98
|
result = self.obj.intersection({2, 3, 4})
|
|
101
|
-
|
|
102
99
|
self.assertEqual(
|
|
103
100
|
result,
|
|
104
101
|
FrozenHoldSet({2, 3}),
|
|
@@ -107,7 +104,6 @@ class TestFrozenHoldSet(unittest.TestCase):
|
|
|
107
104
|
# difference
|
|
108
105
|
def test_difference(self: Self) -> None:
|
|
109
106
|
result = self.obj.difference({2})
|
|
110
|
-
|
|
111
107
|
self.assertEqual(
|
|
112
108
|
result,
|
|
113
109
|
FrozenHoldSet({1, 3}),
|
|
@@ -116,7 +112,6 @@ class TestFrozenHoldSet(unittest.TestCase):
|
|
|
116
112
|
# symmetric_difference
|
|
117
113
|
def test_symmetric_difference(self: Self) -> None:
|
|
118
114
|
result = self.obj.symmetric_difference({3, 4})
|
|
119
|
-
|
|
120
115
|
self.assertEqual(
|
|
121
116
|
result,
|
|
122
117
|
FrozenHoldSet({1, 2, 4}),
|
|
@@ -146,7 +141,6 @@ class TestFrozenHoldSet(unittest.TestCase):
|
|
|
146
141
|
# __and__
|
|
147
142
|
def test_and(self: Self) -> None:
|
|
148
143
|
result = FrozenHoldSet({1, 2, 3}) & FrozenHoldSet({2, 3, 4})
|
|
149
|
-
|
|
150
144
|
self.assertEqual(
|
|
151
145
|
result,
|
|
152
146
|
FrozenHoldSet({2, 3}),
|
|
@@ -155,7 +149,6 @@ class TestFrozenHoldSet(unittest.TestCase):
|
|
|
155
149
|
# __sub__
|
|
156
150
|
def test_sub(self: Self) -> None:
|
|
157
151
|
result = FrozenHoldSet({1, 2, 3}) - FrozenHoldSet({2})
|
|
158
|
-
|
|
159
152
|
self.assertEqual(
|
|
160
153
|
result,
|
|
161
154
|
FrozenHoldSet({1, 3}),
|
|
@@ -164,7 +157,6 @@ class TestFrozenHoldSet(unittest.TestCase):
|
|
|
164
157
|
# __xor__
|
|
165
158
|
def test_xor(self: Self) -> None:
|
|
166
159
|
result = FrozenHoldSet({1, 2, 3}) ^ FrozenHoldSet({3, 4})
|
|
167
|
-
|
|
168
160
|
self.assertEqual(
|
|
169
161
|
result,
|
|
170
162
|
FrozenHoldSet({1, 2, 4}),
|
|
@@ -8,13 +8,17 @@ from datahold import HoldDict
|
|
|
8
8
|
class TestHoldDict(unittest.TestCase):
|
|
9
9
|
|
|
10
10
|
def setUp(self: Self) -> None:
|
|
11
|
-
self.obj: Any
|
|
12
|
-
self.
|
|
13
|
-
self.
|
|
11
|
+
self.obj: Any
|
|
12
|
+
self.other: Any
|
|
13
|
+
self.same: Any
|
|
14
|
+
self.obj = HoldDict({"a": 1, "b": 2})
|
|
15
|
+
self.same = HoldDict({"a": 1, "b": 2})
|
|
16
|
+
self.other = HoldDict({"a": 1, "b": 3})
|
|
14
17
|
|
|
15
18
|
# __init__
|
|
16
19
|
def test_init(self: Self) -> None:
|
|
17
|
-
obj: Any
|
|
20
|
+
obj: Any
|
|
21
|
+
obj = HoldDict({"x": 42})
|
|
18
22
|
self.assertEqual(obj.__fget__(), {"x": 42})
|
|
19
23
|
|
|
20
24
|
# data property
|
|
@@ -61,8 +65,8 @@ class TestHoldDict(unittest.TestCase):
|
|
|
61
65
|
|
|
62
66
|
# __or__
|
|
63
67
|
def test_or(self: Self) -> None:
|
|
64
|
-
result: Any
|
|
65
|
-
|
|
68
|
+
result: Any
|
|
69
|
+
result = HoldDict({"a": 1}) | HoldDict({"b": 2})
|
|
66
70
|
self.assertIsInstance(result, HoldDict)
|
|
67
71
|
self.assertEqual(
|
|
68
72
|
result,
|
|
@@ -78,8 +82,8 @@ class TestHoldDict(unittest.TestCase):
|
|
|
78
82
|
|
|
79
83
|
# fromkeys
|
|
80
84
|
def test_fromkeys(self: Self) -> None:
|
|
81
|
-
result: Any
|
|
82
|
-
|
|
85
|
+
result: Any
|
|
86
|
+
result = HoldDict.fromkeys(["x", "y"], 123)
|
|
83
87
|
self.assertIsInstance(result, HoldDict)
|
|
84
88
|
self.assertEqual(
|
|
85
89
|
result,
|
|
@@ -126,7 +130,8 @@ class TestHoldDict(unittest.TestCase):
|
|
|
126
130
|
|
|
127
131
|
# setdefault
|
|
128
132
|
def test_setdefault(self: Self) -> None:
|
|
129
|
-
value: Any
|
|
133
|
+
value: Any
|
|
134
|
+
value = self.obj.setdefault("c", 3)
|
|
130
135
|
self.assertEqual(value, 3)
|
|
131
136
|
self.assertEqual(self.obj["c"], 3)
|
|
132
137
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
__all__: list[str] = ["TestHoldList"]
|
|
2
2
|
import unittest
|
|
3
|
-
from typing import Self
|
|
3
|
+
from typing import Any, Self
|
|
4
4
|
|
|
5
5
|
from datahold import HoldList
|
|
6
6
|
|
|
@@ -8,19 +8,23 @@ from datahold import HoldList
|
|
|
8
8
|
class TestHoldList(unittest.TestCase):
|
|
9
9
|
|
|
10
10
|
def setUp(self: Self) -> None:
|
|
11
|
+
self.obj: HoldList[int]
|
|
12
|
+
self.other: HoldList[int]
|
|
13
|
+
self.same: HoldList[int]
|
|
11
14
|
self.obj = HoldList([1, 2, 3])
|
|
12
15
|
self.same = HoldList([1, 2, 3])
|
|
13
16
|
self.other = HoldList([1, 2, 4])
|
|
14
17
|
|
|
15
18
|
# __init__
|
|
16
19
|
def test_init(self: Self) -> None:
|
|
20
|
+
obj: HoldList[int]
|
|
17
21
|
obj = HoldList([42])
|
|
18
|
-
self.assertEqual(obj.__fget__(),
|
|
22
|
+
self.assertEqual(obj.__fget__(), [42])
|
|
19
23
|
|
|
20
24
|
# data property
|
|
21
25
|
def test_data(self: Self) -> None:
|
|
22
|
-
self.assertIsInstance(self.obj.__fget__(),
|
|
23
|
-
self.assertEqual(self.obj.__fget__(),
|
|
26
|
+
self.assertIsInstance(self.obj.__fget__(), list)
|
|
27
|
+
self.assertEqual(self.obj.__fget__(), [1, 2, 3])
|
|
24
28
|
|
|
25
29
|
# __contains__
|
|
26
30
|
def test_contains(self: Self) -> None:
|
|
@@ -40,7 +44,7 @@ class TestHoldList(unittest.TestCase):
|
|
|
40
44
|
# __delitem__
|
|
41
45
|
def test_delitem(self: Self) -> None:
|
|
42
46
|
del self.obj[1]
|
|
43
|
-
self.assertEqual(self.obj.__fget__(),
|
|
47
|
+
self.assertEqual(self.obj.__fget__(), [1, 3])
|
|
44
48
|
|
|
45
49
|
# __iter__
|
|
46
50
|
def test_iter(self: Self) -> None:
|
|
@@ -62,21 +66,25 @@ class TestHoldList(unittest.TestCase):
|
|
|
62
66
|
|
|
63
67
|
# __lt__
|
|
64
68
|
def test_lt(self: Self) -> None:
|
|
69
|
+
expected: bool
|
|
65
70
|
expected = self.obj.__fget__() < self.other.__fget__()
|
|
66
71
|
self.assertEqual(self.obj < self.other, expected)
|
|
67
72
|
|
|
68
73
|
# __le__
|
|
69
74
|
def test_le(self: Self) -> None:
|
|
75
|
+
expected: bool
|
|
70
76
|
expected = self.obj.__fget__() <= self.same.__fget__()
|
|
71
77
|
self.assertEqual(self.obj <= self.same, expected)
|
|
72
78
|
|
|
73
79
|
# __gt__
|
|
74
80
|
def test_gt(self: Self) -> None:
|
|
81
|
+
expected: bool
|
|
75
82
|
expected = self.other.__fget__() > self.obj.__fget__()
|
|
76
83
|
self.assertEqual(self.other > self.obj, expected)
|
|
77
84
|
|
|
78
85
|
# __ge__
|
|
79
86
|
def test_ge(self: Self) -> None:
|
|
87
|
+
expected: bool
|
|
80
88
|
expected = self.same.__fget__() >= self.obj.__fget__()
|
|
81
89
|
self.assertEqual(self.same >= self.obj, expected)
|
|
82
90
|
|
|
@@ -90,7 +98,6 @@ class TestHoldList(unittest.TestCase):
|
|
|
90
98
|
# append
|
|
91
99
|
def test_append(self: Self) -> None:
|
|
92
100
|
self.obj.append(4)
|
|
93
|
-
|
|
94
101
|
self.assertEqual(
|
|
95
102
|
self.obj,
|
|
96
103
|
HoldList([1, 2, 3, 4]),
|
|
@@ -99,7 +106,6 @@ class TestHoldList(unittest.TestCase):
|
|
|
99
106
|
# extend
|
|
100
107
|
def test_extend(self: Self) -> None:
|
|
101
108
|
self.obj.extend([4, 5])
|
|
102
|
-
|
|
103
109
|
self.assertEqual(
|
|
104
110
|
self.obj,
|
|
105
111
|
HoldList([1, 2, 3, 4, 5]),
|
|
@@ -108,7 +114,6 @@ class TestHoldList(unittest.TestCase):
|
|
|
108
114
|
# insert
|
|
109
115
|
def test_insert(self: Self) -> None:
|
|
110
116
|
self.obj.insert(1, 99)
|
|
111
|
-
|
|
112
117
|
self.assertEqual(
|
|
113
118
|
self.obj,
|
|
114
119
|
HoldList([1, 99, 2, 3]),
|
|
@@ -117,7 +122,6 @@ class TestHoldList(unittest.TestCase):
|
|
|
117
122
|
# remove
|
|
118
123
|
def test_remove(self: Self) -> None:
|
|
119
124
|
self.obj.remove(2)
|
|
120
|
-
|
|
121
125
|
self.assertEqual(
|
|
122
126
|
self.obj,
|
|
123
127
|
HoldList([1, 3]),
|
|
@@ -125,8 +129,8 @@ class TestHoldList(unittest.TestCase):
|
|
|
125
129
|
|
|
126
130
|
# pop
|
|
127
131
|
def test_pop(self: Self) -> None:
|
|
132
|
+
value: Any
|
|
128
133
|
value = self.obj.pop()
|
|
129
|
-
|
|
130
134
|
self.assertEqual(value, 3)
|
|
131
135
|
self.assertEqual(
|
|
132
136
|
self.obj,
|
|
@@ -136,7 +140,6 @@ class TestHoldList(unittest.TestCase):
|
|
|
136
140
|
# clear
|
|
137
141
|
def test_clear(self: Self) -> None:
|
|
138
142
|
self.obj.clear()
|
|
139
|
-
|
|
140
143
|
self.assertEqual(len(self.obj), 0)
|
|
141
144
|
|
|
142
145
|
# index
|
|
@@ -148,8 +151,8 @@ class TestHoldList(unittest.TestCase):
|
|
|
148
151
|
|
|
149
152
|
# count
|
|
150
153
|
def test_count(self: Self) -> None:
|
|
154
|
+
obj: HoldList[int]
|
|
151
155
|
obj = HoldList([1, 2, 2, 3])
|
|
152
|
-
|
|
153
156
|
self.assertEqual(
|
|
154
157
|
obj.count(2),
|
|
155
158
|
2,
|
|
@@ -158,7 +161,6 @@ class TestHoldList(unittest.TestCase):
|
|
|
158
161
|
# reverse
|
|
159
162
|
def test_reverse(self: Self) -> None:
|
|
160
163
|
self.obj.reverse()
|
|
161
|
-
|
|
162
164
|
self.assertEqual(
|
|
163
165
|
self.obj,
|
|
164
166
|
HoldList([3, 2, 1]),
|
|
@@ -166,10 +168,9 @@ class TestHoldList(unittest.TestCase):
|
|
|
166
168
|
|
|
167
169
|
# sort
|
|
168
170
|
def test_sort(self: Self) -> None:
|
|
171
|
+
obj: HoldList[int]
|
|
169
172
|
obj = HoldList([3, 1, 2])
|
|
170
|
-
|
|
171
173
|
obj.sort()
|
|
172
|
-
|
|
173
174
|
self.assertEqual(
|
|
174
175
|
obj,
|
|
175
176
|
HoldList([1, 2, 3]),
|
|
@@ -177,14 +178,15 @@ class TestHoldList(unittest.TestCase):
|
|
|
177
178
|
|
|
178
179
|
# copy
|
|
179
180
|
def test_copy(self: Self) -> None:
|
|
181
|
+
result: HoldList[Any]
|
|
180
182
|
result = self.obj.copy()
|
|
181
|
-
|
|
182
183
|
self.assertIsInstance(result, HoldList)
|
|
183
184
|
self.assertEqual(result, self.obj)
|
|
184
185
|
self.assertIsNot(result, self.obj)
|
|
185
186
|
|
|
186
187
|
# __add__
|
|
187
188
|
def test_add(self: Self) -> None:
|
|
189
|
+
result: HoldList[int]
|
|
188
190
|
result = HoldList([1, 2]) + HoldList([3, 4])
|
|
189
191
|
self.assertEqual(
|
|
190
192
|
result,
|
|
@@ -193,6 +195,7 @@ class TestHoldList(unittest.TestCase):
|
|
|
193
195
|
|
|
194
196
|
# __mul__
|
|
195
197
|
def test_mul(self: Self) -> None:
|
|
198
|
+
result: HoldList[int]
|
|
196
199
|
result = HoldList([1, 2]) * 2
|
|
197
200
|
self.assertEqual(
|
|
198
201
|
result,
|
|
@@ -201,6 +204,7 @@ class TestHoldList(unittest.TestCase):
|
|
|
201
204
|
|
|
202
205
|
# __rmul__
|
|
203
206
|
def test_rmul(self: Self) -> None:
|
|
207
|
+
result: HoldList[int]
|
|
204
208
|
result = 2 * HoldList([1, 2])
|
|
205
209
|
self.assertEqual(
|
|
206
210
|
result,
|
|
@@ -7,19 +7,23 @@ from datahold import HoldSet
|
|
|
7
7
|
class TestHoldSet(unittest.TestCase):
|
|
8
8
|
|
|
9
9
|
def setUp(self: Self) -> None:
|
|
10
|
-
self.obj: Any
|
|
11
|
-
self.
|
|
12
|
-
self.
|
|
10
|
+
self.obj: Any
|
|
11
|
+
self.other: Any
|
|
12
|
+
self.same: Any
|
|
13
|
+
self.obj = HoldSet({1, 2, 3})
|
|
14
|
+
self.other = HoldSet({3, 4, 5})
|
|
15
|
+
self.same = HoldSet({1, 2, 3})
|
|
13
16
|
|
|
14
17
|
# __init__
|
|
15
18
|
def test_init(self: Self) -> None:
|
|
16
|
-
obj: Any
|
|
17
|
-
|
|
19
|
+
obj: Any
|
|
20
|
+
obj = HoldSet([1, 2, 3])
|
|
21
|
+
self.assertEqual(obj.__fget__(), {1, 2, 3})
|
|
18
22
|
|
|
19
23
|
# data property
|
|
20
24
|
def test_data(self: Self) -> None:
|
|
21
|
-
self.assertIsInstance(self.obj.__fget__(),
|
|
22
|
-
self.assertEqual(self.obj.__fget__(),
|
|
25
|
+
self.assertIsInstance(self.obj.__fget__(), set)
|
|
26
|
+
self.assertEqual(self.obj.__fget__(), {1, 2, 3})
|
|
23
27
|
|
|
24
28
|
# __contains__
|
|
25
29
|
def test_contains(self: Self) -> None:
|
|
@@ -64,8 +68,8 @@ class TestHoldSet(unittest.TestCase):
|
|
|
64
68
|
|
|
65
69
|
# __or__
|
|
66
70
|
def test_or(self: Self) -> None:
|
|
67
|
-
result: Any
|
|
68
|
-
|
|
71
|
+
result: Any
|
|
72
|
+
result = HoldSet({1, 2}) | HoldSet({2, 3})
|
|
69
73
|
self.assertIsInstance(result, HoldSet)
|
|
70
74
|
self.assertEqual(
|
|
71
75
|
result,
|
|
@@ -74,8 +78,8 @@ class TestHoldSet(unittest.TestCase):
|
|
|
74
78
|
|
|
75
79
|
# __and__
|
|
76
80
|
def test_and(self: Self) -> None:
|
|
77
|
-
result: Any
|
|
78
|
-
|
|
81
|
+
result: Any
|
|
82
|
+
result = HoldSet({1, 2, 3}) & HoldSet({2, 3, 4})
|
|
79
83
|
self.assertEqual(
|
|
80
84
|
result,
|
|
81
85
|
HoldSet({2, 3}),
|
|
@@ -83,8 +87,8 @@ class TestHoldSet(unittest.TestCase):
|
|
|
83
87
|
|
|
84
88
|
# __sub__
|
|
85
89
|
def test_sub(self: Self) -> None:
|
|
86
|
-
result: Any
|
|
87
|
-
|
|
90
|
+
result: Any
|
|
91
|
+
result = HoldSet({1, 2, 3}) - HoldSet({2})
|
|
88
92
|
self.assertEqual(
|
|
89
93
|
result,
|
|
90
94
|
HoldSet({1, 3}),
|
|
@@ -92,8 +96,8 @@ class TestHoldSet(unittest.TestCase):
|
|
|
92
96
|
|
|
93
97
|
# __xor__
|
|
94
98
|
def test_xor(self: Self) -> None:
|
|
95
|
-
result: Any
|
|
96
|
-
|
|
99
|
+
result: Any
|
|
100
|
+
result = HoldSet({1, 2, 3}) ^ HoldSet({3, 4})
|
|
97
101
|
self.assertEqual(
|
|
98
102
|
result,
|
|
99
103
|
HoldSet({1, 2, 4}),
|
|
@@ -109,7 +113,6 @@ class TestHoldSet(unittest.TestCase):
|
|
|
109
113
|
# add
|
|
110
114
|
def test_add(self: Self) -> None:
|
|
111
115
|
self.obj.add(4)
|
|
112
|
-
|
|
113
116
|
self.assertEqual(
|
|
114
117
|
self.obj,
|
|
115
118
|
HoldSet({1, 2, 3, 4}),
|
|
@@ -118,7 +121,6 @@ class TestHoldSet(unittest.TestCase):
|
|
|
118
121
|
# remove
|
|
119
122
|
def test_remove(self: Self) -> None:
|
|
120
123
|
self.obj.remove(2)
|
|
121
|
-
|
|
122
124
|
self.assertEqual(
|
|
123
125
|
self.obj,
|
|
124
126
|
HoldSet({1, 3}),
|
|
@@ -128,7 +130,6 @@ class TestHoldSet(unittest.TestCase):
|
|
|
128
130
|
def test_discard(self: Self) -> None:
|
|
129
131
|
self.obj.discard(2)
|
|
130
132
|
self.obj.discard(999)
|
|
131
|
-
|
|
132
133
|
self.assertEqual(
|
|
133
134
|
self.obj,
|
|
134
135
|
HoldSet({1, 3}),
|
|
@@ -136,21 +137,19 @@ class TestHoldSet(unittest.TestCase):
|
|
|
136
137
|
|
|
137
138
|
# pop
|
|
138
139
|
def test_pop(self: Self) -> None:
|
|
139
|
-
value: Any
|
|
140
|
-
|
|
140
|
+
value: Any
|
|
141
|
+
value = self.obj.pop()
|
|
141
142
|
self.assertNotIn(value, self.obj)
|
|
142
143
|
self.assertEqual(len(self.obj), 2)
|
|
143
144
|
|
|
144
145
|
# clear
|
|
145
146
|
def test_clear(self: Self) -> None:
|
|
146
147
|
self.obj.clear()
|
|
147
|
-
|
|
148
148
|
self.assertEqual(len(self.obj), 0)
|
|
149
149
|
|
|
150
150
|
# update
|
|
151
151
|
def test_update(self: Self) -> None:
|
|
152
152
|
self.obj.update({4, 5})
|
|
153
|
-
|
|
154
153
|
self.assertEqual(
|
|
155
154
|
self.obj,
|
|
156
155
|
HoldSet({1, 2, 3, 4, 5}),
|
|
@@ -158,8 +157,8 @@ class TestHoldSet(unittest.TestCase):
|
|
|
158
157
|
|
|
159
158
|
# union
|
|
160
159
|
def test_union(self: Self) -> None:
|
|
161
|
-
result: Any
|
|
162
|
-
|
|
160
|
+
result: Any
|
|
161
|
+
result = self.obj.union({4, 5})
|
|
163
162
|
self.assertIsInstance(result, HoldSet)
|
|
164
163
|
self.assertEqual(
|
|
165
164
|
result,
|
|
@@ -168,8 +167,8 @@ class TestHoldSet(unittest.TestCase):
|
|
|
168
167
|
|
|
169
168
|
# intersection
|
|
170
169
|
def test_intersection(self: Self) -> None:
|
|
171
|
-
result: Any
|
|
172
|
-
|
|
170
|
+
result: Any
|
|
171
|
+
result = self.obj.intersection({2, 3, 4})
|
|
173
172
|
self.assertEqual(
|
|
174
173
|
result,
|
|
175
174
|
HoldSet({2, 3}),
|
|
@@ -177,8 +176,8 @@ class TestHoldSet(unittest.TestCase):
|
|
|
177
176
|
|
|
178
177
|
# difference
|
|
179
178
|
def test_difference(self: Self) -> None:
|
|
180
|
-
result: Any
|
|
181
|
-
|
|
179
|
+
result: Any
|
|
180
|
+
result = self.obj.difference({2})
|
|
182
181
|
self.assertEqual(
|
|
183
182
|
result,
|
|
184
183
|
HoldSet({1, 3}),
|
|
@@ -186,8 +185,8 @@ class TestHoldSet(unittest.TestCase):
|
|
|
186
185
|
|
|
187
186
|
# symmetric_difference
|
|
188
187
|
def test_symmetric_difference(self: Self) -> None:
|
|
189
|
-
result: Any
|
|
190
|
-
|
|
188
|
+
result: Any
|
|
189
|
+
result = self.obj.symmetric_difference({3, 4})
|
|
191
190
|
self.assertEqual(
|
|
192
191
|
result,
|
|
193
192
|
HoldSet({1, 2, 4}),
|
|
@@ -209,8 +208,8 @@ class TestHoldSet(unittest.TestCase):
|
|
|
209
208
|
|
|
210
209
|
# copy
|
|
211
210
|
def test_copy(self: Self) -> None:
|
|
212
|
-
result: Any
|
|
213
|
-
|
|
211
|
+
result: Any
|
|
212
|
+
result = self.obj.copy()
|
|
214
213
|
self.assertIsInstance(result, HoldSet)
|
|
215
214
|
self.assertEqual(result, self.obj)
|
|
216
215
|
self.assertIsNot(result, self.obj)
|
|
@@ -221,17 +220,14 @@ class TestHoldSet(unittest.TestCase):
|
|
|
221
220
|
{1, 2} | HoldSet({2, 3}),
|
|
222
221
|
HoldSet({1, 2, 3}),
|
|
223
222
|
)
|
|
224
|
-
|
|
225
223
|
self.assertEqual(
|
|
226
224
|
{1, 2} & HoldSet({2, 3}),
|
|
227
225
|
HoldSet({2}),
|
|
228
226
|
)
|
|
229
|
-
|
|
230
227
|
self.assertEqual(
|
|
231
228
|
{1, 2} - HoldSet({2}),
|
|
232
229
|
HoldSet({1}),
|
|
233
230
|
)
|
|
234
|
-
|
|
235
231
|
self.assertEqual(
|
|
236
232
|
{1, 2} ^ HoldSet({2, 3}),
|
|
237
233
|
HoldSet({1, 3}),
|
|
@@ -3,8 +3,6 @@ __all__: list[str] = ["TestDataAttribute"]
|
|
|
3
3
|
import unittest
|
|
4
4
|
from typing import Any, Self
|
|
5
5
|
|
|
6
|
-
from frozendict import frozendict
|
|
7
|
-
|
|
8
6
|
from datahold import (
|
|
9
7
|
FrozenHoldDict,
|
|
10
8
|
FrozenHoldList,
|
|
@@ -22,13 +20,8 @@ class TestDataAttribute(unittest.TestCase):
|
|
|
22
20
|
obj: Any
|
|
23
21
|
f = FrozenHoldDict({"a": 1})
|
|
24
22
|
m = HoldDict({"a": 1})
|
|
25
|
-
|
|
26
23
|
for obj in (f, m):
|
|
27
|
-
self.assertIsInstance(obj.__fget__(),
|
|
28
|
-
|
|
29
|
-
# try to mutate underlying data
|
|
30
|
-
with self.assertRaises((TypeError, AttributeError)):
|
|
31
|
-
obj.__fget__()["b"] = 2
|
|
24
|
+
self.assertIsInstance(obj.__fget__(), dict)
|
|
32
25
|
|
|
33
26
|
def test_list_data_is_tuple(self: Self) -> None:
|
|
34
27
|
f: FrozenHoldList[Any]
|
|
@@ -36,11 +29,8 @@ class TestDataAttribute(unittest.TestCase):
|
|
|
36
29
|
o: Any
|
|
37
30
|
f = FrozenHoldList([1, 2, 3])
|
|
38
31
|
m = HoldList([1, 2, 3])
|
|
39
|
-
|
|
40
32
|
for o in (f, m):
|
|
41
|
-
self.assertIsInstance(o.__fget__(),
|
|
42
|
-
with self.assertRaises(Exception):
|
|
43
|
-
o.__fget__().append(4)
|
|
33
|
+
self.assertIsInstance(o.__fget__(), list)
|
|
44
34
|
|
|
45
35
|
def test_set_data_is_frozenset(self: Self) -> None:
|
|
46
36
|
f: FrozenHoldSet[Any]
|
|
@@ -48,11 +38,8 @@ class TestDataAttribute(unittest.TestCase):
|
|
|
48
38
|
obj: Any
|
|
49
39
|
f = FrozenHoldSet({1, 2, 3})
|
|
50
40
|
m = HoldSet({1, 2, 3})
|
|
51
|
-
|
|
52
41
|
for obj in (f, m):
|
|
53
|
-
self.assertIsInstance(obj.__fget__(),
|
|
54
|
-
with self.assertRaises(AttributeError):
|
|
55
|
-
obj.__fget__().add(4)
|
|
42
|
+
self.assertIsInstance(obj.__fget__(), set)
|
|
56
43
|
|
|
57
44
|
|
|
58
45
|
if __name__ == "__main__":
|
|
@@ -19,7 +19,7 @@ class TestMutableBehavior(unittest.TestCase):
|
|
|
19
19
|
x = HoldList([1, 2])
|
|
20
20
|
x.append(3)
|
|
21
21
|
self.assertEqual(list(x), [1, 2, 3])
|
|
22
|
-
self.assertEqual(x.__fget__(),
|
|
22
|
+
self.assertEqual(x.__fget__(), [1, 2, 3])
|
|
23
23
|
|
|
24
24
|
def test_hold_set_mutates_and_syncs_data(self: Self) -> None:
|
|
25
25
|
s: HoldSet[Any]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|