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.
Files changed (36) hide show
  1. {v440-2.0.0.dev21/src/v440.egg-info → v440-2.0.0.dev23}/PKG-INFO +1 -1
  2. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/pyproject.toml +1 -1
  3. v440-2.0.0.dev23/src/v440/core/Qualification.py +205 -0
  4. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/Version.py +1 -2
  5. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/tests/test_version.py +23 -23
  6. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/tests/testdata.toml +1 -1
  7. {v440-2.0.0.dev21 → v440-2.0.0.dev23/src/v440.egg-info}/PKG-INFO +1 -1
  8. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440.egg-info/SOURCES.txt +0 -1
  9. v440-2.0.0.dev21/src/v440/core/Pre.py +0 -98
  10. v440-2.0.0.dev21/src/v440/core/Qualification.py +0 -143
  11. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/LICENSE.txt +0 -0
  12. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/MANIFEST.in +0 -0
  13. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/README.rst +0 -0
  14. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/setup.cfg +0 -0
  15. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/__init__.py +0 -0
  16. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/BaseList.py +0 -0
  17. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/Cfg.py +0 -0
  18. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/Digest.py +0 -0
  19. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/Pattern.py +0 -0
  20. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/SimpleQualifierParser.py +0 -0
  21. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/SlotList.py +0 -0
  22. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/VList.py +0 -0
  23. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/__init__.py +0 -0
  24. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/cfg.toml +0 -0
  25. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/_utils/utils.py +0 -0
  26. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/Base.py +0 -0
  27. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/Local.py +0 -0
  28. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/Public.py +0 -0
  29. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/Release.py +0 -0
  30. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/VersionError.py +0 -0
  31. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/core/__init__.py +0 -0
  32. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/tests/__init__.py +0 -0
  33. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440/tests/test_testdata.py +0 -0
  34. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440.egg-info/dependency_links.txt +0 -0
  35. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440.egg-info/requires.txt +0 -0
  36. {v440-2.0.0.dev21 → v440-2.0.0.dev23}/src/v440.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: v440
3
- Version: 2.0.0.dev21
3
+ Version: 2.0.0.dev23
4
4
  Summary: This project provides mutable version objects in accordance with PEP440.
5
5
  Author-email: Johannes <johannes.programming@gmail.com>
6
6
  License: The MIT License (MIT)
@@ -34,7 +34,7 @@ keywords = []
34
34
  name = "v440"
35
35
  readme = "README.rst"
36
36
  requires-python = ">=3.11"
37
- version = "2.0.0.dev21"
37
+ version = "2.0.0.dev23"
38
38
 
39
39
  [project.license]
40
40
  file = "LICENSE.txt"
@@ -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) -> Pre:
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.Pre import Pre
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.pre = "beta.1"
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 TestVersion(unittest.TestCase):
53
+ class TestPre(unittest.TestCase):
54
54
 
55
- def test_version_pre(self: Self) -> None:
55
+ def test_pre(self: Self) -> None:
56
56
  v: Version = Version("1.2.3")
57
- backup = v.pre
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.pre, [None, None])
61
+ self.assertEqual(v.qualification, [None, None, None, None])
62
62
 
63
63
  # Set pre-release version to "a1"
64
- v.pre = "a1"
64
+ v.qualification = "a1"
65
65
  self.assertEqual(str(v), "1.2.3a1")
66
- self.assertEqual(str(v.pre), "a1")
66
+ self.assertEqual(str(v.qualification), "a1")
67
67
 
68
68
  # Modify pre-release phase to "preview"
69
- v.pre.phase = "preview"
69
+ v.qualification.prephase = "preview"
70
70
  self.assertEqual(str(v), "1.2.3rc1")
71
- self.assertEqual(str(v.pre), "rc1")
71
+ self.assertEqual(str(v.qualification), "rc1")
72
72
 
73
73
  # Modify subphase to "42"
74
- v.pre.subphase = "42"
74
+ v.qualification.presubphase = "42"
75
75
  self.assertEqual(str(v), "1.2.3rc42")
76
- self.assertEqual(str(v.pre), "rc42")
76
+ self.assertEqual(str(v.qualification), "rc42")
77
77
 
78
78
  # Change phase to a formatted string "BeTa"
79
- v.pre.phase = """
79
+ v.qualification.prephase = """
80
80
  BeTa
81
81
  """
82
82
  self.assertEqual(str(v), "1.2.3b42")
83
- self.assertEqual(str(v.pre), "b42")
83
+ self.assertEqual(str(v.qualification), "b42")
84
84
 
85
- self.assertEqual(v.pre, backup)
85
+ self.assertEqual(v.qualification, backup)
86
86
 
87
87
  # Set pre-release to None
88
- v.pre = None
88
+ v.qualification = None
89
89
  self.assertEqual(str(v), "1.2.3")
90
- self.assertEqual(v.pre, [None, None])
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), "2b4") # Further modified pre-release version
156
- v.pre.phase = "PrEvIeW"
157
- self.assertEqual(str(v), "2rc4") # Even further modified pre-release version
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: Pre = Pre("a1")
192
- y: Pre = Pre("b2")
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: v440
3
- Version: 2.0.0.dev21
3
+ Version: 2.0.0.dev23
4
4
  Summary: This project provides mutable version objects in accordance with PEP440.
5
5
  Author-email: Johannes <johannes.programming@gmail.com>
6
6
  License: The MIT License (MIT)
@@ -21,7 +21,6 @@ src/v440/_utils/cfg.toml
21
21
  src/v440/_utils/utils.py
22
22
  src/v440/core/Base.py
23
23
  src/v440/core/Local.py
24
- src/v440/core/Pre.py
25
24
  src/v440/core/Public.py
26
25
  src/v440/core/Qualification.py
27
26
  src/v440/core/Release.py
@@ -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