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.
Files changed (42) hide show
  1. {v440-2.0.0.dev172/src/v440.egg-info → v440-2.0.0.dev174}/PKG-INFO +1 -1
  2. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/pyproject.toml +1 -1
  3. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/BaseStringer.py +4 -0
  4. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/ListStringer.py +3 -0
  5. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/SlotStringer.py +0 -4
  6. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/cfg.toml +1 -1
  7. v440-2.0.0.dev174/src/v440/_utils/releaseparse/setting.py +76 -0
  8. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Qual.py +85 -12
  9. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/tests/test_testdata.py +4 -4
  10. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/tests/test_version.py +5 -5
  11. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/tests/testdata.toml +5 -5
  12. {v440-2.0.0.dev172 → v440-2.0.0.dev174/src/v440.egg-info}/PKG-INFO +1 -1
  13. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440.egg-info/SOURCES.txt +0 -2
  14. v440-2.0.0.dev172/src/v440/_utils/QualStringer.py +0 -126
  15. v440-2.0.0.dev172/src/v440/_utils/releaseparse/setting.py +0 -64
  16. v440-2.0.0.dev172/src/v440/core/Pre.py +0 -47
  17. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/LICENSE.txt +0 -0
  18. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/MANIFEST.in +0 -0
  19. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/README.rst +0 -0
  20. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/setup.cfg +0 -0
  21. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/__init__.py +0 -0
  22. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/Cfg.py +0 -0
  23. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/Pattern.py +0 -0
  24. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/__init__.py +0 -0
  25. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/guarding.py +0 -0
  26. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/__init__.py +0 -0
  27. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/deleting.py +0 -0
  28. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/getting.py +0 -0
  29. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/listing.py +0 -0
  30. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/numerals.py +0 -0
  31. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/_utils/releaseparse/ranging.py +0 -0
  32. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Base.py +0 -0
  33. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Local.py +0 -0
  34. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Public.py +0 -0
  35. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Release.py +0 -0
  36. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/Version.py +0 -0
  37. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/VersionError.py +0 -0
  38. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/core/__init__.py +0 -0
  39. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440/tests/__init__.py +0 -0
  40. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440.egg-info/dependency_links.txt +0 -0
  41. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/src/v440.egg-info/requires.txt +0 -0
  42. {v440-2.0.0.dev172 → v440-2.0.0.dev174}/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.dev172
3
+ Version: 2.0.0.dev174
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.dev172"
40
+ version = "2.0.0.dev174"
41
41
 
42
42
  [project.license]
43
43
  file = "LICENSE.txt"
@@ -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: ...
@@ -1,4 +1,4 @@
1
- [pre]
1
+ [phases]
2
2
  alpha = "a"
3
3
  a = "a"
4
4
  beta = "b"
@@ -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__ = ("_pre", "_post", "_dev")
20
+ __slots__ = ("_prephase", "_prenum", "_post", "_dev")
22
21
  string: str
23
- pre: 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 bool(self.string)
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._pre = Pre()
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
- return "pre"
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.string = 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.string
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.string = ""
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.string = x + y
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.pre.phase != "" or self.dev is not None
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
- return self._pre
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 test_slicing_3(self: Self) -> None:
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.go(**v, key=k)
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, "slicingmethod %s" % key)
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.pre.phase = "preview"
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.pre.num = 42
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.pre.phase = "BeTa"
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.string = "beta.2"
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.pre.phase = "PrEvIeW"
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 = "777"
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 = "777"
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 = "777"
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]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: v440
3
- Version: 2.0.0.dev172
3
+ Version: 2.0.0.dev174
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)
@@ -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