dublib 0.28.2__tar.gz → 0.28.4__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.
- {dublib-0.28.2/src/dublib.egg-info → dublib-0.28.4}/PKG-INFO +1 -1
- {dublib-0.28.2 → dublib-0.28.4}/pyproject.toml +1 -1
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Templates/Bus.py +19 -13
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Terminalyzer/Command/Definition.py +18 -5
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Terminalyzer/Command/Parser.py +66 -12
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/CLI/Terminalyzer.py +13 -0
- {dublib-0.28.2 → dublib-0.28.4/src/dublib.egg-info}/PKG-INFO +1 -1
- {dublib-0.28.2 → dublib-0.28.4}/LICENSE +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/README.md +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/setup.cfg +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Templates/__init__.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Terminalyzer/Helper.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Terminalyzer/__init__.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/TextStyler/Codes.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/TextStyler/Escapes.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/TextStyler/FastStyler.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/TextStyler/__init__.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Validators.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/readline.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Core.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Engine/Bus.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Engine/Configurator.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Engine/GetText.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Engine/Patcher.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/CLI/Validators.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/CLI/__init__.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/Engine/Bus.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/Engine/__init__.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/TelebotUtils.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/WebRequestor.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/__init__.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Methods/Data.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Methods/Decorators.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Methods/Filesystem.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Methods/System.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Polyglot/HTML.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Polyglot/Markdown.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Polyglot/__init__.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/TelebotUtils/Cache.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/TelebotUtils/Master/Decorators.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/TelebotUtils/Master/__init__.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/TelebotUtils/Users.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/WebRequestor.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/__init__.py +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib/py.typed +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib.egg-info/SOURCES.txt +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib.egg-info/dependency_links.txt +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib.egg-info/requires.txt +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/src/dublib.egg-info/top_level.txt +0 -0
- {dublib-0.28.2 → dublib-0.28.4}/tests/test_Polyglot.py +0 -0
|
@@ -19,7 +19,7 @@ class MessagesTypes(enum.Enum):
|
|
|
19
19
|
# >>>>> ФУНКЦИИ ГЕНЕРАЦИИ И ВЫВОДА СООБЩЕНИЙ <<<<< #
|
|
20
20
|
#==========================================================================================#
|
|
21
21
|
|
|
22
|
-
def GenerateMessage(text: str, type: MessagesTypes | None = None, origin: str | None = None) -> str:
|
|
22
|
+
def GenerateMessage(text: str, type: MessagesTypes | None = None, origin: str | None = None, colorize: bool = True) -> str:
|
|
23
23
|
"""
|
|
24
24
|
Генерирует сообщение на основе переданных параметров.
|
|
25
25
|
|
|
@@ -35,10 +35,24 @@ def GenerateMessage(text: str, type: MessagesTypes | None = None, origin: str |
|
|
|
35
35
|
|
|
36
36
|
OriginPart = ""
|
|
37
37
|
TypePart = ""
|
|
38
|
-
if origin:
|
|
39
|
-
|
|
38
|
+
if origin:
|
|
39
|
+
OriginPart = f"{origin}:"
|
|
40
|
+
if type:
|
|
41
|
+
TypePart = f"[{OriginPart}{type.name.upper()}] "
|
|
40
42
|
|
|
41
|
-
|
|
43
|
+
Message = f"{TypePart}{text}"
|
|
44
|
+
|
|
45
|
+
if colorize:
|
|
46
|
+
ColorsDict: dict[MessagesTypes | None, Codes.Colors | None] = {
|
|
47
|
+
MessagesTypes.Info: Codes.Colors.White,
|
|
48
|
+
MessagesTypes.Error: Codes.Colors.Red,
|
|
49
|
+
MessagesTypes.Warning: Codes.Colors.Yellow,
|
|
50
|
+
MessagesTypes.Critical: Codes.Colors.Red,
|
|
51
|
+
None: None
|
|
52
|
+
}
|
|
53
|
+
Message = TextStyler(text_color = ColorsDict[type]).get_styled_text(Message)
|
|
54
|
+
|
|
55
|
+
return Message
|
|
42
56
|
|
|
43
57
|
def PrintMessage(text: str, type: MessagesTypes | None = None, origin: str | None = None):
|
|
44
58
|
"""
|
|
@@ -52,15 +66,7 @@ def PrintMessage(text: str, type: MessagesTypes | None = None, origin: str | Non
|
|
|
52
66
|
:type origin: str | None
|
|
53
67
|
"""
|
|
54
68
|
|
|
55
|
-
|
|
56
|
-
MessagesTypes.Info: Codes.Colors.White,
|
|
57
|
-
MessagesTypes.Error: Codes.Colors.Red,
|
|
58
|
-
MessagesTypes.Warning: Codes.Colors.Yellow,
|
|
59
|
-
MessagesTypes.Critical: Codes.Colors.Red,
|
|
60
|
-
None: None
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
print(TextStyler(text_color = ColorsDict[type]).get_styled_text(GenerateMessage(text, type, origin)))
|
|
69
|
+
print(GenerateMessage(text, type, origin))
|
|
64
70
|
|
|
65
71
|
#==========================================================================================#
|
|
66
72
|
# >>>>> ШАБЛОНЫ ТИПОВ СООБЩЕНИЙ <<<<< #
|
|
@@ -469,10 +469,10 @@ class Command:
|
|
|
469
469
|
return self.__Name
|
|
470
470
|
|
|
471
471
|
@property
|
|
472
|
-
def positions(self) ->
|
|
472
|
+
def positions(self) -> tuple[_Position, ...]:
|
|
473
473
|
"""Список позиций."""
|
|
474
474
|
|
|
475
|
-
return self.__Positions.
|
|
475
|
+
return tuple(self.__Positions.values())
|
|
476
476
|
|
|
477
477
|
#==========================================================================================#
|
|
478
478
|
# >>>>> МЕТОДЫ <<<<< #
|
|
@@ -495,7 +495,7 @@ class Command:
|
|
|
495
495
|
self.__Category = category
|
|
496
496
|
|
|
497
497
|
self.__BasePosition = _BasePosition()
|
|
498
|
-
self.__Positions:
|
|
498
|
+
self.__Positions: dict[str, _Position] = dict()
|
|
499
499
|
|
|
500
500
|
def create_position(self, name: str, description: str | None = None, important: bool = False) -> _Position:
|
|
501
501
|
"""
|
|
@@ -512,10 +512,23 @@ class Command:
|
|
|
512
512
|
"""
|
|
513
513
|
|
|
514
514
|
NewPosition = _Position(name, description, important)
|
|
515
|
-
self.__Positions
|
|
515
|
+
self.__Positions[name] = NewPosition
|
|
516
516
|
|
|
517
|
-
return
|
|
517
|
+
return NewPosition
|
|
518
518
|
|
|
519
|
+
def get_position(self, name: str) -> _Position:
|
|
520
|
+
"""
|
|
521
|
+
Возвращает позицию.
|
|
522
|
+
|
|
523
|
+
:param name: Имя позиции.
|
|
524
|
+
:type name: str
|
|
525
|
+
:return: Позиция.
|
|
526
|
+
:rtype: _Position
|
|
527
|
+
:raises KeyError: Позиция не найдена.
|
|
528
|
+
"""
|
|
529
|
+
|
|
530
|
+
return self.__Positions[name]
|
|
531
|
+
|
|
519
532
|
def set_category(self, category: str | None):
|
|
520
533
|
"""
|
|
521
534
|
Задаёт категорию, в которой будет отображаться команда при выводе помощи.
|
|
@@ -155,6 +155,7 @@ class _ParsedCommandParameters:
|
|
|
155
155
|
"""Данные о спаршенных параметрах команды."""
|
|
156
156
|
|
|
157
157
|
self.__Positions: dict[str, _ParsedArgument | _ParsedFlag | _ParsedKey | None] = dict()
|
|
158
|
+
self.__ImportantPositions: list[str] = list()
|
|
158
159
|
self.__BasePosition: list[_ParsedArgument | _ParsedFlag | _ParsedKey] = list()
|
|
159
160
|
|
|
160
161
|
def add_base_parameter(self, parameter: _ParsedArgument | _ParsedFlag | _ParsedKey):
|
|
@@ -167,7 +168,20 @@ class _ParsedCommandParameters:
|
|
|
167
168
|
|
|
168
169
|
self.__BasePosition.append(parameter)
|
|
169
170
|
|
|
170
|
-
def
|
|
171
|
+
def is_position_important(self, position_name: str) -> bool:
|
|
172
|
+
"""
|
|
173
|
+
Проверяет, описана ли позиция как обязательная.
|
|
174
|
+
|
|
175
|
+
:param position_name: Имя позиции.
|
|
176
|
+
:type position_name: str
|
|
177
|
+
:return: Возвращает `True`, если позиция обязательна для заполнения.
|
|
178
|
+
:rtype: bool
|
|
179
|
+
:raises KeyError: Позиция не найдена.
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
return position_name in self.__ImportantPositions
|
|
183
|
+
|
|
184
|
+
def set_positional_parameter(self, position_name: str, parameter: _ParsedArgument | _ParsedFlag | _ParsedKey, is_important: bool):
|
|
171
185
|
"""
|
|
172
186
|
Устанавливает представление параметра на позицию.
|
|
173
187
|
|
|
@@ -175,12 +189,19 @@ class _ParsedCommandParameters:
|
|
|
175
189
|
:type position_name: str
|
|
176
190
|
:param parameter: Представление параметра.
|
|
177
191
|
:type parameter: _ParsedArgument | _ParsedFlag | _ParsedKey
|
|
192
|
+
:param is_important: Состояние: обязательная ли позиция.
|
|
193
|
+
:type is_important: bool
|
|
178
194
|
:raises Exceptions.CLI.Terminalyzer.MultipleParametersOnPosition: Попытка установки нескольких параметров для одной позиции.
|
|
179
195
|
"""
|
|
180
196
|
|
|
181
|
-
if position_name in self.__Positions:
|
|
197
|
+
if position_name in self.__Positions:
|
|
198
|
+
raise Exceptions.CLI.Terminalyzer.MultipleParametersOnPosition(position_name)
|
|
199
|
+
|
|
182
200
|
self.__Positions[position_name] = parameter
|
|
183
201
|
|
|
202
|
+
if is_important:
|
|
203
|
+
self.__ImportantPositions.append(position_name)
|
|
204
|
+
|
|
184
205
|
#==========================================================================================#
|
|
185
206
|
# >>>>> ДАННЫЕ ОБРАБОТАННОЙ КОМАНДЫ <<<<< #
|
|
186
207
|
#==========================================================================================#
|
|
@@ -222,8 +243,8 @@ class ParsedCommandData:
|
|
|
222
243
|
|
|
223
244
|
def __init__(self, name: str, parsed_data: _ParsedCommandParameters):
|
|
224
245
|
|
|
225
|
-
self.__Name = name
|
|
226
|
-
self.__ParsedData = parsed_data
|
|
246
|
+
self.__Name: str = name
|
|
247
|
+
self.__ParsedData: _ParsedCommandParameters = parsed_data
|
|
227
248
|
|
|
228
249
|
def __str__(self) -> str:
|
|
229
250
|
"""
|
|
@@ -323,23 +344,53 @@ class ParsedCommandData:
|
|
|
323
344
|
return self.__ParsedData.positions[position_name]
|
|
324
345
|
|
|
325
346
|
@overload
|
|
326
|
-
def
|
|
347
|
+
def get_important_position_value(self, position_name: str, expected_type: type[_EXPECTED_TYPE]) -> _EXPECTED_TYPE: ...
|
|
348
|
+
|
|
349
|
+
@overload
|
|
350
|
+
def get_important_position_value(self, position_name: str, expected_type: None = None) -> bool | float | int | Path | str | datetime: ...
|
|
351
|
+
|
|
352
|
+
def get_important_position_value(self, position_name: str, expected_type: type[_EXPECTED_TYPE] | None = None) -> bool | float | int | Path | str | datetime:
|
|
353
|
+
"""
|
|
354
|
+
Для аргументов и ключей на позиции возвращает значение, для флагов – основое имя флага. Позиция не может быть пустой.
|
|
355
|
+
|
|
356
|
+
:param position_name: Имя позиции.
|
|
357
|
+
:type position_name: str
|
|
358
|
+
:param expected_type: Ожидаемый тип значения.
|
|
359
|
+
:type expected_type: type[_EXPECTED_TYPE]
|
|
360
|
+
:return: Значение позиции или основное имя флага.
|
|
361
|
+
:rtype: bool | float | int | Path | str | datetime
|
|
362
|
+
:raises Exceptions.CLI.Terminalyzer.ImportantPositionEmpty: Обязательная позиция пуста.
|
|
363
|
+
:raises Exceptions.CLI.Terminalyzer.PositionOptional: Позиция не обязательна.
|
|
364
|
+
"""
|
|
365
|
+
|
|
366
|
+
if not self.__ParsedData.is_position_important(position_name):
|
|
367
|
+
raise Exceptions.CLI.Terminalyzer.PositionOptional(position_name)
|
|
368
|
+
|
|
369
|
+
ValueToReturn = self.get_position_value(position_name, expected_type)
|
|
370
|
+
|
|
371
|
+
if ValueToReturn is None:
|
|
372
|
+
raise Exceptions.CLI.Terminalyzer.ImportantPositionEmpty(position_name)
|
|
373
|
+
|
|
374
|
+
return ValueToReturn
|
|
375
|
+
|
|
376
|
+
@overload
|
|
377
|
+
def get_position_value(self, position_name: str, expected_type: type[_EXPECTED_TYPE]) -> _EXPECTED_TYPE | None: ...
|
|
327
378
|
|
|
328
379
|
@overload
|
|
329
380
|
def get_position_value(self, position_name: str, expected_type: None = None) -> bool | float | int | Path | str | datetime | None: ...
|
|
330
381
|
|
|
331
382
|
def get_position_value(self, position_name: str, expected_type: type | None = None) -> bool | float | int | Path | str | datetime | None:
|
|
332
383
|
"""
|
|
333
|
-
Для аргументов и ключей на позиции возвращает значение, для флагов –
|
|
384
|
+
Для аргументов и ключей на позиции возвращает значение, для флагов – основное название флага.
|
|
334
385
|
|
|
335
386
|
:param position_name: Имя позиции.
|
|
336
387
|
:type position_name: str
|
|
337
|
-
:param expected_type: Ожидаемый тип значения.
|
|
338
|
-
:type expected_type: type[bool | float | int | Path | str | datetime]
|
|
388
|
+
:param expected_type: Ожидаемый тип значения.
|
|
389
|
+
:type expected_type: type[bool | float | int | Path | str | datetime] | None
|
|
339
390
|
:return: Параметр позиции или `None` при пустой позиции. Для флага возвращает основное имя флага.
|
|
340
391
|
:rtype: bool | float | int | Path | str | datetime | None
|
|
341
392
|
:raises KeyError: Позиция не обнаружена.
|
|
342
|
-
:raises TypeError:
|
|
393
|
+
:raises TypeError: Позиция не пуста и ожидается другой тип данных.
|
|
343
394
|
"""
|
|
344
395
|
|
|
345
396
|
ParsedParameter = self.get_position_parameter(position_name)
|
|
@@ -355,7 +406,7 @@ class ParsedCommandData:
|
|
|
355
406
|
|
|
356
407
|
if expected_type:
|
|
357
408
|
ReturnedType = type(ValueToReturn)
|
|
358
|
-
if ReturnedType is not expected_type:
|
|
409
|
+
if ReturnedType is not expected_type and ReturnedType is not None:
|
|
359
410
|
raise TypeError(f"Expected \"{expected_type}\", but on position {ReturnedType}.")
|
|
360
411
|
|
|
361
412
|
return ValueToReturn
|
|
@@ -537,8 +588,11 @@ class _CommandParser:
|
|
|
537
588
|
if self.__ParametersLocks[Index]: continue
|
|
538
589
|
self.__ParseBasePositionParameters(Index)
|
|
539
590
|
|
|
540
|
-
for PositionName in self.__PositionsLocks:
|
|
541
|
-
|
|
591
|
+
for PositionName in self.__PositionsLocks:
|
|
592
|
+
ParsedData.set_positional_parameter(PositionName, self.__PositionsLocks[PositionName], self.__Command.get_position(PositionName).is_important)
|
|
593
|
+
|
|
594
|
+
for Parameter in self.__BaseParameters:
|
|
595
|
+
ParsedData.add_base_parameter(Parameter)
|
|
542
596
|
|
|
543
597
|
self.__CheckImportantPositionsLocks()
|
|
544
598
|
self.__CheckParametersCount()
|
|
@@ -34,6 +34,19 @@ class MultipleCommandDefinition(Exception):
|
|
|
34
34
|
# >>>>> ИСКЛЮЧЕНИЯ ВРЕМЕНИ ВЫПОЛНЕНИЯ <<<<< #
|
|
35
35
|
#==========================================================================================#
|
|
36
36
|
|
|
37
|
+
class PositionOptional(Exception):
|
|
38
|
+
"""Исключение: позиция является необязательной."""
|
|
39
|
+
|
|
40
|
+
def __init__(self, position: str):
|
|
41
|
+
"""
|
|
42
|
+
Исключение: позиция является необязательной.
|
|
43
|
+
|
|
44
|
+
:param position: Имя позиции.
|
|
45
|
+
:type position: str
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
super().__init__(position)
|
|
49
|
+
|
|
37
50
|
class ImportantPositionEmpty(Exception):
|
|
38
51
|
"""Исключение: для обязательной позиции не задан параметр."""
|
|
39
52
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|