v440 2.0.0.dev79__tar.gz → 2.0.0.dev81__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 (40) hide show
  1. {v440-2.0.0.dev79/src/v440.egg-info → v440-2.0.0.dev81}/PKG-INFO +1 -1
  2. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/pyproject.toml +1 -1
  3. v440-2.0.0.dev81/src/v440/_utils/qualparse/__init__.py +132 -0
  4. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/core/Base.py +0 -28
  5. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/core/Local.py +18 -7
  6. {v440-2.0.0.dev79 → v440-2.0.0.dev81/src/v440.egg-info}/PKG-INFO +1 -1
  7. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440.egg-info/SOURCES.txt +2 -1
  8. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/LICENSE.txt +0 -0
  9. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/MANIFEST.in +0 -0
  10. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/README.rst +0 -0
  11. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/setup.cfg +0 -0
  12. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/__init__.py +0 -0
  13. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/BaseStringer.py +0 -0
  14. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/Cfg.py +0 -0
  15. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/Digest.py +0 -0
  16. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/ListStringer.py +0 -0
  17. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/Pattern.py +0 -0
  18. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/SlotStringer.py +0 -0
  19. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/__init__.py +0 -0
  20. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/cfg.toml +0 -0
  21. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/guarding.py +0 -0
  22. {v440-2.0.0.dev79/src/v440/_utils → v440-2.0.0.dev81/src/v440/_utils/qualparse}/segmenting.py +0 -0
  23. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/qualparse.py +0 -0
  24. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/releaseparse/__init__.py +0 -0
  25. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/releaseparse/listing.py +0 -0
  26. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/releaseparse/numerals.py +0 -0
  27. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/_utils/releaseparse/ranging.py +0 -0
  28. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/core/Public.py +0 -0
  29. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/core/Qual.py +0 -0
  30. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/core/Release.py +0 -0
  31. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/core/Version.py +0 -0
  32. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/core/VersionError.py +0 -0
  33. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/core/__init__.py +0 -0
  34. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/tests/__init__.py +0 -0
  35. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/tests/test_testdata.py +0 -0
  36. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/tests/test_version.py +0 -0
  37. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440/tests/testdata.toml +0 -0
  38. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440.egg-info/dependency_links.txt +0 -0
  39. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/src/v440.egg-info/requires.txt +0 -0
  40. {v440-2.0.0.dev79 → v440-2.0.0.dev81}/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.dev79
3
+ Version: 2.0.0.dev81
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)
@@ -36,7 +36,7 @@ keywords = []
36
36
  name = "v440"
37
37
  readme = "README.rst"
38
38
  requires-python = ">=3.11"
39
- version = "2.0.0.dev79"
39
+ version = "2.0.0.dev81"
40
40
 
41
41
  [project.license]
42
42
  file = "LICENSE.txt"
@@ -0,0 +1,132 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import *
4
+
5
+ from v440._utils.Cfg import Cfg
6
+ from v440._utils.Digest import Digest
7
+ from v440._utils.Pattern import Pattern
8
+ from v440._utils.qualparse import segmenting
9
+
10
+ parse_dev: Digest = Digest("parse_dev")
11
+
12
+
13
+ @parse_dev.overload()
14
+ def parse_dev() -> None:
15
+ return
16
+
17
+
18
+ @parse_dev.overload(int)
19
+ def parse_dev(value: int) -> int:
20
+ if value < 0:
21
+ raise ValueError
22
+ return value
23
+
24
+
25
+ @parse_dev.overload(list)
26
+ def parse_dev(value: list) -> Optional[int]:
27
+ x: Any
28
+ y: Any
29
+ x, y = map(segmenting.segment, value)
30
+ if x != "dev":
31
+ raise ValueError
32
+ if isinstance(y, str):
33
+ raise TypeError
34
+ return y
35
+
36
+
37
+ @parse_dev.overload(str)
38
+ def parse_dev(value: str) -> Optional[int]:
39
+ v: str = value
40
+ v = v.replace("_", ".")
41
+ v = v.replace("-", ".")
42
+ m: Any = Pattern.PARSER.bound.search(v)
43
+ x: Any
44
+ y: Any
45
+ x, y = m.groups()
46
+ if x not in (None, "dev"):
47
+ raise ValueError
48
+ if y is not None:
49
+ return int(y)
50
+
51
+
52
+ parse_post: Digest = Digest("parse_post")
53
+
54
+
55
+ @parse_post.overload()
56
+ def parse_post() -> None:
57
+ return
58
+
59
+
60
+ @parse_post.overload(int)
61
+ def parse_post(value: int) -> int:
62
+ if value < 0:
63
+ raise ValueError
64
+ return value
65
+
66
+
67
+ @parse_post.overload(list)
68
+ def parse_post(value: list) -> Optional[int]:
69
+ v: list = list(map(segmenting.segment, value))
70
+ if len(v) == 0:
71
+ raise ValueError
72
+ if len(v) > 2:
73
+ raise ValueError
74
+ if len(v) == 1:
75
+ v.insert(0, "")
76
+ if v[0] not in ("post", "rev", "r", ""):
77
+ raise ValueError
78
+ if isinstance(v[1], str):
79
+ raise TypeError
80
+ return v[1]
81
+
82
+
83
+ @parse_post.overload(str)
84
+ def parse_post(value: str) -> Optional[int]:
85
+ v: str = value
86
+ v = v.replace("_", ".")
87
+ v = v.replace("-", ".")
88
+ m: Any = Pattern.PARSER.bound.search(v)
89
+ x: Any
90
+ y: Any
91
+ x, y = m.groups()
92
+ if x not in (None, "post", "rev", "r"):
93
+ raise ValueError
94
+ if y is not None:
95
+ return int(y)
96
+
97
+
98
+ parse_pre: Digest = Digest("parse_pre")
99
+
100
+
101
+ @parse_pre.overload()
102
+ def parse_pre() -> tuple:
103
+ return None, None
104
+
105
+
106
+ @parse_pre.overload(list)
107
+ def parse_pre(value: list) -> tuple:
108
+ x: Any
109
+ y: Any
110
+ x, y = map(segmenting.segment, value)
111
+ if (x, y) == (None, None):
112
+ return None, None
113
+ x = Cfg.cfg.data["phases"][x]
114
+ if not isinstance(y, int):
115
+ raise TypeError
116
+ return x, y
117
+
118
+
119
+ @parse_pre.overload(str)
120
+ def parse_pre(value: str) -> tuple:
121
+ if value == "":
122
+ return [None, None]
123
+ v: str = value
124
+ v = v.replace("_", ".")
125
+ v = v.replace("-", ".")
126
+ m: Any = Pattern.PARSER.bound.search(v)
127
+ l: Any
128
+ n: Any
129
+ l, n = m.groups()
130
+ l = Cfg.cfg.data["phases"][l]
131
+ n = 0 if (n is None) else int(n)
132
+ return l, n
@@ -13,34 +13,6 @@ from v440.core.Release import Release
13
13
  __all__ = ["Base"]
14
14
 
15
15
 
16
- parse_epoch: Digest = Digest("parse_epoch")
17
-
18
-
19
- @parse_epoch.overload()
20
- def parse_epoch() -> int:
21
- return 0
22
-
23
-
24
- @parse_epoch.overload(int)
25
- def parse_epoch(value: int) -> int:
26
- if value < 0:
27
- raise ValueError
28
- return value
29
-
30
-
31
- @parse_epoch.overload(str)
32
- def parse_epoch(value: str) -> int:
33
- s: str = value
34
- if s.endswith("!"):
35
- s = s[:-1]
36
- if s == "":
37
- return 0
38
- ans: int = int(s)
39
- if ans < 0:
40
- raise ValueError
41
- return ans
42
-
43
-
44
16
  class Base(SlotStringer):
45
17
 
46
18
  __slots__ = ("_epoch", "_release")
@@ -1,10 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import operator
4
+ import string as string_
3
5
  from typing import *
4
6
 
5
- import setdoc
6
-
7
- from v440._utils import segmenting
8
7
  from v440._utils.ListStringer import ListStringer
9
8
 
10
9
  __all__ = ["Local"]
@@ -18,16 +17,28 @@ class Local(ListStringer):
18
17
 
19
18
  @classmethod
20
19
  def _data_parse(cls: type, value: list) -> Iterable:
21
- ans: tuple = tuple(map(segmenting.segment, value))
22
- if None in ans:
23
- raise ValueError
24
- return ans
20
+ return tuple(map(cls._item_parse, value))
25
21
 
26
22
  def _format(self: Self, format_spec: str) -> str:
27
23
  if format_spec:
28
24
  raise ValueError
29
25
  return ".".join(map(str, self))
30
26
 
27
+ @classmethod
28
+ def _item_parse(cls: type, value: Any) -> int | str:
29
+ ans: int | str
30
+ if isinstance(value, int):
31
+ ans = operator.index(value)
32
+ if ans < 0:
33
+ raise ValueError
34
+ else:
35
+ ans = str(value).lower()
36
+ if ans.strip(string_.digits + string_.ascii_lowercase):
37
+ raise ValueError
38
+ if not ans.strip(string_.digits):
39
+ ans = int(ans)
40
+ return ans
41
+
31
42
  @classmethod
32
43
  def _sort(cls: type, value: Any) -> tuple[bool, int | str]:
33
44
  return type(value) is int, value
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: v440
3
- Version: 2.0.0.dev79
3
+ Version: 2.0.0.dev81
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)
@@ -19,7 +19,8 @@ src/v440/_utils/__init__.py
19
19
  src/v440/_utils/cfg.toml
20
20
  src/v440/_utils/guarding.py
21
21
  src/v440/_utils/qualparse.py
22
- src/v440/_utils/segmenting.py
22
+ src/v440/_utils/qualparse/__init__.py
23
+ src/v440/_utils/qualparse/segmenting.py
23
24
  src/v440/_utils/releaseparse/__init__.py
24
25
  src/v440/_utils/releaseparse/listing.py
25
26
  src/v440/_utils/releaseparse/numerals.py
File without changes
File without changes
File without changes
File without changes