v440 2.0.0.dev16__tar.gz → 2.0.0.dev18__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.dev16/src/v440.egg-info → v440-2.0.0.dev18}/PKG-INFO +1 -1
  2. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/pyproject.toml +1 -1
  3. v440-2.0.0.dev18/src/v440/_utils/BaseList.py +9 -0
  4. v440-2.0.0.dev18/src/v440/_utils/SlotList.py +129 -0
  5. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/_utils/VList.py +6 -1
  6. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/core/Base.py +7 -6
  7. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/core/Pre.py +24 -10
  8. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/core/Public.py +11 -10
  9. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/core/Qualification.py +8 -10
  10. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/core/Version.py +7 -6
  11. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/tests/test_testdata.py +15 -8
  12. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/tests/test_version.py +11 -11
  13. {v440-2.0.0.dev16 → v440-2.0.0.dev18/src/v440.egg-info}/PKG-INFO +1 -1
  14. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440.egg-info/SOURCES.txt +2 -1
  15. v440-2.0.0.dev16/src/v440/_utils/WList.py +0 -17
  16. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/LICENSE.txt +0 -0
  17. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/MANIFEST.in +0 -0
  18. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/README.rst +0 -0
  19. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/setup.cfg +0 -0
  20. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/__init__.py +0 -0
  21. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/_utils/Digest.py +0 -0
  22. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/_utils/Pattern.py +0 -0
  23. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/_utils/SimpleQualifierParser.py +0 -0
  24. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/_utils/__init__.py +0 -0
  25. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/_utils/utils.py +0 -0
  26. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/core/Local.py +0 -0
  27. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/core/Release.py +0 -0
  28. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/core/VersionError.py +0 -0
  29. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/core/__init__.py +0 -0
  30. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/tests/__init__.py +0 -0
  31. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440/tests/testdata.toml +0 -0
  32. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440.egg-info/dependency_links.txt +0 -0
  33. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/src/v440.egg-info/requires.txt +0 -0
  34. {v440-2.0.0.dev16 → v440-2.0.0.dev18}/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.dev16
3
+ Version: 2.0.0.dev18
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)
@@ -34,7 +34,7 @@ keywords = []
34
34
  name = "v440"
35
35
  readme = "README.rst"
36
36
  requires-python = ">=3.11"
37
- version = "2.0.0.dev16"
37
+ version = "2.0.0.dev18"
38
38
 
39
39
  [project.license]
40
40
  file = "LICENSE.txt"
@@ -0,0 +1,9 @@
1
+ from abc import abstractmethod
2
+ from typing import *
3
+
4
+
5
+ class BaseList:
6
+ __slots__ = ()
7
+
8
+ @abstractmethod
9
+ def isempty(self: Self) -> bool: ...
@@ -0,0 +1,129 @@
1
+ import collections
2
+ import operator
3
+ from abc import abstractmethod
4
+ from typing import *
5
+
6
+ import scaevola
7
+ from datarepr import datarepr
8
+ from unhash import unhash
9
+
10
+ from v440._utils.BaseList import BaseList
11
+ from v440._utils.utils import guard
12
+ from v440.core.VersionError import VersionError
13
+
14
+ __all__ = ["SlotList"]
15
+
16
+
17
+ @scaevola.auto
18
+ class SlotList(collections.abc.Collection, BaseList):
19
+ __slots__ = ()
20
+
21
+ data: list
22
+
23
+ def __contains__(self: Self, other: Any) -> bool:
24
+ return other in self.data
25
+
26
+ def __eq__(self: Self, other: Any) -> bool:
27
+ "This magic method implements self==other."
28
+ try:
29
+ alt: Self = type(self)(other)
30
+ except VersionError:
31
+ return False
32
+ else:
33
+ return self.data == alt.data
34
+
35
+ def __format__(self: Self, format_spec: Any = "", /) -> str:
36
+ "This magic method implements format(self, format_spec)."
37
+ return format(str(self), str(format_spec))
38
+
39
+ def __getitem__(self: Self, key: Any) -> Any:
40
+ return self.data[key]
41
+
42
+ def __ge__(self: Self, other: Any, /) -> bool:
43
+ "This magic method implements self<=other."
44
+ alt: Self
45
+ try:
46
+ alt = type(self)(other)
47
+ except VersionError:
48
+ return NotImplemented
49
+ else:
50
+ return self._cmp() >= alt._cmp()
51
+
52
+ def __gt__(self: Self, other: Any, /) -> bool:
53
+ "This magic method implements self<=other."
54
+ alt: Self
55
+ try:
56
+ alt = type(self)(other)
57
+ except VersionError:
58
+ return NotImplemented
59
+ else:
60
+ return self._cmp() > alt._cmp()
61
+
62
+ __hash__ = unhash
63
+
64
+ def __init__(self: Self, data: Any = None) -> None:
65
+ self.data = data
66
+
67
+ def __iter__(self: Self) -> Any:
68
+ return iter(self.data)
69
+
70
+ def __le__(self: Self, other: Any, /) -> bool:
71
+ "This magic method implements self<=other."
72
+ alt: Self
73
+ try:
74
+ alt = type(self)(other)
75
+ except VersionError:
76
+ return NotImplemented
77
+ else:
78
+ return self._cmp() <= alt._cmp()
79
+
80
+ def __len__(self: Self) -> int:
81
+ return len(type(self).__slots__)
82
+
83
+ def __lt__(self: Self, other: Any, /) -> bool:
84
+ "This magic method implements self<=other."
85
+ alt: Self
86
+ try:
87
+ alt = type(self)(other)
88
+ except VersionError:
89
+ return NotImplemented
90
+ else:
91
+ return self._cmp() < alt._cmp()
92
+
93
+ def __ne__(self: Self, other: Any) -> bool:
94
+ return not (self == other)
95
+
96
+ def __repr__(self: Self) -> str:
97
+ return datarepr(type(self).__name__, self.data)
98
+
99
+ def __reversed__(self: Self) -> Iterable:
100
+ return reversed(self.data)
101
+
102
+ def __setitem__(self: Self, key: Any, value: Any) -> None:
103
+ data: list = self.data
104
+ data[key] = value
105
+ self.data = data
106
+
107
+ def __str__(self: Self) -> str:
108
+ return NotImplemented
109
+
110
+ @classmethod
111
+ def __subclasshook__(cls: type, other: type, /) -> bool:
112
+ "This magic classmethod can be overwritten for a custom subclass check."
113
+ return NotImplemented
114
+
115
+ def _cmp(self: Self) -> Any:
116
+ return self.data
117
+
118
+ def copy(self: Self) -> Self:
119
+ return type(self)(self)
120
+
121
+ def count(self: Self, value: Any) -> Any:
122
+ return self.data.count(value)
123
+
124
+ @property
125
+ @abstractmethod
126
+ def data(self: Self) -> list: ...
127
+
128
+ def index(self: Self, value: Any) -> Any:
129
+ return self.data.index(value)
@@ -2,10 +2,12 @@ from typing import *
2
2
 
3
3
  from datahold import OkayList
4
4
 
5
+ from v440._utils.BaseList import BaseList
5
6
  from v440.core.VersionError import VersionError
6
7
 
7
8
 
8
- class VList(OkayList):
9
+ class VList(OkayList, BaseList):
10
+
9
11
  def __eq__(self: Self, other: Any) -> bool:
10
12
  "This magic method implements self==other."
11
13
  ans: bool
@@ -54,3 +56,6 @@ class VList(OkayList):
54
56
  ans: Any = self.copy()
55
57
  ans.sort(**kwargs)
56
58
  return ans
59
+
60
+ def isempty(self: Self) -> bool:
61
+ return len(self) == 0
@@ -3,8 +3,8 @@ from __future__ import annotations
3
3
  from typing import *
4
4
 
5
5
  from v440._utils.Digest import Digest
6
+ from v440._utils.SlotList import SlotList
6
7
  from v440._utils.utils import guard
7
- from v440._utils.WList import WList
8
8
  from v440.core.Release import Release
9
9
 
10
10
  __all__ = ["Base"]
@@ -64,7 +64,7 @@ def parse_epoch(value: str) -> int:
64
64
  return ans
65
65
 
66
66
 
67
- class Base(WList):
67
+ class Base(SlotList):
68
68
 
69
69
  __slots__ = ("_epoch", "_release")
70
70
 
@@ -81,11 +81,12 @@ class Base(WList):
81
81
  return self.format()
82
82
 
83
83
  @property
84
- def _data(self: Self) -> tuple:
85
- return self.epoch, self.release
84
+ def data(self: Self) -> list:
85
+ return [self.epoch, self.release]
86
86
 
87
- @_data.setter
88
- def _data(self: Self, value: Any) -> None:
87
+ @data.setter
88
+ @guard
89
+ def data(self: Self, value: Iterable) -> None:
89
90
  self.epoch, self.release = parse_data(value)
90
91
 
91
92
  @property
@@ -2,13 +2,11 @@ from __future__ import annotations
2
2
 
3
3
  from typing import *
4
4
 
5
- import keyalias
6
-
7
5
  from v440._utils import utils
8
6
  from v440._utils.Digest import Digest
9
7
  from v440._utils.Pattern import Pattern
8
+ from v440._utils.SlotList import SlotList
10
9
  from v440._utils.utils import guard
11
- from v440._utils.WList import WList
12
10
 
13
11
  __all__ = ["Pre"]
14
12
 
@@ -62,8 +60,7 @@ def parse_data(value: str) -> list:
62
60
  return [l, n]
63
61
 
64
62
 
65
- @keyalias.keyalias(phase=0, subphase=1)
66
- class Pre(WList):
63
+ class Pre(SlotList):
67
64
 
68
65
  __slots__ = ("_phase", "_subphase")
69
66
 
@@ -84,12 +81,29 @@ class Pre(WList):
84
81
  return ans
85
82
 
86
83
  @property
87
- def _data(self: Self) -> tuple:
88
- return self._phase, self._subphase
84
+ def data(self: Self) -> list:
85
+ return [self._phase, self._subphase]
89
86
 
90
- @_data.setter
91
- def _data(self: Self, value: Any) -> None:
87
+ @data.setter
88
+ @guard
89
+ def data(self: Self, value: Any) -> None:
92
90
  self._phase, self._subphase = parse_data(value)
93
91
 
94
92
  def isempty(self: Self) -> bool:
95
- return set(self._data) == {None}
93
+ return self.data == [None, None]
94
+
95
+ @property
96
+ def phase(self: Self) -> Optional[str]:
97
+ return self._phase
98
+
99
+ @phase.setter
100
+ def phase(self: Self, value: Any) -> None:
101
+ self[0] = value
102
+
103
+ @property
104
+ def subphase(self: Self) -> Optional[int]:
105
+ return self._subphase
106
+
107
+ @subphase.setter
108
+ def subphase(self: Self, value: Any) -> None:
109
+ self[1] = value
@@ -4,8 +4,8 @@ from typing import *
4
4
 
5
5
  from v440._utils.Digest import Digest
6
6
  from v440._utils.Pattern import Pattern
7
+ from v440._utils.SlotList import SlotList
7
8
  from v440._utils.utils import guard
8
- from v440._utils.WList import WList
9
9
  from v440.core.Base import Base
10
10
  from v440.core.Qualification import Qualification
11
11
 
@@ -36,7 +36,7 @@ def parse_data(value: str) -> list:
36
36
  return value[: match.end()], value[match.end() :]
37
37
 
38
38
 
39
- class Public(WList):
39
+ class Public(SlotList):
40
40
 
41
41
  __slots__ = ("_base", "_qualification")
42
42
 
@@ -52,14 +52,6 @@ class Public(WList):
52
52
  def __str__(self: Self) -> str:
53
53
  return self.format()
54
54
 
55
- @property
56
- def _data(self: Self) -> list:
57
- return [self.base, self.qualification]
58
-
59
- @_data.setter
60
- def _data(self: Self, value: Any) -> None:
61
- self.base, self.qualification = parse_data(value)
62
-
63
55
  @property
64
56
  def base(self: Self) -> Base:
65
57
  return self._base
@@ -69,6 +61,15 @@ class Public(WList):
69
61
  def base(self: Self, value: Any) -> None:
70
62
  self.base.data = value
71
63
 
64
+ @property
65
+ def data(self: Self) -> list:
66
+ return [self.base, self.qualification]
67
+
68
+ @data.setter
69
+ @guard
70
+ def data(self: Self, value: Any) -> None:
71
+ self.base, self.qualification = parse_data(value)
72
+
72
73
  def format(self: Self, cutoff: Any = None) -> str:
73
74
  return self.base.format(cutoff) + str(self.qualification)
74
75
 
@@ -3,10 +3,10 @@ from __future__ import annotations
3
3
  from typing import *
4
4
 
5
5
  from v440._utils import SimpleQualifierParser
6
+ from v440._utils.BaseList import BaseList
6
7
  from v440._utils.Digest import Digest
7
8
  from v440._utils.Pattern import Pattern
8
9
  from v440._utils.utils import guard
9
- from v440._utils.WList import WList
10
10
  from v440.core.Pre import Pre
11
11
 
12
12
  __all__ = ["Qualification"]
@@ -57,7 +57,7 @@ def parse_data(value: str) -> list:
57
57
  return [pre, post, dev]
58
58
 
59
59
 
60
- class Qualification(WList):
60
+ class Qualification(BaseList):
61
61
 
62
62
  __slots__ = ("_pre", "_post", "_dev")
63
63
 
@@ -72,9 +72,6 @@ class Qualification(WList):
72
72
  self._dev = None
73
73
  self.data = data
74
74
 
75
- def __le__(self: Self, other: Any) -> bool:
76
- return self._cmpkey() <= type(self)(other)._cmpkey()
77
-
78
75
  def __str__(self: Self) -> str:
79
76
  ans: str = str(self.pre)
80
77
  if self.post is not None:
@@ -83,7 +80,7 @@ class Qualification(WList):
83
80
  ans += ".dev%s" % self.dev
84
81
  return ans
85
82
 
86
- def _cmpkey(self: Self) -> tuple:
83
+ def _cmp(self: Self) -> list:
87
84
  ans = self.data
88
85
  if not ans[0].isempty():
89
86
  ans[0] = tuple(ans[0])
@@ -100,11 +97,12 @@ class Qualification(WList):
100
97
  return ans
101
98
 
102
99
  @property
103
- def _data(self: Self) -> tuple:
104
- return self.pre, self.post, self.dev
100
+ def data(self: Self) -> list:
101
+ return [self.pre, self.post, self.dev]
105
102
 
106
- @_data.setter
107
- def _data(self: Self, value: Any) -> None:
103
+ @data.setter
104
+ @guard
105
+ def data(self: Self, value: Any) -> None:
108
106
  self.pre, self.post, self.dev = parse_data(value)
109
107
 
110
108
  @property
@@ -5,8 +5,8 @@ from typing import *
5
5
  import packaging.version
6
6
 
7
7
  from v440._utils.Digest import Digest
8
+ from v440._utils.SlotList import SlotList
8
9
  from v440._utils.utils import guard
9
- from v440._utils.WList import WList
10
10
  from v440.core.Base import Base
11
11
  from v440.core.Local import Local
12
12
  from v440.core.Pre import Pre
@@ -40,7 +40,7 @@ def parse_data(value: str) -> list:
40
40
  return [value, None]
41
41
 
42
42
 
43
- class Version(WList):
43
+ class Version(SlotList):
44
44
  __slots__ = ("_public", "_local")
45
45
  base: Base
46
46
  data: list
@@ -63,11 +63,12 @@ class Version(WList):
63
63
  return self.format()
64
64
 
65
65
  @property
66
- def _data(self: Self) -> tuple:
67
- return (self.public, self.local)
66
+ def data(self: Self) -> list:
67
+ return [self.public, self.local]
68
68
 
69
- @_data.setter
70
- def _data(self: Self, value: Any) -> None:
69
+ @data.setter
70
+ @guard
71
+ def data(self: Self, value: Any) -> None:
71
72
  self.public, self.local = parse_data(value)
72
73
 
73
74
  @property
@@ -355,14 +355,6 @@ class TestPackaging(unittest.TestCase):
355
355
  version_obj.local = v.packaging().local
356
356
  self.assertEqual(str(v.local), str(version_obj.local))
357
357
 
358
- def test_exc(self: Self) -> None:
359
- l: list
360
- x: str
361
- for l in Util.util.data["strings"]["exc"].values():
362
- for x in l:
363
- with self.assertRaises(VersionError):
364
- Version(x)
365
-
366
358
  def test_exc_pack(self: Self) -> None:
367
359
  impure: list = list()
368
360
  l: list
@@ -376,5 +368,20 @@ class TestPackaging(unittest.TestCase):
376
368
  packaging.version.Version(x)
377
369
 
378
370
 
371
+ class TestExc(unittest.TestCase):
372
+ def test_exc(self: Self) -> None:
373
+ k: str
374
+ l: list
375
+ for k, l in Util.util.data["strings"]["exc"].items():
376
+ self.go(key=k, queries=l)
377
+
378
+ def go(self: Self, key: str, queries: list) -> None:
379
+ x: str
380
+ with self.subTest(key=key):
381
+ for x in queries:
382
+ with self.assertRaises(VersionError):
383
+ Version(x)
384
+
385
+
379
386
  if __name__ == "__main__":
380
387
  unittest.main()
@@ -104,9 +104,9 @@ class TestExample(unittest.TestCase):
104
104
  v.release.micro = 4
105
105
  self.assertEqual(str(v), "2.64.4") # Further modified version
106
106
 
107
- def test_example_3(self: Self) -> None:
107
+ def test_example_3a(self: Self) -> None:
108
108
  v1: Version = Version("1.6.3")
109
- v2: Version = Version("1.6.4")
109
+ v2: str = "1.6.4"
110
110
  self.assertEqual(str(v1), "1.6.3") # v1
111
111
  self.assertEqual(str(v2), "1.6.4") # v2
112
112
  self.assertFalse(v1 == v2) # v1 == v2 gives False
@@ -116,9 +116,9 @@ class TestExample(unittest.TestCase):
116
116
  self.assertFalse(v1 > v2) # v1 > v2 gives False
117
117
  self.assertTrue(v1 < v2) # v1 < v2 gives True
118
118
 
119
- def test_example_3a(self: Self) -> None:
120
- v1: Version = Version("1.6.3")
121
- v2: str = "1.6.4"
119
+ def test_example_3b(self: Self) -> None:
120
+ v1: str = "1.6.3"
121
+ v2: Version = Version("1.6.4")
122
122
  self.assertEqual(str(v1), "1.6.3") # v1
123
123
  self.assertEqual(str(v2), "1.6.4") # v2
124
124
  self.assertFalse(v1 == v2) # v1 == v2 gives False
@@ -128,8 +128,8 @@ class TestExample(unittest.TestCase):
128
128
  self.assertFalse(v1 > v2) # v1 > v2 gives False
129
129
  self.assertTrue(v1 < v2) # v1 < v2 gives True
130
130
 
131
- def test_example_3b(self: Self) -> None:
132
- v1: str = "1.6.3"
131
+ def test_example_3c(self: Self) -> None:
132
+ v1: Version = Version("1.6.3")
133
133
  v2: Version = Version("1.6.4")
134
134
  self.assertEqual(str(v1), "1.6.3") # v1
135
135
  self.assertEqual(str(v2), "1.6.4") # v2
@@ -181,7 +181,7 @@ class TestExample(unittest.TestCase):
181
181
  self.assertEqual(str(v), "0") # After reset
182
182
  v.base = "4!5.0.1"
183
183
  self.assertEqual(str(v), "4!5.0.1") # Before error
184
- with self.assertRaises(VersionError) as context:
184
+ with self.assertRaises(VersionError):
185
185
  v.base = "9!x"
186
186
  self.assertEqual(str(v), "4!5.0.1") # After error
187
187
 
@@ -190,7 +190,7 @@ class TestPatch(unittest.TestCase):
190
190
  def test_example_0(self: Self) -> None:
191
191
  x: Pre = Pre("a1")
192
192
  y: Pre = Pre("b2")
193
- with self.assertRaises(VersionError):
193
+ with self.assertRaises(Exception):
194
194
  x += y
195
195
 
196
196
 
@@ -286,7 +286,7 @@ class TestAdditionalVersionRelease(unittest.TestCase):
286
286
  # Test if release supports iteration
287
287
  version: Version = Version()
288
288
  version.release = [1, 2, 3]
289
- result = [x for x in version.release]
289
+ result = list(version.release)
290
290
  self.assertEqual(result, [1, 2, 3])
291
291
 
292
292
  def test_release_repr(self: Self) -> None:
@@ -389,7 +389,7 @@ class TestVersionLocal(unittest.TestCase):
389
389
  # Test if local supports iteration
390
390
  version: Version = Version()
391
391
  version.local = "1.dev.build"
392
- result: list = [x for x in version.local]
392
+ result: list = list(version.local)
393
393
  self.assertEqual(result, [1, "dev", "build"])
394
394
 
395
395
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: v440
3
- Version: 2.0.0.dev16
3
+ Version: 2.0.0.dev18
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)
@@ -9,11 +9,12 @@ src/v440.egg-info/SOURCES.txt
9
9
  src/v440.egg-info/dependency_links.txt
10
10
  src/v440.egg-info/requires.txt
11
11
  src/v440.egg-info/top_level.txt
12
+ src/v440/_utils/BaseList.py
12
13
  src/v440/_utils/Digest.py
13
14
  src/v440/_utils/Pattern.py
14
15
  src/v440/_utils/SimpleQualifierParser.py
16
+ src/v440/_utils/SlotList.py
15
17
  src/v440/_utils/VList.py
16
- src/v440/_utils/WList.py
17
18
  src/v440/_utils/__init__.py
18
19
  src/v440/_utils/utils.py
19
20
  src/v440/core/Base.py
@@ -1,17 +0,0 @@
1
- from typing import *
2
-
3
- from v440._utils.utils import guard
4
- from v440._utils.VList import VList
5
-
6
- __all__ = ["WList"]
7
-
8
-
9
- class WList(VList):
10
- @property
11
- def data(self: Self) -> list:
12
- return list(self._data)
13
-
14
- @data.setter
15
- @guard
16
- def data(self: Self, value: Any) -> None:
17
- self._data = value
File without changes
File without changes
File without changes
File without changes