v440 2.0.0.dev21__tar.gz → 2.0.0.dev23__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.dev21/src/v440.egg-info → v440-2.0.0.dev23}/PKG-INFO +1 -1
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/pyproject.toml +1 -1
- v440-2.0.0.dev23/src/v440/core/Qualification.py +205 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/Version.py +1 -2
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/tests/test_version.py +23 -23
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/tests/testdata.toml +1 -1
- {v440-2.0.0.dev21 → v440-2.0.0.dev23/src/v440.egg-info}/PKG-INFO +1 -1
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440.egg-info/SOURCES.txt +0 -1
- v440-2.0.0.dev21/src/v440/core/Pre.py +0 -98
- v440-2.0.0.dev21/src/v440/core/Qualification.py +0 -143
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/LICENSE.txt +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/MANIFEST.in +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/README.rst +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/setup.cfg +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/__init__.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/BaseList.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/Cfg.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/Digest.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/Pattern.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/SimpleQualifierParser.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/SlotList.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/VList.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/__init__.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/cfg.toml +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/utils.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/Base.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/Local.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/Public.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/Release.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/VersionError.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/__init__.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/tests/__init__.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/tests/test_testdata.py +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440.egg-info/dependency_links.txt +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440.egg-info/requires.txt +0 -0
- {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import *
|
|
4
|
+
|
|
5
|
+
from v440._utils import SimpleQualifierParser, utils
|
|
6
|
+
from v440._utils.BaseList import BaseList
|
|
7
|
+
from v440._utils.Cfg import Cfg
|
|
8
|
+
from v440._utils.Digest import Digest
|
|
9
|
+
from v440._utils.Pattern import Pattern
|
|
10
|
+
from v440._utils.SlotList import SlotList
|
|
11
|
+
from v440._utils.utils import guard
|
|
12
|
+
|
|
13
|
+
__all__ = ["Qualification"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
parse_leg: Digest = Digest("parse_leg")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@parse_leg.overload()
|
|
20
|
+
def parse_leg() -> list:
|
|
21
|
+
return [[None, None], None, None]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@parse_leg.overload(int)
|
|
25
|
+
def parse_leg(value: int) -> list:
|
|
26
|
+
return [[None, None], abs(value), None]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@parse_leg.overload(list)
|
|
30
|
+
def parse_leg(value: list) -> list:
|
|
31
|
+
return [value[:2]] + value[2:]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@parse_leg.overload(str)
|
|
35
|
+
def parse_leg(value: str) -> list:
|
|
36
|
+
v = value
|
|
37
|
+
prephase: Any = None
|
|
38
|
+
presubphase: Any = None
|
|
39
|
+
post: Any = None
|
|
40
|
+
dev: Any = None
|
|
41
|
+
m: Any
|
|
42
|
+
x: Any
|
|
43
|
+
y: Any
|
|
44
|
+
while v:
|
|
45
|
+
m = Pattern.QUALIFIERS.leftbound.search(v)
|
|
46
|
+
v = v[m.end() :]
|
|
47
|
+
if m.group("N"):
|
|
48
|
+
post = m.group("N")
|
|
49
|
+
continue
|
|
50
|
+
x = m.group("l")
|
|
51
|
+
y = m.group("n")
|
|
52
|
+
if x == "dev":
|
|
53
|
+
dev = y
|
|
54
|
+
continue
|
|
55
|
+
if x in ("post", "r", "rev"):
|
|
56
|
+
post = y
|
|
57
|
+
continue
|
|
58
|
+
prephase = x
|
|
59
|
+
presubphase = y
|
|
60
|
+
return [[prephase, presubphase], post, dev]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
parse_pre: Digest = Digest("parse_pre")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@parse_pre.overload()
|
|
67
|
+
def parse_pre() -> list:
|
|
68
|
+
return [None, None]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@parse_pre.overload(list)
|
|
72
|
+
def parse_pre(value: list) -> Any:
|
|
73
|
+
l: Any
|
|
74
|
+
n: Any
|
|
75
|
+
l, n = list(map(utils.segment, value))
|
|
76
|
+
if [l, n] == [None, None]:
|
|
77
|
+
return [None, None]
|
|
78
|
+
l = Cfg.cfg.data["phases"][l]
|
|
79
|
+
if not isinstance(n, int):
|
|
80
|
+
raise TypeError
|
|
81
|
+
return [l, n]
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@parse_pre.overload(str)
|
|
85
|
+
def parse_pre(value: str) -> list:
|
|
86
|
+
if value == "":
|
|
87
|
+
return [None, None]
|
|
88
|
+
v: str = value
|
|
89
|
+
v = v.replace("_", ".")
|
|
90
|
+
v = v.replace("-", ".")
|
|
91
|
+
m: Any = Pattern.PARSER.bound.search(v)
|
|
92
|
+
l: Any
|
|
93
|
+
n: Any
|
|
94
|
+
l, n = m.groups()
|
|
95
|
+
l = Cfg.cfg.data["phases"][l]
|
|
96
|
+
n = 0 if (n is None) else int(n)
|
|
97
|
+
return [l, n]
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class Qualification(SlotList):
|
|
101
|
+
|
|
102
|
+
__slots__ = ("_prephase", "_presubphase", "_post", "_dev")
|
|
103
|
+
|
|
104
|
+
data: list
|
|
105
|
+
prephase: Optional[str]
|
|
106
|
+
presubphase: Optional[int]
|
|
107
|
+
post: Optional[int]
|
|
108
|
+
dev: Optional[int]
|
|
109
|
+
|
|
110
|
+
def __init__(self: Self, data: Any = None) -> None:
|
|
111
|
+
self._prephase = None
|
|
112
|
+
self._presubphase = None
|
|
113
|
+
self._post = None
|
|
114
|
+
self._dev = None
|
|
115
|
+
self.data = data
|
|
116
|
+
|
|
117
|
+
def __str__(self: Self) -> str:
|
|
118
|
+
ans: str = ""
|
|
119
|
+
if self.prephase is not None:
|
|
120
|
+
ans += self.prephase
|
|
121
|
+
if self.presubphase is not None:
|
|
122
|
+
ans += str(self.presubphase)
|
|
123
|
+
if self.post is not None:
|
|
124
|
+
ans += ".post%s" % self.post
|
|
125
|
+
if self.dev is not None:
|
|
126
|
+
ans += ".dev%s" % self.dev
|
|
127
|
+
return ans
|
|
128
|
+
|
|
129
|
+
def _cmp(self: Self) -> list:
|
|
130
|
+
ans: list = list()
|
|
131
|
+
if not self.pre.isempty():
|
|
132
|
+
ans += list(self.pre)
|
|
133
|
+
elif self.post is not None:
|
|
134
|
+
ans += ["z", float("inf")]
|
|
135
|
+
elif self.dev is None:
|
|
136
|
+
ans += ["z", float("inf")]
|
|
137
|
+
else:
|
|
138
|
+
ans += ["", -1]
|
|
139
|
+
ans.append(-1 if self.post is None else self.post)
|
|
140
|
+
ans.append(float("inf") if self.dev is None else self.dev)
|
|
141
|
+
return ans
|
|
142
|
+
|
|
143
|
+
@property
|
|
144
|
+
def data(self: Self) -> list:
|
|
145
|
+
return self.pre + [self.post, self.dev]
|
|
146
|
+
|
|
147
|
+
@data.setter
|
|
148
|
+
@guard
|
|
149
|
+
def data(self: Self, value: Any) -> None:
|
|
150
|
+
self.pre, self.post, self.dev = parse_leg(value)
|
|
151
|
+
|
|
152
|
+
@property
|
|
153
|
+
def dev(self: Self) -> Optional[int]:
|
|
154
|
+
return self._dev
|
|
155
|
+
|
|
156
|
+
@dev.setter
|
|
157
|
+
@guard
|
|
158
|
+
def dev(self: Self, value: Any) -> None:
|
|
159
|
+
self._dev = SimpleQualifierParser.DEV(value)
|
|
160
|
+
|
|
161
|
+
def isdevrelease(self: Self) -> bool:
|
|
162
|
+
return self.dev is not None
|
|
163
|
+
|
|
164
|
+
def isempty(self: Self) -> bool:
|
|
165
|
+
return self.data == [None, None, None, None]
|
|
166
|
+
|
|
167
|
+
def isprerelease(self: Self) -> bool:
|
|
168
|
+
return {self.prephase, self.presubphase, self.dev} != {None}
|
|
169
|
+
|
|
170
|
+
def ispostrelease(self: Self) -> bool:
|
|
171
|
+
return self.post is not None
|
|
172
|
+
|
|
173
|
+
@property
|
|
174
|
+
def post(self: Self) -> Optional[int]:
|
|
175
|
+
return self._post
|
|
176
|
+
|
|
177
|
+
@post.setter
|
|
178
|
+
@guard
|
|
179
|
+
def post(self: Self, value: Any) -> None:
|
|
180
|
+
self._post = SimpleQualifierParser.POST(value)
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def pre(self: Self) -> Optional[str]:
|
|
184
|
+
return [self._prephase, self._presubphase]
|
|
185
|
+
|
|
186
|
+
@pre.setter
|
|
187
|
+
@guard
|
|
188
|
+
def pre(self: Self, value: Any) -> None:
|
|
189
|
+
self._prephase, self._presubphase = parse_pre(value)
|
|
190
|
+
|
|
191
|
+
@property
|
|
192
|
+
def prephase(self: Self) -> Optional[str]:
|
|
193
|
+
return self._prephase
|
|
194
|
+
|
|
195
|
+
@prephase.setter
|
|
196
|
+
def prephase(self: Self, value: Any) -> None:
|
|
197
|
+
self[0] = value
|
|
198
|
+
|
|
199
|
+
@property
|
|
200
|
+
def presubphase(self: Self) -> Optional[int]:
|
|
201
|
+
return self._presubphase
|
|
202
|
+
|
|
203
|
+
@presubphase.setter
|
|
204
|
+
def presubphase(self: Self, value: Any) -> None:
|
|
205
|
+
self[1] = value
|
|
@@ -9,7 +9,6 @@ from v440._utils.SlotList import SlotList
|
|
|
9
9
|
from v440._utils.utils import guard
|
|
10
10
|
from v440.core.Base import Base
|
|
11
11
|
from v440.core.Local import Local
|
|
12
|
-
from v440.core.Pre import Pre
|
|
13
12
|
from v440.core.Public import Public
|
|
14
13
|
from v440.core.Qualification import Qualification
|
|
15
14
|
from v440.core.Release import Release
|
|
@@ -131,7 +130,7 @@ class Version(SlotList):
|
|
|
131
130
|
self.qualification.post = value
|
|
132
131
|
|
|
133
132
|
@property
|
|
134
|
-
def pre(self: Self) ->
|
|
133
|
+
def pre(self: Self) -> list:
|
|
135
134
|
return self.qualification.pre
|
|
136
135
|
|
|
137
136
|
@pre.setter
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import unittest
|
|
2
2
|
from typing import *
|
|
3
3
|
|
|
4
|
-
from v440.core.
|
|
4
|
+
from v440.core.Qualification import Qualification
|
|
5
5
|
from v440.core.Version import Version
|
|
6
6
|
from v440.core.VersionError import VersionError
|
|
7
7
|
|
|
@@ -15,7 +15,7 @@ class TestVersionManipulation(unittest.TestCase):
|
|
|
15
15
|
# Modify individual parts of the version
|
|
16
16
|
v.release.major = 2
|
|
17
17
|
v.release.minor = 5
|
|
18
|
-
v.
|
|
18
|
+
v.qualification = "beta.1"
|
|
19
19
|
v.local = "local.7.dev"
|
|
20
20
|
|
|
21
21
|
# Verify the expected output
|
|
@@ -50,44 +50,44 @@ class TestVersionLocal(unittest.TestCase):
|
|
|
50
50
|
self.assertTrue(v.local is backup)
|
|
51
51
|
|
|
52
52
|
|
|
53
|
-
class
|
|
53
|
+
class TestPre(unittest.TestCase):
|
|
54
54
|
|
|
55
|
-
def
|
|
55
|
+
def test_pre(self: Self) -> None:
|
|
56
56
|
v: Version = Version("1.2.3")
|
|
57
|
-
backup = v.
|
|
57
|
+
backup: Qualification = v.qualification
|
|
58
58
|
|
|
59
59
|
# Initial version, no pre-release version
|
|
60
60
|
self.assertEqual(str(v), "1.2.3")
|
|
61
|
-
self.assertEqual(v.
|
|
61
|
+
self.assertEqual(v.qualification, [None, None, None, None])
|
|
62
62
|
|
|
63
63
|
# Set pre-release version to "a1"
|
|
64
|
-
v.
|
|
64
|
+
v.qualification = "a1"
|
|
65
65
|
self.assertEqual(str(v), "1.2.3a1")
|
|
66
|
-
self.assertEqual(str(v.
|
|
66
|
+
self.assertEqual(str(v.qualification), "a1")
|
|
67
67
|
|
|
68
68
|
# Modify pre-release phase to "preview"
|
|
69
|
-
v.
|
|
69
|
+
v.qualification.prephase = "preview"
|
|
70
70
|
self.assertEqual(str(v), "1.2.3rc1")
|
|
71
|
-
self.assertEqual(str(v.
|
|
71
|
+
self.assertEqual(str(v.qualification), "rc1")
|
|
72
72
|
|
|
73
73
|
# Modify subphase to "42"
|
|
74
|
-
v.
|
|
74
|
+
v.qualification.presubphase = "42"
|
|
75
75
|
self.assertEqual(str(v), "1.2.3rc42")
|
|
76
|
-
self.assertEqual(str(v.
|
|
76
|
+
self.assertEqual(str(v.qualification), "rc42")
|
|
77
77
|
|
|
78
78
|
# Change phase to a formatted string "BeTa"
|
|
79
|
-
v.
|
|
79
|
+
v.qualification.prephase = """
|
|
80
80
|
BeTa
|
|
81
81
|
"""
|
|
82
82
|
self.assertEqual(str(v), "1.2.3b42")
|
|
83
|
-
self.assertEqual(str(v.
|
|
83
|
+
self.assertEqual(str(v.qualification), "b42")
|
|
84
84
|
|
|
85
|
-
self.assertEqual(v.
|
|
85
|
+
self.assertEqual(v.qualification, backup)
|
|
86
86
|
|
|
87
87
|
# Set pre-release to None
|
|
88
|
-
v.
|
|
88
|
+
v.qualification = None
|
|
89
89
|
self.assertEqual(str(v), "1.2.3")
|
|
90
|
-
self.assertEqual(v.
|
|
90
|
+
self.assertEqual(v.qualification, [None, None, None, None])
|
|
91
91
|
|
|
92
92
|
|
|
93
93
|
class TestExample(unittest.TestCase):
|
|
@@ -151,10 +151,10 @@ class TestExample(unittest.TestCase):
|
|
|
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
|
|
154
|
-
v.pre[1] = 4
|
|
155
|
-
self.assertEqual(str(v), "
|
|
156
|
-
v.
|
|
157
|
-
self.assertEqual(str(v), "
|
|
154
|
+
v.qualification.pre[1] = 4
|
|
155
|
+
self.assertEqual(str(v), "2b2") # Further modified pre-release version
|
|
156
|
+
v.qualification.prephase = "PrEvIeW"
|
|
157
|
+
self.assertEqual(str(v), "2rc2") # Even further modified pre-release version
|
|
158
158
|
|
|
159
159
|
def test_example_6(self: Self) -> None:
|
|
160
160
|
v: Version = Version("1.2.3")
|
|
@@ -188,8 +188,8 @@ class TestExample(unittest.TestCase):
|
|
|
188
188
|
|
|
189
189
|
class TestPatch(unittest.TestCase):
|
|
190
190
|
def test_example_0(self: Self) -> None:
|
|
191
|
-
x:
|
|
192
|
-
y:
|
|
191
|
+
x: Qualification = Qualification("a1")
|
|
192
|
+
y: Qualification = Qualification("b2")
|
|
193
193
|
with self.assertRaises(Exception):
|
|
194
194
|
x += y
|
|
195
195
|
|
|
@@ -713,7 +713,7 @@ Post-releases = [
|
|
|
713
713
|
"1.2.3+local.version.with.extremely.long.identifier.123456789012345678901234567890",
|
|
714
714
|
"0!0.0.0a9999999999999.post9999999999999.dev9999999999999+build.sha.9999999999999",
|
|
715
715
|
]
|
|
716
|
-
|
|
716
|
+
"Difficult Qualification Relations" = ['1.2.3', '1.2.3.dev0', '1.2.3.dev1', '1.2.3.dev2', '1.2.3.post0', '1.2.3.post0.dev0', '1.2.3.post0.dev1', '1.2.3.post0.dev2', '1.2.3.post10', '1.2.3.post10.dev0', '1.2.3.post10.dev1', '1.2.3.post10.dev2', '1.2.3a0', '1.2.3a0.dev0', '1.2.3a0.dev1', '1.2.3a0.dev2', '1.2.3a0.post0', '1.2.3a0.post0.dev0', '1.2.3a0.post0.dev1', '1.2.3a0.post0.dev2', '1.2.3a0.post10', '1.2.3a0.post10.dev0', '1.2.3a0.post10.dev1', '1.2.3a0.post10.dev2', '1.2.3a4', '1.2.3a4.dev0', '1.2.3a4.dev1', '1.2.3a4.dev2', '1.2.3a4.post0', '1.2.3a4.post0.dev0', '1.2.3a4.post0.dev1', '1.2.3a4.post0.dev2', '1.2.3a4.post10', '1.2.3a4.post10.dev0', '1.2.3a4.post10.dev1', '1.2.3a4.post10.dev2', '1.2.3b1', '1.2.3b1.dev0', '1.2.3b1.dev1', '1.2.3b1.dev2', '1.2.3b1.post0', '1.2.3b1.post0.dev0', '1.2.3b1.post0.dev1', '1.2.3b1.post0.dev2', '1.2.3b1.post10', '1.2.3b1.post10.dev0', '1.2.3b1.post10.dev1', '1.2.3b1.post10.dev2']
|
|
717
717
|
[strings.incomp]
|
|
718
718
|
"Increasing complexity with more combinations" = [
|
|
719
719
|
"1!1.0.0.dev4567.post9+20190101",
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import *
|
|
4
|
-
|
|
5
|
-
from v440._utils import utils
|
|
6
|
-
from v440._utils.Cfg import Cfg
|
|
7
|
-
from v440._utils.Digest import Digest
|
|
8
|
-
from v440._utils.Pattern import Pattern
|
|
9
|
-
from v440._utils.SlotList import SlotList
|
|
10
|
-
from v440._utils.utils import guard
|
|
11
|
-
|
|
12
|
-
__all__ = ["Pre"]
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
parse_data: Digest = Digest("parse_data")
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@parse_data.overload()
|
|
19
|
-
def parse_data() -> list:
|
|
20
|
-
return [None, None]
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@parse_data.overload(list)
|
|
24
|
-
def parse_data(value: list) -> Any:
|
|
25
|
-
l: Any
|
|
26
|
-
n: Any
|
|
27
|
-
l, n = list(map(utils.segment, value))
|
|
28
|
-
if [l, n] == [None, None]:
|
|
29
|
-
return [None, None]
|
|
30
|
-
l = Cfg.cfg.data["phases"][l]
|
|
31
|
-
if not isinstance(n, int):
|
|
32
|
-
raise TypeError
|
|
33
|
-
return [l, n]
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@parse_data.overload(str)
|
|
37
|
-
def parse_data(value: str) -> list:
|
|
38
|
-
if value == "":
|
|
39
|
-
return [None, None]
|
|
40
|
-
v: str = value
|
|
41
|
-
v = v.replace("_", ".")
|
|
42
|
-
v = v.replace("-", ".")
|
|
43
|
-
m: Any = Pattern.PARSER.bound.search(v)
|
|
44
|
-
l: Any
|
|
45
|
-
n: Any
|
|
46
|
-
l, n = m.groups()
|
|
47
|
-
l = Cfg.cfg.data["phases"][l]
|
|
48
|
-
n = 0 if (n is None) else int(n)
|
|
49
|
-
return [l, n]
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class Pre(SlotList):
|
|
53
|
-
|
|
54
|
-
__slots__ = ("_phase", "_subphase")
|
|
55
|
-
|
|
56
|
-
data: list
|
|
57
|
-
phase: Optional[str]
|
|
58
|
-
subphase: Optional[int]
|
|
59
|
-
|
|
60
|
-
def __init__(self: Self, data: Any = None) -> None:
|
|
61
|
-
self._phase = None
|
|
62
|
-
self._subphase = None
|
|
63
|
-
self.data = data
|
|
64
|
-
|
|
65
|
-
def __str__(self: Self) -> str:
|
|
66
|
-
ans: str = ""
|
|
67
|
-
if not self.isempty():
|
|
68
|
-
ans += self.phase
|
|
69
|
-
ans += str(self.subphase)
|
|
70
|
-
return ans
|
|
71
|
-
|
|
72
|
-
@property
|
|
73
|
-
def data(self: Self) -> list:
|
|
74
|
-
return [self._phase, self._subphase]
|
|
75
|
-
|
|
76
|
-
@data.setter
|
|
77
|
-
@guard
|
|
78
|
-
def data(self: Self, value: Any) -> None:
|
|
79
|
-
self._phase, self._subphase = parse_data(value)
|
|
80
|
-
|
|
81
|
-
def isempty(self: Self) -> bool:
|
|
82
|
-
return self.data == [None, None]
|
|
83
|
-
|
|
84
|
-
@property
|
|
85
|
-
def phase(self: Self) -> Optional[str]:
|
|
86
|
-
return self._phase
|
|
87
|
-
|
|
88
|
-
@phase.setter
|
|
89
|
-
def phase(self: Self, value: Any) -> None:
|
|
90
|
-
self[0] = value
|
|
91
|
-
|
|
92
|
-
@property
|
|
93
|
-
def subphase(self: Self) -> Optional[int]:
|
|
94
|
-
return self._subphase
|
|
95
|
-
|
|
96
|
-
@subphase.setter
|
|
97
|
-
def subphase(self: Self, value: Any) -> None:
|
|
98
|
-
self[1] = value
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import *
|
|
4
|
-
|
|
5
|
-
from v440._utils import SimpleQualifierParser
|
|
6
|
-
from v440._utils.BaseList import BaseList
|
|
7
|
-
from v440._utils.Digest import Digest
|
|
8
|
-
from v440._utils.Pattern import Pattern
|
|
9
|
-
from v440._utils.utils import guard
|
|
10
|
-
from v440.core.Pre import Pre
|
|
11
|
-
|
|
12
|
-
__all__ = ["Qualification"]
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
parse_data: Digest = Digest("parse_data")
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@parse_data.overload()
|
|
19
|
-
def parse_data() -> list:
|
|
20
|
-
return [None, None, None]
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@parse_data.overload(int)
|
|
24
|
-
def parse_data(value: int) -> list:
|
|
25
|
-
return [None, abs(value), None]
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
@parse_data.overload(list)
|
|
29
|
-
def parse_data(value: list) -> list:
|
|
30
|
-
return value
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
@parse_data.overload(str)
|
|
34
|
-
def parse_data(value: str) -> list:
|
|
35
|
-
v = value
|
|
36
|
-
pre: Any = None
|
|
37
|
-
post: Any = None
|
|
38
|
-
dev: Any = None
|
|
39
|
-
m: Any
|
|
40
|
-
x: Any
|
|
41
|
-
y: Any
|
|
42
|
-
while v:
|
|
43
|
-
m = Pattern.QUALIFIERS.leftbound.search(v)
|
|
44
|
-
v = v[m.end() :]
|
|
45
|
-
if m.group("N"):
|
|
46
|
-
post = m.group("N")
|
|
47
|
-
continue
|
|
48
|
-
x = m.group("l")
|
|
49
|
-
y = m.group("n")
|
|
50
|
-
if x == "dev":
|
|
51
|
-
dev = y
|
|
52
|
-
continue
|
|
53
|
-
if x in ("post", "r", "rev"):
|
|
54
|
-
post = y
|
|
55
|
-
continue
|
|
56
|
-
pre = (x, y)
|
|
57
|
-
return [pre, post, dev]
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
class Qualification(BaseList):
|
|
61
|
-
|
|
62
|
-
__slots__ = ("_pre", "_post", "_dev")
|
|
63
|
-
|
|
64
|
-
data: list
|
|
65
|
-
pre: Pre
|
|
66
|
-
post: Optional[int]
|
|
67
|
-
dev: Optional[int]
|
|
68
|
-
|
|
69
|
-
def __init__(self: Self, data: Any = None) -> None:
|
|
70
|
-
self._pre = Pre()
|
|
71
|
-
self._post = None
|
|
72
|
-
self._dev = None
|
|
73
|
-
self.data = data
|
|
74
|
-
|
|
75
|
-
def __str__(self: Self) -> str:
|
|
76
|
-
ans: str = str(self.pre)
|
|
77
|
-
if self.post is not None:
|
|
78
|
-
ans += ".post%s" % self.post
|
|
79
|
-
if self.dev is not None:
|
|
80
|
-
ans += ".dev%s" % self.dev
|
|
81
|
-
return ans
|
|
82
|
-
|
|
83
|
-
def _cmp(self: Self) -> list:
|
|
84
|
-
ans: list = list()
|
|
85
|
-
if not self.pre.isempty():
|
|
86
|
-
ans += list(self.pre)
|
|
87
|
-
elif self.post is not None:
|
|
88
|
-
ans += ["z", float("inf")]
|
|
89
|
-
elif self.dev is None:
|
|
90
|
-
ans += ["z", float("inf")]
|
|
91
|
-
else:
|
|
92
|
-
ans += ["", -1]
|
|
93
|
-
ans.append(-1 if self.post is None else self.post)
|
|
94
|
-
ans.append(float("inf") if self.dev is None else self.dev)
|
|
95
|
-
return ans
|
|
96
|
-
|
|
97
|
-
@property
|
|
98
|
-
def data(self: Self) -> list:
|
|
99
|
-
return [self.pre, self.post, self.dev]
|
|
100
|
-
|
|
101
|
-
@data.setter
|
|
102
|
-
@guard
|
|
103
|
-
def data(self: Self, value: Any) -> None:
|
|
104
|
-
self.pre, self.post, self.dev = parse_data(value)
|
|
105
|
-
|
|
106
|
-
@property
|
|
107
|
-
def dev(self: Self) -> Optional[int]:
|
|
108
|
-
return self._dev
|
|
109
|
-
|
|
110
|
-
@dev.setter
|
|
111
|
-
@guard
|
|
112
|
-
def dev(self: Self, value: Any) -> None:
|
|
113
|
-
self._dev = SimpleQualifierParser.DEV(value)
|
|
114
|
-
|
|
115
|
-
def isdevrelease(self: Self) -> bool:
|
|
116
|
-
return self.dev is not None
|
|
117
|
-
|
|
118
|
-
def isempty(self: Self) -> bool:
|
|
119
|
-
return self.data == [None, None, None]
|
|
120
|
-
|
|
121
|
-
def isprerelease(self: Self) -> bool:
|
|
122
|
-
return self.isdevrelease() or not self.pre.isempty()
|
|
123
|
-
|
|
124
|
-
def ispostrelease(self: Self) -> bool:
|
|
125
|
-
return self.post is not None
|
|
126
|
-
|
|
127
|
-
@property
|
|
128
|
-
def post(self: Self) -> Optional[int]:
|
|
129
|
-
return self._post
|
|
130
|
-
|
|
131
|
-
@post.setter
|
|
132
|
-
@guard
|
|
133
|
-
def post(self: Self, value: Any) -> None:
|
|
134
|
-
self._post = SimpleQualifierParser.POST(value)
|
|
135
|
-
|
|
136
|
-
@property
|
|
137
|
-
def pre(self: Self) -> Pre:
|
|
138
|
-
return self._pre
|
|
139
|
-
|
|
140
|
-
@pre.setter
|
|
141
|
-
@guard
|
|
142
|
-
def pre(self: Self, value: Any) -> None:
|
|
143
|
-
self._pre.data = value
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|