argenta 0.4.7__py3-none-any.whl → 0.4.9__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.
@@ -0,0 +1,4 @@
1
+ __all__ = ["StaticDividingLine", "DynamicDividingLine"]
2
+
3
+
4
+ from argenta.app.dividing_line.models import StaticDividingLine, DynamicDividingLine
@@ -0,0 +1,24 @@
1
+ class BaseDividingLine:
2
+ def __init__(self, unit_part: str = '-'):
3
+ self.unit_part = unit_part
4
+
5
+ def get_unit_part(self):
6
+ if len(self.unit_part) == 0:
7
+ return ' '
8
+ else:
9
+ return self.unit_part[0]
10
+
11
+ class StaticDividingLine(BaseDividingLine):
12
+ def __init__(self, unit_part: str = '-', length: int = 25):
13
+ super().__init__(unit_part)
14
+ self.length = length
15
+
16
+ def get_full_line(self):
17
+ return f'\n[dim]{self.length * self.get_unit_part()}[/dim]\n'
18
+
19
+
20
+ class DynamicDividingLine(BaseDividingLine):
21
+ def get_full_line(self, length: int):
22
+ return f'\n[dim]{self.get_unit_part() * length}[/dim]\n'
23
+
24
+
argenta/app/models.py CHANGED
@@ -1,11 +1,14 @@
1
1
  from typing import Callable
2
2
  from rich.console import Console
3
3
  from art import text2art
4
+ from contextlib import redirect_stdout
5
+ import io
4
6
  import re
5
7
 
6
8
  from argenta.command.models import Command, InputCommand
7
9
  from argenta.router import Router
8
10
  from argenta.router.defaults import system_router
11
+ from argenta.app.dividing_line.models import StaticDividingLine, DynamicDividingLine
9
12
  from argenta.command.exceptions import (UnprocessedInputFlagException,
10
13
  RepeatedInputFlagsException,
11
14
  EmptyInputCommandException,
@@ -21,23 +24,25 @@ from argenta.app.registered_routers.entity import RegisteredRouters
21
24
  class BaseApp:
22
25
  def __init__(self,
23
26
  prompt: str = '[italic dim bold]What do you want to do?\n',
24
- initial_message: str = 'Argenta',
25
- farewell_message: str = 'See you',
27
+ initial_message: str = '\nArgenta\n',
28
+ farewell_message: str = '\nSee you\n',
26
29
  exit_command: str = 'Q',
27
30
  exit_command_description: str = 'Exit command',
28
31
  system_points_title: str = 'System points:',
29
32
  ignore_command_register: bool = True,
30
- line_separate: str = '-----',
33
+ dividing_line: StaticDividingLine | DynamicDividingLine = StaticDividingLine(),
31
34
  repeat_command_groups: bool = True,
35
+ full_override_system_messages: bool = False,
32
36
  print_func: Callable[[str], None] = Console().print) -> None:
33
37
  self._prompt = prompt
34
38
  self._print_func = print_func
35
39
  self._exit_command = exit_command
36
40
  self._exit_command_description = exit_command_description
37
41
  self._system_points_title = system_points_title
38
- self._line_separate = line_separate
42
+ self._dividing_line = dividing_line
39
43
  self._ignore_command_register = ignore_command_register
40
44
  self._repeat_command_groups_description = repeat_command_groups
45
+ self._full_override_system_messages = full_override_system_messages
41
46
 
42
47
  self.farewell_message = farewell_message
43
48
  self.initial_message = initial_message
@@ -52,22 +57,14 @@ class BaseApp:
52
57
  self.unknown_command_handler: Callable[[InputCommand], None] = lambda command: print_func(f"[red bold]Unknown command: {command.get_trigger()}")
53
58
  self.exit_command_handler: Callable[[], None] = lambda: print_func(self.farewell_message)
54
59
 
55
- self._setup_default_view(is_initial_message_default=initial_message == 'Argenta',
56
- is_farewell_message_default=farewell_message == 'See you',
57
- is_line_separate_default=line_separate == '-----')
60
+ self._setup_default_view()
58
61
 
59
62
 
60
- def _setup_default_view(self, is_initial_message_default: bool,
61
- is_farewell_message_default: bool,
62
- is_line_separate_default: bool):
63
- if is_initial_message_default:
64
- self.initial_message = f'\n[bold red]{text2art('Argenta', font='tarty1')}\n\n'
65
- if is_farewell_message_default:
66
- self.farewell_message = (f'[bold red]\n{text2art('\nSee you\n', font='chanky')}[/bold red]\n'
67
- f'[red i]github.com/koloideal/Argenta[/red i] | '
68
- f'[red bold i]made by kolo[/red bold i]\n')
69
- if is_line_separate_default:
70
- self._line_separate = f'\n[dim]{"-" * 50}\n'
63
+ def _setup_default_view(self):
64
+ if not self._full_override_system_messages:
65
+ self.initial_message = f'\n[bold red]{text2art(self.initial_message, font='tarty1')}\n\n'
66
+ self.farewell_message = (f'[bold red]\n{text2art(f'\n{self.farewell_message}\n', font='chanky')}[/bold red]\n'
67
+ f'[red i]github.com/koloideal/Argenta[/red i] | [red bold i]made by kolo[/red bold i]\n')
71
68
 
72
69
 
73
70
  def _validate_number_of_routers(self) -> None:
@@ -100,7 +97,15 @@ class BaseApp:
100
97
  return False
101
98
  elif handled_command_trigger == command.get_trigger():
102
99
  return False
103
- self.unknown_command_handler(command)
100
+ if isinstance(self._dividing_line, StaticDividingLine):
101
+ self._print_func(self._dividing_line.get_full_line())
102
+ self.unknown_command_handler(command)
103
+ self._print_func(self._dividing_line.get_full_line())
104
+ elif isinstance(self._dividing_line, DynamicDividingLine):
105
+ with redirect_stdout(io.StringIO()) as f:
106
+ self.unknown_command_handler(command)
107
+ res: str = f.getvalue()
108
+ self._print_framed_text_with_dynamic_line(res)
104
109
  return True
105
110
 
106
111
 
@@ -124,6 +129,15 @@ class BaseApp:
124
129
  self.empty_input_command_handler()
125
130
 
126
131
 
132
+ def _print_framed_text_with_dynamic_line(self, text: str):
133
+ clear_text = re.sub(r'\u001b\[[0-9;]*m', '', text)
134
+ max_length_line = max([len(line) for line in clear_text.split('\n')])
135
+ max_length_line = max_length_line if 10 <= max_length_line <= 80 else 80 if max_length_line > 80 else 10
136
+ self._print_func(self._dividing_line.get_full_line(max_length_line))
137
+ print(text.strip('\n'))
138
+ self._print_func(self._dividing_line.get_full_line(max_length_line))
139
+
140
+
127
141
 
128
142
  class App(BaseApp):
129
143
  def start_polling(self) -> None:
@@ -148,24 +162,35 @@ class App(BaseApp):
148
162
  try:
149
163
  input_command: InputCommand = InputCommand.parse(raw_command=raw_command)
150
164
  except BaseInputCommandException as error:
151
- self._print_func(self._line_separate)
152
- self._error_handler(error, raw_command)
153
- self._print_func(self._line_separate)
165
+ if isinstance(self._dividing_line, StaticDividingLine):
166
+ self._print_func(self._dividing_line.get_full_line())
167
+ self._error_handler(error, raw_command)
168
+ self._print_func(self._dividing_line.get_full_line())
169
+ elif isinstance(self._dividing_line, DynamicDividingLine):
170
+ with redirect_stdout(io.StringIO()) as f:
171
+ self._error_handler(error, raw_command)
172
+ res: str = f.getvalue()
173
+ self._print_framed_text_with_dynamic_line(res)
154
174
  continue
155
175
 
156
176
  if self._is_exit_command(input_command):
157
177
  return
158
178
 
159
- self._print_func(self._line_separate)
160
-
161
179
  if self._is_unknown_command(input_command):
162
- self._print_func(self._line_separate)
163
180
  continue
164
181
 
165
- for registered_router in self._registered_routers:
166
- registered_router.input_command_handler(input_command)
182
+ if isinstance(self._dividing_line, StaticDividingLine):
183
+ self._print_func(self._dividing_line.get_full_line())
184
+ for registered_router in self._registered_routers:
185
+ registered_router.input_command_handler(input_command)
186
+ self._print_func(self._dividing_line.get_full_line())
187
+ elif isinstance(self._dividing_line, DynamicDividingLine):
188
+ with redirect_stdout(io.StringIO()) as f:
189
+ for registered_router in self._registered_routers:
190
+ registered_router.input_command_handler(input_command)
191
+ res: str = f.getvalue()
192
+ self._print_framed_text_with_dynamic_line(res)
167
193
 
168
- self._print_func(self._line_separate)
169
194
  if not self._repeat_command_groups_description:
170
195
  self._print_func(self._prompt)
171
196
 
argenta/command/models.py CHANGED
@@ -60,6 +60,7 @@ class InputCommand(BaseCommand, Generic[InputCommandType]):
60
60
  def get_input_flags(self) -> InputFlags:
61
61
  return self._input_flags
62
62
 
63
+
63
64
  @staticmethod
64
65
  def parse(raw_command: str) -> InputCommandType:
65
66
  if not raw_command:
@@ -1,4 +1,4 @@
1
1
  __all__ = ["Router"]
2
2
 
3
3
 
4
- from .entity import Router
4
+ from argenta.router.entity import Router
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: argenta
3
- Version: 0.4.7
4
- Summary: python library for creating custom shells
3
+ Version: 0.4.9
4
+ Summary: Python library for creating TUI
5
5
  License: MIT
6
6
  Author: kolo
7
7
  Author-email: kolo.is.main@gmail.com
@@ -20,7 +20,7 @@ Description-Content-Type: text/markdown
20
20
  ---
21
21
 
22
22
  ## Описание
23
- **Argenta** — Python library for creating custom shells
23
+ **Argenta** — Python library for creating TUI
24
24
 
25
25
  ![prewiev](https://github.com/koloideal/Argenta/blob/kolo/imgs/mock_app_preview_last.png?raw=True)
26
26
  Пример внешнего вида TUI, написанного с помощью Argenta
@@ -119,8 +119,9 @@ App(prompt: str = 'What do you want to do?\n',
119
119
  exit_command_description: str = 'Exit command',
120
120
  system_points_title: str = 'System points:',
121
121
  ignore_command_register: bool = True,
122
- line_separate: str = '-----',
122
+ dividing_line: StaticDividingLine | DynamicDividingLine = StaticDividingLine(),
123
123
  repeat_command_groups: bool = True,
124
+ full_override_system_messages: bool = False
124
125
  print_func: Callable[[str], None] = Console().print)
125
126
  ```
126
127
  **Аргументы:**
@@ -132,8 +133,9 @@ App(prompt: str = 'What do you want to do?\n',
132
133
  - `exit_command_description` (`str`): Описание команды выхода.
133
134
  - `system_points_title` (`str`): Заголовок перед списком системных команд.
134
135
  - `ignore_command_register` (`bool`): Игнорировать регистр всех команд.
135
- - `line_separate` (`str`): Разделительная строка между командами.
136
+ - `dividing_line` (`StaticDividingLine | DynamicDividingLine`): Разделительная строка.
136
137
  - `repeat_command_groups` (`bool`): Повторять описание команд перед вводом.
138
+ - `full_override_system_messages` (`bool`): Переопределить ли дефолтное оформление сообщений ([подробнее см.](#override_defaults))
137
139
  - `print_func` (`Callable[[str], None]`): Функция вывода текста в терминал.
138
140
 
139
141
  ---
@@ -241,6 +243,11 @@ App(prompt: str = 'What do you want to do?\n',
241
243
  - Наиболее частые сообщение при запуске предопределены и доступны для быстрого
242
244
  использования: `argenta.app.defaults.PredeterminedMessages`
243
245
 
246
+ <a name="override_defaults"></a>
247
+ - Если `override_system_messages`=`False`, то при переопределении таких атрибутов как `initial_message` и
248
+ `farawell_message` будет использовано дефолтное оформление текста, в виде красного ascii арта, при значении
249
+ `override_system_messages`=`True` системные сообщения будут отображены в точности какими были переданы
250
+
244
251
 
245
252
 
246
253
 
@@ -253,6 +260,36 @@ App(prompt: str = 'What do you want to do?\n',
253
260
 
254
261
  ---
255
262
 
263
+ ## *class* :: `StaticDivideLine`
264
+ Класс, экземпляр которого представляет собой строковый разделитель фиксированной длины
265
+
266
+ ### Конструктор
267
+ ```python
268
+ StaticDivideLine(unit_part: str = '-',
269
+ length: int = 25)
270
+ ```
271
+
272
+ **Аргументы:**
273
+ - **name : mean**
274
+ - `unit_part` (`str`): Единичная часть строкового разделителя
275
+ - `length` (`int`): Длина строкового разделителя
276
+
277
+ ---
278
+
279
+ ## *class* :: `DinamicDivideLine`
280
+ Строковый разделитель динамической длины, которая определяется длиной обрамляемого вывода команды
281
+
282
+ ### Конструктор
283
+ ```python
284
+ DinamicDivideLine(unit_part: str = '-')
285
+ ```
286
+
287
+ **Аргументы:**
288
+ - **name : mean**
289
+ - `unit_part` (`str`): Единичная часть строкового разделителя
290
+
291
+ ---
292
+
256
293
  ## *class* :: `Router`
257
294
  Класс, который определяет и конфигурирует обработчики команд
258
295
 
@@ -1,8 +1,10 @@
1
1
  argenta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  argenta/app/__init__.py,sha256=Slm_0b1yaXeJ78zUpo_sDSEzYuTSj3_DhRU6wU8XU9Q,46
3
3
  argenta/app/defaults.py,sha256=7ej4G-4dieMlichfuQhw5XgabF15X-vAa8k02ZfkdUs,234
4
+ argenta/app/dividing_line/__init__.py,sha256=jJZDDZix8XYCAUWW4FzGJH0JmJlchYcx0FPWifjgv1I,147
5
+ argenta/app/dividing_line/models.py,sha256=ueBDmy1hfYzGAr1X2G2Mw0hjES7YQBtP7N3TLBDz9h0,700
4
6
  argenta/app/exceptions.py,sha256=uCkb1VqEIZQuVDY0ZsfDc3yCbySwLpV5CdIT7iaGYRM,928
5
- argenta/app/models.py,sha256=IDC048SZP-jiw66x6ipz-lYOY7-CyD3mk-GHT8AyqCo,9338
7
+ argenta/app/models.py,sha256=DewbYMRXkVEkjkqkfeoZ3ST89-ZtDSSXRSidG4frqac,11023
6
8
  argenta/app/registered_routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
9
  argenta/app/registered_routers/entity.py,sha256=OQZyrF4eoCoDHzRJ22zZxhNEx-bOUDu7NZIFDfO-fuY,688
8
10
  argenta/command/__init__.py,sha256=Yx5Zl5Diwhjs8SZrsYEBNJscTMxWkLP0nqPvAJZtu30,52
@@ -10,8 +12,8 @@ argenta/command/exceptions.py,sha256=HOgddtXLDgk9Wx6c_GnzW3bMAMU5CuUnUyxjW3cVHRo
10
12
  argenta/command/flag/__init__.py,sha256=Ew-ZRFVY7sC_PMvavN0AEcsvdYGHkLAPOYMrReY3NC0,116
11
13
  argenta/command/flag/defaults.py,sha256=ktKmDT0rSSBoFUghTlEQ6OletoFxCiD37hRzO73mUUc,875
12
14
  argenta/command/flag/models.py,sha256=IY0FHyAFD9O1ZxSaq6NR9gSTkldoQGrKVoGrAbnmEuA,3769
13
- argenta/command/models.py,sha256=4MoO22EijeoMGmwYi88BSnBrip8fre2KpULGt8-NouY,4434
14
- argenta/router/__init__.py,sha256=uP58EfcmtK2NuMBQaspD_Gmq3LqgDXus4rfB6hp9Uig,52
15
+ argenta/command/models.py,sha256=1p_QZ5cQq47t915zHehEx-S0smTqj4DDnjZGn_qZlOA,4436
16
+ argenta/router/__init__.py,sha256=ldrIWTXNLXUAMAGQ8ex4e8nMso_fhi01nZi2DVzHnnk,66
15
17
  argenta/router/command_handler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
18
  argenta/router/command_handler/entity.py,sha256=8sWhP89c0FavFBITJmH9c8wNn2ipW_6-_obzjkwXueU,646
17
19
  argenta/router/command_handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -19,7 +21,7 @@ argenta/router/command_handlers/entity.py,sha256=KgFKjAMUr_mOcn9xahTxMUKB6lIxXgq
19
21
  argenta/router/defaults.py,sha256=huftOg1HMjrT_R2SHHOL4eJ5uZHspNEYBSg-mCq9xhU,126
20
22
  argenta/router/entity.py,sha256=afQn5jrDBrcd5QUzeBwRPfazOO6x0yYSXcmvHYhJpDw,4997
21
23
  argenta/router/exceptions.py,sha256=tdeaR8zDvnytgRYo_wQWKHt3if2brapgauIhhMIsTsA,678
22
- argenta-0.4.7.dist-info/LICENSE,sha256=zmqoGh2n5rReBv4s8wPxF_gZEZDgauJYSPMuPczgOiU,1082
23
- argenta-0.4.7.dist-info/METADATA,sha256=Yq80fNHrGnZheM_3OpCM-BTsPEL93ItT1Z8ikKAh0rs,19205
24
- argenta-0.4.7.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
25
- argenta-0.4.7.dist-info/RECORD,,
24
+ argenta-0.4.9.dist-info/LICENSE,sha256=zmqoGh2n5rReBv4s8wPxF_gZEZDgauJYSPMuPczgOiU,1082
25
+ argenta-0.4.9.dist-info/METADATA,sha256=Aqr7MkZ6wKpULTCSW7pIy42b7N0VoCgii34Ko6XFfUs,20985
26
+ argenta-0.4.9.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
27
+ argenta-0.4.9.dist-info/RECORD,,