v440 2.0.0.dev15__tar.gz → 2.0.0.dev16__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.
- {v440-2.0.0.dev15/src/v440.egg-info → v440-2.0.0.dev16}/PKG-INFO +1 -1
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/pyproject.toml +1 -1
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/VList.py +0 -22
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/WList.py +2 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/utils.py +46 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Base.py +3 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Local.py +2 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Pre.py +1 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Public.py +3 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Qualification.py +4 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Release.py +2 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Version.py +3 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/tests/test_version.py +1 -4
- {v440-2.0.0.dev15 → v440-2.0.0.dev16/src/v440.egg-info}/PKG-INFO +1 -1
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/LICENSE.txt +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/MANIFEST.in +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/README.rst +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/setup.cfg +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/__init__.py +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/Digest.py +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/Pattern.py +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/SimpleQualifierParser.py +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/__init__.py +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/VersionError.py +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/__init__.py +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/tests/__init__.py +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/tests/test_testdata.py +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/tests/testdata.toml +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440.egg-info/SOURCES.txt +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440.egg-info/dependency_links.txt +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440.egg-info/requires.txt +0 -0
- {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440.egg-info/top_level.txt +0 -0
|
@@ -5,13 +5,6 @@ from datahold import OkayList
|
|
|
5
5
|
from v440.core.VersionError import VersionError
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
def clone(value: Any) -> Any:
|
|
9
|
-
if isinstance(value, VList):
|
|
10
|
-
return list(map(clone, value))
|
|
11
|
-
else:
|
|
12
|
-
return value
|
|
13
|
-
|
|
14
|
-
|
|
15
8
|
class VList(OkayList):
|
|
16
9
|
def __eq__(self: Self, other: Any) -> bool:
|
|
17
10
|
"This magic method implements self==other."
|
|
@@ -56,21 +49,6 @@ class VList(OkayList):
|
|
|
56
49
|
ans = self._data <= alt._data
|
|
57
50
|
return ans
|
|
58
51
|
|
|
59
|
-
def __setattr__(self: Self, name: str, value: Any) -> Any:
|
|
60
|
-
if name not in type(self).__annotations__.keys():
|
|
61
|
-
return object.__setattr__(self, name, value)
|
|
62
|
-
backup: list = clone(self)
|
|
63
|
-
exc: BaseException
|
|
64
|
-
try:
|
|
65
|
-
object.__setattr__(self, name, value)
|
|
66
|
-
except BaseException as exc:
|
|
67
|
-
self.data = backup
|
|
68
|
-
if isinstance(exc, VersionError):
|
|
69
|
-
raise
|
|
70
|
-
msg: str = "%r is an invalid value for %r"
|
|
71
|
-
msg %= (value, type(self).__name__ + "." + name)
|
|
72
|
-
raise VersionError(msg)
|
|
73
|
-
|
|
74
52
|
def __sorted__(self: Any, /, **kwargs: Any) -> Self:
|
|
75
53
|
"This magic method implements sorted(self, **kwargs)."
|
|
76
54
|
ans: Any = self.copy()
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from typing import *
|
|
2
2
|
|
|
3
|
+
from v440._utils.utils import guard
|
|
3
4
|
from v440._utils.VList import VList
|
|
4
5
|
|
|
5
6
|
__all__ = ["WList"]
|
|
@@ -11,5 +12,6 @@ class WList(VList):
|
|
|
11
12
|
return list(self._data)
|
|
12
13
|
|
|
13
14
|
@data.setter
|
|
15
|
+
@guard
|
|
14
16
|
def data(self: Self, value: Any) -> None:
|
|
15
17
|
self._data = value
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import functools
|
|
3
4
|
import operator
|
|
4
5
|
import string
|
|
5
6
|
from typing import *
|
|
@@ -91,3 +92,48 @@ def torange(key: Any, length: Any) -> range:
|
|
|
91
92
|
stop = 0 if fwd else -1
|
|
92
93
|
ans: range = range(start, stop, step)
|
|
93
94
|
return ans
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def ishashable(value: Any) -> bool:
|
|
98
|
+
try:
|
|
99
|
+
hash(value)
|
|
100
|
+
except:
|
|
101
|
+
return False
|
|
102
|
+
else:
|
|
103
|
+
return True
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def guard(old: Any) -> Any:
|
|
107
|
+
@functools.wraps(old)
|
|
108
|
+
def new(self: Self, value: Any) -> None:
|
|
109
|
+
backup: dict = dict()
|
|
110
|
+
x: Any
|
|
111
|
+
y: Any
|
|
112
|
+
for x in type(self).__slots__:
|
|
113
|
+
y = getattr(self, x)
|
|
114
|
+
backup[x] = y if ishashable(y) else y.copy()
|
|
115
|
+
try:
|
|
116
|
+
old(self, value)
|
|
117
|
+
except VersionError:
|
|
118
|
+
restore(obj=self, backup=backup)
|
|
119
|
+
raise
|
|
120
|
+
except Exception:
|
|
121
|
+
restore(obj=self, backup=backup)
|
|
122
|
+
msg: str = "%r is an invalid value for %r"
|
|
123
|
+
target: str = type(self).__name__ + "." + old.__name__
|
|
124
|
+
msg %= (value, target)
|
|
125
|
+
raise VersionError(msg)
|
|
126
|
+
|
|
127
|
+
return new
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def restore(obj: Any, backup: dict):
|
|
131
|
+
# print("backup", backup)
|
|
132
|
+
for x in type(obj).__slots__:
|
|
133
|
+
# print("x", x)
|
|
134
|
+
if ishashable(backup[x]):
|
|
135
|
+
# print("ishashable", True)
|
|
136
|
+
setattr(obj, x, backup[x])
|
|
137
|
+
else:
|
|
138
|
+
# print("ishashable", False)
|
|
139
|
+
getattr(obj, x).data = backup[x]
|
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from typing import *
|
|
4
4
|
|
|
5
5
|
from v440._utils.Digest import Digest
|
|
6
|
+
from v440._utils.utils import guard
|
|
6
7
|
from v440._utils.WList import WList
|
|
7
8
|
from v440.core.Release import Release
|
|
8
9
|
|
|
@@ -92,6 +93,7 @@ class Base(WList):
|
|
|
92
93
|
return self._epoch
|
|
93
94
|
|
|
94
95
|
@epoch.setter
|
|
96
|
+
@guard
|
|
95
97
|
def epoch(self: Self, value: Any) -> None:
|
|
96
98
|
self._epoch = parse_epoch(value)
|
|
97
99
|
|
|
@@ -107,5 +109,6 @@ class Base(WList):
|
|
|
107
109
|
return self._release
|
|
108
110
|
|
|
109
111
|
@release.setter
|
|
112
|
+
@guard
|
|
110
113
|
def release(self: Self, value: Any) -> None:
|
|
111
114
|
self._release.data = value
|
|
@@ -5,6 +5,7 @@ from typing import *
|
|
|
5
5
|
|
|
6
6
|
from v440._utils import utils
|
|
7
7
|
from v440._utils.Digest import Digest
|
|
8
|
+
from v440._utils.utils import guard
|
|
8
9
|
from v440._utils.VList import VList
|
|
9
10
|
|
|
10
11
|
__all__ = ["Local"]
|
|
@@ -76,6 +77,7 @@ class Local(VList):
|
|
|
76
77
|
return list(self._data)
|
|
77
78
|
|
|
78
79
|
@data.setter
|
|
80
|
+
@guard
|
|
79
81
|
def data(self: Self, value: Any) -> None:
|
|
80
82
|
self._data = self._data_calc(value)
|
|
81
83
|
|
|
@@ -4,6 +4,7 @@ from typing import *
|
|
|
4
4
|
|
|
5
5
|
from v440._utils.Digest import Digest
|
|
6
6
|
from v440._utils.Pattern import Pattern
|
|
7
|
+
from v440._utils.utils import guard
|
|
7
8
|
from v440._utils.WList import WList
|
|
8
9
|
from v440.core.Base import Base
|
|
9
10
|
from v440.core.Qualification import Qualification
|
|
@@ -64,6 +65,7 @@ class Public(WList):
|
|
|
64
65
|
return self._base
|
|
65
66
|
|
|
66
67
|
@base.setter
|
|
68
|
+
@guard
|
|
67
69
|
def base(self: Self, value: Any) -> None:
|
|
68
70
|
self.base.data = value
|
|
69
71
|
|
|
@@ -75,5 +77,6 @@ class Public(WList):
|
|
|
75
77
|
return self._qualification
|
|
76
78
|
|
|
77
79
|
@qualification.setter
|
|
80
|
+
@guard
|
|
78
81
|
def qualification(self: Self, value: Any) -> None:
|
|
79
82
|
self.qualification.data = value
|
|
@@ -5,6 +5,7 @@ from typing import *
|
|
|
5
5
|
from v440._utils import SimpleQualifierParser
|
|
6
6
|
from v440._utils.Digest import Digest
|
|
7
7
|
from v440._utils.Pattern import Pattern
|
|
8
|
+
from v440._utils.utils import guard
|
|
8
9
|
from v440._utils.WList import WList
|
|
9
10
|
from v440.core.Pre import Pre
|
|
10
11
|
|
|
@@ -111,6 +112,7 @@ class Qualification(WList):
|
|
|
111
112
|
return self._dev
|
|
112
113
|
|
|
113
114
|
@dev.setter
|
|
115
|
+
@guard
|
|
114
116
|
def dev(self: Self, value: Any) -> None:
|
|
115
117
|
self._dev = SimpleQualifierParser.DEV(value)
|
|
116
118
|
|
|
@@ -131,6 +133,7 @@ class Qualification(WList):
|
|
|
131
133
|
return self._post
|
|
132
134
|
|
|
133
135
|
@post.setter
|
|
136
|
+
@guard
|
|
134
137
|
def post(self: Self, value: Any) -> None:
|
|
135
138
|
self._post = SimpleQualifierParser.POST(value)
|
|
136
139
|
|
|
@@ -139,5 +142,6 @@ class Qualification(WList):
|
|
|
139
142
|
return self._pre
|
|
140
143
|
|
|
141
144
|
@pre.setter
|
|
145
|
+
@guard
|
|
142
146
|
def pre(self: Self, value: Any) -> None:
|
|
143
147
|
self._pre.data = value
|
|
@@ -8,6 +8,7 @@ from keyalias import keyalias
|
|
|
8
8
|
from overloadable import Overloadable
|
|
9
9
|
|
|
10
10
|
from v440._utils import utils
|
|
11
|
+
from v440._utils.utils import guard
|
|
11
12
|
from v440._utils.VList import VList
|
|
12
13
|
|
|
13
14
|
|
|
@@ -191,6 +192,7 @@ class Release(VList):
|
|
|
191
192
|
return list(self._data)
|
|
192
193
|
|
|
193
194
|
@data.setter
|
|
195
|
+
@guard
|
|
194
196
|
def data(self: Self, value: Any) -> None:
|
|
195
197
|
v: list = self._tolist(value, slicing="always")
|
|
196
198
|
while v and v[-1] == 0:
|
|
@@ -5,6 +5,7 @@ from typing import *
|
|
|
5
5
|
import packaging.version
|
|
6
6
|
|
|
7
7
|
from v440._utils.Digest import Digest
|
|
8
|
+
from v440._utils.utils import guard
|
|
8
9
|
from v440._utils.WList import WList
|
|
9
10
|
from v440.core.Base import Base
|
|
10
11
|
from v440.core.Local import Local
|
|
@@ -113,6 +114,7 @@ class Version(WList):
|
|
|
113
114
|
return self._local
|
|
114
115
|
|
|
115
116
|
@local.setter
|
|
117
|
+
@guard
|
|
116
118
|
def local(self: Self, value: Any) -> None:
|
|
117
119
|
self.local.data = value
|
|
118
120
|
|
|
@@ -140,6 +142,7 @@ class Version(WList):
|
|
|
140
142
|
return self._public
|
|
141
143
|
|
|
142
144
|
@public.setter
|
|
145
|
+
@guard
|
|
143
146
|
def public(self: Self, value: Any) -> None:
|
|
144
147
|
self.public.data = value
|
|
145
148
|
|
|
@@ -181,11 +181,8 @@ class TestExample(unittest.TestCase):
|
|
|
181
181
|
self.assertEqual(str(v), "0") # After reset
|
|
182
182
|
v.base = "4!5.0.1"
|
|
183
183
|
self.assertEqual(str(v), "4!5.0.1") # Before error
|
|
184
|
-
with self.assertRaises(
|
|
184
|
+
with self.assertRaises(VersionError) as context:
|
|
185
185
|
v.base = "9!x"
|
|
186
|
-
self.assertTrue(
|
|
187
|
-
"not a valid numeral segment" in str(context.exception)
|
|
188
|
-
) # Error
|
|
189
186
|
self.assertEqual(str(v), "4!5.0.1") # After error
|
|
190
187
|
|
|
191
188
|
|
|
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
|