v440 2.0.0.dev172__tar.gz → 2.0.0.dev174__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.dev172/src/v440.egg-info → v440-2.0.0.dev174}/PKG-INFO +1 -1
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/pyproject.toml +1 -1
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/BaseStringer.py +4 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/ListStringer.py +3 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/SlotStringer.py +0 -4
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/cfg.toml +1 -1
- v440-2.0.0.dev174/src/v440/_utils/releaseparse/setting.py +76 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Qual.py +85 -12
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/tests/test_testdata.py +4 -4
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/tests/test_version.py +5 -5
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/tests/testdata.toml +5 -5
- {v440-2.0.0.dev172 → v440-2.0.0.dev174/src/v440.egg-info}/PKG-INFO +1 -1
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440.egg-info/SOURCES.txt +0 -2
- v440-2.0.0.dev172/src/v440/_utils/QualStringer.py +0 -126
- v440-2.0.0.dev172/src/v440/_utils/releaseparse/setting.py +0 -64
- v440-2.0.0.dev172/src/v440/core/Pre.py +0 -47
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/LICENSE.txt +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/MANIFEST.in +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/README.rst +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/setup.cfg +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/__init__.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/Cfg.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/Pattern.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/__init__.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/guarding.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/__init__.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/deleting.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/getting.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/listing.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/numerals.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/ranging.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Base.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Local.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Public.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Release.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Version.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/VersionError.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/__init__.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/tests/__init__.py +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440.egg-info/dependency_links.txt +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440.egg-info/requires.txt +0 -0
- {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from abc import ABCMeta, abstractmethod
|
|
2
2
|
from typing import *
|
|
3
3
|
|
|
4
|
+
import scaevola
|
|
4
5
|
import setdoc
|
|
5
6
|
import unhash
|
|
6
7
|
|
|
@@ -102,6 +103,9 @@ class BaseStringer(metaclass=ABCMeta):
|
|
|
102
103
|
@abstractmethod
|
|
103
104
|
def _string_fset(self: Self, value: str) -> None: ...
|
|
104
105
|
|
|
106
|
+
@abstractmethod
|
|
107
|
+
def _todict(self: Self) -> dict: ...
|
|
108
|
+
|
|
105
109
|
@setdoc.basic
|
|
106
110
|
def copy(self: Self) -> Self:
|
|
107
111
|
return type(self)(self)
|
|
@@ -105,6 +105,9 @@ 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
|
+
|
|
108
111
|
def append(self: Self, value: Self, /) -> None:
|
|
109
112
|
"This method appends value to self."
|
|
110
113
|
data: list = list(self.data)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from abc import abstractmethod
|
|
2
1
|
from functools import partial
|
|
3
2
|
from typing import *
|
|
4
3
|
|
|
@@ -21,6 +20,3 @@ class SlotStringer(BaseStringer):
|
|
|
21
20
|
|
|
22
21
|
def _cmp(self: Self) -> tuple:
|
|
23
22
|
return tuple(map(partial(getattr, self), type(self).__slots__))
|
|
24
|
-
|
|
25
|
-
@abstractmethod
|
|
26
|
-
def _todict(self: Self) -> dict: ...
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import operator
|
|
4
|
+
from typing import *
|
|
5
|
+
|
|
6
|
+
from v440._utils.releaseparse import listing, ranging
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def numeral(value: SupportsIndex) -> int:
|
|
10
|
+
ans: int = operator.index(value)
|
|
11
|
+
if ans < 0:
|
|
12
|
+
raise ValueError
|
|
13
|
+
else:
|
|
14
|
+
return ans
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def setitem(data: tuple, key: Any, value: Any) -> tuple:
|
|
18
|
+
f: Callable
|
|
19
|
+
k: int | range
|
|
20
|
+
v: int | tuple[int]
|
|
21
|
+
if type(key) is slice:
|
|
22
|
+
f = setitem_range
|
|
23
|
+
k = ranging.torange(key, len(data))
|
|
24
|
+
v = tuple(map(numeral, value))
|
|
25
|
+
else:
|
|
26
|
+
f = setitem_int
|
|
27
|
+
k = operator.index(key)
|
|
28
|
+
v = numeral(value)
|
|
29
|
+
return f(data, k, v)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def setitem_int(data: tuple, key: int, value: int) -> tuple:
|
|
33
|
+
if key < len(data):
|
|
34
|
+
edit: list = list(data)
|
|
35
|
+
edit[key] = value
|
|
36
|
+
return tuple(edit)
|
|
37
|
+
if value == 0:
|
|
38
|
+
return data
|
|
39
|
+
data += (0,) * (key - len(data))
|
|
40
|
+
data += (value,)
|
|
41
|
+
return data
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def setitem_range(data: tuple, key: range, value: tuple[int]) -> tuple:
|
|
45
|
+
if key.step == 1:
|
|
46
|
+
return setitem_range_1(
|
|
47
|
+
data=data,
|
|
48
|
+
start=key.start,
|
|
49
|
+
stop=key.stop,
|
|
50
|
+
value=value,
|
|
51
|
+
)
|
|
52
|
+
else:
|
|
53
|
+
return setitem_range_align(data, key, value)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def setitem_range_align(data: tuple, key: range, value: tuple[int]) -> tuple:
|
|
57
|
+
key: list = list(key)
|
|
58
|
+
value: list = listing.tolist(value, slicing=len(key))
|
|
59
|
+
if len(key) != len(value):
|
|
60
|
+
e = "attempt to assign sequence of size %s to extended slice of size %s"
|
|
61
|
+
e %= (len(value), len(key))
|
|
62
|
+
raise ValueError(e)
|
|
63
|
+
ext: int = max(0, max(*key) + 1 - len(data))
|
|
64
|
+
edit: list = list(data)
|
|
65
|
+
edit += [0] * ext
|
|
66
|
+
for k, v in zip(key, value):
|
|
67
|
+
edit[k] = v
|
|
68
|
+
return tuple(edit)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def setitem_range_1(data: tuple, start: int, stop: int, value: tuple[int]) -> tuple:
|
|
72
|
+
edit: list = list(data)
|
|
73
|
+
edit += [0] * max(0, start - len(data))
|
|
74
|
+
edit[start:stop] = value
|
|
75
|
+
ans: tuple = tuple(edit)
|
|
76
|
+
return ans
|
|
@@ -11,34 +11,38 @@ 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
|
|
15
14
|
|
|
16
15
|
__all__ = ["Qual"]
|
|
17
16
|
|
|
18
17
|
|
|
19
18
|
class Qual(SlotStringer):
|
|
20
19
|
|
|
21
|
-
__slots__ = ("
|
|
20
|
+
__slots__ = ("_prephase", "_prenum", "_post", "_dev")
|
|
22
21
|
string: str
|
|
23
|
-
pre:
|
|
22
|
+
pre: str
|
|
23
|
+
prephase: str
|
|
24
|
+
prenum: int
|
|
24
25
|
post: Optional[int]
|
|
25
26
|
dev: Optional[int]
|
|
26
27
|
|
|
27
28
|
@setdoc.basic
|
|
28
29
|
def __bool__(self: Self) -> bool:
|
|
29
|
-
return
|
|
30
|
+
return self.string == ""
|
|
30
31
|
|
|
31
32
|
@Overloadable
|
|
32
33
|
@setdoc.basic
|
|
33
34
|
def __init__(self: Self, *args: Any, **kwargs: Any) -> str:
|
|
34
|
-
self.
|
|
35
|
+
self._prephase = ""
|
|
36
|
+
self._prenum = 0
|
|
35
37
|
self._post = None
|
|
36
38
|
self._dev = None
|
|
37
39
|
argc: int = len(args) + len(kwargs)
|
|
38
40
|
keys: set = set(kwargs.keys())
|
|
39
41
|
if argc <= 1 and keys <= {"string"}:
|
|
40
42
|
return "string"
|
|
41
|
-
|
|
43
|
+
if argc <= 3 and keys <= {"pre", "post", "dev"}:
|
|
44
|
+
return "pre"
|
|
45
|
+
return "slots"
|
|
42
46
|
|
|
43
47
|
@__init__.overload("string")
|
|
44
48
|
@setdoc.basic
|
|
@@ -53,7 +57,21 @@ class Qual(SlotStringer):
|
|
|
53
57
|
post: Any = None,
|
|
54
58
|
dev: Any = None,
|
|
55
59
|
) -> None:
|
|
56
|
-
self.pre
|
|
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
|
|
57
75
|
self.post = post
|
|
58
76
|
self.dev = dev
|
|
59
77
|
|
|
@@ -74,7 +92,7 @@ class Qual(SlotStringer):
|
|
|
74
92
|
def _format(self: Self, format_spec: str) -> str:
|
|
75
93
|
if format_spec:
|
|
76
94
|
raise ValueError
|
|
77
|
-
ans: str = self.pre
|
|
95
|
+
ans: str = self.pre
|
|
78
96
|
if self.post is not None:
|
|
79
97
|
ans += ".post%s" % self.post
|
|
80
98
|
if self.dev is not None:
|
|
@@ -88,7 +106,7 @@ class Qual(SlotStringer):
|
|
|
88
106
|
y: Any
|
|
89
107
|
self.dev = None
|
|
90
108
|
self.post = None
|
|
91
|
-
self.pre
|
|
109
|
+
self.pre = ""
|
|
92
110
|
while v:
|
|
93
111
|
m = Pattern.QUALIFIERS.leftbound.search(v)
|
|
94
112
|
v = v[m.end() :]
|
|
@@ -103,7 +121,7 @@ class Qual(SlotStringer):
|
|
|
103
121
|
if x in ("post", "r", "rev"):
|
|
104
122
|
self.post = int(y)
|
|
105
123
|
continue
|
|
106
|
-
self.pre
|
|
124
|
+
self.pre = x + y
|
|
107
125
|
|
|
108
126
|
def _todict(self: Self) -> dict:
|
|
109
127
|
return dict(pre=self.pre, post=self.post, dev=self.dev)
|
|
@@ -129,7 +147,7 @@ class Qual(SlotStringer):
|
|
|
129
147
|
|
|
130
148
|
def isprerelease(self: Self) -> bool:
|
|
131
149
|
"This method returns whether the current instance denotes a pre-release."
|
|
132
|
-
return self.
|
|
150
|
+
return self.prephase != "" or self.dev is not None
|
|
133
151
|
|
|
134
152
|
def ispostrelease(self: Self) -> bool:
|
|
135
153
|
"This method returns whether the current instance denotes a post-release."
|
|
@@ -149,4 +167,59 @@ class Qual(SlotStringer):
|
|
|
149
167
|
|
|
150
168
|
@property
|
|
151
169
|
def pre(self: Self) -> str:
|
|
152
|
-
|
|
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
|
|
@@ -145,12 +145,13 @@ class TestVersionEpochGo(unittest.TestCase):
|
|
|
145
145
|
|
|
146
146
|
|
|
147
147
|
class TestSlicingGo(unittest.TestCase):
|
|
148
|
-
def
|
|
148
|
+
def test_slicingmethod(self: Self) -> None:
|
|
149
149
|
sli: dict = Util.util.data["slicingmethod"]
|
|
150
150
|
k: str
|
|
151
151
|
v: dict
|
|
152
152
|
for k, v in sli.items():
|
|
153
|
-
self.
|
|
153
|
+
with self.subTest(key=k):
|
|
154
|
+
self.go(**v)
|
|
154
155
|
|
|
155
156
|
def go(
|
|
156
157
|
self: Self,
|
|
@@ -160,11 +161,10 @@ class TestSlicingGo(unittest.TestCase):
|
|
|
160
161
|
start: Any = None,
|
|
161
162
|
stop: Any = None,
|
|
162
163
|
step: Any = None,
|
|
163
|
-
key: str = "",
|
|
164
164
|
) -> None:
|
|
165
165
|
v: Version = Version(query)
|
|
166
166
|
v.public.base.release[start:stop:step] = change
|
|
167
|
-
self.assertEqual(str(v), solution
|
|
167
|
+
self.assertEqual(str(v), solution)
|
|
168
168
|
|
|
169
169
|
|
|
170
170
|
class TestDataProperty(unittest.TestCase):
|
|
@@ -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.
|
|
70
|
+
v.public.qual.prephase = "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.
|
|
75
|
+
v.public.qual.prenum = 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.
|
|
80
|
+
v.public.qual.prephase = "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
|
|
150
|
+
v.public.qual.pre = "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.
|
|
155
|
+
v.public.qual.prephase = "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:
|
|
@@ -937,35 +937,35 @@ query = "1.2.3.4.5.6.7.8.9.10"
|
|
|
937
937
|
start = -8
|
|
938
938
|
stop = 15
|
|
939
939
|
step = 5
|
|
940
|
-
change =
|
|
940
|
+
change = [7, 7, 7]
|
|
941
941
|
solution = "1.2.7.4.5.6.7.7.9.10.0.0.7"
|
|
942
942
|
|
|
943
943
|
[slicingmethod.test_slicing_3]
|
|
944
944
|
query = "1.2.3.4.5.6.7.8.9.10"
|
|
945
945
|
start = 3
|
|
946
946
|
stop = 4
|
|
947
|
-
change = 777
|
|
947
|
+
change = [777]
|
|
948
948
|
solution = "1.2.3.777.5.6.7.8.9.10"
|
|
949
949
|
|
|
950
950
|
[slicingmethod.test_slicing_4]
|
|
951
951
|
query = "1.2.3.4.5.6.7.8.9.10"
|
|
952
952
|
start = 3
|
|
953
953
|
stop = 4
|
|
954
|
-
change =
|
|
954
|
+
change = [7, 7, 7]
|
|
955
955
|
solution = "1.2.3.7.7.7.5.6.7.8.9.10"
|
|
956
956
|
|
|
957
957
|
[slicingmethod.test_slicing_5]
|
|
958
958
|
query = "1"
|
|
959
959
|
start = 3
|
|
960
960
|
stop = 4
|
|
961
|
-
change =
|
|
961
|
+
change = [7, 7, 7]
|
|
962
962
|
solution = "1.0.0.7.7.7"
|
|
963
963
|
|
|
964
964
|
[slicingmethod.test_slicing_6]
|
|
965
965
|
query = "1"
|
|
966
966
|
start = 3
|
|
967
967
|
stop = 4
|
|
968
|
-
change = 777
|
|
968
|
+
change = [777]
|
|
969
969
|
solution = "1.0.0.777"
|
|
970
970
|
|
|
971
971
|
[epoch.test_epoch_as_int]
|
|
@@ -13,7 +13,6 @@ src/v440/_utils/BaseStringer.py
|
|
|
13
13
|
src/v440/_utils/Cfg.py
|
|
14
14
|
src/v440/_utils/ListStringer.py
|
|
15
15
|
src/v440/_utils/Pattern.py
|
|
16
|
-
src/v440/_utils/QualStringer.py
|
|
17
16
|
src/v440/_utils/SlotStringer.py
|
|
18
17
|
src/v440/_utils/__init__.py
|
|
19
18
|
src/v440/_utils/cfg.toml
|
|
@@ -27,7 +26,6 @@ src/v440/_utils/releaseparse/ranging.py
|
|
|
27
26
|
src/v440/_utils/releaseparse/setting.py
|
|
28
27
|
src/v440/core/Base.py
|
|
29
28
|
src/v440/core/Local.py
|
|
30
|
-
src/v440/core/Pre.py
|
|
31
29
|
src/v440/core/Public.py
|
|
32
30
|
src/v440/core/Qual.py
|
|
33
31
|
src/v440/core/Release.py
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import operator
|
|
2
|
-
import string as string_
|
|
3
|
-
from abc import abstractmethod
|
|
4
|
-
from typing import *
|
|
5
|
-
|
|
6
|
-
import setdoc
|
|
7
|
-
from datarepr import datarepr
|
|
8
|
-
from overloadable import Overloadable
|
|
9
|
-
|
|
10
|
-
from v440._utils.BaseStringer import BaseStringer
|
|
11
|
-
from v440._utils.Cfg import Cfg
|
|
12
|
-
from v440._utils.guarding import guard
|
|
13
|
-
|
|
14
|
-
__all__ = ["QualStringer"]
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class QualStringer(BaseStringer):
|
|
18
|
-
__slots__ = ("_phase", "_num")
|
|
19
|
-
|
|
20
|
-
string: str
|
|
21
|
-
phase: str
|
|
22
|
-
num: int
|
|
23
|
-
|
|
24
|
-
@setdoc.basic
|
|
25
|
-
def __bool__(self: Self) -> bool:
|
|
26
|
-
return bool(self.phase or self.num)
|
|
27
|
-
|
|
28
|
-
@Overloadable
|
|
29
|
-
@setdoc.basic
|
|
30
|
-
def __init__(self: Self, *args: Any, **kwargs: Any) -> str:
|
|
31
|
-
self._phase = ""
|
|
32
|
-
self._num = 0
|
|
33
|
-
argc: int = len(args) + len(kwargs)
|
|
34
|
-
keys: set = set(kwargs.keys())
|
|
35
|
-
if argc <= 1 and keys <= {"string"}:
|
|
36
|
-
return "string"
|
|
37
|
-
return "slots"
|
|
38
|
-
|
|
39
|
-
@__init__.overload("string")
|
|
40
|
-
@setdoc.basic
|
|
41
|
-
def __init__(self: Self, string: Any = "") -> None:
|
|
42
|
-
self.string = string
|
|
43
|
-
|
|
44
|
-
@__init__.overload("slots")
|
|
45
|
-
@setdoc.basic
|
|
46
|
-
def __init__(
|
|
47
|
-
self: Self,
|
|
48
|
-
phase: Any = "",
|
|
49
|
-
num: Any = 0,
|
|
50
|
-
) -> None:
|
|
51
|
-
self.phase = phase
|
|
52
|
-
self.num = num
|
|
53
|
-
|
|
54
|
-
@setdoc.basic
|
|
55
|
-
def __repr__(self: Self) -> str:
|
|
56
|
-
return datarepr(type(self).__name__, phase=self.phase, num=self.num)
|
|
57
|
-
|
|
58
|
-
def _format(self: Self, format_spec: str) -> str:
|
|
59
|
-
return self._format_cls(
|
|
60
|
-
format_spec=format_spec,
|
|
61
|
-
phase=self.phase,
|
|
62
|
-
num=self.num,
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
@classmethod
|
|
66
|
-
@abstractmethod
|
|
67
|
-
def _format_cls(
|
|
68
|
-
cls: type,
|
|
69
|
-
*,
|
|
70
|
-
phase: str,
|
|
71
|
-
num: int,
|
|
72
|
-
format_spec: str = "",
|
|
73
|
-
) -> str: ...
|
|
74
|
-
|
|
75
|
-
@abstractmethod
|
|
76
|
-
def _num_fset(self: Self, value: int) -> None: ...
|
|
77
|
-
|
|
78
|
-
@classmethod
|
|
79
|
-
@abstractmethod
|
|
80
|
-
def _phasedict(cls: type) -> dict: ...
|
|
81
|
-
|
|
82
|
-
@classmethod
|
|
83
|
-
def _string_parse_common(cls: type, value: str) -> tuple:
|
|
84
|
-
y: str = value.lower()
|
|
85
|
-
y = y.replace("_", ".")
|
|
86
|
-
y = y.replace("-", ".")
|
|
87
|
-
x: str = y.rstrip(string_.digits)
|
|
88
|
-
y = y[len(x) :]
|
|
89
|
-
if x.endswith("."):
|
|
90
|
-
x = x[:-1]
|
|
91
|
-
if not y:
|
|
92
|
-
raise ValueError
|
|
93
|
-
if x.startswith("."):
|
|
94
|
-
x = x[1:]
|
|
95
|
-
if not x:
|
|
96
|
-
raise ValueError
|
|
97
|
-
if x:
|
|
98
|
-
return cls._phasedict()[x], int("0" + y)
|
|
99
|
-
elif y:
|
|
100
|
-
raise ValueError
|
|
101
|
-
else:
|
|
102
|
-
return "", 0
|
|
103
|
-
|
|
104
|
-
@property
|
|
105
|
-
def num(self: Self) -> int:
|
|
106
|
-
return self._num
|
|
107
|
-
|
|
108
|
-
@num.setter
|
|
109
|
-
@guard
|
|
110
|
-
def num(self: Self, value: Any) -> None:
|
|
111
|
-
self._num_fset(operator.index(value))
|
|
112
|
-
|
|
113
|
-
@property
|
|
114
|
-
def phase(self: Self) -> str:
|
|
115
|
-
return self._phase
|
|
116
|
-
|
|
117
|
-
@phase.setter
|
|
118
|
-
@guard
|
|
119
|
-
def phase(self: Self, value: Any) -> None:
|
|
120
|
-
v: str = str(value).lower()
|
|
121
|
-
if v:
|
|
122
|
-
self._phase = self._phasedict()[v]
|
|
123
|
-
elif self.num:
|
|
124
|
-
self.string = str(self.num)
|
|
125
|
-
else:
|
|
126
|
-
self._phase = ""
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import operator
|
|
4
|
-
from typing import *
|
|
5
|
-
|
|
6
|
-
from overloadable import Overloadable
|
|
7
|
-
|
|
8
|
-
from v440._utils.releaseparse import listing, numerals, ranging
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def setitem(data: tuple, key: Any, value: Any) -> tuple:
|
|
12
|
-
f: Callable
|
|
13
|
-
k: int | range
|
|
14
|
-
if type(key) is slice:
|
|
15
|
-
k = ranging.torange(key, len(data))
|
|
16
|
-
f = setitem_range
|
|
17
|
-
else:
|
|
18
|
-
k = operator.index(key)
|
|
19
|
-
f = setitem_int
|
|
20
|
-
return f(data, k, value)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def setitem_int(data: tuple, key: int, value: Any) -> tuple:
|
|
24
|
-
v: int = numerals.numeral(value)
|
|
25
|
-
if key < len(data):
|
|
26
|
-
edit: list = list(data)
|
|
27
|
-
edit[key] = v
|
|
28
|
-
return tuple(edit)
|
|
29
|
-
if v == 0:
|
|
30
|
-
return data
|
|
31
|
-
data += (0,) * (key - len(data))
|
|
32
|
-
data += (v,)
|
|
33
|
-
return data
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@Overloadable
|
|
37
|
-
def setitem_range(data: tuple, key: range, value: Any) -> bool:
|
|
38
|
-
return key.step == 1
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
@setitem_range.overload(False)
|
|
42
|
-
def setitem_range(data: tuple, key: range, value: Any) -> tuple:
|
|
43
|
-
key: list = list(key)
|
|
44
|
-
value: list = listing.tolist(value, slicing=len(key))
|
|
45
|
-
if len(key) != len(value):
|
|
46
|
-
e = "attempt to assign sequence of size %s to extended slice of size %s"
|
|
47
|
-
e %= (len(value), len(key))
|
|
48
|
-
raise ValueError(e)
|
|
49
|
-
ext: int = max(0, max(*key) + 1 - len(data))
|
|
50
|
-
edit: list = list(data)
|
|
51
|
-
edit += [0] * ext
|
|
52
|
-
for k, v in zip(key, value):
|
|
53
|
-
edit[k] = v
|
|
54
|
-
return tuple(edit)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
@setitem_range.overload(True)
|
|
58
|
-
def setitem_range(data: tuple, key: range, value: Any) -> tuple:
|
|
59
|
-
edit: list = list(data)
|
|
60
|
-
ext: int = max(0, key.start - len(data))
|
|
61
|
-
edit += ext * [0]
|
|
62
|
-
l: list = listing.tolist(value, slicing="always")
|
|
63
|
-
edit = edit[: key.start] + l + edit[key.stop :]
|
|
64
|
-
return tuple(edit)
|
|
@@ -1,47 +0,0 @@
|
|
|
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) -> tuple:
|
|
20
|
-
return {bool(self)}, self.phase, self.num
|
|
21
|
-
|
|
22
|
-
@classmethod
|
|
23
|
-
def _format_cls(
|
|
24
|
-
cls: type,
|
|
25
|
-
*,
|
|
26
|
-
phase: str,
|
|
27
|
-
num: int,
|
|
28
|
-
format_spec: str = "",
|
|
29
|
-
) -> str:
|
|
30
|
-
if format_spec:
|
|
31
|
-
raise ValueError
|
|
32
|
-
if phase:
|
|
33
|
-
return phase + str(num)
|
|
34
|
-
else:
|
|
35
|
-
return ""
|
|
36
|
-
|
|
37
|
-
def _num_fset(self: Self, value: int) -> None:
|
|
38
|
-
if value < 0:
|
|
39
|
-
raise ValueError
|
|
40
|
-
self.string = self.phase + str(value)
|
|
41
|
-
|
|
42
|
-
@classmethod
|
|
43
|
-
def _phasedict(cls: type) -> dict:
|
|
44
|
-
return Cfg.cfg.data["pre"]
|
|
45
|
-
|
|
46
|
-
def _string_fset(self: Self, value: str) -> None:
|
|
47
|
-
self._phase, self._num = self._string_parse_common(value)
|
|
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
|