Coverage for src / c41811 / config / basic / sequence.py: 100%

99 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2025-12-09 01:06 +0000

1# cython: language_level = 3 # noqa: ERA001 

2 

3 

4""" 

5序列类型配置数据实现 

6 

7.. versionadded:: 0.2.0 

8""" 

9 

10import operator 

11from collections.abc import Iterable 

12from collections.abc import Iterator 

13from collections.abc import MutableSequence 

14from collections.abc import Sequence 

15from typing import Any 

16from typing import Literal 

17from typing import Self 

18from typing import cast 

19from typing import override 

20 

21from ._generate_operators import generate 

22from ._generate_operators import operate 

23from .core import BasicIndexedConfigData 

24from .core import BasicSingleConfigData 

25from .utils import check_read_only 

26 

27 

28@generate 

29class SequenceConfigData[D: Sequence[Any]](BasicIndexedConfigData[D], MutableSequence[Any]): 

30 """ 

31 序列配置数据 

32 

33 .. versionadded:: 0.1.5 

34 """ 

35 

36 _data: D 

37 data: D 

38 

39 def __init__(self, data: D | None = None): 

40 """ 

41 :param data: 序列数据 

42 :type data: D | None 

43 """ # noqa: D205 

44 if data is None: 

45 data = [] # type: ignore[assignment] 

46 super().__init__(cast(D, data)) 

47 

48 @property 

49 @override 

50 def data_read_only(self) -> bool: 

51 return not isinstance(self._data, MutableSequence) 

52 

53 @override 

54 @check_read_only 

55 def append(self, value: Any) -> None: 

56 self._data.append(value) # type: ignore[attr-defined] 

57 

58 @override 

59 @check_read_only 

60 def insert(self, index: int, value: Any) -> None: 

61 self._data.insert(index, value) # type: ignore[attr-defined] 

62 

63 @override 

64 @check_read_only 

65 def extend(self, values: Iterable[Any]) -> None: 

66 self._data.extend(values) # type: ignore[attr-defined] 

67 

68 @override 

69 def index(self, *args: Any) -> int: 

70 return self._data.index(*args) 

71 

72 @override 

73 def count(self, value: Any) -> int: 

74 return self._data.count(value) 

75 

76 @override 

77 @check_read_only 

78 def pop(self, index: int = -1) -> Any: 

79 return self._data.pop(index) # type: ignore[attr-defined] 

80 

81 @override 

82 @check_read_only 

83 def remove(self, value: Any) -> None: 

84 self._data.remove(value) # type: ignore[attr-defined] 

85 

86 @override 

87 @check_read_only 

88 def clear(self) -> None: 

89 self._data.clear() # type: ignore[attr-defined] 

90 

91 @override 

92 @check_read_only 

93 def reverse(self) -> None: 

94 self._data.reverse() # type: ignore[attr-defined] 

95 

96 @override 

97 def __reversed__(self) -> Iterator[D]: 

98 return reversed(self._data) 

99 

100 @operate(operator.mul, operator.imul) 

101 def __mul__(self, other: Any) -> Self: # type: ignore[empty-body] 

102 ... 

103 

104 @operate(operator.add, operator.iadd) 

105 def __add__(self, other: Any) -> Self: # type: ignore[empty-body] 

106 ... 

107 

108 def __rmul__(self, other: Any) -> Self: # type: ignore[empty-body] 

109 ... 

110 

111 def __radd__(self, other: Any) -> Self: # type: ignore[empty-body] 

112 ... 

113 

114 

115@generate 

116class StringConfigData[D: str | bytes](BasicSingleConfigData[D]): 

117 """字符/字节串配置数据""" 

118 

119 _data: D 

120 

121 def __init__(self, data: D | None = None): 

122 """ 

123 :param data: 配置数据 

124 :type data: D | None 

125 """ # noqa: D205 

126 if data is None: 

127 data = "" # type: ignore[assignment] 

128 super().__init__(cast(D, data)) 

129 

130 @property 

131 @override 

132 def data_read_only(self) -> Literal[False]: 

133 """ 

134 配置数据是否为只读 

135 

136 :return: 配置数据是否为只读 

137 :rtype: Literal[False] 

138 

139 .. note:: 

140 该配置数据类始终认为配置数据非只读,使其能正确作为配置数据容器使用 

141 """ # noqa: RUF002 

142 return False 

143 

144 @property # type: ignore[explicit-override] # mypy抽风 

145 @override 

146 def data(self) -> D: 

147 """ 

148 配置的原始数据 

149 

150 .. caution:: 

151 未默认做深拷贝,可能导致非预期的行为 

152 

153 .. versionchanged:: 0.3.0 

154 现在是可写属性 

155 """ # noqa: RUF002 

156 return self._data 

157 

158 @data.setter 

159 def data(self, data: D) -> None: 

160 self._data = data 

161 

162 @override 

163 def __format__(self, format_spec: str) -> str: 

164 return self._data.__format__(format_spec) 

165 

166 @operate(operator.add, operator.iadd) 

167 def __add__(self, other: Any) -> Self: # type: ignore[empty-body] 

168 ... 

169 

170 @operate(operator.mul, operator.imul) 

171 def __mul__(self, other: Any) -> Self: # type: ignore[empty-body] 

172 ... 

173 

174 def __contains__(self, key: Any) -> bool: 

175 return key in self._data 

176 

177 def __iter__(self) -> Iterator[D]: 

178 return iter(cast(Iterable[D], self._data)) 

179 

180 def __len__(self) -> int: 

181 return len(self._data) 

182 

183 def __getitem__(self, item: Any) -> D: 

184 return cast(D, self._data[item]) 

185 

186 @check_read_only 

187 def __setitem__(self, key: Any, value: D) -> None: 

188 self._data[key] = value # type: ignore[index] 

189 

190 @check_read_only 

191 def __delitem__(self, key: Any) -> None: 

192 del self._data[key] # type: ignore[union-attr] 

193 

194 def __reversed__(self) -> Any: # 不支持reversed[D]语法 

195 return reversed(self._data) 

196 

197 

198__all__ = ( 

199 "SequenceConfigData", 

200 "StringConfigData", 

201)