v440 2.0.0.dev50__tar.gz → 2.0.0.dev52__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 (34) hide show
  1. {v440-2.0.0.dev50/src/v440.egg-info → v440-2.0.0.dev52}/PKG-INFO +1 -1
  2. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/pyproject.toml +1 -1
  3. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/_utils/BaseList.py +6 -0
  4. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/_utils/Digest.py +3 -1
  5. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/_utils/SlotList.py +11 -3
  6. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/_utils/VList.py +14 -0
  7. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/core/Base.py +9 -11
  8. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/core/Local.py +39 -33
  9. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/core/Public.py +4 -5
  10. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/core/Qual.py +16 -14
  11. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/core/Release.py +14 -13
  12. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/core/Version.py +7 -8
  13. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/core/VersionError.py +3 -0
  14. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/tests/test_testdata.py +1 -1
  15. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/tests/test_version.py +2 -2
  16. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/tests/testdata.toml +8 -8
  17. {v440-2.0.0.dev50 → v440-2.0.0.dev52/src/v440.egg-info}/PKG-INFO +1 -1
  18. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/LICENSE.txt +0 -0
  19. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/MANIFEST.in +0 -0
  20. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/README.rst +0 -0
  21. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/setup.cfg +0 -0
  22. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/__init__.py +0 -0
  23. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/_utils/Cfg.py +0 -0
  24. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/_utils/Pattern.py +0 -0
  25. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/_utils/__init__.py +0 -0
  26. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/_utils/cfg.toml +0 -0
  27. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/_utils/qualparse.py +0 -0
  28. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/_utils/utils.py +0 -0
  29. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/core/__init__.py +0 -0
  30. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440/tests/__init__.py +0 -0
  31. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440.egg-info/SOURCES.txt +0 -0
  32. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440.egg-info/dependency_links.txt +0 -0
  33. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/src/v440.egg-info/requires.txt +0 -0
  34. {v440-2.0.0.dev50 → v440-2.0.0.dev52}/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.dev50
3
+ Version: 2.0.0.dev52
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)
@@ -35,7 +35,7 @@ keywords = []
35
35
  name = "v440"
36
36
  readme = "README.rst"
37
37
  requires-python = ">=3.11"
38
- version = "2.0.0.dev50"
38
+ version = "2.0.0.dev52"
39
39
 
40
40
  [project.license]
41
41
  file = "LICENSE.txt"
@@ -1,9 +1,15 @@
1
1
  from abc import ABCMeta, abstractmethod
2
2
  from typing import *
3
3
 
4
+ import setdoc
5
+
4
6
 
5
7
  class BaseList(metaclass=ABCMeta):
6
8
  __slots__ = ()
7
9
 
8
10
  @abstractmethod
11
+ @setdoc.basic
9
12
  def __bool__(self: Self) -> bool: ...
13
+
14
+ @abstractmethod
15
+ def _format(self: Self, format_spec: str) -> str: ...
@@ -4,6 +4,8 @@ import functools
4
4
  import types
5
5
  from typing import *
6
6
 
7
+ import setdoc
8
+
7
9
 
8
10
  class Digest:
9
11
  __slots__ = ("__dict__", "lookup", "name", "kind")
@@ -23,12 +25,12 @@ class Digest:
23
25
  "This magic method implements getting as an attribute from a class or an object."
24
26
  return self.wrapped.__get__(*args, **kwargs)
25
27
 
28
+ @setdoc.basic
26
29
  def __init__(
27
30
  self: Self,
28
31
  name: str = "",
29
32
  kind: Any = None,
30
33
  ) -> None:
31
- "This magic method sets up self."
32
34
  self.lookup = dict()
33
35
  self.name = name
34
36
  self.kind = kind
@@ -1,4 +1,5 @@
1
1
  import collections
2
+ import sys
2
3
  from abc import abstractmethod
3
4
  from typing import *
4
5
 
@@ -37,8 +38,13 @@ class SlotList(collections.abc.Collection, BaseList):
37
38
  return self.data == alt.data
38
39
 
39
40
  @setdoc.basic
40
- def __format__(self: Self, format_spec: Any = "", /) -> str:
41
- return format(str(self), str(format_spec))
41
+ def __format__(self: Self, format_spec: Any) -> str:
42
+ try:
43
+ return self._format(str(format_spec))
44
+ except Exception:
45
+ msg: str = "unsupported format string passed to %s.__format__"
46
+ msg %= type(self).__name__
47
+ raise TypeError(msg) from None
42
48
 
43
49
  @setdoc.basic
44
50
  def __getitem__(self: Self, key: Any) -> Any:
@@ -118,7 +124,7 @@ class SlotList(collections.abc.Collection, BaseList):
118
124
 
119
125
  @setdoc.basic
120
126
  def __str__(self: Self) -> str:
121
- return NotImplemented
127
+ return format(self)
122
128
 
123
129
  @classmethod
124
130
  def __subclasshook__(cls: type, other: type, /) -> bool:
@@ -128,6 +134,7 @@ class SlotList(collections.abc.Collection, BaseList):
128
134
  def _cmp(self: Self) -> Any:
129
135
  return self.data
130
136
 
137
+ @setdoc.basic
131
138
  def copy(self: Self) -> Self:
132
139
  return type(self)(self)
133
140
 
@@ -136,6 +143,7 @@ class SlotList(collections.abc.Collection, BaseList):
136
143
 
137
144
  @property
138
145
  @abstractmethod
146
+ @setdoc.basic
139
147
  def data(self: Self) -> list: ...
140
148
 
141
149
  def index(self: Self, value: Any) -> Any:
@@ -1,3 +1,4 @@
1
+ import builtins
1
2
  from typing import *
2
3
 
3
4
  import setdoc
@@ -11,6 +12,19 @@ class VList(OkayList, BaseList):
11
12
 
12
13
  __slots__ = ()
13
14
 
15
+ @setdoc.basic
16
+ def __format__(self: Self, format_spec: Any) -> str:
17
+ try:
18
+ return self._format(str(format_spec))
19
+ except Exception:
20
+ msg: str = "unsupported format string passed to %s.__format__"
21
+ msg %= type(self).__name__
22
+ raise TypeError(msg) from None
23
+
24
+ @setdoc.basic
25
+ def __str__(self: Self) -> str:
26
+ return builtins.format(self)
27
+
14
28
  @setdoc.basic
15
29
  def __eq__(self: Self, other: Any) -> bool:
16
30
  ans: bool
@@ -80,9 +80,12 @@ class Base(SlotList):
80
80
  self._release = Release()
81
81
  self.data = data
82
82
 
83
- @setdoc.basic
84
- def __str__(self: Self) -> str:
85
- return self.format()
83
+ def _format(self: Self, format_spec: str) -> str:
84
+ ans: str = ""
85
+ if self.epoch:
86
+ ans += "%s!" % self.epoch
87
+ ans += format(self.release, format_spec)
88
+ return ans
86
89
 
87
90
  @property
88
91
  @setdoc.basic
@@ -95,7 +98,8 @@ class Base(SlotList):
95
98
  self.epoch, self.release = parse_data(value)
96
99
 
97
100
  @property
98
- def epoch(self: Self) -> Optional[int]:
101
+ def epoch(self: Self) -> int:
102
+ "This property represents the epoch."
99
103
  return self._epoch
100
104
 
101
105
  @epoch.setter
@@ -103,15 +107,9 @@ class Base(SlotList):
103
107
  def epoch(self: Self, value: Any) -> None:
104
108
  self._epoch = parse_epoch(value)
105
109
 
106
- def format(self: Self, cutoff: Any = None) -> str:
107
- ans: str = ""
108
- if self.epoch:
109
- ans += "%s!" % self.epoch
110
- ans += self.release.format(cutoff)
111
- return ans
112
-
113
110
  @property
114
111
  def release(self: Self) -> Release:
112
+ "This property represents the release."
115
113
  return self._release
116
114
 
117
115
  @release.setter
@@ -12,8 +12,43 @@ from v440._utils.VList import VList
12
12
 
13
13
  __all__ = ["Local"]
14
14
 
15
+ parse_data: Digest = Digest("parse_data")
16
+
17
+
18
+ @parse_data.overload()
19
+ def parse_data() -> list:
20
+ return list()
21
+
22
+
23
+ @parse_data.overload(int)
24
+ def parse_data(value: int) -> list:
25
+ return [value]
26
+
27
+
28
+ @parse_data.overload(list)
29
+ def parse_data(value: list) -> list:
30
+ ans: list = list(map(utils.segment, value))
31
+ if None in ans:
32
+ raise ValueError
33
+ return ans
34
+
35
+
36
+ @parse_data.overload(str)
37
+ def parse_data(value: str) -> list:
38
+ v: str = value
39
+ if v.startswith("+"):
40
+ v = v[1:]
41
+ v = v.replace("_", ".")
42
+ v = v.replace("-", ".")
43
+ ans: list = v.split(".")
44
+ ans = list(map(utils.segment, ans))
45
+ if None in ans:
46
+ raise ValueError
47
+ return ans
48
+
15
49
 
16
50
  class Local(VList):
51
+ __slots__ = ()
17
52
 
18
53
  data: list[int | str]
19
54
 
@@ -33,42 +68,13 @@ class Local(VList):
33
68
  ans = self._cmp() <= alt._cmp()
34
69
  return ans
35
70
 
36
- @setdoc.basic
37
- def __str__(self: Self) -> str:
38
- return ".".join(map(str, self))
39
-
40
71
  def _cmp(self: Self) -> list:
41
72
  return list(map(self._sortkey, self))
42
73
 
43
- _data_calc: Digest = Digest("_data_calc")
44
-
45
- @_data_calc.overload()
46
- def _data_calc(self: Self) -> list:
47
- return list()
48
-
49
- @_data_calc.overload(int)
50
- def _data_calc(self: Self, value: int) -> list:
51
- return [value]
52
-
53
- @_data_calc.overload(list)
54
- def _data_calc(self: Self, value: list) -> list:
55
- ans: list = list(map(utils.segment, value))
56
- if None in ans:
74
+ def _format(self: Self, format_spec: str) -> str:
75
+ if format_spec:
57
76
  raise ValueError
58
- return ans
59
-
60
- @_data_calc.overload(str)
61
- def _data_calc(self: Self, value: str) -> list:
62
- v: str = value
63
- if v.startswith("+"):
64
- v = v[1:]
65
- v = v.replace("_", ".")
66
- v = v.replace("-", ".")
67
- ans: list = v.split(".")
68
- ans = list(map(utils.segment, ans))
69
- if None in ans:
70
- raise ValueError
71
- return ans
77
+ return ".".join(map(str, self))
72
78
 
73
79
  @staticmethod
74
80
  def _sortkey(value: Any) -> tuple[bool, Any]:
@@ -82,7 +88,7 @@ class Local(VList):
82
88
  @data.setter
83
89
  @guard
84
90
  def data(self: Self, value: Any) -> None:
85
- self._data = self._data_calc(value)
91
+ self._data = parse_data(value)
86
92
 
87
93
  @functools.wraps(VList.sort)
88
94
  def sort(self: Self, /, *, key: Any = None, **kwargs: Any) -> None:
@@ -52,11 +52,12 @@ class Public(SlotList):
52
52
  self._qual = Qual()
53
53
  self.data = data
54
54
 
55
- def __str__(self: Self) -> str:
56
- return self.format()
55
+ def _format(self: Self, format_spec: str) -> str:
56
+ return format(self.base, format_spec) + format(self.qual)
57
57
 
58
58
  @property
59
59
  def base(self: Self) -> Base:
60
+ "This property represents the version base."
60
61
  return self._base
61
62
 
62
63
  @base.setter
@@ -74,11 +75,9 @@ class Public(SlotList):
74
75
  def data(self: Self, value: Any) -> None:
75
76
  self.base, self.qual = parse_data(value)
76
77
 
77
- def format(self: Self, cutoff: Any = None) -> str:
78
- return self.base.format(cutoff) + str(self.qual)
79
-
80
78
  @property
81
79
  def qual(self: Self) -> Qual:
80
+ "This property represents the qualification."
82
81
  return self._qual
83
82
 
84
83
  @qual.setter
@@ -16,6 +16,7 @@ class Qual(SlotList):
16
16
  __slots__ = ("_prephase", "_presubphase", "_post", "_dev")
17
17
 
18
18
  data: list
19
+ pre: tuple
19
20
  prephase: Optional[str]
20
21
  presubphase: Optional[int]
21
22
  post: Optional[int]
@@ -33,19 +34,6 @@ class Qual(SlotList):
33
34
  self._dev = None
34
35
  self.data = data
35
36
 
36
- @setdoc.basic
37
- def __str__(self: Self) -> str:
38
- ans: str = ""
39
- if self.prephase is not None:
40
- ans += self.prephase
41
- if self.presubphase is not None:
42
- ans += str(self.presubphase)
43
- if self.post is not None:
44
- ans += ".post%s" % self.post
45
- if self.dev is not None:
46
- ans += ".dev%s" % self.dev
47
- return ans
48
-
49
37
  def _cmp(self: Self) -> list:
50
38
  ans: list = list()
51
39
  if not self.pre.isempty():
@@ -60,6 +48,20 @@ class Qual(SlotList):
60
48
  ans.append(float("inf") if self.dev is None else self.dev)
61
49
  return ans
62
50
 
51
+ def _format(self: Self, format_spec: str) -> str:
52
+ if format_spec:
53
+ raise ValueError
54
+ ans: str = ""
55
+ if self.prephase is not None:
56
+ ans += self.prephase
57
+ if self.presubphase is not None:
58
+ ans += str(self.presubphase)
59
+ if self.post is not None:
60
+ ans += ".post%s" % self.post
61
+ if self.dev is not None:
62
+ ans += ".dev%s" % self.dev
63
+ return ans
64
+
63
65
  @property
64
66
  @setdoc.basic
65
67
  def data(self: Self) -> list:
@@ -102,7 +104,7 @@ class Qual(SlotList):
102
104
 
103
105
  @property
104
106
  def pre(self: Self) -> tuple:
105
- return (self._prephase, self._presubphase)
107
+ return self._prephase, self._presubphase
106
108
 
107
109
  @pre.setter
108
110
  @guard
@@ -70,6 +70,8 @@ def tolist(value: Any, *, slicing: Any) -> list:
70
70
 
71
71
  @keyalias(major=0, minor=1, micro=2, patch=2)
72
72
  class Release(VList):
73
+ __slots__ = ()
74
+
73
75
  data: list[int]
74
76
  major: int
75
77
  minor: int
@@ -146,9 +148,18 @@ class Release(VList):
146
148
  k: range = utils.torange(key, len(self))
147
149
  self._setitem_range(k, value)
148
150
 
149
- @setdoc.basic
150
- def __str__(self: Self) -> str:
151
- return self.format()
151
+ def _format(self: Self, format_spec: str) -> str:
152
+ i: Optional[int]
153
+ if format_spec:
154
+ i = int(format_spec)
155
+ else:
156
+ i = None
157
+ l: list = self[:i]
158
+ if len(l) == 0:
159
+ l += [0]
160
+ l = list(map(str, l))
161
+ ans: str = ".".join(l)
162
+ return ans
152
163
 
153
164
  def _getitem_int(self: Self, key: int) -> int:
154
165
  if key < len(self):
@@ -220,13 +231,3 @@ class Release(VList):
220
231
  while v and v[-1] == 0:
221
232
  v.pop()
222
233
  self._data = v
223
-
224
- def format(self: Self, cutoff: Any = None) -> str:
225
- s: str = str(cutoff) if cutoff else ""
226
- i: Optional[int] = int(s) if s else None
227
- l: list = self[:i]
228
- if len(l) == 0:
229
- l += [0]
230
- l = list(map(str, l))
231
- ans: str = ".".join(l)
232
- return ans
@@ -52,9 +52,14 @@ class Version(SlotList):
52
52
  self._local = Local()
53
53
  self.data = data
54
54
 
55
- @setdoc.basic
56
55
  def __str__(self: Self) -> str:
57
- return self.format()
56
+ return format(self)
57
+
58
+ def _format(self: Self, format_spec: str) -> str:
59
+ ans: str = format(self.public, format_spec)
60
+ if self.local:
61
+ ans += "+" + format(self.local)
62
+ return ans
58
63
 
59
64
  @property
60
65
  @setdoc.basic
@@ -66,12 +71,6 @@ class Version(SlotList):
66
71
  def data(self: Self, value: Any) -> None:
67
72
  self.public, self.local = parse_data(value)
68
73
 
69
- def format(self: Self, cutoff: Any = None) -> str:
70
- ans: str = self.public.format(cutoff)
71
- if self.local:
72
- ans += "+%s" % self.local
73
- return ans
74
-
75
74
  @property
76
75
  def local(self: Self) -> Local:
77
76
  return self._local
@@ -1,8 +1,11 @@
1
1
  from typing import *
2
2
 
3
+ import setdoc
4
+
3
5
  __all__ = ["VersionError"]
4
6
 
5
7
 
6
8
  class VersionError(ValueError):
9
+ @setdoc.basic
7
10
  def __init__(self: Self, *args: Any) -> None:
8
11
  super().__init__(*args)
@@ -261,7 +261,7 @@ class TestPackagingA(unittest.TestCase):
261
261
  a = packaging.version.Version(text)
262
262
  b = str(a)
263
263
  f = len(a.release)
264
- g = Version(text).format(f)
264
+ g = format(Version(text), str(f))
265
265
  self.assertEqual(b, g)
266
266
 
267
267
 
@@ -96,7 +96,7 @@ class TestExample(unittest.TestCase):
96
96
  def test_example_1(self: Self) -> None:
97
97
  v: Version = Version("v1.0.0")
98
98
  self.assertEqual(str(v), "1") # Initial version
99
- self.assertEqual(v.format("3"), "1.0.0") # Initial version formatted
99
+ self.assertEqual(format(v, "3"), "1.0.0") # Initial version formatted
100
100
 
101
101
  def test_example_2(self: Self) -> None:
102
102
  v: Version = Version("2.5.3")
@@ -163,7 +163,7 @@ class TestExample(unittest.TestCase):
163
163
  v.public.qual.post = "post1"
164
164
  v.local = "local.7.dev"
165
165
  self.assertEqual(str(v), "1.2.3.post1+local.7.dev") # Post-release version
166
- self.assertEqual(v.format("-1"), "1.2.post1+local.7.dev") # Formatted version
166
+ self.assertEqual(format(v, "-1"), "1.2.post1+local.7.dev") # Formatted version
167
167
  v.public.qual.post = "post.2"
168
168
  self.assertEqual(str(v), "1.2.3.post2+local.7.dev") # Modified version
169
169
  v.public.qual.post = None
@@ -1030,10 +1030,10 @@ clsname = "Base"
1030
1030
  attrname = "fdsfvdsff"
1031
1031
  attrvalue = 42
1032
1032
 
1033
- #[core-non-attributes.test-0100]
1034
- #clsname = "Local"
1035
- #attrname = "fdsfvdsff"
1036
- #attrvalue = 42
1033
+ [core-non-attributes.test-0100]
1034
+ clsname = "Local"
1035
+ attrname = "fdsfvdsff"
1036
+ attrvalue = 42
1037
1037
 
1038
1038
  [core-non-attributes.test-0200]
1039
1039
  clsname = "Public"
@@ -1045,10 +1045,10 @@ clsname = "Qual"
1045
1045
  attrname = "fdsfvdsff"
1046
1046
  attrvalue = 42
1047
1047
 
1048
- #[core-non-attributes.test-0400]
1049
- #clsname = "Release"
1050
- #attrname = "fdsfvdsff"
1051
- #attrvalue = 42
1048
+ [core-non-attributes.test-0400]
1049
+ clsname = "Release"
1050
+ attrname = "fdsfvdsff"
1051
+ attrvalue = 42
1052
1052
 
1053
1053
  [core-non-attributes.test-0500]
1054
1054
  clsname = "Public"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: v440
3
- Version: 2.0.0.dev50
3
+ Version: 2.0.0.dev52
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