datahold 3.0.0.dev4__tar.gz → 3.0.0.dev40__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 (65) hide show
  1. {datahold-3.0.0.dev4 → datahold-3.0.0.dev40}/LICENSE.txt +1 -1
  2. datahold-3.0.0.dev40/MANIFEST.in +4 -0
  3. datahold-3.0.0.dev40/PKG-INFO +35 -0
  4. datahold-3.0.0.dev40/README.rst +7 -0
  5. datahold-3.0.0.dev40/docs/v1.1.rst +321 -0
  6. datahold-3.0.0.dev40/docs/v1.2.rst +349 -0
  7. datahold-3.0.0.dev40/docs/v2.0.rst +332 -0
  8. datahold-3.0.0.dev40/docs/v2.1.rst +367 -0
  9. datahold-3.0.0.dev40/docs/v2.2.rst +367 -0
  10. datahold-3.0.0.dev40/docs/v2.3.rst +475 -0
  11. datahold-3.0.0.dev40/docs/v3.0.rst +694 -0
  12. {datahold-3.0.0.dev4 → datahold-3.0.0.dev40}/pyproject.toml +19 -13
  13. datahold-3.0.0.dev40/run_tests.py +17 -0
  14. datahold-3.0.0.dev40/src/datahold/__init__.py +304 -0
  15. datahold-3.0.0.dev40/src/datahold.egg-info/PKG-INFO +35 -0
  16. datahold-3.0.0.dev40/src/datahold.egg-info/SOURCES.txt +22 -0
  17. datahold-3.0.0.dev40/src/datahold.egg-info/requires.txt +5 -0
  18. datahold-3.0.0.dev40/tests/test_MutableListSlot.py +539 -0
  19. datahold-3.0.0.dev4/MANIFEST.in +0 -1
  20. datahold-3.0.0.dev4/PKG-INFO +0 -55
  21. datahold-3.0.0.dev4/README.rst +0 -5
  22. datahold-3.0.0.dev4/src/datahold/__init__.py +0 -25
  23. datahold-3.0.0.dev4/src/datahold/_utils/wrapping.py +0 -91
  24. datahold-3.0.0.dev4/src/datahold/core/BaseDataDict.py +0 -129
  25. datahold-3.0.0.dev4/src/datahold/core/BaseDataList.py +0 -115
  26. datahold-3.0.0.dev4/src/datahold/core/BaseDataObject.py +0 -14
  27. datahold-3.0.0.dev4/src/datahold/core/BaseDataSet.py +0 -155
  28. datahold-3.0.0.dev4/src/datahold/core/BaseHoldDict.py +0 -16
  29. datahold-3.0.0.dev4/src/datahold/core/BaseHoldList.py +0 -13
  30. datahold-3.0.0.dev4/src/datahold/core/BaseHoldObject.py +0 -10
  31. datahold-3.0.0.dev4/src/datahold/core/BaseHoldSet.py +0 -13
  32. datahold-3.0.0.dev4/src/datahold/core/DataDict.py +0 -106
  33. datahold-3.0.0.dev4/src/datahold/core/DataList.py +0 -142
  34. datahold-3.0.0.dev4/src/datahold/core/DataObject.py +0 -18
  35. datahold-3.0.0.dev4/src/datahold/core/DataSet.py +0 -152
  36. datahold-3.0.0.dev4/src/datahold/core/FrozenDataDict.py +0 -16
  37. datahold-3.0.0.dev4/src/datahold/core/FrozenDataList.py +0 -13
  38. datahold-3.0.0.dev4/src/datahold/core/FrozenDataObject.py +0 -18
  39. datahold-3.0.0.dev4/src/datahold/core/FrozenDataSet.py +0 -13
  40. datahold-3.0.0.dev4/src/datahold/core/FrozenHoldDict.py +0 -22
  41. datahold-3.0.0.dev4/src/datahold/core/FrozenHoldList.py +0 -20
  42. datahold-3.0.0.dev4/src/datahold/core/FrozenHoldObject.py +0 -15
  43. datahold-3.0.0.dev4/src/datahold/core/FrozenHoldSet.py +0 -20
  44. datahold-3.0.0.dev4/src/datahold/core/HoldDict.py +0 -27
  45. datahold-3.0.0.dev4/src/datahold/core/HoldList.py +0 -25
  46. datahold-3.0.0.dev4/src/datahold/core/HoldObject.py +0 -11
  47. datahold-3.0.0.dev4/src/datahold/core/HoldSet.py +0 -25
  48. datahold-3.0.0.dev4/src/datahold/tests/__init__.py +0 -16
  49. datahold-3.0.0.dev4/src/datahold/tests/test_0.py +0 -66
  50. datahold-3.0.0.dev4/src/datahold/tests/test_datahold_TestAbstractness.py +0 -54
  51. datahold-3.0.0.dev4/src/datahold/tests/test_datahold_TestCopy.py +0 -85
  52. datahold-3.0.0.dev4/src/datahold/tests/test_datahold_TestDataAttribute.py +0 -55
  53. datahold-3.0.0.dev4/src/datahold/tests/test_datahold_TestFrozenMutability.py +0 -38
  54. datahold-3.0.0.dev4/src/datahold/tests/test_datahold_TestInheritance.py +0 -62
  55. datahold-3.0.0.dev4/src/datahold/tests/test_datahold_TestMutableBehavior.py +0 -38
  56. datahold-3.0.0.dev4/src/datahold/tests/test_datahold_TestProtocols.py +0 -66
  57. datahold-3.0.0.dev4/src/datahold/tests/test_generic.py +0 -86
  58. datahold-3.0.0.dev4/src/datahold.egg-info/PKG-INFO +0 -55
  59. datahold-3.0.0.dev4/src/datahold.egg-info/SOURCES.txt +0 -48
  60. datahold-3.0.0.dev4/src/datahold.egg-info/requires.txt +0 -6
  61. {datahold-3.0.0.dev4 → datahold-3.0.0.dev40}/setup.cfg +0 -0
  62. /datahold-3.0.0.dev4/src/datahold/_utils/__init__.py → /datahold-3.0.0.dev40/src/datahold/py.typed +0 -0
  63. {datahold-3.0.0.dev4 → datahold-3.0.0.dev40}/src/datahold.egg-info/dependency_links.txt +0 -0
  64. {datahold-3.0.0.dev4 → datahold-3.0.0.dev40}/src/datahold.egg-info/top_level.txt +0 -0
  65. /datahold-3.0.0.dev4/src/datahold/core/__init__.py → /datahold-3.0.0.dev40/tests/testdata.toml +0 -0
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ SOFTWARE.
@@ -0,0 +1,4 @@
1
+ include run_tests.py
2
+ recursive-include docs *.rst
3
+ recursive-include src *.toml
4
+ recursive-include tests *.toml
@@ -0,0 +1,35 @@
1
+ Metadata-Version: 2.4
2
+ Name: datahold
3
+ Version: 3.0.0.dev40
4
+ Summary: This project wraps common mutable datastructures for inheritance with modification.
5
+ Author-email: Johannes <johannes.programming@gmail.com>
6
+ License-Expression: MIT
7
+ Project-URL: Download, https://pypi.org/project/datahold/#files
8
+ Project-URL: Index, https://pypi.org/project/datahold/
9
+ Project-URL: Source, https://github.com/johannes-programming/datahold/
10
+ Project-URL: Website, http://datahold.johannes-programming.online/
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Natural Language :: English
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3 :: Only
18
+ Classifier: Typing :: Typed
19
+ Requires-Python: >=3.12
20
+ Description-Content-Type: text/x-rst
21
+ License-File: LICENSE.txt
22
+ Requires-Dist: cmp3<2,>=1.1
23
+ Requires-Dist: copyable<2,>=1.1
24
+ Requires-Dist: frozendict<3,>=2.4.6
25
+ Requires-Dist: iterprod<2,>=1.1
26
+ Requires-Dist: setdoc<2,>=1.4
27
+ Dynamic: license-file
28
+
29
+ ========
30
+ datahold
31
+ ========
32
+
33
+ Each minor version has its own documentation.
34
+ These docs can be found as rst-files in the ``docs/`` directory of this project.
35
+ They can also be viewed on the website `https://datahold.johannes-programming.online/ <https://datahold.johannes-programming.online/>`_.
@@ -0,0 +1,7 @@
1
+ ========
2
+ datahold
3
+ ========
4
+
5
+ Each minor version has its own documentation.
6
+ These docs can be found as rst-files in the ``docs/`` directory of this project.
7
+ They can also be viewed on the website `https://datahold.johannes-programming.online/ <https://datahold.johannes-programming.online/>`_.
@@ -0,0 +1,321 @@
1
+ Overview
2
+ --------
3
+
4
+ This project wraps common mutable datastructures for inheritance with modification.
5
+
6
+ .. container:: warning
7
+
8
+ **Warning:** The major version ``1`` of ``datahold`` has reached end-of-life.
9
+
10
+ Links
11
+ -----
12
+
13
+ - Download: https://pypi.org/project/datahold/#files
14
+ - Index: https://pypi.org/project/datahold/
15
+ - Source: https://github.com/johannes-programming/datahold/
16
+ - Website: https://datahold.johannes-programming.online/
17
+
18
+ Installation
19
+ ------------
20
+
21
+ To install ``datahold``, you can use ``pip``.
22
+ Open your terminal and run:
23
+
24
+ .. code-block:: shell
25
+
26
+ pip install datahold
27
+
28
+ Features
29
+ --------
30
+
31
+ ``class datahold.HoldABC(*args: Any, **kwargs: Any)``
32
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
33
+
34
+ .. code-block:: python
35
+
36
+ class HoldABC(ABC):
37
+
38
+ __slots__ = ("_data",)
39
+
40
+ __hash__ = unhash
41
+
42
+ @abstractmethod
43
+ def __init__(self: Self, *args: Any, **kwargs: Any) -> None:
44
+ "This magic method initializes self."
45
+ ...
46
+
47
+ @classmethod
48
+ def __subclasshook__(cls: type, other: type, /) -> bool:
49
+ "This magic classmethod can be overwritten for a custom subclass check."
50
+ return NotImplemented
51
+
52
+ @property
53
+ @abstractmethod
54
+ def data(self: Self) -> Any: ...
55
+
56
+ ``class datahold.HoldDict(*args: Any, **kwargs: Any)``
57
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
58
+
59
+ This class is a brute wrapper for ``dict``. It inherits from ``HoldABC`` and ``collections.abc.MutableMapping``. Its constructor passes all arguments to the constructor of ``dict`` and the result is saved within the ``data`` property.
60
+
61
+ ``__contains__(key: Any, /) -> Any``
62
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
63
+
64
+ This magic method implements the ``in`` operator. Internally its code is equivalent to the following:
65
+
66
+ .. code-block:: python
67
+
68
+ def __contains__(self: Self, key: Any, /) -> Any:
69
+ "True if the dictionary has the specified key, else False."
70
+ data = self.data
71
+ ans = data.__contains__(*args, **kwargs)
72
+ self.data = data
73
+ return ans
74
+
75
+ The imprecise annotations and docstring are due to it adhering to the underlying ``dict.__contains__`` as closely as possible.
76
+
77
+ ``__delitem__(key: Any, /) -> Any``
78
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
79
+
80
+ This magic method implements the deletion of items. Its inner workings are analogous to ``__contains__``.
81
+
82
+ ``__eq__(value: Any, /) -> Any``
83
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
84
+
85
+ This magic method implements the ``==`` operator. Its inner workings are analogous to ``__contains__``.
86
+
87
+ ``__format__(format_spec: Any, /) -> Any``
88
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
89
+
90
+ This magic method implements the inbuilt ``format`` function. Its inner workings are analogous to ``__contains__``.
91
+
92
+ ``__ge__(value: Any, /) -> Any``
93
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
94
+
95
+ This magic method implements the ``>=`` operator. Its inner workings are analogous to ``__contains__``.
96
+
97
+ ``__getitem__(key: Any, /) -> Any``
98
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
99
+
100
+ This magic method implements the returning of items. Its inner workings are analogous to ``__contains__``.
101
+
102
+ ``__gt__(value: Any, /) -> Any``
103
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
104
+
105
+ This magic method implements the ``>`` operator. Its inner workings are analogous to ``__contains__``.
106
+
107
+ ``__hash__() -> int``
108
+ ^^^^^^^^^^^^^^^^^^^^^
109
+
110
+ This magic method implements the inbuilt function ``hash``. Its function is ``unhash.unhash``. It always raises a ``TypeError``.
111
+
112
+ ``__ior__(value: Any, /) -> Any``
113
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
114
+
115
+ This magic method implements the ``|=`` operator. Its inner workings are analogous to ``__contains__``.
116
+
117
+ ``__iter__() -> Any``
118
+ ^^^^^^^^^^^^^^^^^^^^^
119
+
120
+ This magic method implements iteration. Its inner workings are analogous to ``__contains__``.
121
+
122
+ ``__le__(value: Any, /) -> Any``
123
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
124
+
125
+ This magic method implements the ``<=`` operator. Its inner workings are analogous to ``__contains__``.
126
+
127
+ ``__len__() -> Any``
128
+ ^^^^^^^^^^^^^^^^^^^^
129
+
130
+ This magic method implements the inbuilt ``len`` function. Its inner workings are analogous to ``__contains__``.
131
+
132
+ ``__lt__(value: Any, /) -> Any``
133
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
134
+
135
+ This magic method implements the ``<`` operator. Its inner workings are analogous to ``__contains__``.
136
+
137
+ ``__or__(value: Any, /) -> Any``
138
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
139
+
140
+ This magic method implements the ``|`` operator. Its inner workings are analogous to ``__contains__``.
141
+
142
+ ``__repr__() -> Any``
143
+ ^^^^^^^^^^^^^^^^^^^^^
144
+
145
+ This magic method implements representation. Its inner workings are analogous to ``__contains__``.
146
+
147
+ ``__reversed__() -> Any``
148
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
149
+
150
+ This magic method implements the inbuilt ``reversed`` function. Its inner workings are analogous to ``__contains__``.
151
+
152
+ ``__ror__(value: Any, /) -> Any``
153
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
154
+
155
+ This magic method implements the ``|`` operator from the right side if the left operand does not have it implemented. Its inner workings are analogous to ``__contains__``.
156
+
157
+ ``__setitem__(key: Any, value: Any, /) -> Any``
158
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
159
+
160
+ This magic method implements the setting of items. Its inner workings are analogous to ``__contains__``.
161
+
162
+ ``__str__() -> Any``
163
+ ^^^^^^^^^^^^^^^^^^^^
164
+
165
+ This magic method implements the explicit conversion into a string. Its inner workings are analogous to ``__contains__``.
166
+
167
+ ``__subclasshook__(other: type, /) -> bool``
168
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
169
+
170
+ This classmethod is inherited directly from ``HoldABC``.
171
+
172
+ ``clear() -> Any``
173
+ ^^^^^^^^^^^^^^^^^^
174
+
175
+ This method deletes of all ``items``. Its inner workings are analogous to ``__contains__``.
176
+
177
+ ``copy() -> Any``
178
+ ^^^^^^^^^^^^^^^^^
179
+
180
+ This method implements dublication. Its inner workings are analogous to ``__contains__``. Remember that because of that a ``dict`` is returned.
181
+
182
+ ``data: dict``
183
+ ^^^^^^^^^^^^^^
184
+
185
+ This property is implemented with the equivalent to the following code:
186
+
187
+ .. code-block:: python
188
+
189
+ @property
190
+ def data(self: Self) -> dict:
191
+ return dict(self._data)
192
+
193
+ @data.setter
194
+ def data(self: Self, value: Any) -> None:
195
+ self._data = dict(value)
196
+
197
+ @data.deleter
198
+ def data(self: Self) -> None:
199
+ self._data = dict()
200
+
201
+ ``get(key: Any, default: Any = None, /) -> Any``
202
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
203
+
204
+ This method implements getting an item with a ``default`` in case of its absence. Its inner workings are analogous to ``__contains__``.
205
+
206
+ ``items() -> Any``
207
+ ^^^^^^^^^^^^^^^^^^
208
+
209
+ This method returns an iterator over the ``items``. Its inner workings are analogous to ``__contains__``.
210
+
211
+ ``keys() -> Any``
212
+ ^^^^^^^^^^^^^^^^^
213
+
214
+ This method returns an iterator over the ``keys``. Its inner workings are analogous to ``__contains__``.
215
+
216
+ ``popitem() -> Any``
217
+ ^^^^^^^^^^^^^^^^^^^^
218
+
219
+ This method deletes and returns the last item. Its inner workings are analogous to ``__contains__``.
220
+
221
+ ``setdefault(key: Any, default: Any = None, /) -> Any``
222
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
223
+
224
+ This method ensures the presence of a ``key``. Its inner workings are analogous to ``__contains__``.
225
+
226
+ ``update(*args: Any, **kwargs: Any) -> Any``
227
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
228
+
229
+ This method updates the ``data``. Its inner workings are analogous to ``__contains__``.
230
+
231
+ ``values() -> Any``
232
+ ^^^^^^^^^^^^^^^^^^^
233
+
234
+ This method returns an iterator over the ``values``. Its inner workings are analogous to ``__contains__``.
235
+
236
+ ``class datahold.HoldList(*args: Any, **kwargs: Any)``
237
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
238
+
239
+ This class is analogous to ``HoldDict``. It implements the magic methods ``__add__``, ``__contains__``, ``__delitem__``, ``__eq__``, ``__format__``, ``__ge__``, ``__getitem__``, ``__gt__``, ``__iadd__``, ``__imul__``, ``__iter__``, ``__le__``, ``__len__``, ``__lt__``, ``__mul__``, ``__repr__``, ``__reversed__``, ``__rmul__``, ``__setitem__``, and ``__str__``. The other methods implemented are ``append``, ``clear``, ``copy``, ``count``, ``extend``, ``index``, ``insert``, ``pop``, ``remove``, ``reverse``, and ``sort``. It is a child of ``HoldABC`` and of ``collections.abc.MutableSequence``, thereby also inheriting their members.
240
+
241
+ ``class datahold.HoldSet(*args: Any, **kwargs: Any)``
242
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
243
+
244
+ This class is analogous to ``HoldDict``. It implements the magic methods ``__and__``, ``__contains__``, ``__eq__``, ``__format__``, ``__ge__``, ``__gt__``, ``__iand__``, ``__ior__``, ``__isub__``, ``__iter__``, ``__le__``, ``__len__``, ``__lt__``, ``__or__``, ``__rand__``, ``__repr__``, ``__ror__``, ``__rsub__``, ``__rxor__``, ``__str__``, ``__sub__``, ``__rmul__``, ``__sub__``, and ``__xor__``. The other methods implemented are ``add``, ``clear``, ``copy``, ``difference``, ``difference_update``, ``discard``, ``intersection``, ``intersection_update``, ``isdisjoint``, ``issubset``, ``issuperset``, ``pop``, ``remove``, ``symmetric_difference``, ``symmetric_difference_update``, ``union``, and ``update``. It is a child of ``HoldABC`` and of ``collections.abc.MutableSet``, thereby also inheriting their members.
245
+
246
+ ``class datahold.OkayABC(*args: Any, **kwargs: Any)``
247
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
248
+
249
+ A common ABC for ``OkayList``, ``OkayDict``, and ``OkaySet``. Child of ``Scaevola`` and ``HoldABC``. It implements common-sense overwrites for some methods. For example:
250
+
251
+ - All methods that cannot actually change the underlying object are now bound to ``_data`` instead of ``data``.
252
+ - ``__bool__`` is implemented as ``bool(self._data)`` because neither ``list``, ``dict``, nor ``set`` have a ``__bool__`` method defined.
253
+ - The comparison operations are overwritten:
254
+
255
+ - ``__eq__`` returns ``self._data == type(self._data)(other)``.
256
+ - ``__ne__`` negates ``__eq__``.
257
+ - ``__ge__`` returns ``type(self)(other) <= self`` (inherited from ``scaevola.Scaevola``).
258
+ - ``__gt__`` returns ``not (self == other) and (self >= other)``.
259
+ - ``__lt__`` returns ``not (self == other) and (self <= other)``.
260
+ - ``__le__`` returns ``self._data <= type(self)(other)._data``.
261
+
262
+ - Modify ``__eq__`` or ``__le__`` as needed to change the behavior of the other comparison methods.
263
+
264
+ ``class datahold.OkayDict(data: Iterable = (), /, **kwargs: Any)``
265
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
266
+
267
+ A subclass of ``HoldDict`` with common-sense implementations for further inheritance, just like ``OkayList`` for ``HoldList``.
268
+
269
+ ``class datahold.OkayList(data: Iterable = ())``
270
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
271
+
272
+ This class inherits from ``HoldList`` and ``OkayABC``. It implements a ``data`` property that binds a variable ``_data``.
273
+
274
+ .. code-block:: python
275
+
276
+ @property
277
+ def data(self, /):
278
+ return list(self._data)
279
+
280
+ @data.setter
281
+ def data(self, values, /):
282
+ self._data = list(values)
283
+
284
+ @data.deleter
285
+ def data(self, /):
286
+ self._data = list()
287
+
288
+ Based on this, it implements common-sense methods. For example:
289
+
290
+ - All methods that returned a ``list`` before now return ``OkayList`` (type adapts to further inheritance).
291
+ - ``__init__`` allows setting data immediately.
292
+
293
+ ``class datahold.OkaySet(data: Iterable = ())``
294
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
295
+
296
+ A subclass of ``HoldSet`` with common-sense implementations for further inheritance, just like ``OkayList`` for ``HoldList``.
297
+
298
+ ``datahold.test() -> unittest.TextTestResult``
299
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
300
+
301
+ This project can be tested through its ``test`` function.
302
+
303
+ .. code-block:: python
304
+
305
+ import datahold
306
+ datahold.test()
307
+
308
+ License
309
+ -------
310
+
311
+ This project is licensed under the MIT License.
312
+
313
+ Impressum
314
+ ---------
315
+
316
+ **Johannes Programming**
317
+
318
+ - Name: Johannes
319
+ - Email: johannes.programming@gmail.com
320
+ - Homepage: https://www.johannes-programming.online/
321
+ - Gravatar: https://www.johannes-programming.fyi/