v440 2.0.0.dev90__tar.gz → 2.0.0.dev92__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.dev90/src/v440.egg-info → v440-2.0.0.dev92}/PKG-INFO +1 -1
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/pyproject.toml +1 -1
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/BaseStringer.py +0 -1
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/ListStringer.py +18 -32
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/core/Local.py +25 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/core/Release.py +23 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/tests/test_testdata.py +36 -6
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/tests/test_version.py +31 -47
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/tests/testdata.toml +27 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92/src/v440.egg-info}/PKG-INFO +1 -1
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/LICENSE.txt +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/MANIFEST.in +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/README.rst +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/setup.cfg +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/__init__.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/Cfg.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/Pattern.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/SlotStringer.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/__init__.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/cfg.toml +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/guarding.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/qualparse/Digest.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/qualparse/__init__.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/qualparse/devs.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/qualparse/posts.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/qualparse/pres.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/qualparse/segmenting.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/releaseparse/__init__.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/releaseparse/deleting.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/releaseparse/getting.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/releaseparse/listing.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/releaseparse/numerals.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/releaseparse/ranging.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/_utils/releaseparse/setting.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/core/Base.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/core/Public.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/core/Qual.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/core/Version.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/core/VersionError.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/core/__init__.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440/tests/__init__.py +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440.egg-info/SOURCES.txt +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440.egg-info/dependency_links.txt +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440.egg-info/requires.txt +0 -0
- {v440-2.0.0.dev90 → v440-2.0.0.dev92}/src/v440.egg-info/top_level.txt +0 -0
|
@@ -9,7 +9,7 @@ from overloadable import Overloadable
|
|
|
9
9
|
from v440._utils.BaseStringer import BaseStringer
|
|
10
10
|
from v440._utils.guarding import guard
|
|
11
11
|
|
|
12
|
-
__all__ = ["
|
|
12
|
+
__all__ = ["ListStringer"]
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class ListStringer(BaseStringer, collections.abc.MutableSequence):
|
|
@@ -20,7 +20,12 @@ class ListStringer(BaseStringer, collections.abc.MutableSequence):
|
|
|
20
20
|
|
|
21
21
|
@setdoc.basic
|
|
22
22
|
def __add__(self: Self, other: Any) -> Self:
|
|
23
|
-
|
|
23
|
+
alt: tuple
|
|
24
|
+
try:
|
|
25
|
+
alt = tuple(other)
|
|
26
|
+
except Exception:
|
|
27
|
+
return NotImplemented
|
|
28
|
+
return type(self)(data=self.data + alt)
|
|
24
29
|
|
|
25
30
|
@setdoc.basic
|
|
26
31
|
def __bool__(self: Self) -> bool:
|
|
@@ -50,31 +55,6 @@ class ListStringer(BaseStringer, collections.abc.MutableSequence):
|
|
|
50
55
|
self.data = self.data * other
|
|
51
56
|
return self
|
|
52
57
|
|
|
53
|
-
@Overloadable
|
|
54
|
-
@setdoc.basic
|
|
55
|
-
def __init__(self: Self, *args: Any, **kwargs: Any) -> bool:
|
|
56
|
-
if len(args) == 0 and "string" in kwargs.keys():
|
|
57
|
-
return True
|
|
58
|
-
if len(args) == 1 and len(kwargs) == 0:
|
|
59
|
-
if isinstance(args[0], str):
|
|
60
|
-
return True
|
|
61
|
-
if hasattr(args[0], "__iter__"):
|
|
62
|
-
return False
|
|
63
|
-
return True
|
|
64
|
-
return False
|
|
65
|
-
|
|
66
|
-
@__init__.overload(True)
|
|
67
|
-
@setdoc.basic
|
|
68
|
-
def __init__(self: Self, string: Any) -> None:
|
|
69
|
-
self._init_setup()
|
|
70
|
-
self.string = string
|
|
71
|
-
|
|
72
|
-
@__init__.overload(False)
|
|
73
|
-
@setdoc.basic
|
|
74
|
-
def __init__(self: Self, data: Iterable = ()) -> None:
|
|
75
|
-
self._init_setup()
|
|
76
|
-
self.data = data
|
|
77
|
-
|
|
78
58
|
@setdoc.basic
|
|
79
59
|
def __iter__(self: Self) -> Iterator:
|
|
80
60
|
return iter(self.data)
|
|
@@ -85,11 +65,20 @@ class ListStringer(BaseStringer, collections.abc.MutableSequence):
|
|
|
85
65
|
|
|
86
66
|
@setdoc.basic
|
|
87
67
|
def __mul__(self: Self, other: Any) -> Self:
|
|
88
|
-
return type(self)(self.data * other)
|
|
68
|
+
return type(self)(data=self.data * other)
|
|
69
|
+
|
|
70
|
+
@setdoc.basic
|
|
71
|
+
def __radd__(self: Self, other: Any) -> Self:
|
|
72
|
+
alt: tuple
|
|
73
|
+
try:
|
|
74
|
+
alt = tuple(other)
|
|
75
|
+
except Exception:
|
|
76
|
+
return NotImplemented
|
|
77
|
+
return type(self)(data=alt + self.data)
|
|
89
78
|
|
|
90
79
|
@setdoc.basic
|
|
91
80
|
def __repr__(self: Self) -> str:
|
|
92
|
-
return datarepr(type(self).__name__, self
|
|
81
|
+
return datarepr(type(self).__name__, list(self))
|
|
93
82
|
|
|
94
83
|
@setdoc.basic
|
|
95
84
|
def __reversed__(self: Self) -> reversed:
|
|
@@ -112,9 +101,6 @@ class ListStringer(BaseStringer, collections.abc.MutableSequence):
|
|
|
112
101
|
@abstractmethod
|
|
113
102
|
def _data_parse(cls: type, value: list) -> Iterable: ...
|
|
114
103
|
|
|
115
|
-
def _init_setup(self: Self) -> None:
|
|
116
|
-
self._data = ()
|
|
117
|
-
|
|
118
104
|
def _set(self: Self, value: Any) -> None:
|
|
119
105
|
if isinstance(value, str):
|
|
120
106
|
self.string = value
|
|
@@ -4,6 +4,9 @@ import operator
|
|
|
4
4
|
import string as string_
|
|
5
5
|
from typing import *
|
|
6
6
|
|
|
7
|
+
import setdoc
|
|
8
|
+
from overloadable import Overloadable
|
|
9
|
+
|
|
7
10
|
from v440._utils.ListStringer import ListStringer
|
|
8
11
|
|
|
9
12
|
__all__ = ["Local"]
|
|
@@ -15,6 +18,25 @@ class Local(ListStringer):
|
|
|
15
18
|
string: str
|
|
16
19
|
data: tuple[int | str]
|
|
17
20
|
|
|
21
|
+
@Overloadable
|
|
22
|
+
@setdoc.basic
|
|
23
|
+
def __init__(self: Self, *args: Any, **kwargs: Any) -> bool:
|
|
24
|
+
if len(args) <= 1 and len(kwargs) == 0:
|
|
25
|
+
return True
|
|
26
|
+
if "string" in kwargs.keys():
|
|
27
|
+
return True
|
|
28
|
+
return False
|
|
29
|
+
|
|
30
|
+
@__init__.overload(True)
|
|
31
|
+
def __init__(self: Self, string: Any = "") -> None:
|
|
32
|
+
self._data = ()
|
|
33
|
+
self.string = string
|
|
34
|
+
|
|
35
|
+
@__init__.overload(False)
|
|
36
|
+
def __init__(self: Self, data: Iterable) -> None:
|
|
37
|
+
self._data = ()
|
|
38
|
+
self.data = data
|
|
39
|
+
|
|
18
40
|
@classmethod
|
|
19
41
|
def _data_parse(cls: type, value: list) -> Iterable:
|
|
20
42
|
return tuple(map(cls._item_parse, value))
|
|
@@ -24,6 +46,9 @@ class Local(ListStringer):
|
|
|
24
46
|
raise ValueError
|
|
25
47
|
return ".".join(map(str, self))
|
|
26
48
|
|
|
49
|
+
def _init_setup(self: Self) -> None:
|
|
50
|
+
self._data = ()
|
|
51
|
+
|
|
27
52
|
@classmethod
|
|
28
53
|
def _item_parse(cls: type, value: Any) -> int | str:
|
|
29
54
|
ans: int | str
|
|
@@ -5,6 +5,7 @@ from typing import *
|
|
|
5
5
|
|
|
6
6
|
import setdoc
|
|
7
7
|
from keyalias import keyalias
|
|
8
|
+
from overloadable import Overloadable
|
|
8
9
|
|
|
9
10
|
from v440._utils import releaseparse
|
|
10
11
|
from v440._utils.ListStringer import ListStringer
|
|
@@ -32,6 +33,25 @@ class Release(ListStringer):
|
|
|
32
33
|
def __getitem__(self: Self, key: Any) -> bool:
|
|
33
34
|
return getting.getitem(self.data, key)
|
|
34
35
|
|
|
36
|
+
@Overloadable
|
|
37
|
+
@setdoc.basic
|
|
38
|
+
def __init__(self: Self, *args: Any, **kwargs: Any) -> bool:
|
|
39
|
+
if len(args) <= 1 and len(kwargs) == 0:
|
|
40
|
+
return True
|
|
41
|
+
if "string" in kwargs.keys():
|
|
42
|
+
return True
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
@__init__.overload(True)
|
|
46
|
+
def __init__(self: Self, string: Any = "0") -> None:
|
|
47
|
+
self._data = ()
|
|
48
|
+
self.string = string
|
|
49
|
+
|
|
50
|
+
@__init__.overload(False)
|
|
51
|
+
def __init__(self: Self, data: Iterable) -> None:
|
|
52
|
+
self._data = ()
|
|
53
|
+
self.data = data
|
|
54
|
+
|
|
35
55
|
@setdoc.basic
|
|
36
56
|
def __setitem__(self: Self, key: Any, value: Any) -> bool:
|
|
37
57
|
self._data = setting.setitem(self.data, key, value)
|
|
@@ -56,6 +76,9 @@ class Release(ListStringer):
|
|
|
56
76
|
ans: str = ".".join(l)
|
|
57
77
|
return ans
|
|
58
78
|
|
|
79
|
+
def _init_setup(self: Self) -> None:
|
|
80
|
+
self._data = ()
|
|
81
|
+
|
|
59
82
|
@classmethod
|
|
60
83
|
def _sort(cls: type, value: int) -> int:
|
|
61
84
|
return value
|
|
@@ -51,7 +51,8 @@ class TestVersionReleaseAttrs(unittest.TestCase):
|
|
|
51
51
|
ans: Any = attr(*args, **dict(kwargs))
|
|
52
52
|
self.assertEqual(ans, solution)
|
|
53
53
|
if target is not None:
|
|
54
|
-
|
|
54
|
+
ans: list = list(version.public.base.release)
|
|
55
|
+
self.assertEqual(ans, target)
|
|
55
56
|
|
|
56
57
|
|
|
57
58
|
class TestVersionReleaseVersionError(unittest.TestCase):
|
|
@@ -114,7 +115,8 @@ class TestVersionLocalGo(unittest.TestCase):
|
|
|
114
115
|
ans: Any = attr(*args, **dict(kwargs))
|
|
115
116
|
self.assertEqual(ans, solution)
|
|
116
117
|
if target is not None:
|
|
117
|
-
|
|
118
|
+
answer: list = list(version.local)
|
|
119
|
+
self.assertEqual(answer, target)
|
|
118
120
|
|
|
119
121
|
|
|
120
122
|
class TestVersionEpochGo(unittest.TestCase):
|
|
@@ -186,14 +188,14 @@ class TestVersionRelease(unittest.TestCase):
|
|
|
186
188
|
|
|
187
189
|
def test_0(self: Self) -> None:
|
|
188
190
|
k: str
|
|
189
|
-
v:
|
|
191
|
+
v: dict
|
|
190
192
|
for k, v in Util.util.data["release"].items():
|
|
191
193
|
with self.subTest(key=k):
|
|
192
194
|
self.go(**v)
|
|
193
195
|
|
|
194
|
-
def go(self: Self, query:
|
|
195
|
-
release: Release = Release(query)
|
|
196
|
-
self.assertEqual(release, solution)
|
|
196
|
+
def go(self: Self, query: list, solution: list) -> None:
|
|
197
|
+
release: Release = Release(data=query)
|
|
198
|
+
self.assertEqual(list(release), solution)
|
|
197
199
|
|
|
198
200
|
|
|
199
201
|
class TestDevGo(unittest.TestCase):
|
|
@@ -425,5 +427,33 @@ class TestSlots(unittest.TestCase):
|
|
|
425
427
|
setattr(obj, attrname, attrvalue)
|
|
426
428
|
|
|
427
429
|
|
|
430
|
+
class TestReleaseAlias(unittest.TestCase):
|
|
431
|
+
def test_0(self: Self) -> None:
|
|
432
|
+
x: Any
|
|
433
|
+
y: Any
|
|
434
|
+
for x, y in Util.util.data["release-key"].items():
|
|
435
|
+
with self.subTest(test_label=x):
|
|
436
|
+
self.go(**y)
|
|
437
|
+
|
|
438
|
+
def go(self: Self, steps: list) -> None:
|
|
439
|
+
version: Version = Version()
|
|
440
|
+
step: dict
|
|
441
|
+
for step in steps:
|
|
442
|
+
self.modify(version=version, **step)
|
|
443
|
+
|
|
444
|
+
def modify(
|
|
445
|
+
self: Self,
|
|
446
|
+
version: Version,
|
|
447
|
+
name: str,
|
|
448
|
+
value: Any,
|
|
449
|
+
solution: Optional[list] = None,
|
|
450
|
+
) -> None:
|
|
451
|
+
setattr(version.public.base.release, name, value)
|
|
452
|
+
if solution is None:
|
|
453
|
+
return
|
|
454
|
+
answer: list = list(version.public.base.release)
|
|
455
|
+
self.assertEqual(answer, solution)
|
|
456
|
+
|
|
457
|
+
|
|
428
458
|
if __name__ == "__main__":
|
|
429
459
|
unittest.main()
|
|
@@ -59,7 +59,7 @@ class TestPre(unittest.TestCase):
|
|
|
59
59
|
|
|
60
60
|
# Initial version, no pre-release version
|
|
61
61
|
self.assertEqual(str(v), "1.2.3")
|
|
62
|
-
self.assertEqual(v.public.qual
|
|
62
|
+
self.assertEqual(str(v.public.qual), "")
|
|
63
63
|
|
|
64
64
|
# Set pre-release version to "a1"
|
|
65
65
|
v.public.qual = "a1"
|
|
@@ -212,11 +212,11 @@ class TestVersionRelease(unittest.TestCase):
|
|
|
212
212
|
def test_release_modify_aliases(self: Self) -> None:
|
|
213
213
|
# Test modifying the release via major, minor, and micro properties
|
|
214
214
|
version: Version = Version()
|
|
215
|
-
version.public.base.release = [1, 2, 3]
|
|
215
|
+
version.public.base.release.data = [1, 2, 3]
|
|
216
216
|
version.public.base.release.major = 10
|
|
217
217
|
version.public.base.release.minor = 20
|
|
218
218
|
version.public.base.release.micro = 30
|
|
219
|
-
self.assertEqual(version.public.base.release, [10, 20, 30])
|
|
219
|
+
self.assertEqual(list(version.public.base.release), [10, 20, 30])
|
|
220
220
|
self.assertEqual(version.public.base.release.patch, 30)
|
|
221
221
|
|
|
222
222
|
def test_release_with_tailing_zeros_simulation(self: Self) -> None:
|
|
@@ -229,41 +229,12 @@ class TestVersionRelease(unittest.TestCase):
|
|
|
229
229
|
def test_release_empty_major(self: Self) -> None:
|
|
230
230
|
# Test that an empty release still has valid major, minor, micro values
|
|
231
231
|
version: Version = Version()
|
|
232
|
-
version.public.base.release = []
|
|
232
|
+
version.public.base.release.data = []
|
|
233
233
|
self.assertEqual(version.public.base.release.major, 0)
|
|
234
234
|
self.assertEqual(version.public.base.release.minor, 0)
|
|
235
235
|
self.assertEqual(version.public.base.release.micro, 0)
|
|
236
236
|
self.assertEqual(version.public.base.release.patch, 0)
|
|
237
237
|
|
|
238
|
-
def test_release_modify_with_alias_increase_length(self: Self) -> None:
|
|
239
|
-
# Test that modifying an alias can extend the length of release
|
|
240
|
-
version: Version = Version()
|
|
241
|
-
version.public.base.release = [1]
|
|
242
|
-
version.public.base.release.minor = 5 # This should make release [1, 5]
|
|
243
|
-
self.assertEqual(version.public.base.release, [1, 5])
|
|
244
|
-
version.public.base.release.micro = 3 # This should make release [1, 5, 3]
|
|
245
|
-
self.assertEqual(version.public.base.release, [1, 5, 3])
|
|
246
|
-
|
|
247
|
-
def test_release_modify_major_only(self: Self) -> None:
|
|
248
|
-
# Test that setting just the major property works
|
|
249
|
-
version: Version = Version()
|
|
250
|
-
version.public.base.release.major = 10
|
|
251
|
-
self.assertEqual(version.public.base.release, [10])
|
|
252
|
-
|
|
253
|
-
def test_release_modify_minor_only(self: Self) -> None:
|
|
254
|
-
# Test that setting just the minor property extends release
|
|
255
|
-
version: Version = Version()
|
|
256
|
-
version.public.base.release = []
|
|
257
|
-
version.public.base.release.minor = 1
|
|
258
|
-
self.assertEqual(version.public.base.release, [0, 1])
|
|
259
|
-
|
|
260
|
-
def test_release_modify_micro_only(self: Self) -> None:
|
|
261
|
-
# Test that setting just the micro (patch) property extends release
|
|
262
|
-
version: Version = Version()
|
|
263
|
-
version.public.base.release = []
|
|
264
|
-
version.public.base.release.micro = 1
|
|
265
|
-
self.assertEqual(version.public.base.release, [0, 0, 1])
|
|
266
|
-
|
|
267
238
|
|
|
268
239
|
class TestAdditionalVersionRelease(unittest.TestCase):
|
|
269
240
|
|
|
@@ -282,9 +253,12 @@ class TestAdditionalVersionRelease(unittest.TestCase):
|
|
|
282
253
|
def test_release_slice_assignment(self: Self) -> None:
|
|
283
254
|
# Test assigning a slice to release
|
|
284
255
|
version: Version = Version()
|
|
285
|
-
version.public.base.release = [1, 2, 3, 4, 5]
|
|
256
|
+
version.public.base.release.data = [1, 2, 3, 4, 5]
|
|
286
257
|
version.public.base.release[1:4] = [20, 30, 40]
|
|
287
|
-
self.assertEqual(
|
|
258
|
+
self.assertEqual(
|
|
259
|
+
list(version.public.base.release),
|
|
260
|
+
[1, 20, 30, 40, 5],
|
|
261
|
+
)
|
|
288
262
|
|
|
289
263
|
def test_release_iterable(self: Self) -> None:
|
|
290
264
|
# Test if release supports iteration
|
|
@@ -309,7 +283,7 @@ class TestAdditionalVersionRelease(unittest.TestCase):
|
|
|
309
283
|
# Test setting the 'data' property directly
|
|
310
284
|
version: Version = Version()
|
|
311
285
|
version.public.base.release.data = [10, 20, 30]
|
|
312
|
-
self.assertEqual(version.public.base.release, [10, 20, 30])
|
|
286
|
+
self.assertEqual(list(version.public.base.release), [10, 20, 30])
|
|
313
287
|
|
|
314
288
|
def test_release_contains(self: Self) -> None:
|
|
315
289
|
# Test 'in' keyword with release
|
|
@@ -322,13 +296,17 @@ class TestAdditionalVersionRelease(unittest.TestCase):
|
|
|
322
296
|
# Test multiplying the release (list behavior)
|
|
323
297
|
version: Version = Version()
|
|
324
298
|
version.public.base.release = [1, 2]
|
|
325
|
-
|
|
299
|
+
answer: list = list(version.public.base.release * 3)
|
|
300
|
+
solution: list = [1, 2, 1, 2, 1, 2]
|
|
301
|
+
self.assertEqual(answer, solution)
|
|
326
302
|
|
|
327
303
|
def test_release_addition(self: Self) -> None:
|
|
328
304
|
# Test adding another list to release
|
|
329
305
|
version: Version = Version()
|
|
330
|
-
version.public.base.release = [1, 2, 3]
|
|
331
|
-
|
|
306
|
+
version.public.base.release.data = [1, 2, 3]
|
|
307
|
+
answer: list = list(version.public.base.release) + [4, 5]
|
|
308
|
+
solution: list = [1, 2, 3, 4, 5]
|
|
309
|
+
self.assertEqual(answer, solution)
|
|
332
310
|
|
|
333
311
|
|
|
334
312
|
class TestVersionLocal(unittest.TestCase):
|
|
@@ -342,28 +320,32 @@ class TestVersionLocal(unittest.TestCase):
|
|
|
342
320
|
def test_local_slice_assignment(self: Self) -> None:
|
|
343
321
|
# Test assigning a slice to the local list
|
|
344
322
|
version: Version = Version()
|
|
345
|
-
version.local = [1, "dev", "build"]
|
|
323
|
+
version.local.data = [1, "dev", "build"]
|
|
346
324
|
version.local[1:3] = ["alpha", "beta"]
|
|
347
|
-
self.assertEqual(version.local, [1, "alpha", "beta"])
|
|
325
|
+
self.assertEqual(list(version.local), [1, "alpha", "beta"])
|
|
348
326
|
|
|
349
327
|
def test_local_contains(self: Self) -> None:
|
|
350
328
|
# Test 'in' keyword with local list
|
|
351
329
|
version: Version = Version()
|
|
352
|
-
version.local = [1, "dev", "build"]
|
|
330
|
+
version.local.data = [1, "dev", "build"]
|
|
353
331
|
self.assertIn("dev", version.local)
|
|
354
332
|
self.assertNotIn("alpha", version.local)
|
|
355
333
|
|
|
356
334
|
def test_local_mul(self: Self) -> None:
|
|
357
335
|
# Test multiplying the local list
|
|
358
336
|
version: Version = Version()
|
|
359
|
-
version.local = [1, "dev"]
|
|
360
|
-
|
|
337
|
+
version.local.data = [1, "dev"]
|
|
338
|
+
answer: list = list(version.local * 3)
|
|
339
|
+
solution: list = [1, "dev", 1, "dev", 1, "dev"]
|
|
340
|
+
self.assertEqual(answer, solution)
|
|
361
341
|
|
|
362
342
|
def test_local_addition(self: Self) -> None:
|
|
363
343
|
# Test adding another list to local
|
|
364
344
|
version: Version = Version()
|
|
365
|
-
version.local = [1, "dev"]
|
|
366
|
-
|
|
345
|
+
version.local.data = [1, "dev"]
|
|
346
|
+
answer: list = list(version.local + ["build"])
|
|
347
|
+
solution: list = [1, "dev", "build"]
|
|
348
|
+
self.assertEqual(answer, solution)
|
|
367
349
|
|
|
368
350
|
def test_local_inequality_with_list(self: Self) -> None:
|
|
369
351
|
# Test inequality of local with a normal list
|
|
@@ -387,7 +369,9 @@ class TestVersionLocal(unittest.TestCase):
|
|
|
387
369
|
# Test that 'data' property can be set directly
|
|
388
370
|
version: Version = Version()
|
|
389
371
|
version.local.data = ["custom", "data"]
|
|
390
|
-
|
|
372
|
+
answer: list = list(version.local)
|
|
373
|
+
solution: list = ["custom", "data"]
|
|
374
|
+
self.assertEqual(answer, solution)
|
|
391
375
|
|
|
392
376
|
def test_local_iterable(self: Self) -> None:
|
|
393
377
|
# Test if local supports iteration
|
|
@@ -1064,3 +1064,30 @@ clsname = "Version"
|
|
|
1064
1064
|
attrname = "fdsfvdsff"
|
|
1065
1065
|
attrvalue = 42
|
|
1066
1066
|
isimported = true
|
|
1067
|
+
|
|
1068
|
+
[release-key.test-major]
|
|
1069
|
+
steps = [
|
|
1070
|
+
{name = "major", value = 10, solution = [10]}
|
|
1071
|
+
]
|
|
1072
|
+
|
|
1073
|
+
[release-key.test-minor]
|
|
1074
|
+
steps = [
|
|
1075
|
+
{name = "minor", value = 1, solution = [0, 1] }
|
|
1076
|
+
]
|
|
1077
|
+
|
|
1078
|
+
[release-key.test-micro]
|
|
1079
|
+
steps = [
|
|
1080
|
+
{name = "micro",value = 1, solution = [0, 0, 1] }
|
|
1081
|
+
]
|
|
1082
|
+
|
|
1083
|
+
[release-key.test-patch]
|
|
1084
|
+
steps = [
|
|
1085
|
+
{name = "patch", value = 5, solution = [0, 0, 5]}
|
|
1086
|
+
]
|
|
1087
|
+
|
|
1088
|
+
[release-key.modify-increase-length]
|
|
1089
|
+
steps = [
|
|
1090
|
+
{ name = "data", value = [1], solution = [1] },
|
|
1091
|
+
{ name = "minor", value = 5, solution = [1, 5] },
|
|
1092
|
+
{ name = "micro", value = 3, solution = [1, 5, 3] }
|
|
1093
|
+
]
|
|
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
|
|
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
|