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.
Files changed (32) hide show
  1. {v440-2.0.0.dev14/src/v440.egg-info → v440-2.0.0.dev16}/PKG-INFO +1 -1
  2. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/pyproject.toml +1 -1
  3. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/VList.py +0 -22
  4. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/WList.py +2 -0
  5. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/utils.py +46 -0
  6. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Base.py +3 -0
  7. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Local.py +2 -0
  8. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Pre.py +1 -0
  9. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Public.py +3 -0
  10. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Qualification.py +4 -0
  11. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Release.py +2 -0
  12. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/Version.py +3 -0
  13. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/tests/test_testdata.py +16 -20
  14. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/tests/test_version.py +119 -106
  15. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/tests/testdata.toml +7 -4
  16. {v440-2.0.0.dev14 → v440-2.0.0.dev16/src/v440.egg-info}/PKG-INFO +1 -1
  17. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/LICENSE.txt +0 -0
  18. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/MANIFEST.in +0 -0
  19. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/README.rst +0 -0
  20. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/setup.cfg +0 -0
  21. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/__init__.py +0 -0
  22. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/Digest.py +0 -0
  23. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/Pattern.py +0 -0
  24. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/SimpleQualifierParser.py +0 -0
  25. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/_utils/__init__.py +0 -0
  26. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/VersionError.py +0 -0
  27. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/core/__init__.py +0 -0
  28. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440/tests/__init__.py +0 -0
  29. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440.egg-info/SOURCES.txt +0 -0
  30. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440.egg-info/dependency_links.txt +0 -0
  31. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/src/v440.egg-info/requires.txt +0 -0
  32. {v440-2.0.0.dev14 → v440-2.0.0.dev16}/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.dev14
3
+ Version: 2.0.0.dev16
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.dev14"
37
+ version = "2.0.0.dev16"
38
38
 
39
39
  [project.license]
40
40
  file = "LICENSE.txt"
@@ -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
 
@@ -7,6 +7,7 @@ import keyalias
7
7
  from v440._utils import utils
8
8
  from v440._utils.Digest import Digest
9
9
  from v440._utils.Pattern import Pattern
10
+ from v440._utils.utils import guard
10
11
  from v440._utils.WList import WList
11
12
 
12
13
  __all__ = ["Pre"]
@@ -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.local(**v, key=k)
81
+ self.go(**v, key=k)
81
82
 
82
- def local(
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
- self.v = Version()
181
- for k, v in Util.util.data["data_property"].items():
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 data(
184
+ def go(
186
185
  self: Self,
187
- query: Any,
188
- solution: str,
186
+ query: Any = None,
187
+ solution: Any = None,
189
188
  key: str = "",
190
189
  ) -> None:
191
- msg: str = "data_property %r" % key
192
- self.v.data = query
193
- self.assertEqual(solution, str(self.v), msg=msg)
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.release(key=k, **v)
202
+ self.go(key=k, **v)
207
203
 
208
- def release(self: Self, query: Any, solution: Any, key: str = "") -> None:
209
- self.version.release = query
210
- self.assertEqual(self.version.release, solution)
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(Exception) as context:
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
- self.version.release = [1, 2, 3]
209
- self.assertEqual(self.version.release.major, 1)
210
- self.assertEqual(self.version.release.minor, 2)
211
- self.assertEqual(self.version.release.micro, 3)
212
- self.assertEqual(self.version.release.patch, 3) # 'patch' is an alias for micro
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
- self.version.release = [1, 2, 3]
217
- self.version.release.major = 10
218
- self.version.release.minor = 20
219
- self.version.release.micro = 30
220
- self.assertEqual(self.version.release, [10, 20, 30])
221
- self.assertEqual(self.version.release.patch, 30)
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
- self.version.release = [1, 2]
226
- simulated_release = self.version.release[:5]
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
- self.version.release = []
232
- self.assertEqual(self.version.release.major, 0)
233
- self.assertEqual(self.version.release.minor, 0)
234
- self.assertEqual(self.version.release.micro, 0)
235
- self.assertEqual(self.version.release.patch, 0)
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
- self.version.release = [1]
240
- self.version.release.minor = 5 # This should make release [1, 5]
241
- self.assertEqual(self.version.release, [1, 5])
242
- self.version.release.micro = 3 # This should make release [1, 5, 3]
243
- self.assertEqual(self.version.release, [1, 5, 3])
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
- self.version.release.major = 10
248
- self.assertEqual(self.version.release, [10])
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
- self.version.release = []
253
- self.version.release.minor = 1
254
- self.assertEqual(self.version.release, [0, 1])
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
- self.version.release = []
259
- self.version.release.micro = 1
260
- self.assertEqual(self.version.release, [0, 0, 1])
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
- self.version.release = [1, 2, 3]
272
- self.assertFalse(self.version.release == [1, 2, 4])
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
- self.version.release = [1, 2, 3]
277
- self.assertEqual(len(self.version.release), 3)
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
- self.version.release = [1, 2, 3, 4, 5]
282
- self.version.release[1:4] = [20, 30, 40]
283
- self.assertEqual(self.version.release, [1, 20, 30, 40, 5])
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
- self.version.release = [1, 2, 3]
288
- result = [x for x in self.version.release]
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
- self.version.release = [1, 2, 3]
294
- self.assertEqual(str(self.version.release), "1.2.3")
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
- self.version.release = [1, 2, 3]
299
- self.assertEqual(self.version.release.data, [1, 2, 3])
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
- self.version.release.data = [10, 20, 30]
304
- self.assertEqual(self.version.release, [10, 20, 30])
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
- self.version.release = [1, 2, 3]
309
- self.assertIn(2, self.version.release)
310
- self.assertNotIn(4, self.version.release)
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
- self.version.release = [1, 2]
315
- self.assertEqual(self.version.release * 3, [1, 2, 1, 2, 1, 2])
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
- self.version.release = [1, 2, 3]
320
- self.assertEqual(self.version.release + [4, 5], [1, 2, 3, 4, 5])
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
- self.version.local = [1, "dev", "build"]
332
- self.assertEqual(len(self.version.local), 3)
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
- self.version.local = [1, "dev", "build"]
337
- self.version.local[1:3] = ["alpha", "beta"]
338
- self.assertEqual(self.version.local, [1, "alpha", "beta"])
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
- self.version.local = [1, "dev", "build"]
343
- self.assertIn("dev", self.version.local)
344
- self.assertNotIn("alpha", self.version.local)
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
- self.version.local = [1, "dev"]
349
- self.assertEqual(self.version.local * 3, [1, "dev", 1, "dev", 1, "dev"])
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
- self.version.local = [1, "dev"]
354
- self.assertEqual(self.version.local + ["build"], [1, "dev", "build"])
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
- self.version.local = [1, "dev"]
359
- self.assertFalse(self.version.local == [1, "build"])
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
- self.version.local = [1, "dev", "build"]
364
- self.assertEqual(str(self.version.local), "1.dev.build")
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
- self.version.local = [1, "dev", "build"]
369
- self.assertEqual(self.version.local.data, [1, "dev", "build"])
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
- self.version.local.data = ["custom", "data"]
374
- self.assertEqual(self.version.local, ["custom", "data"])
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
- self.version.local = "1.dev.build"
379
- result = [x for x in self.version.local]
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
- [data_property.local]
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
- [data_property.hitch]
948
+ [data-property.hitch]
949
949
  query = 4.2
950
950
  solution = "4.2"
951
951
 
952
- [data_property.dragon]
952
+ [data-property.dragon]
953
953
  query = 9001
954
954
  solution = "9001"
955
955
 
956
- [data_property.local_again]
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: v440
3
- Version: 2.0.0.dev14
3
+ Version: 2.0.0.dev16
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)
File without changes
File without changes
File without changes
File without changes