v440 2.0.0.dev15__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.dev15/src/v440.egg-info → v440-2.0.0.dev16}/PKG-INFO +1 -1
  2. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/pyproject.toml +1 -1
  3. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/VList.py +0 -22
  4. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/WList.py +2 -0
  5. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/utils.py +46 -0
  6. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Base.py +3 -0
  7. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Local.py +2 -0
  8. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Pre.py +1 -0
  9. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Public.py +3 -0
  10. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Qualification.py +4 -0
  11. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Release.py +2 -0
  12. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/Version.py +3 -0
  13. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/tests/test_version.py +1 -4
  14. {v440-2.0.0.dev15 → v440-2.0.0.dev16/src/v440.egg-info}/PKG-INFO +1 -1
  15. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/LICENSE.txt +0 -0
  16. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/MANIFEST.in +0 -0
  17. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/README.rst +0 -0
  18. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/setup.cfg +0 -0
  19. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/__init__.py +0 -0
  20. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/Digest.py +0 -0
  21. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/Pattern.py +0 -0
  22. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/SimpleQualifierParser.py +0 -0
  23. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/_utils/__init__.py +0 -0
  24. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/VersionError.py +0 -0
  25. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/core/__init__.py +0 -0
  26. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/tests/__init__.py +0 -0
  27. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/tests/test_testdata.py +0 -0
  28. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440/tests/testdata.toml +0 -0
  29. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440.egg-info/SOURCES.txt +0 -0
  30. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440.egg-info/dependency_links.txt +0 -0
  31. {v440-2.0.0.dev15 → v440-2.0.0.dev16}/src/v440.egg-info/requires.txt +0 -0
  32. {v440-2.0.0.dev15 → 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.dev15
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.dev15"
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
 
@@ -181,11 +181,8 @@ class TestExample(unittest.TestCase):
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: v440
3
- Version: 2.0.0.dev15
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