v440 2.0.0.dev14__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.dev14/src/v440.egg-info → v440-2.0.0.dev16}/PKG-INFO +1 -1
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/pyproject.toml +1 -1
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/VList.py +0 -22
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/WList.py +2 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/utils.py +46 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Base.py +3 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Local.py +2 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Pre.py +1 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Public.py +3 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Qualification.py +4 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Release.py +2 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Version.py +3 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/tests/test_testdata.py +16 -20
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/tests/test_version.py +119 -106
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/tests/testdata.toml +7 -4
- {v440-2.0.0.dev14 → v440-2.0.0.dev16/src/v440.egg-info}/PKG-INFO +1 -1
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/LICENSE.txt +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/MANIFEST.in +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/README.rst +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/setup.cfg +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/__init__.py +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/Digest.py +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/Pattern.py +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/SimpleQualifierParser.py +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/__init__.py +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/VersionError.py +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/__init__.py +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/tests/__init__.py +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440.egg-info/SOURCES.txt +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440.egg-info/dependency_links.txt +0 -0
- {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440.egg-info/requires.txt +0 -0
- {v440-2.0.0.dev14 → 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
|
|
|
@@ -10,6 +10,7 @@ import iterprod
|
|
|
10
10
|
import packaging.version
|
|
11
11
|
from catchlib import Catcher
|
|
12
12
|
|
|
13
|
+
from v440.core.Release import Release
|
|
13
14
|
from v440.core.Version import Version
|
|
14
15
|
from v440.core.VersionError import VersionError
|
|
15
16
|
|
|
@@ -77,9 +78,9 @@ class TestVersionLocalVersionError(unittest.TestCase):
|
|
|
77
78
|
k: str
|
|
78
79
|
v: dict
|
|
79
80
|
for k, v in Util.util.data["local_VersionError"].items():
|
|
80
|
-
self.
|
|
81
|
+
self.go(**v, key=k)
|
|
81
82
|
|
|
82
|
-
def
|
|
83
|
+
def go(
|
|
83
84
|
self: Self,
|
|
84
85
|
key: str,
|
|
85
86
|
query: list,
|
|
@@ -177,37 +178,32 @@ class TestSlicing(unittest.TestCase):
|
|
|
177
178
|
|
|
178
179
|
class TestDataProperty(unittest.TestCase):
|
|
179
180
|
def test_data(self: Self) -> None:
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
self.data(**v, key=k)
|
|
183
|
-
self.data(query=None, solution="0")
|
|
181
|
+
for k, v in Util.util.data["data-property"].items():
|
|
182
|
+
self.go(**v, key=k)
|
|
184
183
|
|
|
185
|
-
def
|
|
184
|
+
def go(
|
|
186
185
|
self: Self,
|
|
187
|
-
query: Any,
|
|
188
|
-
solution:
|
|
186
|
+
query: Any = None,
|
|
187
|
+
solution: Any = None,
|
|
189
188
|
key: str = "",
|
|
190
189
|
) -> None:
|
|
191
|
-
msg: str = "
|
|
192
|
-
|
|
193
|
-
|
|
190
|
+
msg: str = "data-property %r" % key
|
|
191
|
+
version: Version = Version()
|
|
192
|
+
version.data = query
|
|
193
|
+
self.assertEqual(solution, str(version), msg=msg)
|
|
194
194
|
|
|
195
195
|
|
|
196
196
|
class TestVersionRelease(unittest.TestCase):
|
|
197
197
|
|
|
198
|
-
def setUp(self: Self) -> None:
|
|
199
|
-
# Create a version class instance
|
|
200
|
-
self.version = Version()
|
|
201
|
-
|
|
202
198
|
def test_0(self: Self) -> None:
|
|
203
199
|
k: str
|
|
204
200
|
v: Any
|
|
205
201
|
for k, v in Util.util.data["release"].items():
|
|
206
|
-
self.
|
|
202
|
+
self.go(key=k, **v)
|
|
207
203
|
|
|
208
|
-
def
|
|
209
|
-
|
|
210
|
-
self.assertEqual(
|
|
204
|
+
def go(self: Self, query: Any, solution: Any, key: str = "") -> None:
|
|
205
|
+
release: Release = Release(query)
|
|
206
|
+
self.assertEqual(release, solution)
|
|
211
207
|
|
|
212
208
|
|
|
213
209
|
class TestDev(unittest.TestCase):
|
|
@@ -10,7 +10,7 @@ class TestVersionManipulation(unittest.TestCase):
|
|
|
10
10
|
|
|
11
11
|
def test_version_modification(self: Self) -> None:
|
|
12
12
|
# Create an instance of the v440.Version class
|
|
13
|
-
v = Version("1.2.3")
|
|
13
|
+
v: Version = Version("1.2.3")
|
|
14
14
|
|
|
15
15
|
# Modify individual parts of the version
|
|
16
16
|
v.release.major = 2
|
|
@@ -25,7 +25,7 @@ class TestVersionManipulation(unittest.TestCase):
|
|
|
25
25
|
class TestVersionLocal(unittest.TestCase):
|
|
26
26
|
|
|
27
27
|
def test_version_operations(self: Self) -> None:
|
|
28
|
-
v = Version("1.2.3")
|
|
28
|
+
v: Version = Version("1.2.3")
|
|
29
29
|
backup = v.local
|
|
30
30
|
v.local = "local.1.2.3"
|
|
31
31
|
self.assertEqual(str(v), "1.2.3+local.1.2.3")
|
|
@@ -53,7 +53,7 @@ class TestVersionLocal(unittest.TestCase):
|
|
|
53
53
|
class TestVersion(unittest.TestCase):
|
|
54
54
|
|
|
55
55
|
def test_version_pre(self: Self) -> None:
|
|
56
|
-
v = Version("1.2.3")
|
|
56
|
+
v: Version = Version("1.2.3")
|
|
57
57
|
backup = v.pre
|
|
58
58
|
|
|
59
59
|
# Initial version, no pre-release version
|
|
@@ -93,20 +93,20 @@ class TestVersion(unittest.TestCase):
|
|
|
93
93
|
class TestExample(unittest.TestCase):
|
|
94
94
|
|
|
95
95
|
def test_example_1(self: Self) -> None:
|
|
96
|
-
v = Version("v1.0.0")
|
|
96
|
+
v: Version = Version("v1.0.0")
|
|
97
97
|
self.assertEqual(str(v), "1") # Initial version
|
|
98
98
|
self.assertEqual(v.format("3"), "1.0.0") # Initial version formatted
|
|
99
99
|
|
|
100
100
|
def test_example_2(self: Self) -> None:
|
|
101
|
-
v = Version("2.5.3")
|
|
101
|
+
v: Version = Version("2.5.3")
|
|
102
102
|
self.assertEqual(str(v), "2.5.3") # Modified version
|
|
103
103
|
v.release[1] = 64
|
|
104
104
|
v.release.micro = 4
|
|
105
105
|
self.assertEqual(str(v), "2.64.4") # Further modified version
|
|
106
106
|
|
|
107
107
|
def test_example_3(self: Self) -> None:
|
|
108
|
-
v1 = Version("1.6.3")
|
|
109
|
-
v2 = Version("1.6.4")
|
|
108
|
+
v1: Version = Version("1.6.3")
|
|
109
|
+
v2: Version = Version("1.6.4")
|
|
110
110
|
self.assertEqual(str(v1), "1.6.3") # v1
|
|
111
111
|
self.assertEqual(str(v2), "1.6.4") # v2
|
|
112
112
|
self.assertFalse(v1 == v2) # v1 == v2 gives False
|
|
@@ -117,8 +117,8 @@ class TestExample(unittest.TestCase):
|
|
|
117
117
|
self.assertTrue(v1 < v2) # v1 < v2 gives True
|
|
118
118
|
|
|
119
119
|
def test_example_3a(self: Self) -> None:
|
|
120
|
-
v1 = Version("1.6.3")
|
|
121
|
-
v2 = "1.6.4"
|
|
120
|
+
v1: Version = Version("1.6.3")
|
|
121
|
+
v2: str = "1.6.4"
|
|
122
122
|
self.assertEqual(str(v1), "1.6.3") # v1
|
|
123
123
|
self.assertEqual(str(v2), "1.6.4") # v2
|
|
124
124
|
self.assertFalse(v1 == v2) # v1 == v2 gives False
|
|
@@ -129,8 +129,8 @@ class TestExample(unittest.TestCase):
|
|
|
129
129
|
self.assertTrue(v1 < v2) # v1 < v2 gives True
|
|
130
130
|
|
|
131
131
|
def test_example_3b(self: Self) -> None:
|
|
132
|
-
v1 = "1.6.3"
|
|
133
|
-
v2 = Version("1.6.4")
|
|
132
|
+
v1: str = "1.6.3"
|
|
133
|
+
v2: Version = Version("1.6.4")
|
|
134
134
|
self.assertEqual(str(v1), "1.6.3") # v1
|
|
135
135
|
self.assertEqual(str(v2), "1.6.4") # v2
|
|
136
136
|
self.assertFalse(v1 == v2) # v1 == v2 gives False
|
|
@@ -141,13 +141,13 @@ class TestExample(unittest.TestCase):
|
|
|
141
141
|
self.assertTrue(v1 < v2) # v1 < v2 gives True
|
|
142
142
|
|
|
143
143
|
def test_example_4(self: Self) -> None:
|
|
144
|
-
v = Version("2.5.3.9")
|
|
144
|
+
v: Version = Version("2.5.3.9")
|
|
145
145
|
self.assertEqual(str(v), "2.5.3.9") # before sorting
|
|
146
146
|
v.release.sort()
|
|
147
147
|
self.assertEqual(str(v), "2.3.5.9") # after sorting
|
|
148
148
|
|
|
149
149
|
def test_example_5(self: Self) -> None:
|
|
150
|
-
v = Version("2.0.0-alpha.1")
|
|
150
|
+
v: Version = Version("2.0.0-alpha.1")
|
|
151
151
|
self.assertEqual(str(v), "2a1") # Pre-release version
|
|
152
152
|
v.pre = "beta.2"
|
|
153
153
|
self.assertEqual(str(v), "2b2") # Modified pre-release version
|
|
@@ -157,7 +157,7 @@ class TestExample(unittest.TestCase):
|
|
|
157
157
|
self.assertEqual(str(v), "2rc4") # Even further modified pre-release version
|
|
158
158
|
|
|
159
159
|
def test_example_6(self: Self) -> None:
|
|
160
|
-
v = Version("1.2.3")
|
|
160
|
+
v: Version = Version("1.2.3")
|
|
161
161
|
v.post = "post1"
|
|
162
162
|
v.local = "local.7.dev"
|
|
163
163
|
self.assertEqual(str(v), "1.2.3.post1+local.7.dev") # Post-release version
|
|
@@ -175,17 +175,14 @@ class TestExample(unittest.TestCase):
|
|
|
175
175
|
self.assertEqual(str(v), "1.2.3.post3+3.test.19") # Modified local again
|
|
176
176
|
|
|
177
177
|
def test_example_7(self: Self) -> None:
|
|
178
|
-
v = Version("5.0.0")
|
|
178
|
+
v: Version = Version("5.0.0")
|
|
179
179
|
self.assertEqual(str(v), "5") # Original version
|
|
180
180
|
v.data = None
|
|
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
|
|
|
@@ -199,184 +196,200 @@ class TestPatch(unittest.TestCase):
|
|
|
199
196
|
|
|
200
197
|
class TestVersionRelease(unittest.TestCase):
|
|
201
198
|
|
|
202
|
-
def setUp(self: Self) -> None:
|
|
203
|
-
# Create a version class instance
|
|
204
|
-
self.version = Version()
|
|
205
|
-
|
|
206
199
|
def test_major_minor_micro_aliases(self: Self) -> None:
|
|
207
200
|
# Test major, minor, and micro aliases for the first three indices
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
self.assertEqual(
|
|
211
|
-
self.assertEqual(
|
|
212
|
-
self.assertEqual(
|
|
201
|
+
version: Version = Version()
|
|
202
|
+
version.release = [1, 2, 3]
|
|
203
|
+
self.assertEqual(version.release.major, 1)
|
|
204
|
+
self.assertEqual(version.release.minor, 2)
|
|
205
|
+
self.assertEqual(version.release.micro, 3)
|
|
206
|
+
self.assertEqual(version.release.patch, 3) # 'patch' is an alias for micro
|
|
213
207
|
|
|
214
208
|
def test_release_modify_aliases(self: Self) -> None:
|
|
215
209
|
# Test modifying the release via major, minor, and micro properties
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
self.assertEqual(
|
|
210
|
+
version: Version = Version()
|
|
211
|
+
version.release = [1, 2, 3]
|
|
212
|
+
version.release.major = 10
|
|
213
|
+
version.release.minor = 20
|
|
214
|
+
version.release.micro = 30
|
|
215
|
+
self.assertEqual(version.release, [10, 20, 30])
|
|
216
|
+
self.assertEqual(version.release.patch, 30)
|
|
222
217
|
|
|
223
218
|
def test_release_with_tailing_zeros_simulation(self: Self) -> None:
|
|
224
219
|
# Test that the release can simulate arbitrary high number of tailing zeros
|
|
225
|
-
|
|
226
|
-
|
|
220
|
+
version: Version = Version()
|
|
221
|
+
version.release = [1, 2]
|
|
222
|
+
simulated_release = version.release[:5]
|
|
227
223
|
self.assertEqual(simulated_release, [1, 2, 0, 0, 0])
|
|
228
224
|
|
|
229
225
|
def test_release_empty_major(self: Self) -> None:
|
|
230
226
|
# Test that an empty release still has valid major, minor, micro values
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
self.assertEqual(
|
|
234
|
-
self.assertEqual(
|
|
235
|
-
self.assertEqual(
|
|
227
|
+
version: Version = Version()
|
|
228
|
+
version.release = []
|
|
229
|
+
self.assertEqual(version.release.major, 0)
|
|
230
|
+
self.assertEqual(version.release.minor, 0)
|
|
231
|
+
self.assertEqual(version.release.micro, 0)
|
|
232
|
+
self.assertEqual(version.release.patch, 0)
|
|
236
233
|
|
|
237
234
|
def test_release_modify_with_alias_increase_length(self: Self) -> None:
|
|
238
235
|
# Test that modifying an alias can extend the length of release
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
self.version.release
|
|
243
|
-
|
|
236
|
+
version: Version = Version()
|
|
237
|
+
version.release = [1]
|
|
238
|
+
version.release.minor = 5 # This should make release [1, 5]
|
|
239
|
+
self.assertEqual(version.release, [1, 5])
|
|
240
|
+
version.release.micro = 3 # This should make release [1, 5, 3]
|
|
241
|
+
self.assertEqual(version.release, [1, 5, 3])
|
|
244
242
|
|
|
245
243
|
def test_release_modify_major_only(self: Self) -> None:
|
|
246
244
|
# Test that setting just the major property works
|
|
247
|
-
|
|
248
|
-
|
|
245
|
+
version: Version = Version()
|
|
246
|
+
version.release.major = 10
|
|
247
|
+
self.assertEqual(version.release, [10])
|
|
249
248
|
|
|
250
249
|
def test_release_modify_minor_only(self: Self) -> None:
|
|
251
250
|
# Test that setting just the minor property extends release
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
251
|
+
version: Version = Version()
|
|
252
|
+
version.release = []
|
|
253
|
+
version.release.minor = 1
|
|
254
|
+
self.assertEqual(version.release, [0, 1])
|
|
255
255
|
|
|
256
256
|
def test_release_modify_micro_only(self: Self) -> None:
|
|
257
257
|
# Test that setting just the micro (patch) property extends release
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
258
|
+
version: Version = Version()
|
|
259
|
+
version.release = []
|
|
260
|
+
version.release.micro = 1
|
|
261
|
+
self.assertEqual(version.release, [0, 0, 1])
|
|
261
262
|
|
|
262
263
|
|
|
263
264
|
class TestAdditionalVersionRelease(unittest.TestCase):
|
|
264
265
|
|
|
265
|
-
def setUp(self: Self) -> None:
|
|
266
|
-
# Initialize a fresh Version instance for every test
|
|
267
|
-
self.version = Version()
|
|
268
|
-
|
|
269
266
|
def test_release_inequality_with_list(self: Self) -> None:
|
|
270
267
|
# Test inequality of release with a normal list
|
|
271
|
-
|
|
272
|
-
|
|
268
|
+
version: Version = Version()
|
|
269
|
+
version.release = [1, 2, 3]
|
|
270
|
+
self.assertFalse(version.release == [1, 2, 4])
|
|
273
271
|
|
|
274
272
|
def test_release_len(self: Self) -> None:
|
|
275
273
|
# Test the length of the release list
|
|
276
|
-
|
|
277
|
-
|
|
274
|
+
version: Version = Version()
|
|
275
|
+
version.release = [1, 2, 3]
|
|
276
|
+
self.assertEqual(len(version.release), 3)
|
|
278
277
|
|
|
279
278
|
def test_release_slice_assignment(self: Self) -> None:
|
|
280
279
|
# Test assigning a slice to release
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
280
|
+
version: Version = Version()
|
|
281
|
+
version.release = [1, 2, 3, 4, 5]
|
|
282
|
+
version.release[1:4] = [20, 30, 40]
|
|
283
|
+
self.assertEqual(version.release, [1, 20, 30, 40, 5])
|
|
284
284
|
|
|
285
285
|
def test_release_iterable(self: Self) -> None:
|
|
286
286
|
# Test if release supports iteration
|
|
287
|
-
|
|
288
|
-
|
|
287
|
+
version: Version = Version()
|
|
288
|
+
version.release = [1, 2, 3]
|
|
289
|
+
result = [x for x in version.release]
|
|
289
290
|
self.assertEqual(result, [1, 2, 3])
|
|
290
291
|
|
|
291
292
|
def test_release_repr(self: Self) -> None:
|
|
292
293
|
# Test the repr of the release property
|
|
293
|
-
|
|
294
|
-
|
|
294
|
+
version: Version = Version()
|
|
295
|
+
version.release = [1, 2, 3]
|
|
296
|
+
self.assertEqual(str(version.release), "1.2.3")
|
|
295
297
|
|
|
296
298
|
def test_release_data_property(self: Self) -> None:
|
|
297
299
|
# Test the 'data' property
|
|
298
|
-
|
|
299
|
-
|
|
300
|
+
version: Version = Version()
|
|
301
|
+
version.release = [1, 2, 3]
|
|
302
|
+
self.assertEqual(version.release.data, [1, 2, 3])
|
|
300
303
|
|
|
301
304
|
def test_release_data_setter(self: Self) -> None:
|
|
302
305
|
# Test setting the 'data' property directly
|
|
303
|
-
|
|
304
|
-
|
|
306
|
+
version: Version = Version()
|
|
307
|
+
version.release.data = [10, 20, 30]
|
|
308
|
+
self.assertEqual(version.release, [10, 20, 30])
|
|
305
309
|
|
|
306
310
|
def test_release_contains(self: Self) -> None:
|
|
307
311
|
# Test 'in' keyword with release
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
self.
|
|
312
|
+
version: Version = Version()
|
|
313
|
+
version.release = [1, 2, 3]
|
|
314
|
+
self.assertIn(2, version.release)
|
|
315
|
+
self.assertNotIn(4, version.release)
|
|
311
316
|
|
|
312
317
|
def test_release_mul(self: Self) -> None:
|
|
313
318
|
# Test multiplying the release (list behavior)
|
|
314
|
-
|
|
315
|
-
|
|
319
|
+
version: Version = Version()
|
|
320
|
+
version.release = [1, 2]
|
|
321
|
+
self.assertEqual(version.release * 3, [1, 2, 1, 2, 1, 2])
|
|
316
322
|
|
|
317
323
|
def test_release_addition(self: Self) -> None:
|
|
318
324
|
# Test adding another list to release
|
|
319
|
-
|
|
320
|
-
|
|
325
|
+
version: Version = Version()
|
|
326
|
+
version.release = [1, 2, 3]
|
|
327
|
+
self.assertEqual(version.release + [4, 5], [1, 2, 3, 4, 5])
|
|
321
328
|
|
|
322
329
|
|
|
323
330
|
class TestVersionLocal(unittest.TestCase):
|
|
324
331
|
|
|
325
|
-
def setUp(self: Self) -> None:
|
|
326
|
-
# Initialize a fresh Version instance for every test
|
|
327
|
-
self.version = Version()
|
|
328
|
-
|
|
329
332
|
def test_local_len(self: Self) -> None:
|
|
330
333
|
# Test the length of the local list
|
|
331
|
-
|
|
332
|
-
|
|
334
|
+
version: Version = Version()
|
|
335
|
+
version.local = [1, "dev", "build"]
|
|
336
|
+
self.assertEqual(len(version.local), 3)
|
|
333
337
|
|
|
334
338
|
def test_local_slice_assignment(self: Self) -> None:
|
|
335
339
|
# Test assigning a slice to the local list
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
340
|
+
version: Version = Version()
|
|
341
|
+
version.local = [1, "dev", "build"]
|
|
342
|
+
version.local[1:3] = ["alpha", "beta"]
|
|
343
|
+
self.assertEqual(version.local, [1, "alpha", "beta"])
|
|
339
344
|
|
|
340
345
|
def test_local_contains(self: Self) -> None:
|
|
341
346
|
# Test 'in' keyword with local list
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
self.
|
|
347
|
+
version: Version = Version()
|
|
348
|
+
version.local = [1, "dev", "build"]
|
|
349
|
+
self.assertIn("dev", version.local)
|
|
350
|
+
self.assertNotIn("alpha", version.local)
|
|
345
351
|
|
|
346
352
|
def test_local_mul(self: Self) -> None:
|
|
347
353
|
# Test multiplying the local list
|
|
348
|
-
|
|
349
|
-
|
|
354
|
+
version: Version = Version()
|
|
355
|
+
version.local = [1, "dev"]
|
|
356
|
+
self.assertEqual(version.local * 3, [1, "dev", 1, "dev", 1, "dev"])
|
|
350
357
|
|
|
351
358
|
def test_local_addition(self: Self) -> None:
|
|
352
359
|
# Test adding another list to local
|
|
353
|
-
|
|
354
|
-
|
|
360
|
+
version: Version = Version()
|
|
361
|
+
version.local = [1, "dev"]
|
|
362
|
+
self.assertEqual(version.local + ["build"], [1, "dev", "build"])
|
|
355
363
|
|
|
356
364
|
def test_local_inequality_with_list(self: Self) -> None:
|
|
357
365
|
# Test inequality of local with a normal list
|
|
358
|
-
|
|
359
|
-
|
|
366
|
+
version: Version = Version()
|
|
367
|
+
version.local = [1, "dev"]
|
|
368
|
+
self.assertFalse(version.local == [1, "build"])
|
|
360
369
|
|
|
361
370
|
def test_local_repr(self: Self) -> None:
|
|
362
371
|
# Test repr of local list
|
|
363
|
-
|
|
364
|
-
|
|
372
|
+
version: Version = Version()
|
|
373
|
+
version.local = [1, "dev", "build"]
|
|
374
|
+
self.assertEqual(str(version.local), "1.dev.build")
|
|
365
375
|
|
|
366
376
|
def test_local_data_property(self: Self) -> None:
|
|
367
377
|
# Test that 'data' property correctly reflects local's internal list
|
|
368
|
-
|
|
369
|
-
|
|
378
|
+
version: Version = Version()
|
|
379
|
+
version.local = [1, "dev", "build"]
|
|
380
|
+
self.assertEqual(version.local.data, [1, "dev", "build"])
|
|
370
381
|
|
|
371
382
|
def test_local_data_setter(self: Self) -> None:
|
|
372
383
|
# Test that 'data' property can be set directly
|
|
373
|
-
|
|
374
|
-
|
|
384
|
+
version: Version = Version()
|
|
385
|
+
version.local.data = ["custom", "data"]
|
|
386
|
+
self.assertEqual(version.local, ["custom", "data"])
|
|
375
387
|
|
|
376
388
|
def test_local_iterable(self: Self) -> None:
|
|
377
389
|
# Test if local supports iteration
|
|
378
|
-
|
|
379
|
-
|
|
390
|
+
version: Version = Version()
|
|
391
|
+
version.local = "1.dev.build"
|
|
392
|
+
result: list = [x for x in version.local]
|
|
380
393
|
self.assertEqual(result, [1, "dev", "build"])
|
|
381
394
|
|
|
382
395
|
|
|
@@ -941,22 +941,25 @@ solution = [
|
|
|
941
941
|
3,
|
|
942
942
|
]
|
|
943
943
|
|
|
944
|
-
[
|
|
944
|
+
[data-property.local]
|
|
945
945
|
query = "42!1.2.3.dev1337+5.nov"
|
|
946
946
|
solution = "42!1.2.3.dev1337+5.nov"
|
|
947
947
|
|
|
948
|
-
[
|
|
948
|
+
[data-property.hitch]
|
|
949
949
|
query = 4.2
|
|
950
950
|
solution = "4.2"
|
|
951
951
|
|
|
952
|
-
[
|
|
952
|
+
[data-property.dragon]
|
|
953
953
|
query = 9001
|
|
954
954
|
solution = "9001"
|
|
955
955
|
|
|
956
|
-
[
|
|
956
|
+
[data-property.local_again]
|
|
957
957
|
query = "1701!4.5.6.rc255+reset"
|
|
958
958
|
solution = "1701!4.5.6rc255+reset"
|
|
959
959
|
|
|
960
|
+
[data-property.none]
|
|
961
|
+
solution = "0"
|
|
962
|
+
|
|
960
963
|
[slicingmethod.test_slicing_1]
|
|
961
964
|
query = "1.2.3.4.5.6.7.8.9.10"
|
|
962
965
|
start = -8
|
|
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
|