datahold 3.0.2__tar.gz → 3.1.0.dev0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. {datahold-3.0.2/src/datahold.egg-info → datahold-3.1.0.dev0}/PKG-INFO +3 -2
  2. {datahold-3.0.2 → datahold-3.1.0.dev0}/pyproject.toml +3 -2
  3. datahold-3.1.0.dev0/src/datahold/core/BaseDataNaming.py +123 -0
  4. datahold-3.1.0.dev0/src/datahold/core/BaseHoldNaming.py +15 -0
  5. datahold-3.1.0.dev0/src/datahold/core/DataNaming.py +105 -0
  6. datahold-3.1.0.dev0/src/datahold/core/FrozenDataNaming.py +15 -0
  7. datahold-3.1.0.dev0/src/datahold/core/FrozenHoldNaming.py +21 -0
  8. datahold-3.1.0.dev0/src/datahold/core/HoldNaming.py +26 -0
  9. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/tests/test_0.py +5 -0
  10. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/tests/test_datahold_TestAbstractness.py +8 -0
  11. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/tests/test_datahold_TestCopy.py +18 -1
  12. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/tests/test_datahold_TestDataAttribute.py +19 -0
  13. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/tests/test_datahold_TestFrozenMutability.py +12 -3
  14. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/tests/test_datahold_TestInheritance.py +19 -2
  15. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/tests/test_datahold_TestMutableBehavior.py +11 -6
  16. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/tests/test_datahold_TestProtocols.py +16 -2
  17. {datahold-3.0.2 → datahold-3.1.0.dev0/src/datahold.egg-info}/PKG-INFO +3 -2
  18. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold.egg-info/SOURCES.txt +6 -0
  19. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold.egg-info/requires.txt +1 -0
  20. {datahold-3.0.2 → datahold-3.1.0.dev0}/LICENSE.txt +0 -0
  21. {datahold-3.0.2 → datahold-3.1.0.dev0}/MANIFEST.in +0 -0
  22. {datahold-3.0.2 → datahold-3.1.0.dev0}/README.rst +0 -0
  23. {datahold-3.0.2 → datahold-3.1.0.dev0}/setup.cfg +0 -0
  24. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/__init__.py +0 -0
  25. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/_utils/__init__.py +0 -0
  26. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/_utils/wrapping.py +0 -0
  27. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/BaseDataDict.py +0 -0
  28. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/BaseDataList.py +0 -0
  29. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/BaseDataObject.py +0 -0
  30. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/BaseDataSet.py +0 -0
  31. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/BaseHoldDict.py +0 -0
  32. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/BaseHoldList.py +0 -0
  33. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/BaseHoldObject.py +0 -0
  34. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/BaseHoldSet.py +0 -0
  35. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/DataDict.py +0 -0
  36. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/DataList.py +0 -0
  37. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/DataObject.py +0 -0
  38. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/DataSet.py +0 -0
  39. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/FrozenDataDict.py +0 -0
  40. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/FrozenDataList.py +0 -0
  41. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/FrozenDataObject.py +0 -0
  42. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/FrozenDataSet.py +0 -0
  43. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/FrozenHoldDict.py +0 -0
  44. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/FrozenHoldList.py +0 -0
  45. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/FrozenHoldObject.py +0 -0
  46. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/FrozenHoldSet.py +0 -0
  47. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/HoldDict.py +0 -0
  48. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/HoldList.py +0 -0
  49. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/HoldObject.py +0 -0
  50. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/HoldSet.py +0 -0
  51. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/core/__init__.py +0 -0
  52. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/tests/__init__.py +0 -0
  53. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold/tests/test_generic.py +0 -0
  54. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold.egg-info/dependency_links.txt +0 -0
  55. {datahold-3.0.2 → datahold-3.1.0.dev0}/src/datahold.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datahold
3
- Version: 3.0.2
3
+ Version: 3.1.0.dev0
4
4
  Summary: This project wraps common mutable datastructures for inheritance with modification.
5
5
  Author-email: Johannes <johannes.programming@gmail.com>
6
6
  License: The MIT License (MIT)
@@ -28,7 +28,7 @@ Project-URL: Download, https://pypi.org/project/datahold/#files
28
28
  Project-URL: Index, https://pypi.org/project/datahold/
29
29
  Project-URL: Source, https://github.com/johannes-programming/datahold/
30
30
  Project-URL: Website, http://datahold.johannes-programming.online/
31
- Classifier: Development Status :: 5 - Production/Stable
31
+ Classifier: Development Status :: 3 - Alpha
32
32
  Classifier: Intended Audience :: Developers
33
33
  Classifier: License :: OSI Approved :: MIT License
34
34
  Classifier: Natural Language :: English
@@ -44,6 +44,7 @@ Requires-Dist: cmp3<2,>=1.0
44
44
  Requires-Dist: copyable<2,>=1.0
45
45
  Requires-Dist: datarepr<2,>=1.0
46
46
  Requires-Dist: frozendict<3,>=2.4.6
47
+ Requires-Dist: namings<2,>=1.0
47
48
  Requires-Dist: setdoc<2,>=1.2.8
48
49
  Dynamic: license-file
49
50
 
@@ -9,7 +9,7 @@ authors = [
9
9
  { email = "johannes.programming@gmail.com", name = "Johannes" },
10
10
  ]
11
11
  classifiers = [
12
- "Development Status :: 5 - Production/Stable",
12
+ "Development Status :: 3 - Alpha",
13
13
  "Intended Audience :: Developers",
14
14
  "License :: OSI Approved :: MIT License",
15
15
  "Natural Language :: English",
@@ -24,6 +24,7 @@ dependencies = [
24
24
  "copyable>=1.0,<2",
25
25
  "datarepr>=1.0,<2",
26
26
  "frozendict>=2.4.6,<3",
27
+ "namings>=1.0,<2",
27
28
  "setdoc>=1.2.8,<2",
28
29
  ]
29
30
  description = "This project wraps common mutable datastructures for inheritance with modification."
@@ -31,7 +32,7 @@ keywords = []
31
32
  name = "datahold"
32
33
  readme = "README.rst"
33
34
  requires-python = ">=3.11"
34
- version = "3.0.2"
35
+ version = "3.1.0.dev0"
35
36
 
36
37
  [project.license]
37
38
  file = "LICENSE.txt"
@@ -0,0 +1,123 @@
1
+ import collections
2
+ from abc import abstractmethod
3
+ from typing import *
4
+
5
+ from namings import FrozenNaming, Naming
6
+
7
+ from datahold._utils.wrapping import wraps
8
+
9
+ from .BaseDataObject import BaseDataObject
10
+
11
+ __all__ = ["BaseDataNaming"]
12
+
13
+ Value = TypeVar("Value")
14
+
15
+
16
+ class BaseDataNaming(
17
+ BaseDataObject,
18
+ collections.abc.Mapping[str, Value],
19
+ ):
20
+ data: FrozenNaming[Value]
21
+ __slots__ = ()
22
+
23
+ @wraps(Naming[Value])
24
+ def __contains__(self: Self, *args: Any, **kwargs: Any) -> Any:
25
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
26
+ return Naming[Value](self.data).__contains__(*args, **kwargs)
27
+
28
+ @wraps(Naming[Value])
29
+ def __eq__(self: Self, *args: Any, **kwargs: Any) -> Any:
30
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
31
+ return Naming[Value](self.data).__eq__(*args, **kwargs)
32
+
33
+ @wraps(Naming[Value])
34
+ def __format__(self: Self, *args: Any, **kwargs: Any) -> Any:
35
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
36
+ return Naming[Value](self.data).__format__(*args, **kwargs)
37
+
38
+ @wraps(Naming[Value])
39
+ def __ge__(self: Self, *args: Any, **kwargs: Any) -> Any:
40
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
41
+ return Naming[Value](self.data).__ge__(*args, **kwargs)
42
+
43
+ @wraps(Naming[Value])
44
+ def __getitem__(self: Self, *args: Any, **kwargs: Any) -> Any:
45
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
46
+ return Naming[Value](self.data).__getitem__(*args, **kwargs)
47
+
48
+ @wraps(Naming[Value])
49
+ def __gt__(self: Self, *args: Any, **kwargs: Any) -> Any:
50
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
51
+ return Naming[Value](self.data).__gt__(*args, **kwargs)
52
+
53
+ @abstractmethod
54
+ @wraps(Naming[Value])
55
+ def __init__(self: Self, *args: Any, **kwargs: Any) -> None:
56
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
57
+ ...
58
+
59
+ @wraps(Naming[Value])
60
+ def __iter__(self: Self, *args: Any, **kwargs: Any) -> Any:
61
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
62
+ return Naming[Value](self.data).__iter__(*args, **kwargs)
63
+
64
+ @wraps(Naming[Value])
65
+ def __le__(self: Self, *args: Any, **kwargs: Any) -> Any:
66
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
67
+ return Naming[Value](self.data).__le__(*args, **kwargs)
68
+
69
+ @wraps(Naming[Value])
70
+ def __len__(self: Self, *args: Any, **kwargs: Any) -> Any:
71
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
72
+ return Naming[Value](self.data).__len__(*args, **kwargs)
73
+
74
+ @wraps(Naming[Value])
75
+ def __lt__(self: Self, *args: Any, **kwargs: Any) -> Any:
76
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
77
+ return Naming[Value](self.data).__lt__(*args, **kwargs)
78
+
79
+ @wraps(Naming[Value])
80
+ def __or__(self: Self, *args: Any, **kwargs: Any) -> Any:
81
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
82
+ return Naming[Value](self.data).__or__(*args, **kwargs)
83
+
84
+ @wraps(Naming[Value])
85
+ def __repr__(self: Self, *args: Any, **kwargs: Any) -> Any:
86
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
87
+ return Naming[Value](self.data).__repr__(*args, **kwargs)
88
+
89
+ @wraps(Naming[Value])
90
+ def __reversed__(self: Self, *args: Any, **kwargs: Any) -> Any:
91
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
92
+ return Naming[Value](self.data).__reversed__(*args, **kwargs)
93
+
94
+ @wraps(Naming[Value])
95
+ def __str__(self: Self, *args: Any, **kwargs: Any) -> Any:
96
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
97
+ return Naming[Value](self.data).__str__(*args, **kwargs)
98
+
99
+ @classmethod
100
+ @wraps(Naming[Value])
101
+ def fromkeys(cls: type[Self], *args: Any, **kwargs: Any) -> Any:
102
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
103
+ return cls[Value](Naming[Value].fromkeys(*args, **kwargs))
104
+
105
+ @wraps(Naming[Value])
106
+ def get(self: Self, *args: Any, **kwargs: Any) -> Any:
107
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
108
+ return Naming[Value](self.data).get(*args, **kwargs)
109
+
110
+ @wraps(Naming[Value])
111
+ def items(self: Self, *args: Any, **kwargs: Any) -> Any:
112
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
113
+ return Naming[Value](self.data).items(*args, **kwargs)
114
+
115
+ @wraps(Naming[Value])
116
+ def keys(self: Self, *args: Any, **kwargs: Any) -> Any:
117
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
118
+ return Naming[Value](self.data).keys(*args, **kwargs)
119
+
120
+ @wraps(Naming[Value])
121
+ def values(self: Self, *args: Any, **kwargs: Any) -> Any:
122
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
123
+ return Naming[Value](self.data).values(*args, **kwargs)
@@ -0,0 +1,15 @@
1
+ from typing import *
2
+
3
+ from namings import FrozenNaming
4
+
5
+ from .BaseDataNaming import BaseDataNaming
6
+ from .BaseHoldObject import BaseHoldObject
7
+
8
+ __all__ = ["BaseHoldNaming"]
9
+
10
+ Value = TypeVar("Value")
11
+
12
+
13
+ class BaseHoldNaming(BaseHoldObject, BaseDataNaming[Value]):
14
+ data: FrozenNaming[Value]
15
+ __slots__ = ()
@@ -0,0 +1,105 @@
1
+ import collections
2
+ from typing import *
3
+
4
+ import setdoc
5
+ from namings import FrozenNaming, Naming
6
+
7
+ from datahold._utils.wrapping import wraps
8
+
9
+ from .BaseDataNaming import BaseDataNaming
10
+ from .DataObject import DataObject
11
+
12
+ __all__ = ["DataNaming"]
13
+
14
+ Value = TypeVar("Value")
15
+
16
+
17
+ class DataNaming(
18
+ DataObject, BaseDataNaming[Value], collections.abc.MutableMapping[str, Value]
19
+ ):
20
+ data: FrozenNaming[Value]
21
+ __slots__ = ()
22
+
23
+ @wraps(Naming[Value])
24
+ def __delitem__(self: Self, *args: Any, **kwargs: Any) -> Any:
25
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
26
+ ans: Any
27
+ data: Naming[Value]
28
+ data = Naming[Value](self.data)
29
+ ans = data.__delitem__(*args, **kwargs)
30
+ self.data = FrozenNaming[Value](data)
31
+ return ans
32
+
33
+ @setdoc.basic
34
+ def __init__(self: Self, data: Any = (), /, **kwargs: Any) -> None:
35
+ self.data = FrozenNaming[Value](data, **kwargs)
36
+
37
+ @wraps(Naming[Value])
38
+ def __ior__(self: Self, *args: Any, **kwargs: Any) -> Any:
39
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
40
+ ans: Any
41
+ data: Naming[Value]
42
+ data = Naming[Value](self.data)
43
+ ans = data.__ior__(*args, **kwargs)
44
+ self.data = FrozenNaming[Value](data)
45
+ return ans
46
+
47
+ @wraps(Naming[Value])
48
+ def __setitem__(self: Self, *args: Any, **kwargs: Any) -> Any:
49
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
50
+ ans: Any
51
+ data: Naming[Value]
52
+ data = Naming[Value](self.data)
53
+ ans = data.__setitem__(*args, **kwargs)
54
+ self.data = FrozenNaming[Value](data)
55
+ return ans
56
+
57
+ @wraps(Naming[Value])
58
+ def clear(self: Self, *args: Any, **kwargs: Any) -> Any:
59
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
60
+ ans: Any
61
+ data: Naming[Value]
62
+ data = Naming[Value](self.data)
63
+ ans = data.clear(*args, **kwargs)
64
+ self.data = FrozenNaming[Value](data)
65
+ return ans
66
+
67
+ @wraps(Naming[Value])
68
+ def pop(self: Self, *args: Any, **kwargs: Any) -> Any:
69
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
70
+ ans: Any
71
+ data: Naming[Value]
72
+ data = Naming[Value](self.data)
73
+ ans = data.pop(*args, **kwargs)
74
+ self.data = FrozenNaming[Value](data)
75
+ return ans
76
+
77
+ @wraps(Naming[Value])
78
+ def popitem(self: Self, *args: Any, **kwargs: Any) -> Any:
79
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
80
+ ans: Any
81
+ data: Naming[Value]
82
+ data = Naming[Value](self.data)
83
+ ans = data.popitem(*args, **kwargs)
84
+ self.data = FrozenNaming[Value](data)
85
+ return ans
86
+
87
+ @wraps(Naming[Value])
88
+ def setdefault(self: Self, *args: Any, **kwargs: Any) -> Any:
89
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
90
+ ans: Any
91
+ data: Naming[Value]
92
+ data = Naming[Value](self.data)
93
+ ans = data.setdefault(*args, **kwargs)
94
+ self.data = FrozenNaming[Value](data)
95
+ return ans
96
+
97
+ @wraps(Naming[Value])
98
+ def update(self: Self, *args: Any, **kwargs: Any) -> Any:
99
+ "This doc string is overwritten together with the signature to match the original as closely as possible."
100
+ ans: Any
101
+ data: Naming[Value]
102
+ data = Naming[Value](self.data)
103
+ ans = data.update(*args, **kwargs)
104
+ self.data = FrozenNaming[Value](data)
105
+ return ans
@@ -0,0 +1,15 @@
1
+ from typing import *
2
+
3
+ from namings import FrozenNaming
4
+
5
+ from .BaseDataNaming import BaseDataNaming
6
+ from .FrozenDataObject import FrozenDataObject
7
+
8
+ __all__ = ["FrozenDataNaming"]
9
+
10
+ Value = TypeVar("Value")
11
+
12
+
13
+ class FrozenDataNaming(FrozenDataObject, BaseDataNaming[Value]):
14
+ data: FrozenNaming[Value]
15
+ __slots__ = ()
@@ -0,0 +1,21 @@
1
+ from typing import *
2
+
3
+ import setdoc
4
+ from namings import FrozenNaming
5
+
6
+ from .BaseHoldNaming import BaseHoldNaming
7
+ from .FrozenDataNaming import FrozenDataNaming
8
+ from .FrozenHoldObject import FrozenHoldObject
9
+
10
+ __all__ = ["FrozenHoldNaming"]
11
+
12
+ Value = TypeVar("Value")
13
+
14
+
15
+ class FrozenHoldNaming(FrozenHoldObject, FrozenDataNaming, BaseHoldNaming[Value]):
16
+ data: FrozenNaming[Value]
17
+ __slots__ = ()
18
+
19
+ @setdoc.basic
20
+ def __init__(self: Self, data: Any, /, **kwargs: Any) -> None:
21
+ self._data = FrozenNaming[Value](data, **kwargs)
@@ -0,0 +1,26 @@
1
+ from typing import *
2
+
3
+ import setdoc
4
+ from namings import FrozenNaming
5
+
6
+ from .BaseHoldNaming import BaseHoldNaming
7
+ from .DataNaming import DataNaming
8
+ from .HoldObject import HoldObject
9
+
10
+ __all__ = ["HoldNaming"]
11
+
12
+ Value = TypeVar("Value")
13
+
14
+
15
+ class HoldNaming(HoldObject, DataNaming[Value], BaseHoldNaming[Value]):
16
+ data: FrozenNaming[Value]
17
+ __slots__ = ()
18
+
19
+ @property
20
+ @setdoc.basic
21
+ def data(self: Self) -> FrozenNaming[Value]:
22
+ return self._data
23
+
24
+ @data.setter
25
+ def data(self: Self, value: Any) -> None:
26
+ self._data = FrozenNaming[Value](value)
@@ -4,6 +4,8 @@ from typing import *
4
4
  from datahold import core
5
5
  from datahold.core import *
6
6
 
7
+ __all__ = ["TestData"]
8
+
7
9
 
8
10
  class TestData(unittest.TestCase):
9
11
  def test_constructor_abc(self: Self) -> None:
@@ -11,12 +13,15 @@ class TestData(unittest.TestCase):
11
13
  core.DataDict.DataDict()
12
14
  with self.assertRaises(Exception):
13
15
  core.DataList.DataList()
16
+ with self.assertRaises(Exception):
17
+ core.DataList.DataNaming()
14
18
  with self.assertRaises(Exception):
15
19
  core.DataSet.DataSet()
16
20
 
17
21
  def test_constructor_core(self: Self) -> None:
18
22
  core.HoldDict.HoldDict()
19
23
  core.HoldList.HoldList()
24
+ core.HoldNaming.HoldNaming()
20
25
  core.HoldSet.HoldSet()
21
26
 
22
27
  def test_doc(self: Self) -> None:
@@ -6,18 +6,22 @@ from frozendict import frozendict
6
6
 
7
7
  from datahold.core.DataDict import DataDict
8
8
  from datahold.core.DataList import DataList
9
+ from datahold.core.DataNaming import DataNaming
9
10
  from datahold.core.DataObject import DataObject
10
11
  from datahold.core.DataSet import DataSet
11
12
  from datahold.core.FrozenDataDict import FrozenDataDict
12
13
  from datahold.core.FrozenDataList import FrozenDataList
14
+ from datahold.core.FrozenDataNaming import FrozenDataNaming
13
15
  from datahold.core.FrozenDataObject import FrozenDataObject
14
16
  from datahold.core.FrozenDataSet import FrozenDataSet
15
17
  from datahold.core.FrozenHoldDict import FrozenHoldDict
16
18
  from datahold.core.FrozenHoldList import FrozenHoldList
19
+ from datahold.core.FrozenHoldNaming import FrozenHoldNaming
17
20
  from datahold.core.FrozenHoldObject import FrozenHoldObject
18
21
  from datahold.core.FrozenHoldSet import FrozenHoldSet
19
22
  from datahold.core.HoldDict import HoldDict
20
23
  from datahold.core.HoldList import HoldList
24
+ from datahold.core.HoldNaming import HoldNaming
21
25
  from datahold.core.HoldSet import HoldSet
22
26
 
23
27
  __all__ = ["TestAbstractness"]
@@ -29,11 +33,13 @@ class TestAbstractness(unittest.TestCase):
29
33
  self.assertTrue(isabstract(DataObject))
30
34
  self.assertTrue(isabstract(DataDict))
31
35
  self.assertTrue(isabstract(DataList))
36
+ self.assertTrue(isabstract(DataNaming))
32
37
  self.assertTrue(isabstract(DataSet))
33
38
 
34
39
  self.assertTrue(isabstract(FrozenDataObject))
35
40
  self.assertTrue(isabstract(FrozenDataDict))
36
41
  self.assertTrue(isabstract(FrozenDataList))
42
+ self.assertTrue(isabstract(FrozenDataNaming))
37
43
  self.assertTrue(isabstract(FrozenDataSet))
38
44
 
39
45
  # hold
@@ -43,10 +49,12 @@ class TestAbstractness(unittest.TestCase):
43
49
  def test_concrete_classes(self: Self) -> None:
44
50
  FrozenHoldDict({"a": 1})
45
51
  FrozenHoldList([1, 2])
52
+ FrozenHoldNaming({"a": 1}.items())
46
53
  FrozenHoldSet({1, 2})
47
54
 
48
55
  HoldDict({"a": 1})
49
56
  HoldList([1, 2])
57
+ HoldNaming({"a": 1}.items())
50
58
  HoldSet({1, 2})
51
59
 
52
60
 
@@ -1,13 +1,15 @@
1
1
  import unittest
2
2
  from typing import Any, Self
3
3
 
4
- from frozendict import frozendict
4
+ from namings import Naming
5
5
 
6
6
  from datahold.core.FrozenHoldDict import FrozenHoldDict
7
7
  from datahold.core.FrozenHoldList import FrozenHoldList
8
+ from datahold.core.FrozenHoldNaming import FrozenHoldNaming
8
9
  from datahold.core.FrozenHoldSet import FrozenHoldSet
9
10
  from datahold.core.HoldDict import HoldDict
10
11
  from datahold.core.HoldList import HoldList
12
+ from datahold.core.HoldNaming import HoldNaming
11
13
  from datahold.core.HoldSet import HoldSet
12
14
 
13
15
  __all__ = ["TestCopy"]
@@ -17,6 +19,7 @@ class TestCopy(unittest.TestCase):
17
19
  def test_frozen_have_no_copy(self: Self) -> None:
18
20
  self.assertFalse(hasattr(FrozenHoldDict({"a": 1}), "copy"))
19
21
  self.assertFalse(hasattr(FrozenHoldList([1, 2]), "copy"))
22
+ self.assertFalse(hasattr(FrozenHoldNaming({"a": 1}.items()), "copy"))
20
23
  self.assertFalse(hasattr(FrozenHoldSet({1, 2}), "copy"))
21
24
 
22
25
  def test_frozen_have_no_copy_2(self: Self) -> None:
@@ -31,6 +34,7 @@ class TestCopy(unittest.TestCase):
31
34
  for cls, args in (
32
35
  (FrozenHoldDict, ({"a": 1},)),
33
36
  (FrozenHoldList, ([1, 2],)),
37
+ (FrozenHoldNaming, ({"a": 1}.items(),)),
34
38
  (FrozenHoldSet, ({1, 2},)),
35
39
  ):
36
40
  # They must not *define* copy themselves
@@ -56,6 +60,19 @@ class TestCopy(unittest.TestCase):
56
60
  d["a"]["x"] = 2
57
61
  self.assertEqual(d_copy["a"]["x"], 2)
58
62
 
63
+ def test_naming_copy(self: Self) -> None:
64
+ d: HoldNaming
65
+ d_copy: HoldNaming
66
+ d = HoldNaming({"a": {"x": 1}}.items())
67
+ d_copy = d.copy()
68
+ self.assertIsInstance(d_copy, HoldNaming)
69
+ self.assertIsNot(d_copy, d)
70
+ self.assertEqual(Naming(d_copy), Naming(d))
71
+
72
+ # shallow: inner object is shared
73
+ d["a"]["x"] = 2
74
+ self.assertEqual(d_copy["a"]["x"], 2)
75
+
59
76
  def test_list_copy(self: Self) -> None:
60
77
  lst: HoldList
61
78
  lst_copy: HoldList
@@ -2,14 +2,19 @@ import unittest
2
2
  from typing import Any, Self
3
3
 
4
4
  from frozendict import frozendict
5
+ from namings import FrozenNaming
5
6
 
6
7
  from datahold.core.FrozenHoldDict import FrozenHoldDict
7
8
  from datahold.core.FrozenHoldList import FrozenHoldList
9
+ from datahold.core.FrozenHoldNaming import FrozenHoldNaming
8
10
  from datahold.core.FrozenHoldSet import FrozenHoldSet
9
11
  from datahold.core.HoldDict import HoldDict
10
12
  from datahold.core.HoldList import HoldList
13
+ from datahold.core.HoldNaming import HoldNaming
11
14
  from datahold.core.HoldSet import HoldSet
12
15
 
16
+ __all__ = ["TestDataAttribute"]
17
+
13
18
 
14
19
  class TestDataAttribute(unittest.TestCase):
15
20
  def test_dict_data_is_immutable_mapping(self: Self) -> None:
@@ -38,6 +43,20 @@ class TestDataAttribute(unittest.TestCase):
38
43
  with self.assertRaises(Exception):
39
44
  o.data.append(4)
40
45
 
46
+ def test_naming_data_is_immutable_mapping(self: Self) -> None:
47
+ f: FrozenHoldNaming
48
+ m: HoldNaming
49
+ obj: Any
50
+ f = FrozenHoldNaming({"a": 1}.items())
51
+ m = HoldNaming({"a": 1}.items())
52
+
53
+ for obj in (f, m):
54
+ self.assertIsInstance(obj.data, FrozenNaming)
55
+
56
+ # try to mutate underlying data
57
+ with self.assertRaises((TypeError, AttributeError)):
58
+ obj.data["b"] = 2
59
+
41
60
  def test_set_data_is_frozenset(self: Self) -> None:
42
61
  f: FrozenHoldSet
43
62
  m: HoldSet
@@ -1,12 +1,13 @@
1
1
  import unittest
2
- from typing import Any, Self
3
-
4
- from frozendict import frozendict
2
+ from typing import *
5
3
 
6
4
  from datahold.core.FrozenHoldDict import FrozenHoldDict
7
5
  from datahold.core.FrozenHoldList import FrozenHoldList
6
+ from datahold.core.FrozenHoldNaming import FrozenHoldNaming
8
7
  from datahold.core.FrozenHoldSet import FrozenHoldSet
9
8
 
9
+ __all__ = ["TestFrozenMutability"]
10
+
10
11
 
11
12
  class TestFrozenMutability(unittest.TestCase):
12
13
  def test_frozen_dict_cannot_mutate(self: Self) -> None:
@@ -25,6 +26,14 @@ class TestFrozenMutability(unittest.TestCase):
25
26
  with self.assertRaises((TypeError, AttributeError)):
26
27
  f.pop()
27
28
 
29
+ def test_frozen_naming_cannot_mutate(self: Self) -> None:
30
+ f: FrozenHoldNaming
31
+ f = FrozenHoldNaming({"a": 1}.items())
32
+ with self.assertRaises((TypeError, AttributeError)):
33
+ f["b"] = 2
34
+ with self.assertRaises((TypeError, AttributeError)):
35
+ f.pop("a", None)
36
+
28
37
  def test_frozen_set_cannot_mutate(self: Self) -> None:
29
38
  f: FrozenHoldSet
30
39
  f = FrozenHoldSet({1, 2, 3})
@@ -1,31 +1,37 @@
1
1
  import unittest
2
2
  from typing import Self
3
3
 
4
- from frozendict import frozendict
5
-
6
4
  from datahold.core.BaseDataDict import BaseDataDict
7
5
  from datahold.core.BaseDataList import BaseDataList
6
+ from datahold.core.BaseDataNaming import BaseDataNaming
8
7
  from datahold.core.BaseDataSet import BaseDataSet
9
8
  from datahold.core.BaseHoldDict import BaseHoldDict
10
9
  from datahold.core.BaseHoldList import BaseHoldList
10
+ from datahold.core.BaseHoldNaming import BaseHoldNaming
11
11
  from datahold.core.BaseHoldSet import BaseHoldSet
12
12
  from datahold.core.DataDict import DataDict
13
13
  from datahold.core.DataList import DataList
14
+ from datahold.core.DataNaming import DataNaming
14
15
  from datahold.core.DataObject import DataObject
15
16
  from datahold.core.DataSet import DataSet
16
17
  from datahold.core.FrozenDataDict import FrozenDataDict
17
18
  from datahold.core.FrozenDataList import FrozenDataList
19
+ from datahold.core.FrozenDataNaming import FrozenDataNaming
18
20
  from datahold.core.FrozenDataObject import FrozenDataObject
19
21
  from datahold.core.FrozenDataSet import FrozenDataSet
20
22
  from datahold.core.FrozenHoldDict import FrozenHoldDict
21
23
  from datahold.core.FrozenHoldList import FrozenHoldList
24
+ from datahold.core.FrozenHoldNaming import FrozenHoldNaming
22
25
  from datahold.core.FrozenHoldObject import FrozenHoldObject
23
26
  from datahold.core.FrozenHoldSet import FrozenHoldSet
24
27
  from datahold.core.HoldDict import HoldDict
25
28
  from datahold.core.HoldList import HoldList
29
+ from datahold.core.HoldNaming import HoldNaming
26
30
  from datahold.core.HoldObject import HoldObject
27
31
  from datahold.core.HoldSet import HoldSet
28
32
 
33
+ __all__ = ["TestInheritance"]
34
+
29
35
 
30
36
  class TestInheritance(unittest.TestCase):
31
37
  def test_dict_inheritance(self: Self) -> None:
@@ -48,6 +54,17 @@ class TestInheritance(unittest.TestCase):
48
54
  self.assertTrue(issubclass(DataList, BaseDataList))
49
55
  self.assertTrue(issubclass(HoldList, BaseHoldList))
50
56
 
57
+ def test_naming_inheritance(self: Self) -> None:
58
+ # base → concrete
59
+ self.assertTrue(issubclass(DataNaming, DataObject))
60
+ self.assertTrue(issubclass(FrozenDataNaming, FrozenDataObject))
61
+ self.assertTrue(issubclass(HoldNaming, HoldObject))
62
+ self.assertTrue(issubclass(FrozenHoldNaming, FrozenHoldObject))
63
+
64
+ # non-frozen data inherit from frozen
65
+ self.assertTrue(issubclass(DataNaming, BaseDataNaming))
66
+ self.assertTrue(issubclass(HoldNaming, BaseHoldNaming))
67
+
51
68
  def test_set_inheritance(self: Self) -> None:
52
69
  self.assertTrue(issubclass(DataSet, DataObject))
53
70
  self.assertTrue(issubclass(FrozenDataSet, FrozenDataObject))
@@ -1,15 +1,13 @@
1
1
  import unittest
2
- from typing import Any, Self
2
+ from typing import *
3
3
 
4
- from frozendict import frozendict
5
-
6
- from datahold.core.FrozenHoldDict import FrozenHoldDict
7
- from datahold.core.FrozenHoldList import FrozenHoldList
8
- from datahold.core.FrozenHoldSet import FrozenHoldSet
9
4
  from datahold.core.HoldDict import HoldDict
10
5
  from datahold.core.HoldList import HoldList
6
+ from datahold.core.HoldNaming import HoldNaming
11
7
  from datahold.core.HoldSet import HoldSet
12
8
 
9
+ __all__ = ["TestMutableBehavior"]
10
+
13
11
 
14
12
  class TestMutableBehavior(unittest.TestCase):
15
13
  def test_hold_dict_mutates_and_syncs_data(self: Self) -> None:
@@ -26,6 +24,13 @@ class TestMutableBehavior(unittest.TestCase):
26
24
  self.assertEqual(list(x), [1, 2, 3])
27
25
  self.assertEqual(x.data, (1, 2, 3))
28
26
 
27
+ def test_hold_naming_mutates_and_syncs_data(self: Self) -> None:
28
+ x: HoldNaming
29
+ x = HoldNaming({"a": 1}.items())
30
+ x["b"] = 2
31
+ self.assertEqual(x["b"], 2)
32
+ self.assertEqual(x.data["b"], 2)
33
+
29
34
  def test_hold_set_mutates_and_syncs_data(self: Self) -> None:
30
35
  s: HoldSet
31
36
  s = HoldSet({1, 2})
@@ -9,13 +9,13 @@ from collections.abc import (
9
9
  from collections.abc import Set as AbstractSet
10
10
  from typing import Self
11
11
 
12
- from frozendict import frozendict
13
-
14
12
  from datahold.core.FrozenHoldDict import FrozenHoldDict
15
13
  from datahold.core.FrozenHoldList import FrozenHoldList
14
+ from datahold.core.FrozenHoldNaming import FrozenHoldNaming
16
15
  from datahold.core.FrozenHoldSet import FrozenHoldSet
17
16
  from datahold.core.HoldDict import HoldDict
18
17
  from datahold.core.HoldList import HoldList
18
+ from datahold.core.HoldNaming import HoldNaming
19
19
  from datahold.core.HoldSet import HoldSet
20
20
 
21
21
  __all__ = ["TestProtocols"]
@@ -49,6 +49,20 @@ class TestProtocols(unittest.TestCase):
49
49
  self.assertIsInstance(m, Sequence)
50
50
  self.assertIsInstance(m, MutableSequence)
51
51
 
52
+ def test_naming_protocols_x(self: Self) -> None:
53
+ x: FrozenHoldNaming
54
+ x = FrozenHoldNaming({"a": 1}.items())
55
+
56
+ self.assertIsInstance(x, Mapping)
57
+ self.assertNotIsInstance(x, MutableMapping)
58
+
59
+ def test_naming_protocols_y(self: Self) -> None:
60
+ y: HoldNaming
61
+ y = HoldNaming({"a": 1}.items())
62
+
63
+ self.assertIsInstance(y, Mapping)
64
+ self.assertIsInstance(y, MutableMapping)
65
+
52
66
  def test_set_protocols(self: Self) -> None:
53
67
  f: FrozenHoldSet
54
68
  m: HoldSet
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datahold
3
- Version: 3.0.2
3
+ Version: 3.1.0.dev0
4
4
  Summary: This project wraps common mutable datastructures for inheritance with modification.
5
5
  Author-email: Johannes <johannes.programming@gmail.com>
6
6
  License: The MIT License (MIT)
@@ -28,7 +28,7 @@ Project-URL: Download, https://pypi.org/project/datahold/#files
28
28
  Project-URL: Index, https://pypi.org/project/datahold/
29
29
  Project-URL: Source, https://github.com/johannes-programming/datahold/
30
30
  Project-URL: Website, http://datahold.johannes-programming.online/
31
- Classifier: Development Status :: 5 - Production/Stable
31
+ Classifier: Development Status :: 3 - Alpha
32
32
  Classifier: Intended Audience :: Developers
33
33
  Classifier: License :: OSI Approved :: MIT License
34
34
  Classifier: Natural Language :: English
@@ -44,6 +44,7 @@ Requires-Dist: cmp3<2,>=1.0
44
44
  Requires-Dist: copyable<2,>=1.0
45
45
  Requires-Dist: datarepr<2,>=1.0
46
46
  Requires-Dist: frozendict<3,>=2.4.6
47
+ Requires-Dist: namings<2,>=1.0
47
48
  Requires-Dist: setdoc<2,>=1.2.8
48
49
  Dynamic: license-file
49
50
 
@@ -13,26 +13,32 @@ src/datahold/_utils/__init__.py
13
13
  src/datahold/_utils/wrapping.py
14
14
  src/datahold/core/BaseDataDict.py
15
15
  src/datahold/core/BaseDataList.py
16
+ src/datahold/core/BaseDataNaming.py
16
17
  src/datahold/core/BaseDataObject.py
17
18
  src/datahold/core/BaseDataSet.py
18
19
  src/datahold/core/BaseHoldDict.py
19
20
  src/datahold/core/BaseHoldList.py
21
+ src/datahold/core/BaseHoldNaming.py
20
22
  src/datahold/core/BaseHoldObject.py
21
23
  src/datahold/core/BaseHoldSet.py
22
24
  src/datahold/core/DataDict.py
23
25
  src/datahold/core/DataList.py
26
+ src/datahold/core/DataNaming.py
24
27
  src/datahold/core/DataObject.py
25
28
  src/datahold/core/DataSet.py
26
29
  src/datahold/core/FrozenDataDict.py
27
30
  src/datahold/core/FrozenDataList.py
31
+ src/datahold/core/FrozenDataNaming.py
28
32
  src/datahold/core/FrozenDataObject.py
29
33
  src/datahold/core/FrozenDataSet.py
30
34
  src/datahold/core/FrozenHoldDict.py
31
35
  src/datahold/core/FrozenHoldList.py
36
+ src/datahold/core/FrozenHoldNaming.py
32
37
  src/datahold/core/FrozenHoldObject.py
33
38
  src/datahold/core/FrozenHoldSet.py
34
39
  src/datahold/core/HoldDict.py
35
40
  src/datahold/core/HoldList.py
41
+ src/datahold/core/HoldNaming.py
36
42
  src/datahold/core/HoldObject.py
37
43
  src/datahold/core/HoldSet.py
38
44
  src/datahold/core/__init__.py
@@ -2,4 +2,5 @@ cmp3<2,>=1.0
2
2
  copyable<2,>=1.0
3
3
  datarepr<2,>=1.0
4
4
  frozendict<3,>=2.4.6
5
+ namings<2,>=1.0
5
6
  setdoc<2,>=1.2.8
File without changes
File without changes
File without changes
File without changes