anb-python-components 1.2.1__py3-none-any.whl
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.
- anb_python_components/__init__.py +1 -0
- anb_python_components/classes/__init__.py +1 -0
- anb_python_components/classes/action_state.py +211 -0
- anb_python_components/classes/directory.py +115 -0
- anb_python_components/classes/file.py +226 -0
- anb_python_components/classes/shortcode_parser.py +195 -0
- anb_python_components/custom_types/__init__.py +3 -0
- anb_python_components/custom_types/guid.py +169 -0
- anb_python_components/custom_types/object_array.py +625 -0
- anb_python_components/custom_types/shortcode_attributes.py +128 -0
- anb_python_components/custom_types/two_dim_size.py +413 -0
- anb_python_components/custom_types/version_info.py +461 -0
- anb_python_components/enums/__init__.py +1 -0
- anb_python_components/enums/message_type.py +44 -0
- anb_python_components/enums/not_bool_action.py +24 -0
- anb_python_components/enums/type_copy_strategy.py +47 -0
- anb_python_components/exceptions/__init__.py +1 -0
- anb_python_components/exceptions/wrong_type_exception.py +20 -0
- anb_python_components/extensions/__init__.py +1 -0
- anb_python_components/extensions/array_extension.py +34 -0
- anb_python_components/extensions/bool_extension.py +87 -0
- anb_python_components/extensions/string_extension.py +259 -0
- anb_python_components/extensions/string_extension_constant.py +80 -0
- anb_python_components/extensions/type_extension.py +112 -0
- anb_python_components/models/__init__.py +1 -0
- anb_python_components/models/action_state_message.py +27 -0
- anb_python_components/models/shortcode_model.py +31 -0
- anb_python_components-1.2.1.dist-info/METADATA +12 -0
- anb_python_components-1.2.1.dist-info/RECORD +48 -0
- anb_python_components-1.2.1.dist-info/WHEEL +5 -0
- anb_python_components-1.2.1.dist-info/licenses/LICENSE +235 -0
- anb_python_components-1.2.1.dist-info/top_level.txt +2 -0
- tests/__init__.py +1 -0
- tests/classes/__init__.py +1 -0
- tests/classes/action_state_test.py +138 -0
- tests/classes/directory_test.py +19 -0
- tests/classes/file_test.py +79 -0
- tests/classes/shortcode_parser_test.py +105 -0
- tests/custom_types/__init__.py +1 -0
- tests/custom_types/guid_test.py +14 -0
- tests/custom_types/object_array_test.py +160 -0
- tests/custom_types/two_dim_size_test.py +37 -0
- tests/custom_types/version_info_test.py +51 -0
- tests/extensions/__init__.py +1 -0
- tests/extensions/array_extension_test.py +21 -0
- tests/extensions/bool_extension_test.py +19 -0
- tests/extensions/string_extension_test.py +55 -0
- tests/extensions/type_extension_test.py +38 -0
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
# anb_python_components/custom_types/version_info.py
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
from anb_python_components.extensions.string_extension import StringExtension
|
|
5
|
+
|
|
6
|
+
class VersionInfo:
|
|
7
|
+
"""
|
|
8
|
+
Класс для работы с версиями.
|
|
9
|
+
"""
|
|
10
|
+
# Шаблон вывода по умолчанию.
|
|
11
|
+
DEFAULT_TEMPLATE: str = '#{Major}.#{Minor}.#{Release}.#{Build} #{Stage} #{StageNumber}'
|
|
12
|
+
|
|
13
|
+
def __init__ (self, major: int, minor: int, release: int, build: int, stage: str = '', stage_number: int = 0):
|
|
14
|
+
"""
|
|
15
|
+
Создание экземпляра класса VersionInfo.
|
|
16
|
+
:param major: Мажорная версия.
|
|
17
|
+
:param minor: Минорная версия.
|
|
18
|
+
:param release: Номер релиза.
|
|
19
|
+
:param build: Номер сборки.
|
|
20
|
+
:param stage: Стадия.
|
|
21
|
+
:param stage_number: Номер стадии.
|
|
22
|
+
"""
|
|
23
|
+
self.__major: int = major
|
|
24
|
+
self.__minor: int = minor
|
|
25
|
+
self.__release: int = release
|
|
26
|
+
self.__build: int = build
|
|
27
|
+
self.__stage: str = stage
|
|
28
|
+
self.__stage_number: int = stage_number
|
|
29
|
+
|
|
30
|
+
# Мажорная версия
|
|
31
|
+
@property
|
|
32
|
+
def major (self) -> int:
|
|
33
|
+
"""
|
|
34
|
+
Получение значения major.
|
|
35
|
+
:return: Значение major.
|
|
36
|
+
"""
|
|
37
|
+
return self.__major
|
|
38
|
+
|
|
39
|
+
@major.setter
|
|
40
|
+
def major (self, value: int):
|
|
41
|
+
"""
|
|
42
|
+
Установка значения major.
|
|
43
|
+
:param value: Значение major.
|
|
44
|
+
:return: None
|
|
45
|
+
"""
|
|
46
|
+
self.__major = value if value >= 0 else 0
|
|
47
|
+
|
|
48
|
+
@major.deleter
|
|
49
|
+
def major (self):
|
|
50
|
+
"""
|
|
51
|
+
Удаление значения major.
|
|
52
|
+
:return: None
|
|
53
|
+
"""
|
|
54
|
+
self.__major = 0
|
|
55
|
+
|
|
56
|
+
# Минорная версия
|
|
57
|
+
@property
|
|
58
|
+
def minor (self) -> int:
|
|
59
|
+
"""
|
|
60
|
+
Получение значения minor.
|
|
61
|
+
:return: Значение minor.
|
|
62
|
+
"""
|
|
63
|
+
return self.__minor
|
|
64
|
+
|
|
65
|
+
@minor.setter
|
|
66
|
+
def minor (self, value: int):
|
|
67
|
+
"""
|
|
68
|
+
Установка значения minor.
|
|
69
|
+
:param value: Значение minor.
|
|
70
|
+
:return: None
|
|
71
|
+
"""
|
|
72
|
+
self.__minor = value if value >= 0 else 0
|
|
73
|
+
|
|
74
|
+
@minor.deleter
|
|
75
|
+
def minor (self):
|
|
76
|
+
"""
|
|
77
|
+
Удаление значения minor.
|
|
78
|
+
:return: None
|
|
79
|
+
"""
|
|
80
|
+
self.__minor = 0
|
|
81
|
+
|
|
82
|
+
# Номер релиза
|
|
83
|
+
@property
|
|
84
|
+
def release (self) -> int:
|
|
85
|
+
"""
|
|
86
|
+
Получение значения release.
|
|
87
|
+
:return: Значение release.
|
|
88
|
+
"""
|
|
89
|
+
return self.__release
|
|
90
|
+
|
|
91
|
+
@release.setter
|
|
92
|
+
def release (self, value: int):
|
|
93
|
+
"""
|
|
94
|
+
Установка значения release.
|
|
95
|
+
:param value: Значение release.
|
|
96
|
+
:return: None
|
|
97
|
+
"""
|
|
98
|
+
self.__release = value if value >= 0 else 0
|
|
99
|
+
|
|
100
|
+
@release.deleter
|
|
101
|
+
def release (self):
|
|
102
|
+
"""
|
|
103
|
+
Удаление значения release.
|
|
104
|
+
:return: None
|
|
105
|
+
"""
|
|
106
|
+
self.__release = 0
|
|
107
|
+
|
|
108
|
+
# Номер сборки
|
|
109
|
+
@property
|
|
110
|
+
def bild (self) -> int:
|
|
111
|
+
"""
|
|
112
|
+
Получение значения bild.
|
|
113
|
+
:return: Значение bild.
|
|
114
|
+
"""
|
|
115
|
+
return self.__build
|
|
116
|
+
|
|
117
|
+
@bild.setter
|
|
118
|
+
def bild (self, value: int):
|
|
119
|
+
"""
|
|
120
|
+
Установка значения bild.
|
|
121
|
+
:param value: Значение bild.
|
|
122
|
+
:return: None
|
|
123
|
+
"""
|
|
124
|
+
self.__build = value if value >= 0 else 0
|
|
125
|
+
|
|
126
|
+
@bild.deleter
|
|
127
|
+
def bild (self):
|
|
128
|
+
"""
|
|
129
|
+
Удаление значения bild.
|
|
130
|
+
:return: None
|
|
131
|
+
"""
|
|
132
|
+
self.__build = 0
|
|
133
|
+
|
|
134
|
+
# Стадия
|
|
135
|
+
@property
|
|
136
|
+
def stage (self) -> str:
|
|
137
|
+
"""
|
|
138
|
+
Получение значения stage.
|
|
139
|
+
:return: Значение stage.
|
|
140
|
+
"""
|
|
141
|
+
return self.__stage
|
|
142
|
+
|
|
143
|
+
@stage.setter
|
|
144
|
+
def stage (self, value: str | None):
|
|
145
|
+
"""
|
|
146
|
+
Установка значения stage.
|
|
147
|
+
:param value: Значение stage.
|
|
148
|
+
:return: None
|
|
149
|
+
"""
|
|
150
|
+
self.__stage = value if value is not None else ''
|
|
151
|
+
|
|
152
|
+
@stage.deleter
|
|
153
|
+
def stage (self):
|
|
154
|
+
"""
|
|
155
|
+
Удаление значения stage.
|
|
156
|
+
:return: None
|
|
157
|
+
"""
|
|
158
|
+
self.__stage = ''
|
|
159
|
+
|
|
160
|
+
# Номер стадии
|
|
161
|
+
@property
|
|
162
|
+
def stage_number (self) -> int:
|
|
163
|
+
"""
|
|
164
|
+
Получение значения stage_number.
|
|
165
|
+
:return: Значение stage_number.
|
|
166
|
+
"""
|
|
167
|
+
return self.__stage_number
|
|
168
|
+
|
|
169
|
+
@stage_number.setter
|
|
170
|
+
def stage_number (self, value: int):
|
|
171
|
+
"""
|
|
172
|
+
Установка значения stage_number.
|
|
173
|
+
:param value: Значение stage_number.
|
|
174
|
+
:return: None
|
|
175
|
+
"""
|
|
176
|
+
self.__stage_number = value if value >= 0 else 0
|
|
177
|
+
|
|
178
|
+
@stage_number.deleter
|
|
179
|
+
def stage_number (self):
|
|
180
|
+
"""
|
|
181
|
+
Удаление значения stage_number.
|
|
182
|
+
:return: None
|
|
183
|
+
"""
|
|
184
|
+
self.__stage_number = 0
|
|
185
|
+
|
|
186
|
+
def to_string (self, template: str = DEFAULT_TEMPLATE) -> str:
|
|
187
|
+
"""
|
|
188
|
+
Преобразование экземпляра класса VersionInfo в строку.
|
|
189
|
+
:param template: Шаблон для преобразования.
|
|
190
|
+
:return: Строка с версией.
|
|
191
|
+
"""
|
|
192
|
+
# Создание словаря для замены
|
|
193
|
+
template_dict = {
|
|
194
|
+
'#{Major}': str(self.major),
|
|
195
|
+
'#{Minor}': str(self.minor),
|
|
196
|
+
'#{Release}': str(self.release),
|
|
197
|
+
'#{Build}': str(self.bild),
|
|
198
|
+
'#{Stage}': str(self.stage),
|
|
199
|
+
'#{StageNumber}': str(self.stage_number) if self.stage_number > 0 else ''
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
# Замена значений в шаблоне
|
|
203
|
+
replaced = StringExtension.replace_all(template_dict, template)
|
|
204
|
+
|
|
205
|
+
# Удаление лишних пробелов и символов в начале и конце строки и возврат результата
|
|
206
|
+
return replaced.strip()
|
|
207
|
+
|
|
208
|
+
def __str__ (self) -> str:
|
|
209
|
+
"""
|
|
210
|
+
Переопределение метода __str__.
|
|
211
|
+
:return: Строка с версией.
|
|
212
|
+
"""
|
|
213
|
+
return self.to_string(VersionInfo.DEFAULT_TEMPLATE)
|
|
214
|
+
|
|
215
|
+
def __repr__ (self) -> str:
|
|
216
|
+
"""
|
|
217
|
+
Переопределение метода __repr__.
|
|
218
|
+
:return: Строка с версией.
|
|
219
|
+
"""
|
|
220
|
+
return f'VersionInfo(major={self.major}, minor={self.minor}, release={self.release}, build={self.bild}, stage={self.stage}, stage_number={self.stage_number})'
|
|
221
|
+
|
|
222
|
+
def __compare (self, other: 'VersionInfo') -> int:
|
|
223
|
+
"""
|
|
224
|
+
Сравнение версий.
|
|
225
|
+
:param other: Версия для сравнения.
|
|
226
|
+
:return: 1, если текущая версия больше, -1, если текущая версия меньше, 0, если версии равны.
|
|
227
|
+
"""
|
|
228
|
+
# Проверка типа
|
|
229
|
+
if not isinstance(other, VersionInfo):
|
|
230
|
+
# - если other не является экземпляром VersionInfo, то выбрасываем исключение
|
|
231
|
+
raise TypeError(f'Невозможно сравнить тип VersionInfo с {type(other)}')
|
|
232
|
+
|
|
233
|
+
# Сравнение мажорных версий. Если текущая мажорная версия больше
|
|
234
|
+
if self.major > other.major:
|
|
235
|
+
# - возвращаем 1
|
|
236
|
+
return 1
|
|
237
|
+
# Если текущая мажорная версия меньше
|
|
238
|
+
elif self.major < other.major:
|
|
239
|
+
# - возвращаем -1
|
|
240
|
+
return -1
|
|
241
|
+
|
|
242
|
+
# Если мажорные версии равны, то сравниваем минорные версии. Если текущая минорная версия больше
|
|
243
|
+
if self.minor > other.minor:
|
|
244
|
+
# - возвращаем 1
|
|
245
|
+
return 1
|
|
246
|
+
# Если текущая минорная версия меньше
|
|
247
|
+
elif self.minor < other.minor:
|
|
248
|
+
# - возвращаем -1
|
|
249
|
+
return -1
|
|
250
|
+
|
|
251
|
+
# Если мажорные и минорные версии равны, то сравниваем номер релиза. Если текущий номер релиза больше
|
|
252
|
+
if self.release > other.release:
|
|
253
|
+
# - возвращаем 1
|
|
254
|
+
return 1
|
|
255
|
+
# Если текущий номер релиза меньше
|
|
256
|
+
elif self.release < other.release:
|
|
257
|
+
# - возвращаем -1
|
|
258
|
+
return -1
|
|
259
|
+
|
|
260
|
+
# Если мажорные, минорные и номер релиза равны, то сравниваем номер сборки. Если текущий номер сборки больше
|
|
261
|
+
if self.bild > other.bild:
|
|
262
|
+
# - возвращаем 1
|
|
263
|
+
return 1
|
|
264
|
+
# Если текущий номер сборки меньше
|
|
265
|
+
elif self.bild < other.bild:
|
|
266
|
+
# - возвращаем -1
|
|
267
|
+
return -1
|
|
268
|
+
|
|
269
|
+
# Если мажорные, минорные, номер релиза и номер сборки равны, то равны и версии. Возвращаем 0.
|
|
270
|
+
return 0
|
|
271
|
+
|
|
272
|
+
def __eq__ (self, other: 'VersionInfo') -> bool:
|
|
273
|
+
"""
|
|
274
|
+
Сравнение версий на равенство (==).
|
|
275
|
+
:param other: Версия для сравнения.
|
|
276
|
+
:return: True, если версии равны, False, если версии не равны.
|
|
277
|
+
"""
|
|
278
|
+
# Проверка типа
|
|
279
|
+
if not isinstance(other, VersionInfo):
|
|
280
|
+
# - если other не является экземпляром VersionInfo, то выбрасываем исключение
|
|
281
|
+
raise TypeError(f'Невозможно сравнить тип VersionInfo с {type(other)}')
|
|
282
|
+
|
|
283
|
+
# Если версии равны, то возвращаем True
|
|
284
|
+
return self.__compare(other) == 0
|
|
285
|
+
|
|
286
|
+
def __ne__ (self, other: 'VersionInfo') -> bool:
|
|
287
|
+
"""
|
|
288
|
+
Сравнение версий на неравенство (!=).
|
|
289
|
+
:param other: Версия для сравнения.
|
|
290
|
+
:return: True, если версии не равны, False, если версии равны.
|
|
291
|
+
"""
|
|
292
|
+
# Проверка типа
|
|
293
|
+
if not isinstance(other, VersionInfo):
|
|
294
|
+
# - если other не является экземпляром VersionInfo, то выбрасываем исключение
|
|
295
|
+
raise TypeError(f'Невозможно сравнить тип VersionInfo с {type(other)}')
|
|
296
|
+
|
|
297
|
+
# Если версии не равны, то возвращаем True
|
|
298
|
+
return self.__compare(other) != 0
|
|
299
|
+
|
|
300
|
+
def __lt__ (self, other: 'VersionInfo') -> bool:
|
|
301
|
+
"""
|
|
302
|
+
Сравнение версий на меньше (<).
|
|
303
|
+
:param other: Версия для сравнения.
|
|
304
|
+
:return: True, если текущая версия меньше, False, если текущая версия больше или равна.
|
|
305
|
+
"""
|
|
306
|
+
# Проверка типа
|
|
307
|
+
if not isinstance(other, VersionInfo):
|
|
308
|
+
# - если other не является экземпляром VersionInfo, то выбрасываем исключение
|
|
309
|
+
raise TypeError(f'Невозможно сравнить тип VersionInfo с {type(other)}')
|
|
310
|
+
|
|
311
|
+
# Если текущая версия меньше, то возвращаем True
|
|
312
|
+
return self.__compare(other) == -1
|
|
313
|
+
|
|
314
|
+
def __gt__ (self, other: 'VersionInfo') -> bool:
|
|
315
|
+
"""
|
|
316
|
+
Сравнение версий на больше (>).
|
|
317
|
+
:param other: Версия для сравнения.
|
|
318
|
+
:return: True, если текущая версия больше, False, если текущая версия меньше или равна.
|
|
319
|
+
"""
|
|
320
|
+
# Проверка типа
|
|
321
|
+
if not isinstance(other, VersionInfo):
|
|
322
|
+
# - если other не является экземпляром VersionInfo, то выбрасываем исключение
|
|
323
|
+
raise TypeError(f'Невозможно сравнить тип VersionInfo с {type(other)}')
|
|
324
|
+
|
|
325
|
+
# Если текущая версия больше, то возвращаем True
|
|
326
|
+
return self.__compare(other) == 1
|
|
327
|
+
|
|
328
|
+
def __le__ (self, other: 'VersionInfo') -> bool:
|
|
329
|
+
"""
|
|
330
|
+
Сравнение версий на меньше или равно (<=).
|
|
331
|
+
:param other: Версия для сравнения.
|
|
332
|
+
:return: True, если текущая версия меньше или равна, False, если текущая версия больше.
|
|
333
|
+
"""
|
|
334
|
+
# Проверка типа
|
|
335
|
+
if not isinstance(other, VersionInfo):
|
|
336
|
+
# - если other не является экземпляром VersionInfo, то выбрасываем исключение
|
|
337
|
+
raise TypeError(f'Невозможно сравнить тип VersionInfo с {type(other)}')
|
|
338
|
+
|
|
339
|
+
# Если текущая версия меньше или равна, то возвращаем True
|
|
340
|
+
return self.__compare(other) in (0, -1)
|
|
341
|
+
|
|
342
|
+
def __ge__ (self, other: 'VersionInfo') -> bool:
|
|
343
|
+
"""
|
|
344
|
+
Сравнение версий на больше или равно (>=).
|
|
345
|
+
:param other: Версия для сравнения.
|
|
346
|
+
:return: True, если текущая версия больше или равна, False, если текущая версия меньше.
|
|
347
|
+
"""
|
|
348
|
+
# Проверка типа
|
|
349
|
+
if not isinstance(other, VersionInfo):
|
|
350
|
+
# - если other не является экземпляром VersionInfo, то выбрасываем исключение
|
|
351
|
+
raise TypeError(f'Невозможно сравнить тип VersionInfo с {type(other)}')
|
|
352
|
+
|
|
353
|
+
# Если текущая версия больше или равна, то возвращаем True
|
|
354
|
+
return self.__compare(other) in (0, 1)
|
|
355
|
+
|
|
356
|
+
def in_range (
|
|
357
|
+
self, start: 'VersionInfo' or None = None, end: 'VersionInfo' or None = None, start_inclusive: bool = True,
|
|
358
|
+
end_inclusive: bool = True
|
|
359
|
+
) -> bool:
|
|
360
|
+
"""
|
|
361
|
+
Проверка версии на принадлежность диапазону.
|
|
362
|
+
:param start: Начало диапазона (по умолчанию None). Если start равен None, то считается, что start не ограничен.
|
|
363
|
+
:param end: Конец диапазона (по умолчанию None). Если end равен None, то считается, что end не ограничен.
|
|
364
|
+
:param start_inclusive: Включать ли начало диапазона (по умолчанию True).
|
|
365
|
+
:param end_inclusive: Включать ли конец диапазона (по умолчанию True).
|
|
366
|
+
:return: True, если версия принадлежит диапазону, False, если версия не принадлежит диапазону.
|
|
367
|
+
"""
|
|
368
|
+
# Если start не указан
|
|
369
|
+
if start is None:
|
|
370
|
+
# - устанавливаем start_inclusive равным True
|
|
371
|
+
start_inclusive = True
|
|
372
|
+
# - устанавливаем start равным self
|
|
373
|
+
start = self
|
|
374
|
+
|
|
375
|
+
# Если end не указан
|
|
376
|
+
if end is None:
|
|
377
|
+
# - устанавливаем end_inclusive равным True
|
|
378
|
+
end_inclusive = True
|
|
379
|
+
# - устанавливаем end равным self
|
|
380
|
+
end = self
|
|
381
|
+
|
|
382
|
+
# Проверка типов
|
|
383
|
+
if not isinstance(start, VersionInfo) or not isinstance(end, VersionInfo):
|
|
384
|
+
# - если start или end не являются экземплярами VersionInfo, то выбрасываем исключение
|
|
385
|
+
raise TypeError(f'Невозможно сравнить тип VersionInfo с {type(start)} и {type(end)}')
|
|
386
|
+
|
|
387
|
+
# Если start совпадает с версией
|
|
388
|
+
if self == start:
|
|
389
|
+
# - если включать начало диапазона (start_inclusive), то возвращаем True, иначе False
|
|
390
|
+
return True if start_inclusive else False
|
|
391
|
+
|
|
392
|
+
# Если end совпадает с версией
|
|
393
|
+
if self == end:
|
|
394
|
+
# - если включать конец диапазона (end_inclusive), то возвращаем True, иначе False
|
|
395
|
+
return True if end_inclusive else False
|
|
396
|
+
|
|
397
|
+
# Если текущая версия находится между start и end, то возвращаем True, иначе False
|
|
398
|
+
return True if start < self < end else False
|
|
399
|
+
|
|
400
|
+
@staticmethod
|
|
401
|
+
def parse (version: str) -> 'VersionInfo':
|
|
402
|
+
version = version.strip()
|
|
403
|
+
|
|
404
|
+
# Разбиваем строку на части по пробелам (1 часть - основная - мажор, минор, релиз, сборка,
|
|
405
|
+
# 2 часть - стадия и 3 - номер стадии):
|
|
406
|
+
# - находим позицию первого пробела
|
|
407
|
+
start = version.find(" ")
|
|
408
|
+
# - если позиция первого пробела не найдена
|
|
409
|
+
if start == -1:
|
|
410
|
+
# - устанавливаем конец строки
|
|
411
|
+
start = len(version)
|
|
412
|
+
# - находим позицию последнего пробела
|
|
413
|
+
end = version.rfind(" ") if start < len(version) else -1
|
|
414
|
+
|
|
415
|
+
# - получаем основную часть
|
|
416
|
+
main_part = version[:start].strip()
|
|
417
|
+
# - получаем стадию
|
|
418
|
+
stage = version[start:end].strip() if end > 0 else ''
|
|
419
|
+
# - получаем номер стадии в виде строки
|
|
420
|
+
stage_number_text = version[end:].strip()
|
|
421
|
+
# - получаем номер стадии из строки
|
|
422
|
+
try:
|
|
423
|
+
stage_number = int(stage_number_text)
|
|
424
|
+
except ValueError:
|
|
425
|
+
stage_number = 0
|
|
426
|
+
|
|
427
|
+
# Составляем регулярное выражение для парсинга базовой информации о версии
|
|
428
|
+
pattern = r'^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.(\d+))?$'
|
|
429
|
+
|
|
430
|
+
# Парсим базовую информацию о версии
|
|
431
|
+
matches = re.match(pattern, main_part)
|
|
432
|
+
|
|
433
|
+
# Если не удалось найти соответствие
|
|
434
|
+
if not matches:
|
|
435
|
+
# - возвращаем пустую версию
|
|
436
|
+
return VersionInfo(0, 0, 0, 0, stage, stage_number)
|
|
437
|
+
|
|
438
|
+
# Получаем группы из совпадения
|
|
439
|
+
groups = matches.groups()
|
|
440
|
+
|
|
441
|
+
# Проверяем, что найдены как минимум 2 части
|
|
442
|
+
if len(groups) < 2:
|
|
443
|
+
# - иначе возвращаем пустую версию
|
|
444
|
+
return VersionInfo(0, 0, 0, 0, stage, stage_number)
|
|
445
|
+
|
|
446
|
+
# Проверяем, что групп 4
|
|
447
|
+
if len(groups) != 4:
|
|
448
|
+
# - иначе возвращаем пустую версию
|
|
449
|
+
return VersionInfo(0, 0, 0, 0, stage, stage_number)
|
|
450
|
+
|
|
451
|
+
# Распаковываем значения
|
|
452
|
+
major, minor, release, build = groups
|
|
453
|
+
|
|
454
|
+
# Преобразуем строки в целые числа
|
|
455
|
+
major = int(major) if major else 0
|
|
456
|
+
minor = int(minor) if minor else 0
|
|
457
|
+
release = int(release) if release else 0
|
|
458
|
+
build = int(build) if build else 0
|
|
459
|
+
|
|
460
|
+
# Возвращаем экземпляр класса VersionInfo с полученными значениями
|
|
461
|
+
return VersionInfo(major, minor, release, build, stage, stage_number)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# anb_python_components/enums/__init__.py
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# anb_python_components/enums/message_type.py
|
|
2
|
+
|
|
3
|
+
from enum import Enum
|
|
4
|
+
|
|
5
|
+
class MessageType(Enum):
|
|
6
|
+
"""
|
|
7
|
+
Перечисление типов сообщений:
|
|
8
|
+
- SUCCESS: Успешное выполнение.
|
|
9
|
+
- INFO: Информация.
|
|
10
|
+
- WARNING: Предупреждение.
|
|
11
|
+
- ERROR: Ошибка.
|
|
12
|
+
"""
|
|
13
|
+
# Успешное выполнение
|
|
14
|
+
SUCCESS = 0
|
|
15
|
+
|
|
16
|
+
# Информация
|
|
17
|
+
INFO = 1
|
|
18
|
+
|
|
19
|
+
# Предупреждение
|
|
20
|
+
WARNING = 2
|
|
21
|
+
|
|
22
|
+
# Ошибка
|
|
23
|
+
ERROR = 3
|
|
24
|
+
|
|
25
|
+
def __str__ (self):
|
|
26
|
+
"""
|
|
27
|
+
Переопределение метода __str__.
|
|
28
|
+
:return: Текстовое представление перечисления.
|
|
29
|
+
"""
|
|
30
|
+
# Получаем текстовое представление
|
|
31
|
+
match self:
|
|
32
|
+
case MessageType.SUCCESS:
|
|
33
|
+
result = "Успех"
|
|
34
|
+
case MessageType.INFO:
|
|
35
|
+
result = "Информация"
|
|
36
|
+
case MessageType.WARNING:
|
|
37
|
+
result = "Предупреждение"
|
|
38
|
+
case MessageType.ERROR:
|
|
39
|
+
result = "Ошибка"
|
|
40
|
+
case _:
|
|
41
|
+
result = "Неизвестный тип сообщения"
|
|
42
|
+
|
|
43
|
+
# Возвращаем результат
|
|
44
|
+
return result
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# anb_python_components/enums/not_bool_action.py
|
|
2
|
+
|
|
3
|
+
from enum import Enum
|
|
4
|
+
|
|
5
|
+
class NotBoolAction(Enum):
|
|
6
|
+
"""
|
|
7
|
+
Перечисление типов действий, которые необходимо выполнить, если переменная не является булевым типом.
|
|
8
|
+
- IGNORE: Игнорировать это утверждение.
|
|
9
|
+
- IT_TRUE: Считать это утверждение истинным.
|
|
10
|
+
- IT_FALSE: Считать это утверждение ложным.
|
|
11
|
+
- RAISE: Вызвать исключение.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# Игнорировать это утверждение.
|
|
15
|
+
IGNORE = 0
|
|
16
|
+
|
|
17
|
+
# Считать это утверждение истинным.
|
|
18
|
+
IT_TRUE = 1
|
|
19
|
+
|
|
20
|
+
# Считать это утверждение ложным.
|
|
21
|
+
IT_FALSE = 2
|
|
22
|
+
|
|
23
|
+
# Вызвать исключение
|
|
24
|
+
RAISE = 3
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# anb_python_components/enums/type_copy_strategy.py
|
|
2
|
+
|
|
3
|
+
from enum import Enum
|
|
4
|
+
|
|
5
|
+
class TypeCopyStrategy(Enum):
|
|
6
|
+
"""
|
|
7
|
+
Стратегия копирования.
|
|
8
|
+
Возможные значения:
|
|
9
|
+
Ignore - без копирования.
|
|
10
|
+
Auto - автоматический выбор.
|
|
11
|
+
Copy - копирование (примитивы).
|
|
12
|
+
DeepCopy - глубокое копирование (объекты и классы).
|
|
13
|
+
"""
|
|
14
|
+
# Без стратегии копирования (простое присваивание).
|
|
15
|
+
IGNORE = 0
|
|
16
|
+
|
|
17
|
+
# Автоматически выбрать стратегию копирования (по типу объекта: COPY или DEEP_COPY).
|
|
18
|
+
AUTO = 1
|
|
19
|
+
|
|
20
|
+
# Копировать объект (хорошая практика для примитивов).
|
|
21
|
+
COPY = 2
|
|
22
|
+
|
|
23
|
+
# Глубокое копирование (для объектов и классов).
|
|
24
|
+
DEEP_COPY = 3
|
|
25
|
+
|
|
26
|
+
def __str__ (self):
|
|
27
|
+
"""
|
|
28
|
+
Строковое представление объекта.
|
|
29
|
+
:return: Строковое представление объекта.
|
|
30
|
+
:rtype: str
|
|
31
|
+
"""
|
|
32
|
+
# Итоговый текст
|
|
33
|
+
text: str = ""
|
|
34
|
+
|
|
35
|
+
# Выбор текста
|
|
36
|
+
match self:
|
|
37
|
+
case TypeCopyStrategy.IGNORE:
|
|
38
|
+
text = "Без копирования"
|
|
39
|
+
case TypeCopyStrategy.AUTO:
|
|
40
|
+
text = "Автоматический выбор"
|
|
41
|
+
case TypeCopyStrategy.COPY:
|
|
42
|
+
text = "Обычное копирование (примитивы)"
|
|
43
|
+
case TypeCopyStrategy.DEEP_COPY:
|
|
44
|
+
text = "Глубокое копирование (объекты и классы)"
|
|
45
|
+
|
|
46
|
+
# Возврат
|
|
47
|
+
return text
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# anb_python_components/exceptions/__init__.py
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# anb_python_components/exceptions/wrong_type_exception.py
|
|
2
|
+
|
|
3
|
+
class WrongTypeException(Exception):
|
|
4
|
+
"""
|
|
5
|
+
Ошибка, возникающая при попытке присвоить значение другого типа данным полям.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
def __init__ (self, message: str = None, type_name: str = None, real_type_name: str = None, var_name: str = None):
|
|
9
|
+
"""
|
|
10
|
+
Инициализация экземпляра класса WrongTypeException.
|
|
11
|
+
:param message: Сообщение об ошибке.
|
|
12
|
+
:param type_name: Имя типа (по умолчанию None).
|
|
13
|
+
:param real_type_name: Имя реального типа (по умолчанию None).
|
|
14
|
+
:param var_name: Имя переменной (по умолчанию None).
|
|
15
|
+
"""
|
|
16
|
+
super().__init__(message)
|
|
17
|
+
self.message = message
|
|
18
|
+
self.type_name = type_name,
|
|
19
|
+
self.real_type_name = real_type_name,
|
|
20
|
+
self.var_name = var_name
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# anb_python_components/extensions/__init__.py
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# anb_python_components/extensions/array_extension.py
|
|
2
|
+
|
|
3
|
+
from anb_python_components.extensions.string_extension import StringExtension
|
|
4
|
+
|
|
5
|
+
class ArrayExtension:
|
|
6
|
+
"""
|
|
7
|
+
Класс расширения для работы с массивами.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
def __init__ (self):
|
|
11
|
+
"""
|
|
12
|
+
Инициализация расширения.
|
|
13
|
+
"""
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
@staticmethod
|
|
17
|
+
def remove_empties (array: list[str], re_sort: bool = False) -> list[str]:
|
|
18
|
+
"""
|
|
19
|
+
Удаляет пустые строки из массива.
|
|
20
|
+
|
|
21
|
+
:param array: Массив строк.
|
|
22
|
+
:param re_sort: Пересортировать массив после удаления пустых строк.
|
|
23
|
+
:return: Массив строк без пустых строк.
|
|
24
|
+
"""
|
|
25
|
+
# Удаляем пустые строки
|
|
26
|
+
result = list(filter(lambda x: not StringExtension.is_none_or_whitespace(x), array))
|
|
27
|
+
|
|
28
|
+
# Если нужно пересортировать массив
|
|
29
|
+
if re_sort:
|
|
30
|
+
# - сортируем массив
|
|
31
|
+
result.sort()
|
|
32
|
+
|
|
33
|
+
# Возвращаем результат
|
|
34
|
+
return result
|