v440 2.0.0.dev164__tar.gz → 2.0.0.dev166__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 (42) hide show
  1. {v440-2.0.0.dev164/src/v440.egg-info → v440-2.0.0.dev166}/PKG-INFO +1 -1
  2. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/pyproject.toml +1 -1
  3. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/BaseStringer.py +0 -4
  4. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/ListStringer.py +0 -3
  5. v440-2.0.0.dev166/src/v440/_utils/QualStringer.py +78 -0
  6. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/SlotStringer.py +4 -0
  7. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/cfg.toml +1 -1
  8. v440-2.0.0.dev166/src/v440/core/Pre.py +59 -0
  9. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/core/Qual.py +12 -85
  10. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/tests/test_version.py +5 -5
  11. {v440-2.0.0.dev164 → v440-2.0.0.dev166/src/v440.egg-info}/PKG-INFO +1 -1
  12. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440.egg-info/SOURCES.txt +1 -0
  13. v440-2.0.0.dev164/src/v440/_utils/QualStringer.py +0 -22
  14. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/LICENSE.txt +0 -0
  15. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/MANIFEST.in +0 -0
  16. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/README.rst +0 -0
  17. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/setup.cfg +0 -0
  18. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/__init__.py +0 -0
  19. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/Cfg.py +0 -0
  20. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/Pattern.py +0 -0
  21. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/__init__.py +0 -0
  22. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/guarding.py +0 -0
  23. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/releaseparse/__init__.py +0 -0
  24. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/releaseparse/deleting.py +0 -0
  25. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/releaseparse/getting.py +0 -0
  26. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/releaseparse/listing.py +0 -0
  27. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/releaseparse/numerals.py +0 -0
  28. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/releaseparse/ranging.py +0 -0
  29. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/_utils/releaseparse/setting.py +0 -0
  30. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/core/Base.py +0 -0
  31. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/core/Local.py +0 -0
  32. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/core/Public.py +0 -0
  33. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/core/Release.py +0 -0
  34. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/core/Version.py +0 -0
  35. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/core/VersionError.py +0 -0
  36. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/core/__init__.py +0 -0
  37. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/tests/__init__.py +0 -0
  38. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/tests/test_testdata.py +0 -0
  39. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440/tests/testdata.toml +0 -0
  40. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440.egg-info/dependency_links.txt +0 -0
  41. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/src/v440.egg-info/requires.txt +0 -0
  42. {v440-2.0.0.dev164 → v440-2.0.0.dev166}/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.dev164
3
+ Version: 2.0.0.dev166
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)
@@ -37,7 +37,7 @@ keywords = []
37
37
  name = "v440"
38
38
  readme = "README.rst"
39
39
  requires-python = ">=3.11"
40
- version = "2.0.0.dev164"
40
+ version = "2.0.0.dev166"
41
41
 
42
42
  [project.license]
43
43
  file = "LICENSE.txt"
@@ -1,7 +1,6 @@
1
1
  from abc import ABCMeta, abstractmethod
2
2
  from typing import *
3
3
 
4
- import scaevola
5
4
  import setdoc
6
5
  import unhash
7
6
 
@@ -103,9 +102,6 @@ class BaseStringer(metaclass=ABCMeta):
103
102
  @abstractmethod
104
103
  def _string_fset(self: Self, value: str) -> None: ...
105
104
 
106
- @abstractmethod
107
- def _todict(self: Self) -> dict: ...
108
-
109
105
  @setdoc.basic
110
106
  def copy(self: Self) -> Self:
111
107
  return type(self)(self)
@@ -105,9 +105,6 @@ class ListStringer(BaseStringer, collections.abc.MutableSequence):
105
105
  @abstractmethod
106
106
  def _sort(cls: type, value: Any): ...
107
107
 
108
- def _todict(self: Self) -> dict:
109
- return dict(data=self.data)
110
-
111
108
  def append(self: Self, value: Self, /) -> None:
112
109
  "This method appends value to self."
113
110
  data: list = list(self.data)
@@ -0,0 +1,78 @@
1
+ import operator
2
+ from abc import abstractmethod
3
+ from typing import *
4
+
5
+ import setdoc
6
+ from datarepr import datarepr
7
+ from overloadable import Overloadable
8
+
9
+ from v440._utils.BaseStringer import BaseStringer
10
+ from v440._utils.guarding import guard
11
+
12
+ __all__ = ["QualStringer"]
13
+
14
+
15
+ class QualStringer(BaseStringer):
16
+ __slots__ = ("_phase", "_num")
17
+
18
+ string: str
19
+ phase: str
20
+ num: int
21
+
22
+ @setdoc.basic
23
+ def __bool__(self: Self) -> bool:
24
+ return bool(self.phase or self.num)
25
+
26
+ @Overloadable
27
+ @setdoc.basic
28
+ def __init__(self: Self, *args: Any, **kwargs: Any) -> str:
29
+ self._phase = ""
30
+ self._num = 0
31
+ argc: int = len(args) + len(kwargs)
32
+ keys: set = set(kwargs.keys())
33
+ if argc <= 1 and keys <= {"string"}:
34
+ return "string"
35
+ return "slots"
36
+
37
+ @__init__.overload("string")
38
+ @setdoc.basic
39
+ def __init__(self: Self, string: Any = "") -> None:
40
+ self.string = string
41
+
42
+ @__init__.overload("slots")
43
+ @setdoc.basic
44
+ def __init__(
45
+ self: Self,
46
+ phase: Any = "",
47
+ num: Any = 0,
48
+ ) -> None:
49
+ self.phase = phase
50
+ self.num = num
51
+
52
+ @setdoc.basic
53
+ def __repr__(self: Self) -> str:
54
+ return datarepr(type(self).__name__, phase=self.phase, num=self.num)
55
+
56
+ @abstractmethod
57
+ def _num_fset(self: Self, value: int) -> None: ...
58
+
59
+ @abstractmethod
60
+ def _phase_fset(self: Self, value: str) -> None: ...
61
+
62
+ @property
63
+ def num(self: Self) -> int:
64
+ return self._num
65
+
66
+ @num.setter
67
+ @guard
68
+ def num(self: Self, value: Any) -> None:
69
+ self._num_fset(operator.index(value))
70
+
71
+ @property
72
+ def phase(self: Self) -> str:
73
+ return self._phase
74
+
75
+ @phase.setter
76
+ @guard
77
+ def phase(self: Self, value: Any) -> None:
78
+ self._phase_fset(str(value))
@@ -1,3 +1,4 @@
1
+ from abc import abstractmethod
1
2
  from functools import partial
2
3
  from typing import *
3
4
 
@@ -20,3 +21,6 @@ class SlotStringer(BaseStringer):
20
21
 
21
22
  def _cmp(self: Self) -> tuple:
22
23
  return tuple(map(partial(getattr, self), type(self).__slots__))
24
+
25
+ @abstractmethod
26
+ def _todict(self: Self) -> dict: ...
@@ -1,4 +1,4 @@
1
- [phases]
1
+ [pre]
2
2
  alpha = "a"
3
3
  a = "a"
4
4
  beta = "b"
@@ -0,0 +1,59 @@
1
+ from __future__ import annotations
2
+
3
+ import string as string_
4
+ from typing import *
5
+
6
+ from v440._utils.Cfg import Cfg
7
+ from v440._utils.QualStringer import QualStringer
8
+
9
+ __all__ = ["Pre"]
10
+
11
+
12
+ class Pre(QualStringer):
13
+
14
+ __slots__ = ()
15
+ string: str
16
+ phase: str
17
+ num: int
18
+
19
+ def _cmp(self: Self) -> list:
20
+ return {bool(self)}, self.phase, self.num
21
+
22
+ def _format(self: Self, format_spec: str) -> str:
23
+ if format_spec:
24
+ raise ValueError
25
+ if self:
26
+ return self.phase + str(self.num)
27
+ else:
28
+ return ""
29
+
30
+ def _num_fset(self: Self, value: int) -> None:
31
+ if value < 0:
32
+ raise ValueError
33
+ self.string = self.phase + str(value)
34
+
35
+ def _phase_fset(self: Self, value: str) -> None:
36
+ self._phase = Cfg.cfg.data["pre"][value.lower()]
37
+
38
+ def _string_fset(self: Self, value: str) -> None:
39
+ v: str = value.lower()
40
+ v = v.replace("_", ".")
41
+ v = v.replace("-", ".")
42
+ x: str = v.rstrip(string_.digits)
43
+ v = v[len(x) :]
44
+ q: bool = x.endswith(".")
45
+ if q:
46
+ if not v:
47
+ raise ValueError
48
+ x = x[:-1]
49
+ p: bool = x.startswith(".")
50
+ if p:
51
+ x = x[1:]
52
+ if x:
53
+ self._phase = Cfg.cfg.data["pre"][x]
54
+ self._num = int("0" + v)
55
+ elif p or v:
56
+ raise ValueError
57
+ else:
58
+ self._phase = ""
59
+ self._num = 0
@@ -11,38 +11,34 @@ from v440._utils.Cfg import Cfg
11
11
  from v440._utils.guarding import guard
12
12
  from v440._utils.Pattern import Pattern
13
13
  from v440._utils.SlotStringer import SlotStringer
14
+ from v440.core.Pre import Pre
14
15
 
15
16
  __all__ = ["Qual"]
16
17
 
17
18
 
18
19
  class Qual(SlotStringer):
19
20
 
20
- __slots__ = ("_prephase", "_prenum", "_post", "_dev")
21
+ __slots__ = ("_pre", "_post", "_dev")
21
22
  string: str
22
- pre: str
23
- prephase: str
24
- prenum: int
23
+ pre: Pre
25
24
  post: Optional[int]
26
25
  dev: Optional[int]
27
26
 
28
27
  @setdoc.basic
29
28
  def __bool__(self: Self) -> bool:
30
- return self.string == ""
29
+ return bool(self.string)
31
30
 
32
31
  @Overloadable
33
32
  @setdoc.basic
34
33
  def __init__(self: Self, *args: Any, **kwargs: Any) -> str:
35
- self._prephase = ""
36
- self._prenum = 0
34
+ self._pre = Pre()
37
35
  self._post = None
38
36
  self._dev = None
39
37
  argc: int = len(args) + len(kwargs)
40
38
  keys: set = set(kwargs.keys())
41
39
  if argc <= 1 and keys <= {"string"}:
42
40
  return "string"
43
- if argc <= 3 and keys <= {"pre", "post", "dev"}:
44
- return "pre"
45
- return "slots"
41
+ return "pre"
46
42
 
47
43
  @__init__.overload("string")
48
44
  @setdoc.basic
@@ -57,21 +53,7 @@ class Qual(SlotStringer):
57
53
  post: Any = None,
58
54
  dev: Any = None,
59
55
  ) -> None:
60
- self.pre = pre
61
- self.post = post
62
- self.dev = dev
63
-
64
- @__init__.overload("slots")
65
- @setdoc.basic
66
- def __init__(
67
- self: Self,
68
- prephase: Any = "",
69
- prenum: Any = 0,
70
- post: Any = None,
71
- dev: Any = None,
72
- ) -> None:
73
- self.prephase = prephase
74
- self.prenum = prenum
56
+ self.pre.string = pre
75
57
  self.post = post
76
58
  self.dev = dev
77
59
 
@@ -92,7 +74,7 @@ class Qual(SlotStringer):
92
74
  def _format(self: Self, format_spec: str) -> str:
93
75
  if format_spec:
94
76
  raise ValueError
95
- ans: str = self.pre
77
+ ans: str = self.pre.string
96
78
  if self.post is not None:
97
79
  ans += ".post%s" % self.post
98
80
  if self.dev is not None:
@@ -106,7 +88,7 @@ class Qual(SlotStringer):
106
88
  y: Any
107
89
  self.dev = None
108
90
  self.post = None
109
- self.pre = ""
91
+ self.pre.string = ""
110
92
  while v:
111
93
  m = Pattern.QUALIFIERS.leftbound.search(v)
112
94
  v = v[m.end() :]
@@ -121,7 +103,7 @@ class Qual(SlotStringer):
121
103
  if x in ("post", "r", "rev"):
122
104
  self.post = int(y)
123
105
  continue
124
- self.pre = x + y
106
+ self.pre.string = x + y
125
107
 
126
108
  def _todict(self: Self) -> dict:
127
109
  return dict(pre=self.pre, post=self.post, dev=self.dev)
@@ -147,7 +129,7 @@ class Qual(SlotStringer):
147
129
 
148
130
  def isprerelease(self: Self) -> bool:
149
131
  "This method returns whether the current instance denotes a pre-release."
150
- return self.prephase != "" or self.dev is not None
132
+ return self.pre.phase != "" or self.dev is not None
151
133
 
152
134
  def ispostrelease(self: Self) -> bool:
153
135
  "This method returns whether the current instance denotes a post-release."
@@ -167,59 +149,4 @@ class Qual(SlotStringer):
167
149
 
168
150
  @property
169
151
  def pre(self: Self) -> str:
170
- if "" == self.prephase:
171
- return ""
172
- return self.prephase + str(self.prenum)
173
-
174
- @pre.setter
175
- @guard
176
- def pre(self: Self, value: Any) -> None:
177
- v: str = str(value).lower()
178
- v = v.replace("_", ".")
179
- v = v.replace("-", ".")
180
- x: str = v.rstrip(string_.digits)
181
- v = v[len(x) :]
182
- q: bool = x.endswith(".")
183
- if q:
184
- if not v:
185
- raise ValueError
186
- x = x[:-1]
187
- p: bool = x.startswith(".")
188
- if p:
189
- x = x[1:]
190
- if x:
191
- self._prephase = Cfg.cfg.data["phases"][x]
192
- self._prenum = int("0" + v)
193
- elif p or v:
194
- raise ValueError
195
- else:
196
- self._prephase = ""
197
- self._prenum = 0
198
-
199
- @property
200
- def prephase(self: Self) -> str:
201
- return self._prephase
202
-
203
- @prephase.setter
204
- @guard
205
- def prephase(self: Self, value: Any) -> None:
206
- x: str = str(value).lower()
207
- if x != "":
208
- self._prephase = Cfg.cfg.data["phases"][x]
209
- elif self.prenum:
210
- self.pre = self.prenum # raises error
211
-
212
- @property
213
- def prenum(self: Self) -> Optional[int]:
214
- return self._prenum
215
-
216
- @prenum.setter
217
- @guard
218
- def prenum(self: Self, value: Any) -> None:
219
- y: int = operator.index(value)
220
- if y < 0:
221
- raise ValueError
222
- if self.prephase:
223
- self._prenum = y
224
- else:
225
- self.pre = y # raises error
152
+ return self._pre
@@ -67,17 +67,17 @@ class TestPre(unittest.TestCase):
67
67
  self.assertEqual(str(v.public.qual), "a1")
68
68
 
69
69
  # Modify pre-release phase to "preview"
70
- v.public.qual.prephase = "preview"
70
+ v.public.qual.pre.phase = "preview"
71
71
  self.assertEqual(str(v), "1.2.3rc1")
72
72
  self.assertEqual(str(v.public.qual), "rc1")
73
73
 
74
74
  # Modify subphase to "42"
75
- v.public.qual.prenum = 42
75
+ v.public.qual.pre.num = 42
76
76
  self.assertEqual(str(v), "1.2.3rc42")
77
77
  self.assertEqual(str(v.public.qual), "rc42")
78
78
 
79
79
  # Change phase to a formatted string "BeTa"
80
- v.public.qual.prephase = "BeTa"
80
+ v.public.qual.pre.phase = "BeTa"
81
81
  self.assertEqual(str(v), "1.2.3b42")
82
82
  self.assertEqual(str(v.public.qual), "b42")
83
83
  self.assertEqual(v.public.qual, backup)
@@ -147,12 +147,12 @@ class TestExample(unittest.TestCase):
147
147
  def test_example_5(self: Self) -> None:
148
148
  v: Version = Version("2.0.0-alpha.1")
149
149
  self.assertEqual(str(v), "2a1") # Pre-release version
150
- v.public.qual.pre = "beta.2"
150
+ v.public.qual.pre.string = "beta.2"
151
151
  self.assertEqual(str(v), "2b2") # Modified pre-release version
152
152
  with self.assertRaises(Exception):
153
153
  v.public.qual.pre[1] = 4
154
154
  self.assertEqual(str(v), "2b2") # Further modified pre-release version
155
- v.public.qual.prephase = "PrEvIeW"
155
+ v.public.qual.pre.phase = "PrEvIeW"
156
156
  self.assertEqual(str(v), "2rc2") # Even further modified pre-release version
157
157
 
158
158
  def test_example_6(self: Self) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: v440
3
- Version: 2.0.0.dev164
3
+ Version: 2.0.0.dev166
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)
@@ -27,6 +27,7 @@ src/v440/_utils/releaseparse/ranging.py
27
27
  src/v440/_utils/releaseparse/setting.py
28
28
  src/v440/core/Base.py
29
29
  src/v440/core/Local.py
30
+ src/v440/core/Pre.py
30
31
  src/v440/core/Public.py
31
32
  src/v440/core/Qual.py
32
33
  src/v440/core/Release.py
@@ -1,22 +0,0 @@
1
- from functools import partial
2
- from typing import *
3
-
4
- import setdoc
5
- from datarepr import datarepr
6
-
7
- from v440._utils.BaseStringer import BaseStringer
8
-
9
- __all__ = ["QualStringer"]
10
-
11
-
12
- class QualStringer(BaseStringer):
13
- __slots__ = ()
14
-
15
- string: str
16
-
17
- @setdoc.basic
18
- def __repr__(self: Self) -> str:
19
- return datarepr(type(self).__name__, **self._todict())
20
-
21
- def _cmp(self: Self) -> tuple:
22
- return tuple(map(partial(getattr, self), type(self).__slots__))
File without changes
File without changes
File without changes
File without changes