datahold 4.0.0.dev3__tar.gz → 4.0.0.dev5__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.dev5}/PKG-INFO +1 -1
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/pyproject.toml +1 -1
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/src/datahold/__init__.py +83 -97
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/src/datahold.egg-info/PKG-INFO +1 -1
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/tests/test_FrozenHoldDict.py +4 -4
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/tests/test_FrozenHoldList.py +15 -10
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/tests/test_FrozenHoldSet.py +4 -12
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/tests/test_HoldDict.py +14 -9
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/tests/test_HoldList.py +20 -16
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/tests/test_HoldSet.py +31 -35
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/tests/test_datahold_TestDataAttribute.py +3 -16
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/tests/test_datahold_TestMutableBehavior.py +1 -1
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/LICENSE.txt +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/MANIFEST.in +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/README.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/docs/v1.1.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/docs/v1.2.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/docs/v2.0.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/docs/v2.1.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/docs/v2.2.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/docs/v2.3.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/docs/v3.0.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/docs/v4.0.rst +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/run_tests.py +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/setup.cfg +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/src/datahold/py.typed +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/src/datahold.egg-info/SOURCES.txt +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/src/datahold.egg-info/dependency_links.txt +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/src/datahold.egg-info/requires.txt +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/src/datahold.egg-info/top_level.txt +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/tests/test_datahold_TestCopy.py +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/tests/test_datahold_TestFrozenMutability.py +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/tests/test_testdata.py +0 -0
- {datahold-4.0.0.dev3 → datahold-4.0.0.dev5}/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,25 +121,32 @@ 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
|
|
125
136
|
@setdoc.basic
|
|
126
|
-
def
|
|
137
|
+
def __fget__(self: Self) -> set[Item]: ...
|
|
127
138
|
|
|
139
|
+
@abstractmethod
|
|
128
140
|
@setdoc.basic
|
|
129
|
-
def
|
|
130
|
-
|
|
141
|
+
def __fset__(self: Self, data: Data[Item], /) -> None: ...
|
|
142
|
+
|
|
143
|
+
@setdoc.basic
|
|
144
|
+
def __init__(self: Self, data: Init[Item] = (), /) -> None:
|
|
145
|
+
self.__fset__(set(data))
|
|
131
146
|
|
|
132
|
-
@abstractmethod
|
|
133
147
|
@setdoc.basic
|
|
134
|
-
def
|
|
148
|
+
def __repr__(self: Self, /) -> str:
|
|
149
|
+
return f"{type(self).__name__}({set(self.__fget__())!r})"
|
|
135
150
|
|
|
136
151
|
@setdoc.basic
|
|
137
152
|
def difference(self: Self, /, *others: abc.Iterable[abc.Hashable]) -> Self:
|
|
@@ -171,7 +186,7 @@ class FrozenDataSet[Item: abc.Hashable](BaseDataSet[Item], abc.Hashable):
|
|
|
171
186
|
|
|
172
187
|
@setdoc.basic
|
|
173
188
|
def __hash__(self: Self) -> int:
|
|
174
|
-
return hash(self.__fget__())
|
|
189
|
+
return hash(frozenset(self.__fget__()))
|
|
175
190
|
|
|
176
191
|
|
|
177
192
|
class FrozenHoldSet[Item: abc.Hashable](
|
|
@@ -184,16 +199,12 @@ class FrozenHoldSet[Item: abc.Hashable](
|
|
|
184
199
|
|
|
185
200
|
@setdoc.basic
|
|
186
201
|
def __fget__(self: Self) -> FrozenHoldSet.Data[Item]:
|
|
187
|
-
return self._data
|
|
202
|
+
return set(self._data)
|
|
188
203
|
|
|
189
204
|
@setdoc.basic
|
|
190
205
|
def __fset__(self: Self, data: FrozenHoldSet.Data[Item], /) -> None:
|
|
191
206
|
self._data: FrozenHoldSet.Data[Item] = data
|
|
192
207
|
|
|
193
|
-
@setdoc.basic
|
|
194
|
-
def __init__(self: Self, data: FrozenHoldSet.Init[Item] = (), /) -> None:
|
|
195
|
-
self.__fset__(frozenset(data))
|
|
196
|
-
|
|
197
208
|
|
|
198
209
|
class DataSet[Item: abc.Hashable](
|
|
199
210
|
BaseDataSet[Item],
|
|
@@ -211,14 +222,10 @@ 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
|
-
@setdoc.basic
|
|
219
|
-
def __init__(self: Self, data: abc.Iterable[Item] = (), /) -> None:
|
|
220
|
-
self.__fset__(frozenset(data))
|
|
221
|
-
|
|
222
229
|
@setdoc.basic
|
|
223
230
|
def add(self: Self, item: Item, /) -> None:
|
|
224
231
|
self.__fset__(self.__fget__() | {item})
|
|
@@ -236,14 +243,14 @@ class DataSet[Item: abc.Hashable](
|
|
|
236
243
|
data: set[Item]
|
|
237
244
|
data = set(self.__fget__())
|
|
238
245
|
data.difference_update(*others)
|
|
239
|
-
self.__fset__(
|
|
246
|
+
self.__fset__(set(data))
|
|
240
247
|
|
|
241
248
|
@setdoc.basic
|
|
242
249
|
def discard(self: Self, item: abc.Hashable, /) -> None:
|
|
243
250
|
data: set[Item]
|
|
244
251
|
data = set(self.__fget__())
|
|
245
252
|
data.discard(item)
|
|
246
|
-
self.__fset__(
|
|
253
|
+
self.__fset__(set(data))
|
|
247
254
|
|
|
248
255
|
@setdoc.basic
|
|
249
256
|
def intersection_update(
|
|
@@ -252,7 +259,7 @@ class DataSet[Item: abc.Hashable](
|
|
|
252
259
|
data: set[Item]
|
|
253
260
|
data = set(self.__fget__())
|
|
254
261
|
data.intersection_update(*others)
|
|
255
|
-
self.__fset__(
|
|
262
|
+
self.__fset__(set(data))
|
|
256
263
|
|
|
257
264
|
@setdoc.basic
|
|
258
265
|
def symmetric_difference_update(
|
|
@@ -261,7 +268,7 @@ class DataSet[Item: abc.Hashable](
|
|
|
261
268
|
data: set[Item]
|
|
262
269
|
data = set(self.__fget__())
|
|
263
270
|
data.symmetric_difference_update(other)
|
|
264
|
-
self.__fset__(
|
|
271
|
+
self.__fset__(set(data))
|
|
265
272
|
|
|
266
273
|
@setdoc.basic
|
|
267
274
|
def update(self: Self, /, *others: abc.Iterable[Item]) -> None:
|
|
@@ -278,11 +285,11 @@ class HoldSet[Item: abc.Hashable](
|
|
|
278
285
|
|
|
279
286
|
@setdoc.basic
|
|
280
287
|
def __fget__(self: Self) -> HoldSet.Data[Item]:
|
|
281
|
-
return self._data
|
|
288
|
+
return set(self._data)
|
|
282
289
|
|
|
283
290
|
@setdoc.basic
|
|
284
|
-
def __fset__(self: Self, value:
|
|
285
|
-
self._data: HoldSet.Data[Item] =
|
|
291
|
+
def __fset__(self: Self, value: HoldSet.Data[Item], /) -> None:
|
|
292
|
+
self._data: HoldSet.Data[Item] = value
|
|
286
293
|
|
|
287
294
|
|
|
288
295
|
### MAPPING ###
|
|
@@ -314,13 +321,7 @@ class BaseDataMapping[Key, Value](
|
|
|
314
321
|
def __fget__(self: Self) -> Data[Key, Value]: ...
|
|
315
322
|
|
|
316
323
|
|
|
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]: ...
|
|
324
|
+
### DICT ###
|
|
324
325
|
|
|
325
326
|
|
|
326
327
|
class BaseDataDict[Key: abc.Hashable, Value](
|
|
@@ -330,22 +331,29 @@ class BaseDataDict[Key: abc.Hashable, Value](
|
|
|
330
331
|
|
|
331
332
|
__slots__ = ()
|
|
332
333
|
|
|
333
|
-
type Data[DataKey, DataValue] =
|
|
334
|
-
DataKey | str, Optional[DataValue]
|
|
335
|
-
]
|
|
334
|
+
type Data[DataKey, DataValue] = dict[DataKey | str, Optional[DataValue]]
|
|
336
335
|
type Init[DataKey, DataValue] = (
|
|
337
336
|
SupportsKeysAndGetitem[DataKey | str, Optional[DataValue]]
|
|
338
337
|
| abc.Iterable[tuple[DataKey | str, Optional[DataValue]]]
|
|
339
338
|
)
|
|
340
339
|
|
|
341
340
|
@abstractmethod
|
|
341
|
+
@setdoc.basic
|
|
342
|
+
def __fset__(self: Self, data: Data[Key, Value], /) -> None: ...
|
|
343
|
+
|
|
342
344
|
@setdoc.basic
|
|
343
345
|
def __init__(
|
|
344
346
|
self: Self,
|
|
345
347
|
data: Init[Key, Value] = (),
|
|
346
348
|
/,
|
|
347
349
|
**kwargs: Optional[Value],
|
|
348
|
-
) -> None:
|
|
350
|
+
) -> None:
|
|
351
|
+
data_: BaseDataDict.Data[Key, Value]
|
|
352
|
+
data_ = dict( # type: ignore[assignment]
|
|
353
|
+
data, # type: ignore[arg-type]
|
|
354
|
+
**kwargs,
|
|
355
|
+
)
|
|
356
|
+
self.__fset__(data_)
|
|
349
357
|
|
|
350
358
|
@setdoc.basic
|
|
351
359
|
def __or__(
|
|
@@ -386,7 +394,7 @@ class FrozenDataDict[Key: abc.Hashable, Value](
|
|
|
386
394
|
|
|
387
395
|
@setdoc.basic
|
|
388
396
|
def __hash__(self: Self) -> int:
|
|
389
|
-
return hash(self.__fget__())
|
|
397
|
+
return hash(frozendict(self.__fget__()))
|
|
390
398
|
|
|
391
399
|
|
|
392
400
|
class FrozenHoldDict[Key: abc.Hashable, Value](
|
|
@@ -397,23 +405,9 @@ class FrozenHoldDict[Key: abc.Hashable, Value](
|
|
|
397
405
|
|
|
398
406
|
__slots__ = ()
|
|
399
407
|
|
|
400
|
-
@setdoc.basic
|
|
401
|
-
def __init__(
|
|
402
|
-
self: Self,
|
|
403
|
-
data: FrozenHoldDict.Init[Key, Value] = (),
|
|
404
|
-
/,
|
|
405
|
-
**kwargs: Optional[Value],
|
|
406
|
-
) -> None:
|
|
407
|
-
self.__fset__(
|
|
408
|
-
frozendict(
|
|
409
|
-
data, # type: ignore[arg-type]
|
|
410
|
-
**kwargs,
|
|
411
|
-
)
|
|
412
|
-
)
|
|
413
|
-
|
|
414
408
|
@setdoc.basic
|
|
415
409
|
def __fget__(self: Self) -> FrozenHoldDict.Data[Key, Value]:
|
|
416
|
-
return self._data
|
|
410
|
+
return dict(self._data)
|
|
417
411
|
|
|
418
412
|
@setdoc.basic
|
|
419
413
|
def __fset__(self: Self, data: FrozenHoldDict.Data[Key, Value], /) -> None:
|
|
@@ -430,7 +424,10 @@ class DataDict[Key: abc.Hashable, Value](
|
|
|
430
424
|
|
|
431
425
|
@setdoc.basic
|
|
432
426
|
def __delitem__(self: Self, key: Key | str, /) -> None:
|
|
433
|
-
|
|
427
|
+
data: DataDict.Data[Key, Value]
|
|
428
|
+
data = self.__fget__()
|
|
429
|
+
del data[key]
|
|
430
|
+
self.__fset__(data)
|
|
434
431
|
|
|
435
432
|
@abstractmethod
|
|
436
433
|
@setdoc.basic
|
|
@@ -440,15 +437,6 @@ class DataDict[Key: abc.Hashable, Value](
|
|
|
440
437
|
@setdoc.basic
|
|
441
438
|
def __fset__(self: Self, data: DataDict.Data[Key, Value], /) -> None: ...
|
|
442
439
|
|
|
443
|
-
@setdoc.basic
|
|
444
|
-
def __init__(
|
|
445
|
-
self: Self,
|
|
446
|
-
data: BaseDataDict.Init[Key, Value] = (),
|
|
447
|
-
/,
|
|
448
|
-
**kwargs: Optional[Value],
|
|
449
|
-
) -> None:
|
|
450
|
-
self.__fset__(frozendict(data, **kwargs)) # type: ignore[arg-type]
|
|
451
|
-
|
|
452
440
|
@setdoc.basic
|
|
453
441
|
def __ior__(
|
|
454
442
|
self: Self,
|
|
@@ -466,7 +454,10 @@ class DataDict[Key: abc.Hashable, Value](
|
|
|
466
454
|
/,
|
|
467
455
|
) -> None:
|
|
468
456
|
# what to do if Key includes unhashable types?
|
|
469
|
-
|
|
457
|
+
data: DataDict.Data[Key, Value]
|
|
458
|
+
data = self.__fget__()
|
|
459
|
+
data[key] = value
|
|
460
|
+
self.__fset__(data)
|
|
470
461
|
|
|
471
462
|
@setdoc.basic
|
|
472
463
|
def copy(self: Self) -> Self:
|
|
@@ -483,15 +474,15 @@ class HoldDict[Key: abc.Hashable, Value](
|
|
|
483
474
|
|
|
484
475
|
@setdoc.basic
|
|
485
476
|
def __fget__(self: Self) -> HoldDict.Data[Key, Value]:
|
|
486
|
-
return self._data
|
|
477
|
+
return dict(self._data)
|
|
487
478
|
|
|
488
479
|
@setdoc.basic
|
|
489
480
|
def __fset__(
|
|
490
481
|
self: Self,
|
|
491
|
-
value: HoldDict.
|
|
482
|
+
value: HoldDict.Data[Key, Value],
|
|
492
483
|
/,
|
|
493
484
|
) -> None:
|
|
494
|
-
self._data: HoldDict.Data[Key, Value] =
|
|
485
|
+
self._data: HoldDict.Data[Key, Value] = value
|
|
495
486
|
|
|
496
487
|
|
|
497
488
|
### SEQUENCE ###
|
|
@@ -542,12 +533,15 @@ class BaseDataSequence[Item](
|
|
|
542
533
|
def __fget__(self: Self) -> Data[Item]: ...
|
|
543
534
|
|
|
544
535
|
|
|
536
|
+
### LIST ###
|
|
537
|
+
|
|
538
|
+
|
|
545
539
|
class BaseDataList[Item](BaseDataSequence[Item]):
|
|
546
540
|
"""Provide an easy abc for custom list-like."""
|
|
547
541
|
|
|
548
542
|
__slots__ = ()
|
|
549
543
|
|
|
550
|
-
type Data[DataItem] =
|
|
544
|
+
type Data[DataItem] = list[DataItem]
|
|
551
545
|
type Init[InitItem] = abc.Iterable[InitItem]
|
|
552
546
|
|
|
553
547
|
@setdoc.basic
|
|
@@ -572,6 +566,10 @@ class BaseDataList[Item](BaseDataSequence[Item]):
|
|
|
572
566
|
else:
|
|
573
567
|
return NotImplemented
|
|
574
568
|
|
|
569
|
+
@abstractmethod
|
|
570
|
+
@setdoc.basic
|
|
571
|
+
def __fset__(self: Self, value: list[Item], /) -> None: ...
|
|
572
|
+
|
|
575
573
|
@setdoc.basic
|
|
576
574
|
def __ge__(self: Self, other: object, /) -> NotImplementedType | bool:
|
|
577
575
|
if isinstance(other, BaseDataList):
|
|
@@ -603,9 +601,9 @@ class BaseDataList[Item](BaseDataSequence[Item]):
|
|
|
603
601
|
else:
|
|
604
602
|
return NotImplemented
|
|
605
603
|
|
|
606
|
-
@abstractmethod
|
|
607
604
|
@setdoc.basic
|
|
608
|
-
def __init__(self: Self, data: Init[Item] = (), /) -> None:
|
|
605
|
+
def __init__(self: Self, data: Init[Item] = (), /) -> None:
|
|
606
|
+
self.__fset__(list(data))
|
|
609
607
|
|
|
610
608
|
@setdoc.basic
|
|
611
609
|
def __le__(self: Self, other: object, /) -> NotImplementedType | bool:
|
|
@@ -646,7 +644,7 @@ class FrozenDataList[Item](
|
|
|
646
644
|
|
|
647
645
|
@setdoc.basic
|
|
648
646
|
def __hash__(self: Self) -> int:
|
|
649
|
-
return hash(self.__fget__())
|
|
647
|
+
return hash(tuple(self.__fget__()))
|
|
650
648
|
|
|
651
649
|
|
|
652
650
|
class FrozenHoldList[Item](
|
|
@@ -659,16 +657,12 @@ class FrozenHoldList[Item](
|
|
|
659
657
|
|
|
660
658
|
@setdoc.basic
|
|
661
659
|
def __fget__(self: Self) -> FrozenHoldList.Data[Item]:
|
|
662
|
-
return self._data
|
|
660
|
+
return list(self._data)
|
|
663
661
|
|
|
664
662
|
@setdoc.basic
|
|
665
663
|
def __fset__(self: Self, data: FrozenHoldList.Data[Item], /) -> None:
|
|
666
664
|
self._data: FrozenHoldList.Data[Item] = data
|
|
667
665
|
|
|
668
|
-
@setdoc.basic
|
|
669
|
-
def __init__(self: Self, data: FrozenHoldList.Init[Item] = (), /) -> None:
|
|
670
|
-
self.__fset__(tuple(data))
|
|
671
|
-
|
|
672
666
|
|
|
673
667
|
class DataList[Item](
|
|
674
668
|
BaseDataList[Item],
|
|
@@ -683,9 +677,9 @@ class DataList[Item](
|
|
|
683
677
|
self: Self, other: SupportsIndex | Slice[SupportsIndex], /
|
|
684
678
|
) -> None:
|
|
685
679
|
data: list[Item]
|
|
686
|
-
data =
|
|
680
|
+
data = self.__fget__()
|
|
687
681
|
del data[other]
|
|
688
|
-
self.__fset__(
|
|
682
|
+
self.__fset__(data)
|
|
689
683
|
|
|
690
684
|
@abstractmethod
|
|
691
685
|
@setdoc.basic
|
|
@@ -695,7 +689,7 @@ class DataList[Item](
|
|
|
695
689
|
@setdoc.basic
|
|
696
690
|
def __fset__(
|
|
697
691
|
self: Self,
|
|
698
|
-
value: DataList.
|
|
692
|
+
value: DataList.Data[Item],
|
|
699
693
|
/,
|
|
700
694
|
) -> None: ...
|
|
701
695
|
|
|
@@ -704,14 +698,6 @@ class DataList[Item](
|
|
|
704
698
|
self.__fset__(self.__fget__() * other)
|
|
705
699
|
return self
|
|
706
700
|
|
|
707
|
-
@setdoc.basic
|
|
708
|
-
def __init__(
|
|
709
|
-
self: Self,
|
|
710
|
-
data: abc.Iterable[Item] = (),
|
|
711
|
-
/,
|
|
712
|
-
) -> None:
|
|
713
|
-
self.__fset__(tuple(data))
|
|
714
|
-
|
|
715
701
|
@overload
|
|
716
702
|
@setdoc.basic
|
|
717
703
|
def __setitem__(
|
|
@@ -734,10 +720,10 @@ class DataList[Item](
|
|
|
734
720
|
value: Item | abc.Iterable[Item],
|
|
735
721
|
/,
|
|
736
722
|
) -> None:
|
|
737
|
-
data:
|
|
738
|
-
data =
|
|
739
|
-
data[key] = value
|
|
740
|
-
self.__fset__(
|
|
723
|
+
data: list[Item]
|
|
724
|
+
data = self.__fget__()
|
|
725
|
+
data[key] = value # type: ignore[index, assignment]
|
|
726
|
+
self.__fset__(data)
|
|
741
727
|
|
|
742
728
|
@setdoc.basic
|
|
743
729
|
def copy(self: Self) -> Self:
|
|
@@ -746,16 +732,16 @@ class DataList[Item](
|
|
|
746
732
|
@setdoc.basic
|
|
747
733
|
def insert(self: Self, index: SupportsIndex, item: Item, /) -> None:
|
|
748
734
|
data: list[Item]
|
|
749
|
-
data =
|
|
735
|
+
data = self.__fget__()
|
|
750
736
|
data.insert(index, item)
|
|
751
|
-
self.__fset__(
|
|
737
|
+
self.__fset__(data)
|
|
752
738
|
|
|
753
739
|
@setdoc.basic
|
|
754
740
|
def sort(self: Self, *, key: Any = None, reverse: bool = False) -> None:
|
|
755
741
|
data: list[Item]
|
|
756
|
-
data =
|
|
742
|
+
data = self.__fget__()
|
|
757
743
|
data.sort(key=key, reverse=reverse)
|
|
758
|
-
self.__fset__(
|
|
744
|
+
self.__fset__(data)
|
|
759
745
|
|
|
760
746
|
|
|
761
747
|
class HoldList[Item](
|
|
@@ -768,8 +754,8 @@ class HoldList[Item](
|
|
|
768
754
|
|
|
769
755
|
@setdoc.basic
|
|
770
756
|
def __fget__(self: Self) -> HoldList.Data[Item]:
|
|
771
|
-
return self._data
|
|
757
|
+
return list(self._data)
|
|
772
758
|
|
|
773
759
|
@setdoc.basic
|
|
774
|
-
def __fset__(self: Self, value:
|
|
775
|
-
self._data: HoldList.Data[Item] =
|
|
760
|
+
def __fset__(self: Self, value: HoldList.Data[Item], /) -> None:
|
|
761
|
+
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
|