v440 2.0.0.dev59__tar.gz → 2.0.0.dev60__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.dev59/src/v440.egg-info → v440-2.0.0.dev60}/PKG-INFO +1 -1
  2. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/pyproject.toml +1 -1
  3. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/_utils/BaseList.py +15 -0
  4. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/_utils/SlotList.py +1 -0
  5. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/_utils/VList.py +1 -0
  6. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/core/Base.py +9 -0
  7. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/core/Local.py +9 -0
  8. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/core/Public.py +6 -0
  9. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/core/Qual.py +22 -0
  10. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/core/Release.py +7 -0
  11. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/core/Version.py +9 -0
  12. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/tests/test_version.py +35 -21
  13. {v440-2.0.0.dev59 → v440-2.0.0.dev60/src/v440.egg-info}/PKG-INFO +1 -1
  14. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/LICENSE.txt +0 -0
  15. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/MANIFEST.in +0 -0
  16. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/README.rst +0 -0
  17. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/setup.cfg +0 -0
  18. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/__init__.py +0 -0
  19. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/_utils/Cfg.py +0 -0
  20. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/_utils/Digest.py +0 -0
  21. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/_utils/Pattern.py +0 -0
  22. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/_utils/__init__.py +0 -0
  23. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/_utils/cfg.toml +0 -0
  24. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/_utils/qualparse.py +0 -0
  25. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/_utils/utils.py +0 -0
  26. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/core/VersionError.py +0 -0
  27. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/core/__init__.py +0 -0
  28. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/tests/__init__.py +0 -0
  29. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/tests/test_testdata.py +0 -0
  30. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440/tests/testdata.toml +0 -0
  31. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440.egg-info/SOURCES.txt +0 -0
  32. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440.egg-info/dependency_links.txt +0 -0
  33. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/src/v440.egg-info/requires.txt +0 -0
  34. {v440-2.0.0.dev59 → v440-2.0.0.dev60}/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.dev59
3
+ Version: 2.0.0.dev60
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.dev59"
39
+ version = "2.0.0.dev60"
40
40
 
41
41
  [project.license]
42
42
  file = "LICENSE.txt"
@@ -7,6 +7,7 @@ import setdoc
7
7
  import unhash
8
8
  from datarepr import datarepr
9
9
 
10
+ from v440._utils.utils import guard
10
11
  from v440.core.VersionError import VersionError
11
12
 
12
13
 
@@ -14,6 +15,8 @@ from v440.core.VersionError import VersionError
14
15
  class BaseList(collections.abc.Collection):
15
16
  __slots__ = ()
16
17
 
18
+ string: str
19
+
17
20
  @abstractmethod
18
21
  @setdoc.basic
19
22
  def __bool__(self: Self) -> bool: ...
@@ -122,6 +125,9 @@ class BaseList(collections.abc.Collection):
122
125
  @abstractmethod
123
126
  def _format(self: Self, format_spec: str) -> str: ...
124
127
 
128
+ @abstractmethod
129
+ def _string_fset(self: Self, value: str) -> None: ...
130
+
125
131
  @setdoc.basic
126
132
  def copy(self: Self) -> Self:
127
133
  return type(self)(self)
@@ -138,3 +144,12 @@ class BaseList(collections.abc.Collection):
138
144
  def index(self: Self, *args: Any) -> None:
139
145
  "This method returns the index of the first occurence."
140
146
  return self.data.index(*args)
147
+
148
+ @property
149
+ def string(self: Self) -> str:
150
+ return self._format("")
151
+
152
+ @string.setter
153
+ @guard
154
+ def string(self: Self, value: Any) -> None:
155
+ self._string_fset(str(value))
@@ -12,6 +12,7 @@ class SlotList(BaseList):
12
12
  __slots__ = ()
13
13
 
14
14
  data: tuple
15
+ string: str
15
16
 
16
17
  @setdoc.basic
17
18
  def __bool__(self: Self) -> bool:
@@ -12,6 +12,7 @@ class VList(BaseList):
12
12
 
13
13
  __slots__ = ("_data",)
14
14
  data: tuple
15
+ string: str
15
16
 
16
17
  @setdoc.basic
17
18
  def __add__(self: Self, other: Any) -> Self:
@@ -71,6 +71,7 @@ class Base(SlotList):
71
71
  __slots__ = ("_epoch", "_release")
72
72
 
73
73
  data: tuple
74
+ string: str
74
75
  epoch: int
75
76
  release: Release
76
77
 
@@ -87,6 +88,14 @@ class Base(SlotList):
87
88
  ans += format(self.release, format_spec)
88
89
  return ans
89
90
 
91
+ def _string_fset(self: Self, value: str) -> None:
92
+ parsed: Iterable
93
+ if "!" in value:
94
+ parsed = value.split("!")
95
+ else:
96
+ parsed = 0, value
97
+ self.epoch, self.release.string = parsed
98
+
90
99
  @property
91
100
  @setdoc.basic
92
101
  def data(self: Self) -> tuple:
@@ -50,6 +50,7 @@ class Local(VList):
50
50
  __slots__ = ()
51
51
 
52
52
  data: tuple[int | str]
53
+ string: str
53
54
 
54
55
  @setdoc.basic
55
56
  def __init__(self: Any, data: Any = None) -> None:
@@ -64,6 +65,14 @@ class Local(VList):
64
65
  def _sort(cls: type, value: Any) -> tuple[bool, int | str]:
65
66
  return type(value) is int, value
66
67
 
68
+ def _string_fset(self: Self, value: str) -> None:
69
+ v: str = value
70
+ if v.startswith("+"):
71
+ v = v[1:]
72
+ v = v.replace("_", ".")
73
+ v = v.replace("-", ".")
74
+ self.data = v.split(".")
75
+
67
76
  @property
68
77
  @setdoc.basic
69
78
  def data(self: Self) -> tuple[int | str]:
@@ -43,6 +43,7 @@ class Public(SlotList):
43
43
  __slots__ = ("_base", "_qual")
44
44
 
45
45
  data: tuple
46
+ string: str
46
47
  base: Base
47
48
  qual: Qual
48
49
 
@@ -55,6 +56,11 @@ class Public(SlotList):
55
56
  def _format(self: Self, format_spec: str) -> str:
56
57
  return format(self.base, format_spec) + format(self.qual)
57
58
 
59
+ def _string_fset(self: Self, value: str) -> None:
60
+ match: Any = Pattern.PUBLIC.leftbound.search(value)
61
+ self.base.string = value[: match.end()]
62
+ self.qual.string = value[match.end() :]
63
+
58
64
  @property
59
65
  def base(self: Self) -> Base:
60
66
  "This property represents the version base."
@@ -16,6 +16,7 @@ class Qual(SlotList):
16
16
  __slots__ = ("_prephase", "_presubphase", "_post", "_dev")
17
17
 
18
18
  data: tuple
19
+ string: str
19
20
  pre: tuple
20
21
  prephase: Optional[str]
21
22
  presubphase: Optional[int]
@@ -62,6 +63,27 @@ class Qual(SlotList):
62
63
  ans += ".dev%s" % self.dev
63
64
  return ans
64
65
 
66
+ def _string_fset(self: Self, value: str) -> None:
67
+ v: str = value
68
+ m: Any
69
+ x: Any
70
+ y: Any
71
+ while v:
72
+ m = Pattern.QUALIFIERS.leftbound.search(v)
73
+ v = v[m.end() :]
74
+ if m.group("N"):
75
+ self.post = m.group("N")
76
+ continue
77
+ x = m.group("l")
78
+ y = m.group("n")
79
+ if x == "dev":
80
+ self.dev = y
81
+ continue
82
+ if x in ("post", "r", "rev"):
83
+ self.post = y
84
+ continue
85
+ self.pre = x, y
86
+
65
87
  @property
66
88
  @setdoc.basic
67
89
  def data(self: Self) -> tuple:
@@ -104,6 +104,7 @@ class Release(VList):
104
104
  __slots__ = ()
105
105
 
106
106
  data: tuple[int]
107
+ string: str
107
108
  major: int
108
109
  minor: int
109
110
  micro: int
@@ -240,6 +241,12 @@ class Release(VList):
240
241
  def _sort(cls: type, value: int) -> int:
241
242
  return value
242
243
 
244
+ def _string_fset(self: Self, value: str) -> None:
245
+ v: str = value
246
+ v = v.replace("_", ".")
247
+ v = v.replace("-", ".")
248
+ self.data = v.split(".")
249
+
243
250
  def bump(self: Self, index: SupportsIndex = -1, amount: SupportsIndex = 1) -> None:
244
251
  i: int = operator.index(index)
245
252
  a: int = operator.index(amount)
@@ -43,6 +43,7 @@ class Version(SlotList):
43
43
  __slots__ = ("_public", "_local")
44
44
 
45
45
  data: tuple
46
+ string: str
46
47
  local: Local
47
48
  public: Public
48
49
 
@@ -58,6 +59,14 @@ class Version(SlotList):
58
59
  ans += "+" + format(self.local)
59
60
  return ans
60
61
 
62
+ def _string_fset(self: Self, value: str) -> None:
63
+ parsed: Iterable
64
+ if "+" in value:
65
+ parsed = value.split("+")
66
+ else:
67
+ parsed = value, ""
68
+ self.public.string, self.local.string = parsed
69
+
61
70
  @property
62
71
  @setdoc.basic
63
72
  def data(self: Self) -> tuple:
@@ -105,27 +105,41 @@ class TestExample(unittest.TestCase):
105
105
  v.public.base.release.micro = 4
106
106
  self.assertEqual(str(v), "2.64.4") # Further modified version
107
107
 
108
- def test_example_3(self: Self) -> None:
109
- t: list = [
110
- [Version, str],
111
- [str, Version],
112
- [Version, Version],
113
- ]
114
- X: type
115
- Y: type
116
- x: Any
117
- y: Any
118
- for X, Y in t:
119
- x = X("1.6.3")
120
- y = Y("1.6.3")
121
- self.assertEqual(str(x), "1.6.3") # x
122
- self.assertEqual(str(y), "1.6.4") # y
123
- self.assertFalse(x == y) # x == y gives False
124
- self.assertTrue(x != y) # x != y gives True
125
- self.assertFalse(x >= y) # x >= y gives False
126
- self.assertTrue(x <= y) # x <= y gives True
127
- self.assertFalse(x > y) # x > y gives False
128
- self.assertTrue(x < y) # x < y gives True
108
+ def test_example_3a(self: Self) -> None:
109
+ v1: Version = Version("1.6.3")
110
+ v2: str = "1.6.4"
111
+ self.assertEqual(str(v1), "1.6.3") # v1
112
+ self.assertEqual(str(v2), "1.6.4") # v2
113
+ self.assertFalse(v1 == v2) # v1 == v2 gives False
114
+ self.assertTrue(v1 != v2) # v1 != v2 gives True
115
+ self.assertFalse(v1 >= v2) # v1 >= v2 gives False
116
+ self.assertTrue(v1 <= v2) # v1 <= v2 gives True
117
+ self.assertFalse(v1 > v2) # v1 > v2 gives False
118
+ self.assertTrue(v1 < v2) # v1 < v2 gives True
119
+
120
+ def test_example_3b(self: Self) -> None:
121
+ v1: str = "1.6.3"
122
+ v2: Version = Version("1.6.4")
123
+ self.assertEqual(str(v1), "1.6.3") # v1
124
+ self.assertEqual(str(v2), "1.6.4") # v2
125
+ self.assertFalse(v1 == v2) # v1 == v2 gives False
126
+ self.assertTrue(v1 != v2) # v1 != v2 gives True
127
+ self.assertFalse(v1 >= v2) # v1 >= v2 gives False
128
+ self.assertTrue(v1 <= v2) # v1 <= v2 gives True
129
+ self.assertFalse(v1 > v2) # v1 > v2 gives False
130
+ self.assertTrue(v1 < v2) # v1 < v2 gives True
131
+
132
+ def test_example_3c(self: Self) -> None:
133
+ v1: Version = Version("1.6.3")
134
+ v2: Version = Version("1.6.4")
135
+ self.assertEqual(str(v1), "1.6.3") # v1
136
+ self.assertEqual(str(v2), "1.6.4") # v2
137
+ self.assertFalse(v1 == v2) # v1 == v2 gives False
138
+ self.assertTrue(v1 != v2) # v1 != v2 gives True
139
+ self.assertFalse(v1 >= v2) # v1 >= v2 gives False
140
+ self.assertTrue(v1 <= v2) # v1 <= v2 gives True
141
+ self.assertFalse(v1 > v2) # v1 > v2 gives False
142
+ self.assertTrue(v1 < v2) # v1 < v2 gives True
129
143
 
130
144
  def test_example_4(self: Self) -> None:
131
145
  v: Version = Version("2.5.3.9")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: v440
3
- Version: 2.0.0.dev59
3
+ Version: 2.0.0.dev60
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