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.
Files changed (50) hide show
  1. {dublib-0.28.2/src/dublib.egg-info → dublib-0.28.4}/PKG-INFO +1 -1
  2. {dublib-0.28.2 → dublib-0.28.4}/pyproject.toml +1 -1
  3. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Templates/Bus.py +19 -13
  4. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Terminalyzer/Command/Definition.py +18 -5
  5. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Terminalyzer/Command/Parser.py +66 -12
  6. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/CLI/Terminalyzer.py +13 -0
  7. {dublib-0.28.2 → dublib-0.28.4/src/dublib.egg-info}/PKG-INFO +1 -1
  8. {dublib-0.28.2 → dublib-0.28.4}/LICENSE +0 -0
  9. {dublib-0.28.2 → dublib-0.28.4}/README.md +0 -0
  10. {dublib-0.28.2 → dublib-0.28.4}/setup.cfg +0 -0
  11. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Templates/__init__.py +0 -0
  12. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Terminalyzer/Helper.py +0 -0
  13. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Terminalyzer/__init__.py +0 -0
  14. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/TextStyler/Codes.py +0 -0
  15. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/TextStyler/Escapes.py +0 -0
  16. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/TextStyler/FastStyler.py +0 -0
  17. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/TextStyler/__init__.py +0 -0
  18. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/Validators.py +0 -0
  19. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/CLI/readline.py +0 -0
  20. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Core.py +0 -0
  21. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Engine/Bus.py +0 -0
  22. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Engine/Configurator.py +0 -0
  23. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Engine/GetText.py +0 -0
  24. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Engine/Patcher.py +0 -0
  25. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/CLI/Validators.py +0 -0
  26. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/CLI/__init__.py +0 -0
  27. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/Engine/Bus.py +0 -0
  28. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/Engine/__init__.py +0 -0
  29. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/TelebotUtils.py +0 -0
  30. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/WebRequestor.py +0 -0
  31. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Exceptions/__init__.py +0 -0
  32. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Methods/Data.py +0 -0
  33. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Methods/Decorators.py +0 -0
  34. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Methods/Filesystem.py +0 -0
  35. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Methods/System.py +0 -0
  36. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Polyglot/HTML.py +0 -0
  37. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Polyglot/Markdown.py +0 -0
  38. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/Polyglot/__init__.py +0 -0
  39. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/TelebotUtils/Cache.py +0 -0
  40. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/TelebotUtils/Master/Decorators.py +0 -0
  41. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/TelebotUtils/Master/__init__.py +0 -0
  42. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/TelebotUtils/Users.py +0 -0
  43. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/WebRequestor.py +0 -0
  44. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/__init__.py +0 -0
  45. {dublib-0.28.2 → dublib-0.28.4}/src/dublib/py.typed +0 -0
  46. {dublib-0.28.2 → dublib-0.28.4}/src/dublib.egg-info/SOURCES.txt +0 -0
  47. {dublib-0.28.2 → dublib-0.28.4}/src/dublib.egg-info/dependency_links.txt +0 -0
  48. {dublib-0.28.2 → dublib-0.28.4}/src/dublib.egg-info/requires.txt +0 -0
  49. {dublib-0.28.2 → dublib-0.28.4}/src/dublib.egg-info/top_level.txt +0 -0
  50. {dublib-0.28.2 → dublib-0.28.4}/tests/test_Polyglot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dublib
3
- Version: 0.28.2
3
+ Version: 0.28.4
4
4
  Summary: Коллекция полезных модулей от DUB1401.
5
5
  Author-email: DUB1401 <vlad.milosta@outlook.com>
6
6
  License: This is free and unencumbered software released into the public domain.
@@ -3,7 +3,7 @@ requires = ["setuptools"]
3
3
 
4
4
  [project]
5
5
  name = "dublib"
6
- version = "0.28.2"
6
+ version = "0.28.4"
7
7
  description = "Коллекция полезных модулей от DUB1401."
8
8
  authors = [
9
9
  {name = "DUB1401", email = "vlad.milosta@outlook.com"}
@@ -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: OriginPart = f"{origin}:"
39
- if type: TypePart = f"[{OriginPart}{type.name.upper()}] "
38
+ if origin:
39
+ OriginPart = f"{origin}:"
40
+ if type:
41
+ TypePart = f"[{OriginPart}{type.name.upper()}] "
40
42
 
41
- return f"{TypePart}{text}"
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
- ColorsDict: dict[MessagesTypes | None, Codes.Colors | None] = {
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) -> list[_Position]:
472
+ def positions(self) -> tuple[_Position, ...]:
473
473
  """Список позиций."""
474
474
 
475
- return self.__Positions.copy()
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: list[_Position] = list()
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.append(NewPosition)
515
+ self.__Positions[name] = NewPosition
516
516
 
517
- return self.__Positions[-1]
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 set_positional_parameter(self, position_name: str, parameter: _ParsedArgument | _ParsedFlag | _ParsedKey):
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: raise Exceptions.CLI.Terminalyzer.MultipleParametersOnPosition(position_name)
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 get_position_value(self, position_name: str, expected_type: type[_EXPECTED_TYPE]) -> _EXPECTED_TYPE: ...
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
- Для аргументов и ключей на позиции возвращает значение, для флагов – `True` при активации.
384
+ Для аргументов и ключей на позиции возвращает значение, для флагов – основное название флага.
334
385
 
335
386
  :param position_name: Имя позиции.
336
387
  :type position_name: str
337
- :param expected_type: Ожидаемый тип значения. Если тип не соответствует, будет выбрашено исключение `TypeError`.
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: ParsedData.set_positional_parameter(PositionName, self.__PositionsLocks[PositionName])
541
- for Parameter in self.__BaseParameters: ParsedData.add_base_parameter(Parameter)
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dublib
3
- Version: 0.28.2
3
+ Version: 0.28.4
4
4
  Summary: Коллекция полезных модулей от DUB1401.
5
5
  Author-email: DUB1401 <vlad.milosta@outlook.com>
6
6
  License: This is free and unencumbered software released into the public domain.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes