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,87 @@
1
+ # anb_python_components/extensions/bool_extension.py
2
+
3
+ from anb_python_components.enums.not_bool_action import NotBoolAction
4
+
5
+ class BoolExtension:
6
+ """
7
+ Расширение типа "правда/ложь".
8
+ """
9
+
10
+ def __init__ (self):
11
+ """
12
+ Инициализация расширения.
13
+ """
14
+ pass
15
+
16
+ @staticmethod
17
+ def to_str (b: bool, if_true: str = "True", if_false: str = "False") -> str:
18
+ """
19
+ Конвертирует булево значение в строку.
20
+ :param b: Булево значение.
21
+ :param if_true: Возвращаемое значение, если b == True (по умолчанию "True")
22
+ :param if_false: Возвращаемое значение, если b == False (по умолчанию "False")
23
+ :return: Строка, соответствующая булевому значению.
24
+ """
25
+ return if_true if b else if_false
26
+
27
+ @staticmethod
28
+ def true_count (expressions: list[bool], if_not_bool: NotBoolAction = NotBoolAction.IGNORE) -> int:
29
+ """
30
+ Возвращает количество истинных значений в списке аргументов.
31
+ :param expressions: Список аргументов.
32
+ :param if_not_bool: Действие при не булевом значении.
33
+ :return: Количество истинных значений в списке аргументов.
34
+ """
35
+ # Создаем пустой массив для хранения проверяемых аргументов
36
+ check_array = []
37
+
38
+ # Проверяем все входящие аргументы
39
+ for expression in expressions:
40
+ # - если аргумент не является типом правда/ложь
41
+ if not isinstance(expression, bool):
42
+ match if_not_bool:
43
+ # -- если указано действие при не булевом значении - игнорирование
44
+ case NotBoolAction.IGNORE:
45
+ # - игнорируем аргумент и продолжаем цикл
46
+ continue
47
+
48
+ # -- если указано действие при не булевом значении - считать как истинное значение
49
+ case NotBoolAction.IT_TRUE:
50
+ # --- добавляем True в массив проверяемых аргументов
51
+ check_array.append(True)
52
+ # --- и продолжаем цикл
53
+ continue
54
+
55
+ # -- если указано действие при не булевом значении - считать как ложное значение
56
+ case NotBoolAction.IT_FALSE:
57
+ # --- добавляем False в массив проверяемых аргументов
58
+ check_array.append(False)
59
+ # --- и продолжаем цикл
60
+ continue
61
+
62
+ # -- если указано действие при не булевом значении - выбросить исключение
63
+ case NotBoolAction.RAISE:
64
+ # --- то вызываем исключение
65
+ raise ValueError(f"{expression} не является булевым значением")
66
+ else:
67
+ # - иначе добавляем аргумент в массив проверяемых аргументов
68
+ check_array.append(expression)
69
+
70
+ # Используем фильтрацию массива для получения массива только истинных значений
71
+ filtered = [value for value in check_array if value]
72
+
73
+ # Возвращаем количество истинных значений в отфильтрованном массиве
74
+ return len(filtered)
75
+
76
+ @staticmethod
77
+ def any_true (expressions: list[bool]) -> bool:
78
+ """
79
+ Проверяет, есть ли хотя бы один истинный аргумент.
80
+ :param expressions: Выражения.
81
+ :return: Есть ли хотя бы один истинный аргумент, то вернется True, иначе False.
82
+ """
83
+ # Получаем количество истинных значений
84
+ true_count = BoolExtension.true_count(expressions, NotBoolAction.IGNORE)
85
+
86
+ # Если количество истинных значений больше нуля, возвращаем True, иначе False
87
+ return True if true_count > 0 else False
@@ -0,0 +1,259 @@
1
+ # anb_python_components/extensions/string_extension.py
2
+ import re
3
+
4
+ from .string_extension_constant import StringExtensionConstants
5
+
6
+ class StringExtension:
7
+ """
8
+ Расширение строк.
9
+ """
10
+
11
+ def __init__ (self):
12
+ """
13
+ Конструктор.
14
+ """
15
+ pass
16
+
17
+ @staticmethod
18
+ def is_none_or_empty (text: str | None) -> bool:
19
+ """
20
+ Проверяет, пуста ли строка.
21
+ :param text: Проверяемая строка.
22
+ :return: Результат проверки.
23
+ """
24
+ return text is None or text == ""
25
+
26
+ @classmethod
27
+ def is_none_or_whitespace (cls, text: str | None) -> bool:
28
+ """
29
+ Проверяет, пуста ли строка, содержит ли вместо текста только пробелы.
30
+ :param text: Проверяемая строка.
31
+ :return: Bool Результат проверки.
32
+ """
33
+ return cls.is_none_or_empty(text) or text.strip() == ''
34
+
35
+ @staticmethod
36
+ def is_russian_letter (letter: str) -> bool:
37
+ """
38
+ Проверяет, является ли символ русским буквой.
39
+ :param letter: Проверяемый символ.
40
+ :return: Результат проверки.
41
+ """
42
+
43
+ return letter in StringExtensionConstants.russian_letters
44
+
45
+ @staticmethod
46
+ def get_russian_letter_transliteration (letter: str) -> bool | None:
47
+ """
48
+ Получаю транслитерированную букву русского алфавита.
49
+ :param letter: Буква русского алфавита.
50
+ :return: Транслитерированная буква.
51
+ """
52
+
53
+ try:
54
+ # Получаю транслитерированную букву
55
+ transliteration = StringExtensionConstants.russian_letters[letter]
56
+
57
+ # Если не удалось получить транслитерированную букву
58
+ if transliteration is None:
59
+ # - то возбуждаю исключение
60
+ raise KeyError
61
+ except KeyError:
62
+ # Если возбуждено исключение, то возвращаю None
63
+ return None
64
+
65
+ # Возвращаю транслитерированную букву
66
+ return transliteration
67
+
68
+ @classmethod
69
+ def convert_to_latin (cls, source: str) -> str:
70
+ """
71
+ Конвертация в латиницу.
72
+ :param source: Исходная строка.
73
+ :return: Результат перевода.
74
+ """
75
+ # Создаю результат
76
+ result = ""
77
+
78
+ # Получаю длину строкиДля каждой буквы или символа из слова
79
+ for i, letter in enumerate(source):
80
+ if cls.is_russian_letter(letter):
81
+ # - транслитерирую эту букву
82
+ result_transliteration = cls.get_russian_letter_transliteration(letter)
83
+
84
+ # - если транслитерация не удалась
85
+ if result_transliteration is None:
86
+ # -- вывожу оригинальную букву
87
+ result += letter
88
+ else:
89
+ # -- вывожу транслитерированную букву
90
+ result += result_transliteration
91
+ else:
92
+ # - иначе вывожу букву или символ
93
+ result += letter
94
+
95
+ # Вывожу результат
96
+ return result
97
+
98
+ @classmethod
99
+ def compare (cls, str1: str | None, str2: str | None, ignore_case: bool = False) -> int:
100
+ """
101
+ Сравнивает две строки.
102
+ :param str1: Первая строка.
103
+ :param str2: Вторая строка.
104
+ :param ignore_case: Нужно ли учитывать регистр (по умолчанию, нет).
105
+ :return: Результат сравнения. Возвращаемые значения:
106
+ -1 | значение str1 меньше значения str2.
107
+ 0 | значения str1 и str2 равны.
108
+ 1 | значение str1 больше значения str2.
109
+ """
110
+ # Если обе строки пусты
111
+ if cls.is_none_or_whitespace(str1) and cls.is_none_or_whitespace(str2):
112
+ # - то считаем их равными
113
+ return 0
114
+
115
+ # Если первый из них не пуст, а второй пуст
116
+ if not cls.is_none_or_whitespace(str1) and cls.is_none_or_whitespace(str2):
117
+ # - то первый больше
118
+ return 1
119
+
120
+ # Если первый из них пуст, а второй не пуст
121
+ if cls.is_none_or_whitespace(str1) and not cls.is_none_or_whitespace(str2):
122
+ # - то первый меньше
123
+ return -1
124
+
125
+ # Если не нужно учитывать регистр
126
+ # - преобразую (или нет) первую строку
127
+ compare_str_1 = str1 if not ignore_case else str1.lower()
128
+ # - преобразую (или нет) вторую строку
129
+ compare_str_2 = str2 if not ignore_case else str2.lower()
130
+
131
+ # Проверяю равенство
132
+ if compare_str_1 == compare_str_2:
133
+ # - и если равны, то возвращаю 0
134
+ return 0
135
+
136
+ # Они не равны, поэтому получим длину первого слова и второго
137
+ len1 = len(compare_str_1)
138
+ len2 = len(compare_str_2)
139
+
140
+ # Если длина первого больше и равна второго, то верну 1, иначе -1
141
+ return 1 if len1 >= len2 else -1
142
+
143
+ @staticmethod
144
+ def get_short_text (text: str, max_length: int, end_symbols: str = '') -> str:
145
+ """
146
+ Обрезает строку до указанных в параметре max_length символов.
147
+ :param text: Исходный текст.
148
+ :param max_length: Максимальная длина текста.
149
+ :param end_symbols: Суффикс, которым завершается обрезанная строка (по умолчанию, "").
150
+ :return: Обрезанный текст.
151
+ """
152
+ # Если длина текста меньше максимальной
153
+ if len(text) <= max_length:
154
+ # - то возвращаем сам текст
155
+ return text
156
+
157
+ # Если длина текста больше максимальной, то получаю длину текста без суффикса
158
+ len_no_end_symbols = max_length - len(end_symbols)
159
+
160
+ # Возвращаю обрезанный текст
161
+ return text[:len_no_end_symbols] + end_symbols
162
+
163
+ @staticmethod
164
+ def to_utf8 (subject: str, encoding: str = 'UTF-8') -> str:
165
+ """
166
+ Перекодирует строку в UTF-8.
167
+ :param subject: Исходная строка.
168
+ :param encoding: Исходная кодировка (по умолчанию, UTF-8).
169
+ :return: Перекодированная строка.
170
+ """
171
+ # Если текущая кодировка уже UTF-8
172
+ if encoding == 'UTF-8':
173
+ # - то возвращаю исходную строку
174
+ return subject
175
+
176
+ # Получаем байты оригинальной строки
177
+ bytes_original = subject.encode(encoding)
178
+
179
+ # Преобразовываем в Unicode (используя указанную кодировку)
180
+ unicode_string = bytes_original.decode(encoding)
181
+
182
+ # Кодируем в UTF-8
183
+ utf8_bytes = unicode_string.encode('UTF-8')
184
+
185
+ # Возвращаем результат
186
+ return utf8_bytes.decode('UTF-8')
187
+
188
+ @staticmethod
189
+ def from_utf8 (subject: str, to_encoding: str = 'UTF-8') -> str:
190
+ """
191
+ Перекодирует строку из UTF-8.
192
+ :param subject: Исходная строка.
193
+ :param to_encoding: Кодировка, в которую нужно перекодировать (по умолчанию, UTF-8).
194
+ :return: Перекодированная строка.
195
+ """
196
+ # Если нужно перекодировать в UTF-8
197
+ if to_encoding == 'UTF-8':
198
+ # - то возвращаю исходную строку
199
+ return subject
200
+
201
+ # Получаю байты строки
202
+ target_bytes = subject.encode('UTF-8')
203
+
204
+ # Преобразовываю в нужную кодировку и возвращаю результат
205
+ return str(target_bytes.decode('UTF-8').encode(to_encoding))
206
+
207
+ @classmethod
208
+ def replace (cls, subject: str, search: str, replace: str, encoding: str = 'UTF-8') -> str:
209
+ """
210
+ Заменяет в строке все вхождения строки поиска на строку замены.
211
+ :param subject: Исходная строка.
212
+ :param search: Строка поиска.
213
+ :param replace: Строка замены.
214
+ :param encoding: Кодировка (по умолчанию, UTF-8).
215
+ :return: Результат замены.
216
+ """
217
+ # Если кодировка не UTF-8
218
+ if encoding != 'UTF-8':
219
+ # - то перекодируем строку поиска, замены и исходную строку в UTF-8
220
+ search = cls.to_utf8(search, encoding)
221
+ # - и перекодируем строку замены в UTF-8
222
+ replace = cls.to_utf8(replace, encoding)
223
+ # - и перекодируем исходную строку в UTF-8
224
+ subject = cls.to_utf8(subject, encoding)
225
+
226
+ # Используем re.escape для экранирования спецсимволов
227
+ pattern = re.escape(search)
228
+
229
+ # Замена всех вхождений search на replace
230
+ result = re.sub(pattern, replace, subject)
231
+
232
+ # Если кодировка не UTF-8
233
+ if encoding != 'UTF-8':
234
+ # - то перекодируем результат в нужную кодировку
235
+ result = cls.from_utf8(result, encoding)
236
+
237
+ # Возвращаем результат
238
+ return result
239
+
240
+ @classmethod
241
+ def replace_all (cls, search_replace: dict[str, str], subject: str, encoding: str = 'UTF-8') -> str:
242
+ """
243
+ Заменяет в строке все вхождения строки поиска на строку замены.
244
+ :param search_replace: Словарь с парами поиска и замены. Например, {'-': '#', '$': '%'}
245
+ заменит все дефисы на # и все доллары на %.
246
+ :param subject: Исходная строка.
247
+ :param encoding: Кодировка (по умолчанию, UTF-8).
248
+ :return: Результат замены.
249
+ """
250
+ # Создаю результат
251
+ result = subject
252
+
253
+ # Для каждой пары поиска и замены
254
+ for search, replace in search_replace.items():
255
+ # - заменяю все вхождения строки поиска на строку замены в заданной строке
256
+ result = cls.replace(result, search, replace, encoding)
257
+
258
+ # Возвращаю результат
259
+ return result
@@ -0,0 +1,80 @@
1
+ # anb_python_components/extensions/string_extension_constant.py
2
+
3
+
4
+ class StringExtensionConstants:
5
+ """
6
+ Константы для расширения строк.
7
+
8
+ Attributes:
9
+ russian_letters (dict): Словарь соответствия русских букв в транслитерации.
10
+ """
11
+
12
+ # Словарь соответствия русских букв в транслитерации
13
+ russian_letters = {
14
+ 'а': 'a',
15
+ 'б': 'b',
16
+ 'в': 'v',
17
+ 'г': 'g',
18
+ 'д': 'd',
19
+ 'е': 'e',
20
+ 'ё': 'yo',
21
+ 'ж': 'zh',
22
+ 'з': 'z',
23
+ 'и': 'i',
24
+ 'й': 'j',
25
+ 'к': 'k',
26
+ 'л': 'l',
27
+ 'м': 'm',
28
+ 'н': 'n',
29
+ 'о': 'o',
30
+ 'п': 'p',
31
+ 'р': 'r',
32
+ 'с': 's',
33
+ 'т': 't',
34
+ 'у': 'u',
35
+ 'ф': 'f',
36
+ 'х': 'h',
37
+ 'ц': 'c',
38
+ 'ч': 'ch',
39
+ 'ш': 'sh',
40
+ 'щ': 'sch',
41
+ 'ъ': 'j',
42
+ 'ы': 'i',
43
+ 'ь': 'j',
44
+ 'э': 'e',
45
+ 'ю': 'yu',
46
+ 'я': 'ya',
47
+ 'А': 'A',
48
+ 'Б': 'B',
49
+ 'В': 'V',
50
+ 'Г': 'G',
51
+ 'Д': 'D',
52
+ 'Е': 'E',
53
+ 'Ё': 'Yo',
54
+ 'Ж': 'Zh',
55
+ 'З': 'Z',
56
+ 'И': 'I',
57
+ 'Й': 'J',
58
+ 'К': 'K',
59
+ 'Л': 'L',
60
+ 'М': 'M',
61
+ 'Н': 'N',
62
+ 'О': 'O',
63
+ 'П': 'P',
64
+ 'Р': 'R',
65
+ 'С': 'S',
66
+ 'Т': 'T',
67
+ 'У': 'U',
68
+ 'Ф': 'F',
69
+ 'Х': 'H',
70
+ 'Ц': 'C',
71
+ 'Ч': 'Ch',
72
+ 'Ш': 'Sh',
73
+ 'Щ': 'Sch',
74
+ 'Ъ': 'J',
75
+ 'Ы': 'I',
76
+ 'Ь': 'J',
77
+ 'Э': 'E',
78
+ 'Ю': 'Yu',
79
+ 'Я': 'Ya'
80
+ }
@@ -0,0 +1,112 @@
1
+ # anb_python_components/extensions/type_extension.py
2
+
3
+ import datetime
4
+ from typing import Any, List, Union, get_args, get_origin
5
+
6
+ # Базовая структура для представления расширенного типа
7
+ class TypeExtension:
8
+ """
9
+ Класс для расширения типов.
10
+ """
11
+
12
+ def __init__ (self):
13
+ """
14
+ Инициализирует экземпляр класса.
15
+ """
16
+ pass
17
+
18
+ @staticmethod
19
+ def to_dict (instance: Any) -> dict[str, Any]:
20
+ """
21
+ Преобразует экземпляр объекта в словарь.
22
+
23
+ :param instance: Экземпляр класса.
24
+ :return: Словарь представлений всех полей.
25
+ """
26
+ # Создаём словарь
27
+ result = {}
28
+
29
+ # Перебираем поля экземпляра
30
+ for key, value in vars(instance).items():
31
+ # - если значение является экземпляром datetime, преобразуем его в timestamp
32
+ if isinstance(value, datetime.datetime):
33
+ result[key] = int(value.timestamp())
34
+ # - если значение является словарем, вызываем рекурсивно функцию to_dict
35
+ elif hasattr(value, '__dict__'):
36
+ result[key] = TypeExtension.to_dict(value)
37
+ # - иначе просто добавляем значение
38
+ else:
39
+ result[key] = value
40
+
41
+ # Возвращаем словарь
42
+ return result
43
+
44
+ @staticmethod
45
+ def from_dict (data: dict, cls = None) -> Any:
46
+ """
47
+ Восстанавливает объект из словаря.
48
+
49
+ :param data: Словарь, представляющий поля объекта.
50
+ :param cls: Класс для восстановления объекта (необязательный параметр, равный None по умолчанию).
51
+ :return: Восстановленный объект.
52
+ """
53
+
54
+ # Проверяем, что класс указан и является типом
55
+ if cls is None or not isinstance(cls, type):
56
+ # - если класс не указан, бросаем исключение
57
+ raise TypeError('Класс для восстановления не указан.')
58
+
59
+ # Создаём объект класса
60
+ # noinspection PyArgumentList
61
+ obj = cls.__new__(cls)
62
+
63
+ # Перебираем поля словаря
64
+ for key, value in data.items():
65
+ # - если значение является словарем, вызываем рекурсивно функцию from_dict и устанавливаем результат в поле объекта
66
+ if isinstance(value, int) and hasattr(obj, key) and isinstance(getattr(obj, key), datetime.datetime):
67
+ setattr(obj, key, datetime.datetime.fromtimestamp(value))
68
+ elif isinstance(value, dict):
69
+ nested_cls = getattr(obj, key).__class__
70
+ setattr(obj, key, TypeExtension.from_dict(value, nested_cls))
71
+ else:
72
+ setattr(obj, key, value)
73
+
74
+ # Возвращаем восстановленный объект
75
+ return obj
76
+
77
+ @staticmethod
78
+ def is_immutable_type (t) -> bool:
79
+ """
80
+ Проверяет, является ли тип t примитивным/неизменяемым.
81
+ :param t: Тип.
82
+ :type t: type
83
+ :return: True, если тип является примитивным/неизменяемым, иначе False.
84
+ """
85
+ # Примитивные неизменяемые типы
86
+ immutable_types = (int, str, float, bool, type(None), tuple, frozenset)
87
+
88
+ # Прямая проверка на примитивы
89
+ if t in immutable_types:
90
+ return True
91
+
92
+ # Обработка Union
93
+ if get_origin(t) is Union:
94
+ args = get_args(t)
95
+
96
+ # Если это Optional[T] (Union[T, None])
97
+ if len(args) == 2 and type(None) in args:
98
+ inner_type = args[0] if args[1] is type(None) else args[1]
99
+ return TypeExtension.is_immutable_type(inner_type) # Рекурсивно проверяем T
100
+
101
+ # Для обычного Union проверяем все аргументы
102
+ return all(TypeExtension.is_immutable_type(arg) for arg in args)
103
+
104
+ # Обработка list[T], List[T]
105
+ if get_origin(t) in (list, List):
106
+ args = get_args(t)
107
+ if not args: # list без параметра (list)
108
+ return False # Считаем изменяемым
109
+ inner_type = args[0] # Получаем T из list[T]
110
+ return TypeExtension.is_immutable_type(inner_type) # Проверяем T
111
+
112
+ return False
@@ -0,0 +1 @@
1
+ # anb_python_components/models/__init__.py
@@ -0,0 +1,27 @@
1
+ # anb_python_components/models/action_state_message.py
2
+ from anb_python_components.enums.message_type import MessageType
3
+
4
+ class ActionStateMessage:
5
+ """
6
+ Модель сообщения о состояния действия.
7
+ """
8
+
9
+ def __init__ (
10
+ self, message_type: MessageType = MessageType.INFO, message: str = "", flags: dict[str, bool] | None = None
11
+ ):
12
+ """
13
+ Конструктор.
14
+ :param message_type: Тип сообщения (по умолчанию, INFO).
15
+ :param message: Текст сообщения (по умолчанию, пустая строка).
16
+ :param flags: Флаги сообщения (по умолчанию, пустой словарь).
17
+ """
18
+ self.message_type: MessageType = message_type
19
+ self.message: str = message
20
+ self.flags: dict[str, bool] = flags if flags is not None else []
21
+
22
+ def __str__ (self):
23
+ """
24
+ Переопределение метода __str__.
25
+ :return: Текстовое представление модели.
26
+ """
27
+ return f"[{str(self.message_type).upper()}] {self.message}"
@@ -0,0 +1,31 @@
1
+ from typing import Callable
2
+
3
+ class ShortCodeModel:
4
+ """
5
+ Модель добавления шорткода.
6
+ """
7
+
8
+ def __init__ (
9
+ self, short_code: str | None = None, on_set: Callable | None = None,
10
+ on_unset: Callable | None = None, on_validate: Callable | None = None
11
+ ):
12
+ """
13
+ Конструктор модели.
14
+
15
+ :param short_code: Буква, символ или последовательность символов, которая будет использоваться для шорткода.
16
+ Если не указана, то будет использована пустая строка.
17
+ :type short_code: str | None
18
+ :param on_set: Обработчик действия шорткода при обработке текста, когда шорткод включен.
19
+ Функция должна принимать два аргумента: content (str) и params (dict).
20
+ :type on_set: Callable | None
21
+ :param on_unset: Обработчик действия шорткода при обработке текста, когда шорткод отключен.
22
+ Аналогично OnSet.
23
+ :type on_unset: Callable | None
24
+ :param on_validate: Обработчик действия шорткода при валидации самого шорткода.
25
+ Функционал тот же, что и у OnSet и OnUnSet.
26
+ :type on_validate: Callable | None
27
+ """
28
+ self.shortcode: str = short_code or ''
29
+ self.on_set: Callable | None = on_set
30
+ self.on_unset: Callable | None = on_unset
31
+ self.on_validate: Callable | None = on_validate
@@ -0,0 +1,12 @@
1
+ Metadata-Version: 2.4
2
+ Name: anb_python_components
3
+ Version: 1.2.1
4
+ Author: Александр Бабаев
5
+ Author-email: contact_with_us@babaev-an.ru
6
+ Classifier: Programming Language :: Python :: 3.14
7
+ Classifier: License :: OSI Approved :: MIT License
8
+ License-File: LICENSE
9
+ Dynamic: author
10
+ Dynamic: author-email
11
+ Dynamic: classifier
12
+ Dynamic: license-file
@@ -0,0 +1,48 @@
1
+ anb_python_components/__init__.py,sha256=L4VwPTIFu2nTe0Wjhl5z7wzpWrlu27f1rn1ufITdpmw,35
2
+ anb_python_components/classes/__init__.py,sha256=wzYF97ZvKcwJ71dXgaqO-RHeC6RiWxRzV_J3RM32TZQ,43
3
+ anb_python_components/classes/action_state.py,sha256=1p-yjqrsjEJbBrKhTpjkK2EmYL00w41hNDxT4lQ6hjM,10369
4
+ anb_python_components/classes/directory.py,sha256=s9Tw8ds6tg2haOH3qacK7TpASGjHU9E1rynb__e-Yjg,6696
5
+ anb_python_components/classes/file.py,sha256=6loAIZBBCwiEQpSJ66rhxpwTzj8nkhC6yKW-UhmlUrw,12533
6
+ anb_python_components/classes/shortcode_parser.py,sha256=4zQabHnqgvFtB9Yev7O8W7lkvJcLPQ-oMYP3F8GvVPY,9560
7
+ anb_python_components/custom_types/__init__.py,sha256=5ko8rPsSg7P1E4iTxl116Dsxgu_Yzn7QOnnhAGv9FAo,81
8
+ anb_python_components/custom_types/guid.py,sha256=Z43ZPjEmCx_A5b_hQWe6-j3fsra1QYdtKeNafQtxtPY,7815
9
+ anb_python_components/custom_types/object_array.py,sha256=jFSDxyi2XiHR8s9EjIAO8yZnR6VwKLIaD-B-elbf4KE,30731
10
+ anb_python_components/custom_types/shortcode_attributes.py,sha256=wRG1CR9AZ_GCzpz_yMf8DLdaonThPiYff4lKT44PeZg,5373
11
+ anb_python_components/custom_types/two_dim_size.py,sha256=Bu7Kr8XIePRrKwoV5kJyyapPkKIHO6ZecWBsQ3bNUMM,21778
12
+ anb_python_components/custom_types/version_info.py,sha256=_ONZ5nHb3vHyFj5Os7Ba36hE8uMXleI8D2u8UbaIA3E,20731
13
+ anb_python_components/enums/__init__.py,sha256=MA5CU1-25qvZB8kTEPfF3k8vM5ZRZ0Bx_PtH6L_4r3Q,41
14
+ anb_python_components/enums/message_type.py,sha256=knZPAOgIhwASJHDB7WYBf6c7fltUpVuoSwS3huKwKuY,1374
15
+ anb_python_components/enums/not_bool_action.py,sha256=kY6CTzLe1Q38X3b4kB2ss2CgSElIJr7h70ZJI4PliqI,924
16
+ anb_python_components/enums/type_copy_strategy.py,sha256=Sa-gtzTe5dyWKtjapoFQ3F1T26HxeCufOPL1TvKYJY4,1892
17
+ anb_python_components/exceptions/__init__.py,sha256=42UYjSI-naSUIFcpDlbFrevY5RQdEeTmvmgabo32Cps,46
18
+ anb_python_components/exceptions/wrong_type_exception.py,sha256=sT8t3C8TScfAq0Q9MP1AFdPk3r8mqlZ3yZhbBmdhYvc,1015
19
+ anb_python_components/extensions/__init__.py,sha256=iG75Ml_0L-8G4aCB7_t-T6XpXllREbuTCpDAzNs4Yus,46
20
+ anb_python_components/extensions/array_extension.py,sha256=KDWhxKHwmxBi7DMiDFzmZjPQdLv6J2HqlRP2cXSxJs8,1247
21
+ anb_python_components/extensions/bool_extension.py,sha256=6E4h8XNIocrduG9vuHTOgrNVmSJEd4Qi-cYYfgTQbow,5097
22
+ anb_python_components/extensions/string_extension.py,sha256=NbBVA7nEJ-N9LQK8IjM7WebW2fJcVP2cujwlsxGeVZQ,12391
23
+ anb_python_components/extensions/string_extension_constant.py,sha256=BuQZZfPR9wuP8-izfMOri9ejRq96NA7CutmgQoEQPNM,2079
24
+ anb_python_components/extensions/type_extension.py,sha256=M1hPJBs3OQyuxzYVM7z7GIUITQYJvE3ZEUoZS1cTnJ0,5279
25
+ anb_python_components/models/__init__.py,sha256=wDBaXnroVv2B28gNWt3tMaxJZr6uwrzICPo6umKbT_w,42
26
+ anb_python_components/models/action_state_message.py,sha256=TwoRVpMacBeVryQDT8E-3tSPeGPZMPKNQnDej3l8lWE,1205
27
+ anb_python_components/models/shortcode_model.py,sha256=pmCcADRdtl797Hx49PIShDyp_ZdSTaEBWiqpfo9-Vh4,1836
28
+ anb_python_components-1.2.1.dist-info/licenses/LICENSE,sha256=KcsvfUkDrcic4UUsLmT6KoMHIGxzumxUpyXz_AxbNUc,34196
29
+ tests/__init__.py,sha256=OWz0Ua3ofMcvkBc9REOLWwUyCh7tL1XeAPZisU6wD2E,19
30
+ tests/classes/__init__.py,sha256=8otxPyXe89vX4ajDH6Zj4V559aOEni2MIbsvfp2o_dg,27
31
+ tests/classes/action_state_test.py,sha256=1t81Z8v7zGAWq4NamwoCFtJEP-hnzXMg2MTH7PrT87M,5154
32
+ tests/classes/directory_test.py,sha256=BWeRaxdvSx8i0kFatx_vA2_CQE65z2omKykNnul-mDg,800
33
+ tests/classes/file_test.py,sha256=C7CsK4AQzSeiN922uJsHRQeswKkqB9qKowmVa5cYcCU,2717
34
+ tests/classes/shortcode_parser_test.py,sha256=tOjHYxyJIqvA4kZaD6KMwBHeDr7Bb3r9wrhs9lI8PZI,4662
35
+ tests/custom_types/__init__.py,sha256=lT7EfzksF_WekNu3OYYMDkFgs5dcQQStVEkmc0bBGmU,32
36
+ tests/custom_types/guid_test.py,sha256=MVwlZDJUeSuP0CMLFR14IesQ0r-jEhfkcrqwFlOQ9vY,378
37
+ tests/custom_types/object_array_test.py,sha256=8KJDiKms6LLkitFgS24KGPWkqOB04GRN4K42y2gZXDU,4838
38
+ tests/custom_types/two_dim_size_test.py,sha256=vbwveysgwo8zKCCjBt1HhNPd6ci5_ZiytzGoqVZWA5g,1035
39
+ tests/custom_types/version_info_test.py,sha256=WlAA4csXQKbfsyHqW0nFM407-BVzTSNmAgFk_zoyNeM,2579
40
+ tests/extensions/__init__.py,sha256=OoxNA3aYZ-MIfuuE4HnBPhV9g24WVP-_TVZOTmDAb5Q,30
41
+ tests/extensions/array_extension_test.py,sha256=6HuGZTX8IjwFffZNfTDAinfncIoknJ3U0A6v3_H22sI,820
42
+ tests/extensions/bool_extension_test.py,sha256=BNkWBJHpYldMAcrsZFwBsWLZtU8OTLNHpE2m4D_SD1k,674
43
+ tests/extensions/string_extension_test.py,sha256=qB7LrqawFRR0skKnurlHuDgOhNjSiLVvFY047m5TohI,2968
44
+ tests/extensions/type_extension_test.py,sha256=hB7Xwt-m8GgTfo-8nOPH8SQma6UzIwBMxzec1yvD1sc,1424
45
+ anb_python_components-1.2.1.dist-info/METADATA,sha256=ktpvxSKGlKLFoubK8WvQ0y02eOUUml1rhY_71cjRQHc,364
46
+ anb_python_components-1.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
47
+ anb_python_components-1.2.1.dist-info/top_level.txt,sha256=xZUQAZyFd9-k4FOsuIUIQfhk8rub887gWe9zmuBMvi0,28
48
+ anb_python_components-1.2.1.dist-info/RECORD,,