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.
Files changed (48) hide show
  1. anb_python_components/__init__.py +1 -0
  2. anb_python_components/classes/__init__.py +1 -0
  3. anb_python_components/classes/action_state.py +211 -0
  4. anb_python_components/classes/directory.py +115 -0
  5. anb_python_components/classes/file.py +226 -0
  6. anb_python_components/classes/shortcode_parser.py +195 -0
  7. anb_python_components/custom_types/__init__.py +3 -0
  8. anb_python_components/custom_types/guid.py +169 -0
  9. anb_python_components/custom_types/object_array.py +625 -0
  10. anb_python_components/custom_types/shortcode_attributes.py +128 -0
  11. anb_python_components/custom_types/two_dim_size.py +413 -0
  12. anb_python_components/custom_types/version_info.py +461 -0
  13. anb_python_components/enums/__init__.py +1 -0
  14. anb_python_components/enums/message_type.py +44 -0
  15. anb_python_components/enums/not_bool_action.py +24 -0
  16. anb_python_components/enums/type_copy_strategy.py +47 -0
  17. anb_python_components/exceptions/__init__.py +1 -0
  18. anb_python_components/exceptions/wrong_type_exception.py +20 -0
  19. anb_python_components/extensions/__init__.py +1 -0
  20. anb_python_components/extensions/array_extension.py +34 -0
  21. anb_python_components/extensions/bool_extension.py +87 -0
  22. anb_python_components/extensions/string_extension.py +259 -0
  23. anb_python_components/extensions/string_extension_constant.py +80 -0
  24. anb_python_components/extensions/type_extension.py +112 -0
  25. anb_python_components/models/__init__.py +1 -0
  26. anb_python_components/models/action_state_message.py +27 -0
  27. anb_python_components/models/shortcode_model.py +31 -0
  28. anb_python_components-1.2.1.dist-info/METADATA +12 -0
  29. anb_python_components-1.2.1.dist-info/RECORD +48 -0
  30. anb_python_components-1.2.1.dist-info/WHEEL +5 -0
  31. anb_python_components-1.2.1.dist-info/licenses/LICENSE +235 -0
  32. anb_python_components-1.2.1.dist-info/top_level.txt +2 -0
  33. tests/__init__.py +1 -0
  34. tests/classes/__init__.py +1 -0
  35. tests/classes/action_state_test.py +138 -0
  36. tests/classes/directory_test.py +19 -0
  37. tests/classes/file_test.py +79 -0
  38. tests/classes/shortcode_parser_test.py +105 -0
  39. tests/custom_types/__init__.py +1 -0
  40. tests/custom_types/guid_test.py +14 -0
  41. tests/custom_types/object_array_test.py +160 -0
  42. tests/custom_types/two_dim_size_test.py +37 -0
  43. tests/custom_types/version_info_test.py +51 -0
  44. tests/extensions/__init__.py +1 -0
  45. tests/extensions/array_extension_test.py +21 -0
  46. tests/extensions/bool_extension_test.py +19 -0
  47. tests/extensions/string_extension_test.py +55 -0
  48. 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