argenta 0.3.5__py3-none-any.whl → 0.3.7__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.
- argenta/app/__init__.py +0 -2
- argenta/app/entity.py +15 -7
- argenta/command/entity.py +15 -28
- argenta/command/exceptions.py +0 -15
- argenta/command/params/flag/entity.py +4 -4
- argenta/command/params/flag/flags_group/entity.py +12 -1
- argenta/router/__init__.py +1 -2
- argenta/router/entity.py +13 -13
- argenta/router/exceptions.py +1 -11
- argenta-0.3.7.dist-info/METADATA +459 -0
- argenta-0.3.7.dist-info/RECORD +19 -0
- argenta-0.3.5.dist-info/METADATA +0 -289
- argenta-0.3.5.dist-info/RECORD +0 -19
- {argenta-0.3.5.dist-info → argenta-0.3.7.dist-info}/LICENSE +0 -0
- {argenta-0.3.5.dist-info → argenta-0.3.7.dist-info}/WHEEL +0 -0
argenta/app/__init__.py
CHANGED
argenta/app/entity.py
CHANGED
@@ -23,7 +23,7 @@ class App:
|
|
23
23
|
invalid_input_flags_message: str = 'Invalid input flags',
|
24
24
|
exit_command: str = 'Q',
|
25
25
|
exit_command_description: str = 'Exit command',
|
26
|
-
|
26
|
+
system_points_title: str = 'System points:',
|
27
27
|
ignore_exit_command_register: bool = True,
|
28
28
|
ignore_command_register: bool = False,
|
29
29
|
line_separate: str = '',
|
@@ -34,7 +34,7 @@ class App:
|
|
34
34
|
self.print_func = print_func
|
35
35
|
self.exit_command = exit_command
|
36
36
|
self.exit_command_description = exit_command_description
|
37
|
-
self.
|
37
|
+
self.system_points_title = system_points_title
|
38
38
|
self.ignore_exit_command_register = ignore_exit_command_register
|
39
39
|
self.farewell_message = farewell_message
|
40
40
|
self.initial_message = initial_message
|
@@ -100,7 +100,7 @@ class App:
|
|
100
100
|
self.print_func(self.prompt)
|
101
101
|
continue
|
102
102
|
|
103
|
-
self._check_command_for_exit_command(input_command.
|
103
|
+
self._check_command_for_exit_command(input_command.get_trigger())
|
104
104
|
|
105
105
|
self.print_func(self.line_separate)
|
106
106
|
is_unknown_command: bool = self._check_is_command_unknown(input_command)
|
@@ -163,6 +163,14 @@ class App:
|
|
163
163
|
self._unknown_command_handler = handler
|
164
164
|
|
165
165
|
|
166
|
+
def set_empty_command_handler(self, handler: Callable[[str], None]) -> None:
|
167
|
+
args = getfullargspec(handler).args
|
168
|
+
if len(args) != 1:
|
169
|
+
raise IncorrectNumberOfHandlerArgsException()
|
170
|
+
else:
|
171
|
+
self._empty_input_command_handler = handler
|
172
|
+
|
173
|
+
|
166
174
|
def include_router(self, router: Router) -> None:
|
167
175
|
if not isinstance(router, Router):
|
168
176
|
raise InvalidRouterInstanceException()
|
@@ -219,11 +227,11 @@ class App:
|
|
219
227
|
registered_router_entities: list[dict[str, str | list[dict[str, Callable[[], None] | Command]] | Router]] = self._registered_router_entities
|
220
228
|
for router_entity in registered_router_entities:
|
221
229
|
for command_entity in router_entity['commands']:
|
222
|
-
if command_entity['command'].
|
230
|
+
if command_entity['command'].get_trigger().lower() == command.get_trigger().lower():
|
223
231
|
if self.ignore_command_register:
|
224
232
|
return False
|
225
233
|
else:
|
226
|
-
if command_entity['command'].
|
234
|
+
if command_entity['command'].get_trigger() == command.get_trigger():
|
227
235
|
return False
|
228
236
|
self._unknown_command_handler(command)
|
229
237
|
return True
|
@@ -234,13 +242,13 @@ class App:
|
|
234
242
|
self.print_func(router_entity['title'])
|
235
243
|
for command_entity in router_entity['commands']:
|
236
244
|
self.print_func(self._description_message_pattern.format(
|
237
|
-
command=command_entity['command'].
|
245
|
+
command=command_entity['command'].get_trigger(),
|
238
246
|
description=command_entity['command'].get_description()
|
239
247
|
)
|
240
248
|
)
|
241
249
|
self.print_func(self.command_group_description_separate)
|
242
250
|
|
243
|
-
self.print_func(self.
|
251
|
+
self.print_func(self.system_points_title)
|
244
252
|
self.print_func(self._description_message_pattern.format(
|
245
253
|
command=self.exit_command,
|
246
254
|
description=self.exit_command_description
|
argenta/command/entity.py
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
from .params.flag.entity import Flag
|
2
2
|
from .params.flag.flags_group.entity import FlagsGroup
|
3
|
-
from .exceptions import (
|
4
|
-
InvalidDescriptionInstanceException,
|
5
|
-
InvalidFlagsInstanceException,
|
6
|
-
UnprocessedInputFlagException,
|
3
|
+
from .exceptions import (UnprocessedInputFlagException,
|
7
4
|
RepeatedInputFlagsException,
|
8
5
|
EmptyInputCommandException)
|
9
6
|
|
@@ -14,37 +11,28 @@ T = TypeVar('T')
|
|
14
11
|
|
15
12
|
|
16
13
|
class Command(Generic[T]):
|
17
|
-
def __init__(self,
|
14
|
+
def __init__(self, trigger: str,
|
18
15
|
description: str = None,
|
19
|
-
flags: Flag | FlagsGroup
|
20
|
-
self.
|
21
|
-
self._description = f'description for "{self.
|
16
|
+
flags: Flag | FlagsGroup = None):
|
17
|
+
self._trigger = trigger
|
18
|
+
self._description = f'description for "{self._trigger}" command' if not description else description
|
22
19
|
self._registered_flags: FlagsGroup | None = flags if isinstance(flags, FlagsGroup) else FlagsGroup([flags]) if isinstance(flags, Flag) else flags
|
23
20
|
|
24
21
|
self._input_flags: FlagsGroup | None = None
|
25
22
|
|
26
23
|
|
27
|
-
def
|
28
|
-
return self.
|
24
|
+
def get_trigger(self) -> str:
|
25
|
+
return self._trigger
|
29
26
|
|
30
27
|
|
31
|
-
def get_description(self):
|
28
|
+
def get_description(self) -> str:
|
32
29
|
return self._description
|
33
30
|
|
34
31
|
|
35
|
-
def get_registered_flags(self):
|
32
|
+
def get_registered_flags(self) -> FlagsGroup | None:
|
36
33
|
return self._registered_flags
|
37
34
|
|
38
35
|
|
39
|
-
def validate_commands_params(self):
|
40
|
-
if not isinstance(self._command, str):
|
41
|
-
raise InvalidCommandInstanceException(self._command)
|
42
|
-
if not isinstance(self._description, str):
|
43
|
-
raise InvalidDescriptionInstanceException()
|
44
|
-
if not any([(isinstance(self._registered_flags, FlagsGroup)), not self._registered_flags]):
|
45
|
-
raise InvalidFlagsInstanceException
|
46
|
-
|
47
|
-
|
48
36
|
def validate_input_flag(self, flag: Flag):
|
49
37
|
registered_flags: FlagsGroup | None = self.get_registered_flags()
|
50
38
|
if registered_flags:
|
@@ -62,7 +50,7 @@ class Command(Generic[T]):
|
|
62
50
|
return False
|
63
51
|
|
64
52
|
|
65
|
-
def
|
53
|
+
def _set_input_flags(self, input_flags: FlagsGroup):
|
66
54
|
self._input_flags = input_flags
|
67
55
|
|
68
56
|
def get_input_flags(self) -> FlagsGroup:
|
@@ -93,9 +81,8 @@ class Command(Generic[T]):
|
|
93
81
|
current_flag_value = _
|
94
82
|
if current_flag_name and current_flag_value:
|
95
83
|
flag_prefix_last_symbol_index = current_flag_name.rfind('-')
|
96
|
-
flag_prefix = current_flag_name[:flag_prefix_last_symbol_index]
|
97
|
-
flag_name = current_flag_name[flag_prefix_last_symbol_index:]
|
98
|
-
|
84
|
+
flag_prefix = current_flag_name[:flag_prefix_last_symbol_index+1]
|
85
|
+
flag_name = current_flag_name[flag_prefix_last_symbol_index+1:]
|
99
86
|
input_flag = Flag(flag_name=flag_name,
|
100
87
|
flag_prefix=flag_prefix)
|
101
88
|
input_flag.set_value(current_flag_value)
|
@@ -111,10 +98,10 @@ class Command(Generic[T]):
|
|
111
98
|
if any([current_flag_name, current_flag_value]):
|
112
99
|
raise UnprocessedInputFlagException()
|
113
100
|
if len(flags.get_flags()) == 0:
|
114
|
-
return Command(
|
101
|
+
return Command(trigger=command)
|
115
102
|
else:
|
116
|
-
input_command = Command(
|
117
|
-
input_command.
|
103
|
+
input_command = Command(trigger=command)
|
104
|
+
input_command._set_input_flags(flags)
|
118
105
|
return input_command
|
119
106
|
|
120
107
|
|
argenta/command/exceptions.py
CHANGED
@@ -1,21 +1,6 @@
|
|
1
1
|
from .params.flag.entity import Flag
|
2
2
|
|
3
3
|
|
4
|
-
class InvalidCommandInstanceException(Exception):
|
5
|
-
def __str__(self):
|
6
|
-
return "Invalid Command Instance"
|
7
|
-
|
8
|
-
|
9
|
-
class InvalidDescriptionInstanceException(Exception):
|
10
|
-
def __str__(self):
|
11
|
-
return "Invalid Description Instance"
|
12
|
-
|
13
|
-
|
14
|
-
class InvalidFlagsInstanceException(Exception):
|
15
|
-
def __str__(self):
|
16
|
-
return "Invalid Flags Instance"
|
17
|
-
|
18
|
-
|
19
4
|
class UnprocessedInputFlagException(Exception):
|
20
5
|
def __str__(self):
|
21
6
|
return "Unprocessed Input Flags"
|
@@ -3,7 +3,7 @@ from typing import Literal, Pattern
|
|
3
3
|
|
4
4
|
class Flag:
|
5
5
|
def __init__(self, flag_name: str,
|
6
|
-
flag_prefix: Literal['-', '--', '---'] = '
|
6
|
+
flag_prefix: Literal['-', '--', '---'] = '--',
|
7
7
|
ignore_flag_value_register: bool = False,
|
8
8
|
possible_flag_values: list[str] | Pattern[str] = False):
|
9
9
|
self._flag_name = flag_name
|
@@ -11,7 +11,7 @@ class Flag:
|
|
11
11
|
self.possible_flag_values = possible_flag_values
|
12
12
|
self.ignore_flag_value_register = ignore_flag_value_register
|
13
13
|
|
14
|
-
self.
|
14
|
+
self._flag_value = None
|
15
15
|
|
16
16
|
def get_string_entity(self):
|
17
17
|
string_entity: str = self._flag_prefix + self._flag_name
|
@@ -24,10 +24,10 @@ class Flag:
|
|
24
24
|
return self._flag_prefix
|
25
25
|
|
26
26
|
def get_value(self):
|
27
|
-
return self.
|
27
|
+
return self._flag_value
|
28
28
|
|
29
29
|
def set_value(self, value):
|
30
|
-
self.
|
30
|
+
self._flag_value = value
|
31
31
|
|
32
32
|
def validate_input_flag_value(self, input_flag_value: str):
|
33
33
|
if isinstance(self.possible_flag_values, Pattern):
|
@@ -5,7 +5,7 @@ class FlagsGroup:
|
|
5
5
|
def __init__(self, flags: list[Flag] = None):
|
6
6
|
self._flags: list[Flag] = [] if not flags else flags
|
7
7
|
|
8
|
-
def get_flags(self):
|
8
|
+
def get_flags(self) -> list[Flag]:
|
9
9
|
return self._flags
|
10
10
|
|
11
11
|
def add_flag(self, flag: Flag):
|
@@ -14,6 +14,17 @@ class FlagsGroup:
|
|
14
14
|
def add_flags(self, flags: list[Flag]):
|
15
15
|
self._flags.extend(flags)
|
16
16
|
|
17
|
+
def unparse_to_dict(self):
|
18
|
+
result_dict: dict[str, dict] = {}
|
19
|
+
for flag in self._flags:
|
20
|
+
result_dict[flag.get_flag_name()] = {
|
21
|
+
'name': flag.get_flag_name(),
|
22
|
+
'string_entity': flag.get_string_entity(),
|
23
|
+
'prefix': flag.get_flag_prefix(),
|
24
|
+
'value': flag.get_value()
|
25
|
+
}
|
26
|
+
return result_dict
|
27
|
+
|
17
28
|
def __iter__(self):
|
18
29
|
return iter(self._flags)
|
19
30
|
|
argenta/router/__init__.py
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
from .entity import Router
|
2
|
-
from .exceptions import InvalidDescriptionInstanceException
|
1
|
+
from .entity import Router
|
argenta/router/entity.py
CHANGED
@@ -4,7 +4,8 @@ from inspect import getfullargspec
|
|
4
4
|
from ..command.entity import Command
|
5
5
|
from ..command.params.flag.entity import Flag
|
6
6
|
from ..command.params.flag.flags_group.entity import FlagsGroup
|
7
|
-
from ..router.exceptions import (RepeatedCommandException,
|
7
|
+
from ..router.exceptions import (RepeatedCommandException,
|
8
|
+
RepeatedFlagNameException,
|
8
9
|
TooManyTransferredArgsException,
|
9
10
|
RequiredArgumentNotPassedException,
|
10
11
|
IncorrectNumberOfHandlerArgsException)
|
@@ -13,10 +14,10 @@ from ..router.exceptions import (RepeatedCommandException, RepeatedFlagNameExcep
|
|
13
14
|
class Router:
|
14
15
|
def __init__(self,
|
15
16
|
title: str = 'Commands group title:',
|
16
|
-
name: str = '
|
17
|
+
name: str = 'Default'):
|
17
18
|
|
18
|
-
self.
|
19
|
-
self.
|
19
|
+
self._title = title
|
20
|
+
self._name = name
|
20
21
|
|
21
22
|
self._command_entities: list[dict[str, Callable[[], None] | Command]] = []
|
22
23
|
self._ignore_command_register: bool = False
|
@@ -25,7 +26,6 @@ class Router:
|
|
25
26
|
|
26
27
|
|
27
28
|
def command(self, command: Command) -> Callable[[Any], Any]:
|
28
|
-
command.validate_commands_params()
|
29
29
|
self._validate_command(command)
|
30
30
|
|
31
31
|
def command_decorator(func):
|
@@ -47,10 +47,10 @@ class Router:
|
|
47
47
|
|
48
48
|
|
49
49
|
def input_command_handler(self, input_command: Command):
|
50
|
-
input_command_name: str = input_command.
|
50
|
+
input_command_name: str = input_command.get_trigger()
|
51
51
|
input_command_flags: FlagsGroup = input_command.get_input_flags()
|
52
52
|
for command_entity in self._command_entities:
|
53
|
-
if input_command_name.lower() == command_entity['command'].
|
53
|
+
if input_command_name.lower() == command_entity['command'].get_trigger().lower():
|
54
54
|
if command_entity['command'].get_registered_flags():
|
55
55
|
if input_command_flags:
|
56
56
|
for flag in input_command_flags:
|
@@ -58,9 +58,9 @@ class Router:
|
|
58
58
|
if not is_valid:
|
59
59
|
self._not_valid_flag_handler(flag)
|
60
60
|
return
|
61
|
-
return command_entity['handler_func'](input_command_flags)
|
61
|
+
return command_entity['handler_func'](input_command_flags.unparse_to_dict())
|
62
62
|
else:
|
63
|
-
return command_entity['handler_func'](
|
63
|
+
return command_entity['handler_func']({})
|
64
64
|
else:
|
65
65
|
if input_command_flags:
|
66
66
|
self._not_valid_flag_handler(input_command_flags[0])
|
@@ -70,7 +70,7 @@ class Router:
|
|
70
70
|
|
71
71
|
|
72
72
|
def _validate_command(self, command: Command):
|
73
|
-
command_name: str = command.
|
73
|
+
command_name: str = command.get_trigger()
|
74
74
|
if command_name in self.get_all_commands():
|
75
75
|
raise RepeatedCommandException()
|
76
76
|
if self._ignore_command_register:
|
@@ -106,16 +106,16 @@ class Router:
|
|
106
106
|
|
107
107
|
|
108
108
|
def get_name(self) -> str:
|
109
|
-
return self.
|
109
|
+
return self._name
|
110
110
|
|
111
111
|
|
112
112
|
def get_title(self) -> str:
|
113
|
-
return self.
|
113
|
+
return self._title
|
114
114
|
|
115
115
|
|
116
116
|
def get_all_commands(self) -> list[str]:
|
117
117
|
all_commands: list[str] = []
|
118
118
|
for command_entity in self._command_entities:
|
119
|
-
all_commands.append(command_entity['command'].
|
119
|
+
all_commands.append(command_entity['command'].get_trigger())
|
120
120
|
|
121
121
|
return all_commands
|
argenta/router/exceptions.py
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
class InvalidDescriptionInstanceException(Exception):
|
2
|
-
def __str__(self):
|
3
|
-
return "Invalid Description Instance"
|
4
|
-
|
5
|
-
|
6
1
|
class RepeatedCommandException(Exception):
|
7
2
|
def __str__(self):
|
8
3
|
return "Commands in handler cannot be repeated"
|
@@ -23,11 +18,6 @@ class RequiredArgumentNotPassedException(Exception):
|
|
23
18
|
return "Required argument not passed"
|
24
19
|
|
25
20
|
|
26
|
-
class NotValidInputFlagHandlerHasBeenAlreadyCreatedException(Exception):
|
27
|
-
def __str__(self):
|
28
|
-
return "Invalid Input Flag Handler has already been created"
|
29
|
-
|
30
|
-
|
31
21
|
class IncorrectNumberOfHandlerArgsException(Exception):
|
32
22
|
def __str__(self):
|
33
|
-
return "
|
23
|
+
return "Handler has incorrect number of arguments"
|
@@ -0,0 +1,459 @@
|
|
1
|
+
Metadata-Version: 2.3
|
2
|
+
Name: argenta
|
3
|
+
Version: 0.3.7
|
4
|
+
Summary: python library for creating custom shells
|
5
|
+
License: MIT
|
6
|
+
Author: kolo
|
7
|
+
Author-email: kolo.is.main@gmail.com
|
8
|
+
Requires-Python: >=3.11
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
11
|
+
Classifier: Programming Language :: Python :: 3.11
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
13
|
+
Classifier: Programming Language :: Python :: 3.13
|
14
|
+
Description-Content-Type: text/markdown
|
15
|
+
|
16
|
+
# Argenta
|
17
|
+
|
18
|
+
---
|
19
|
+
|
20
|
+
## Описание
|
21
|
+
**Argenta** — Python library for creating custom shells
|
22
|
+
|
23
|
+
---
|
24
|
+
|
25
|
+
# Установка
|
26
|
+
```bash
|
27
|
+
pip install argenta
|
28
|
+
```
|
29
|
+
or
|
30
|
+
```bash
|
31
|
+
poetry add argenta
|
32
|
+
```
|
33
|
+
|
34
|
+
---
|
35
|
+
|
36
|
+
# Быстрый старт
|
37
|
+
|
38
|
+
Пример простейшей оболочки с командой без зарегистрированных флагов
|
39
|
+
```python
|
40
|
+
# routers.py
|
41
|
+
from argenta.router import Router
|
42
|
+
from argenta.command import Command
|
43
|
+
|
44
|
+
|
45
|
+
router = Router()
|
46
|
+
|
47
|
+
@router.command(Command("hello"))
|
48
|
+
def handler():
|
49
|
+
print("Hello, world!")
|
50
|
+
```
|
51
|
+
|
52
|
+
```python
|
53
|
+
# main.py
|
54
|
+
from argenta.app import App
|
55
|
+
from routers import router
|
56
|
+
|
57
|
+
app: App = App()
|
58
|
+
|
59
|
+
def main() -> None:
|
60
|
+
app.include_router(router)
|
61
|
+
app.start_polling()
|
62
|
+
|
63
|
+
|
64
|
+
if __name__ == '__main__':
|
65
|
+
main()
|
66
|
+
```
|
67
|
+
Пример оболочки с командой, у которой зарегистрированы флаги
|
68
|
+
|
69
|
+
```python
|
70
|
+
# routers.py
|
71
|
+
import re
|
72
|
+
from argenta.router import Router
|
73
|
+
from argenta.command import Command
|
74
|
+
from argenta.command.params.flag import FlagsGroup, Flag
|
75
|
+
|
76
|
+
router = Router()
|
77
|
+
|
78
|
+
registered_flags = FlagsGroup([
|
79
|
+
Flag(flag_name='host',
|
80
|
+
flag_prefix='--',
|
81
|
+
possible_flag_values=re.compile(r'^192.168.\d{1,3}.\d{1,3}$')),
|
82
|
+
Flag('port', '---', re.compile(r'^[0-9]{1,4}$'))
|
83
|
+
])
|
84
|
+
|
85
|
+
|
86
|
+
@router.command(Command("hello"))
|
87
|
+
def handler():
|
88
|
+
print("Hello, world!")
|
89
|
+
|
90
|
+
|
91
|
+
@router.command(Command(trigger="ssh",
|
92
|
+
description='connect via ssh',
|
93
|
+
flags=registered_flags))
|
94
|
+
def handler_with_flags(flags: dict):
|
95
|
+
for flag in flags:
|
96
|
+
print(f'Flag name: {flag['name']}\n'
|
97
|
+
f'Flag value: {flag['value']}')
|
98
|
+
```
|
99
|
+
|
100
|
+
---
|
101
|
+
|
102
|
+
# *classes* :
|
103
|
+
|
104
|
+
---
|
105
|
+
|
106
|
+
## *class* : : `App`
|
107
|
+
Класс, определяющий поведение и состояние оболочки
|
108
|
+
|
109
|
+
### Конструктор
|
110
|
+
```python
|
111
|
+
App(prompt: str = 'Enter a command',
|
112
|
+
initial_greeting: str = '\nHello, I am Argenta\n',
|
113
|
+
farewell_message: str = '\nGoodBye\n',
|
114
|
+
exit_command: str = 'Q',
|
115
|
+
exit_command_description: str = 'Exit command',
|
116
|
+
system_points_title: str = 'System points:',
|
117
|
+
ignore_exit_command_register: bool = True,
|
118
|
+
ignore_command_register: bool = False,
|
119
|
+
line_separate: str = '',
|
120
|
+
command_group_description_separate: str = '',
|
121
|
+
repeat_command_groups: bool = True,
|
122
|
+
print_func: Callable[[str], None] = print)
|
123
|
+
```
|
124
|
+
**Аргументы:**
|
125
|
+
- **name : mean**
|
126
|
+
- `prompt` (`str`): Сообщение перед вводом команды.
|
127
|
+
- `initial_greeting` (`str`): Приветственное сообщение при запуске.
|
128
|
+
- `farewell_message` (`str`): Сообщение при выходе.
|
129
|
+
- `exit_command` (`str`): Команда выхода (по умолчанию `'Q'`).
|
130
|
+
- `exit_command_description` (`str`): Описание команды выхода.
|
131
|
+
- `system_points_title` (`str`): Заголовок перед списком системных команд.
|
132
|
+
- `ignore_exit_command_register` (`bool`): Игнорировать регистр команды выхода.
|
133
|
+
- `ignore_command_register` (`bool`): Игнорировать регистр всех команд.
|
134
|
+
- `line_separate` (`str`): Разделительная строка между командами.
|
135
|
+
- `command_group_description_separate` (`str`): Разделитель между группами команд.
|
136
|
+
- `repeat_command_groups` (`bool`): Повторять описание команд перед вводом.
|
137
|
+
- `print_func` (`Callable[[str], None]`): Функция вывода текста в терминал (по умолчанию `print`).
|
138
|
+
|
139
|
+
---
|
140
|
+
|
141
|
+
### ***methods***
|
142
|
+
|
143
|
+
---
|
144
|
+
|
145
|
+
#### **.start_polling() -> `None`**
|
146
|
+
|
147
|
+
*method mean* **::** запускает цикл обработки ввода
|
148
|
+
|
149
|
+
---
|
150
|
+
|
151
|
+
#### **.include_router(router: Router) -> `None`**
|
152
|
+
|
153
|
+
*param* `router: Router` **::** регистрируемый роутер
|
154
|
+
*required* **::** True
|
155
|
+
|
156
|
+
*method mean* **::** регистрирует роутер в оболочке
|
157
|
+
|
158
|
+
---
|
159
|
+
|
160
|
+
#### **.set_initial_message(message: str) -> `None`**
|
161
|
+
|
162
|
+
*param* `message: str` **::** устанавливаемое приветственное сообщение
|
163
|
+
*required* **::** True
|
164
|
+
*example* **::** `"Hello, I'm a example app"`
|
165
|
+
|
166
|
+
*method mean* **::** устанавливает сообщение, которое будет отображено при запуске программы
|
167
|
+
|
168
|
+
---
|
169
|
+
|
170
|
+
#### **.set_farewell_message(message: str) -> `None`**
|
171
|
+
|
172
|
+
*param* `message: str` **::** устанавливаемое сообщение при выходе
|
173
|
+
*required* **::** True
|
174
|
+
*example* **::** `"GoodBye !"`
|
175
|
+
|
176
|
+
*method mean* **::** устанавливает сообщение, которое будет отображено при выходе
|
177
|
+
|
178
|
+
---
|
179
|
+
|
180
|
+
#### **.set_description_message_pattern(pattern: str) -> `None`**
|
181
|
+
|
182
|
+
*param* `pattern: str` **::** паттерн описания команды при её выводе в консоль
|
183
|
+
*required* **::** True
|
184
|
+
*example* **::** `"[{command}] *=*=* {description}"`
|
185
|
+
|
186
|
+
*method mean* **::** устанавливает паттерн описания команд, который будет использован
|
187
|
+
при выводе в консоль
|
188
|
+
|
189
|
+
---
|
190
|
+
<a name="custom_handler"></a>
|
191
|
+
#### **.set_repeated_input_flags_handler(handler: Callable[[str], None]) -> `None`**
|
192
|
+
|
193
|
+
*param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
|
194
|
+
вводе юзером повторяющихся флагов
|
195
|
+
*required* **::** True
|
196
|
+
*example* **::** `lambda raw_command: print_func(f'Repeated input flags: "{raw_command}"')`
|
197
|
+
|
198
|
+
*method mean* **::** устанавливает функцию, которой будет передано управление при
|
199
|
+
вводе юзером повторяющихся флагов
|
200
|
+
|
201
|
+
---
|
202
|
+
|
203
|
+
#### **.set_invalid_input_flags_handler(self, handler: Callable[[str], None]) -> `None`**
|
204
|
+
|
205
|
+
*param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
|
206
|
+
вводе юзером команды с некорректным синтаксисом флагов
|
207
|
+
*required* **::** True
|
208
|
+
*example* **::** `lambda raw_command: print_func(f'Incorrect flag syntax: "{raw_command}"')`
|
209
|
+
|
210
|
+
*method mean* **::** устанавливает функцию, которой будет передано управление при
|
211
|
+
вводе юзером команды с некорректным синтаксисом флагов
|
212
|
+
|
213
|
+
---
|
214
|
+
|
215
|
+
#### **.set_unknown_command_handler(self, handler: Callable[[str], None]) -> `None`**
|
216
|
+
|
217
|
+
*param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
|
218
|
+
вводе юзером неизвестной команды
|
219
|
+
*required* **::** True
|
220
|
+
*example* **::** `lambda command: print_func(f"Unknown command: {command.get_string_entity()}")`
|
221
|
+
|
222
|
+
*method mean* **::** устанавливает функцию, которой будет передано управление при
|
223
|
+
вводе юзером неизвестной команды
|
224
|
+
|
225
|
+
---
|
226
|
+
|
227
|
+
#### **.set_empty_command_handler(self, handler: Callable[[str], None]) -> `None`**
|
228
|
+
|
229
|
+
*param* `handler: Callable[[str], None]` **::** функция или лямбда функция, которой будет передано управление при
|
230
|
+
вводе юзером пустой команды
|
231
|
+
*required* **::** True
|
232
|
+
*example* **::** `lambda: print_func(f'Empty input command')`
|
233
|
+
|
234
|
+
*method mean* **::** устанавливает функцию, которой будет передано управление при
|
235
|
+
вводе юзером пустой команды
|
236
|
+
|
237
|
+
---
|
238
|
+
|
239
|
+
### Примечания
|
240
|
+
|
241
|
+
- В устанавливаемом паттерне сообщения описания команды необходимы быть два ключевых слова:
|
242
|
+
`command` и `description`, каждое из которых должно быть заключено в фигурные скобки, после обработки
|
243
|
+
паттерна на места этих ключевых слов будут подставлены соответствующие атрибуты команды, при отсутствии
|
244
|
+
этих двух ключевых слов будет вызвано исключение `InvalidDescriptionMessagePatternException`
|
245
|
+
|
246
|
+
- Команды оболочки не должны повторяться, при значении атрибута `ignore_command_register` равным `True`
|
247
|
+
допускается создание обработчиков для разных регистров одинаковых символов в команде, для примера `u` и `U`,
|
248
|
+
при значении атрибута `ignore_command_register` класса `App` равным `False` тот же пример вызывает исключение
|
249
|
+
`RepeatedCommandInDifferentRoutersException`. Исключение вызывается только при наличии пересекающихся команд
|
250
|
+
у __<u>разных</u>__ роутеров
|
251
|
+
|
252
|
+
|
253
|
+
|
254
|
+
|
255
|
+
### Исключения
|
256
|
+
|
257
|
+
- `InvalidRouterInstanceException` — Переданный объект в метод `App().include_router()` не является экземпляром класса `Router`.
|
258
|
+
- `InvalidDescriptionMessagePatternException` — Неправильный формат паттерна описания команд.
|
259
|
+
- `IncorrectNumberOfHandlerArgsException` — У обработчика нестандартного поведения зарегистрировано неверное количество аргументов(в большинстве случаев у него должен быть один аргумент).
|
260
|
+
- `NoRegisteredRoutersException` — Отсутствуют зарегистрированные роутеры.
|
261
|
+
- `NoRegisteredHandlersException` — У роутера нет ни одного обработчика команд.
|
262
|
+
- `RepeatedCommandInDifferentRoutersException` — Одна и та же команда зарегистрирована в разных роутерах.
|
263
|
+
|
264
|
+
---
|
265
|
+
|
266
|
+
## *class* :: `Router`
|
267
|
+
Класс, который определяет и конфигурирует обработчики команд
|
268
|
+
|
269
|
+
### Конструктор
|
270
|
+
```python
|
271
|
+
Router(title: str = 'Commands group title:',
|
272
|
+
name: str = 'Default')
|
273
|
+
```
|
274
|
+
|
275
|
+
|
276
|
+
|
277
|
+
**Аргументы:**
|
278
|
+
- **name : mean**
|
279
|
+
- `title` (`str`): Заголовок группы команд.
|
280
|
+
- `name` (`str`): Персональное название роутера
|
281
|
+
|
282
|
+
---
|
283
|
+
|
284
|
+
### ***methods***
|
285
|
+
|
286
|
+
---
|
287
|
+
|
288
|
+
#### **command(command: Command)**
|
289
|
+
|
290
|
+
*param* `command: Command` **::** экземпляр класса `Command`, который определяет строковый триггер команды,
|
291
|
+
допустимые флаги команды и другое
|
292
|
+
*required* **::** True
|
293
|
+
*example* **::** `Command(command='ssh', description='connect via ssh')`
|
294
|
+
|
295
|
+
*method mean* **::** декоратор, который регистрирует функцию как обработчик команды
|
296
|
+
|
297
|
+
---
|
298
|
+
|
299
|
+
#### **.get_name() -> `str`**
|
300
|
+
|
301
|
+
*method mean* **::** возвращает установленное название роутера
|
302
|
+
|
303
|
+
---
|
304
|
+
|
305
|
+
#### **.get_title() -> `str`**
|
306
|
+
|
307
|
+
*method mean* **::** возвращает установленный заголовок группы команд данного роутера
|
308
|
+
|
309
|
+
---
|
310
|
+
|
311
|
+
#### **.get_all_commands() -> `list[str]`**
|
312
|
+
|
313
|
+
*method mean* **::** возвращает все зарегистрированные команды для данного роутера
|
314
|
+
|
315
|
+
---
|
316
|
+
|
317
|
+
### Исключения
|
318
|
+
- `RepeatedCommandException` - Одна и та же команда зарегистрирована в одном роутере
|
319
|
+
- `RepeatedFlagNameException` - Повторяющиеся зарегистрированные флаги в команде
|
320
|
+
- `TooManyTransferredArgsException` - Слишком много зарегистрированных аргументов у обработчика команды
|
321
|
+
- `RequiredArgumentNotPassedException` - Не зарегистрирован обязательный аргумент у обработчика команды(аргумент, через который будут переданы флаги введённой команды)
|
322
|
+
- `IncorrectNumberOfHandlerArgsException` - У обработчика нестандартного поведения зарегистрировано неверное количество аргументов(в большинстве случаев у него должен быть один аргумент)
|
323
|
+
|
324
|
+
---
|
325
|
+
|
326
|
+
## *class* :: `Command`
|
327
|
+
Класс, экземпляр которого определяет строковый триггер хэндлера и конфигурирует его атрибуты
|
328
|
+
|
329
|
+
### Конструктор
|
330
|
+
```python
|
331
|
+
Command(trigger: str,
|
332
|
+
description: str = None,
|
333
|
+
flags: Flag | FlagsGroup = None)
|
334
|
+
```
|
335
|
+
|
336
|
+
**Аргументы:**
|
337
|
+
- **name : mean**
|
338
|
+
- `trigger` (`str`): Строковый триггер
|
339
|
+
- `description` (`str`): Описание команды, которое будет выведено в консоль при запуске оболочки
|
340
|
+
- `flags` (`Flag | FlagsGroup`): Флаги, которые будут обработаны при их наличии во вводе юзера
|
341
|
+
|
342
|
+
---
|
343
|
+
|
344
|
+
#### **.get_trigger() -> `str`**
|
345
|
+
|
346
|
+
*method mean* **::** возвращает строковый триггер экземпляра
|
347
|
+
|
348
|
+
---
|
349
|
+
|
350
|
+
#### **.get_description() -> `str`**
|
351
|
+
|
352
|
+
*method mean* **::** возвращает описание команды
|
353
|
+
|
354
|
+
---
|
355
|
+
|
356
|
+
#### **.get_registered_flags() -> `FlagsGroup | None`**
|
357
|
+
|
358
|
+
*method mean* **::** возвращает зарегистрированные флаги экземпляра
|
359
|
+
|
360
|
+
---
|
361
|
+
|
362
|
+
### Исключения
|
363
|
+
- `UnprocessedInputFlagException` - Некорректный синтаксис ввода команды
|
364
|
+
- `RepeatedInputFlagsException` - Повторяющиеся флаги во введённой команде
|
365
|
+
- `EmptyInputCommandException` - Введённая команда является пустой(не содержит символов)
|
366
|
+
|
367
|
+
**Примечание**
|
368
|
+
Все вышеуказанные исключения класса `Command` вызываются в рантайме запущенным экземпляром класса
|
369
|
+
`App`, а также по дефолту обрабатываются, при желании можно задать пользовательские
|
370
|
+
обработчики для этих исключений ([подробнее см.](#custom_handler))
|
371
|
+
|
372
|
+
---
|
373
|
+
|
374
|
+
## *class* :: `Flag`
|
375
|
+
Класс, экземпляры которого в большинстве случаев передаются при создании
|
376
|
+
экземпляра класса `Command` для регистрации допустимого флага при вводе юзером команды
|
377
|
+
|
378
|
+
### Конструктор
|
379
|
+
```python
|
380
|
+
Flag(flag_name: str,
|
381
|
+
flag_prefix: Literal['-', '--', '---'] = '-',
|
382
|
+
ignore_flag_value_register: bool = False,
|
383
|
+
possible_flag_values: list[str] | Pattern[str] = False)
|
384
|
+
```
|
385
|
+
|
386
|
+
---
|
387
|
+
|
388
|
+
**Аргументы:**
|
389
|
+
- **name : mean**
|
390
|
+
- `flag_name` (`str`): Имя флага
|
391
|
+
- `flag_prefix` (`Literal['-', '--', '---']`): Префикс команды, допустимым значением является от одного до трёх минусов
|
392
|
+
- `ignore_flag_value_register` (`bool`): Будет ли игнорироваться регистр значения введённого флага
|
393
|
+
- `possible_flag_values` (`list[str] | Pattern[str]`): Множество допустимых значений флага, может быть задано
|
394
|
+
списком с допустимыми значениями или регулярным выражением (рекомендуется `re.compile(r'example exspression')`)
|
395
|
+
|
396
|
+
---
|
397
|
+
|
398
|
+
### ***methods***
|
399
|
+
|
400
|
+
---
|
401
|
+
|
402
|
+
#### **.get_string_entity() -> `str`**
|
403
|
+
|
404
|
+
*method mean* **::** возвращает строковое представление флага(префикс + имя)
|
405
|
+
|
406
|
+
---
|
407
|
+
|
408
|
+
#### **.get_flag_name() -> `str`**
|
409
|
+
|
410
|
+
*method mean* **::** возвращает имя флага
|
411
|
+
|
412
|
+
---
|
413
|
+
|
414
|
+
#### **.get_flag_prefix() -> `str`**
|
415
|
+
|
416
|
+
*method mean* **::** возвращает префикс флага
|
417
|
+
|
418
|
+
---
|
419
|
+
|
420
|
+
## *class* :: `FlagsGroup`
|
421
|
+
Класс, объединяющий список флагов в один объект, используется в качестве
|
422
|
+
передаваемого аргумента `flags` экземпляру класса `Command`, при регистрации
|
423
|
+
хэндлера
|
424
|
+
|
425
|
+
### Конструктор
|
426
|
+
```python
|
427
|
+
FlagsGroup(flags: list[Flag] = None)
|
428
|
+
```
|
429
|
+
|
430
|
+
---
|
431
|
+
|
432
|
+
**Аргументы:**
|
433
|
+
- **name : mean**
|
434
|
+
- `flags` (`list[Flag]`): Список флагов, которые будут объединены в одну группу
|
435
|
+
|
436
|
+
---
|
437
|
+
|
438
|
+
### ***methods***
|
439
|
+
|
440
|
+
---
|
441
|
+
|
442
|
+
#### **.get_flags() -> `list[Flag]`**
|
443
|
+
|
444
|
+
*method mean* **::** возвращает зарегистрированные флаги
|
445
|
+
|
446
|
+
---
|
447
|
+
|
448
|
+
# Тесты
|
449
|
+
|
450
|
+
Запуск тестов:
|
451
|
+
|
452
|
+
```bash
|
453
|
+
python -m unittest discover
|
454
|
+
```
|
455
|
+
or
|
456
|
+
```bash
|
457
|
+
python -m unittest discover -v
|
458
|
+
```
|
459
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
argenta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
+
argenta/app/__init__.py,sha256=NoKJpO5inI4bEtptNj7BZtNpGQidCNoFSw2-JoK6P98,25
|
3
|
+
argenta/app/entity.py,sha256=f1UV8g92ZhyXeeTHvZYKNqPw0xCRUljYgXDg1qsaZa4,11508
|
4
|
+
argenta/app/exceptions.py,sha256=ruI_MwJQtBLrnWxJbKlSRE50c5FjnZ9qXJma34kPZhk,1253
|
5
|
+
argenta/command/__init__.py,sha256=yRSj5CtLjxwjKiokUGdSmuBZPOF_qheRyG0NW1pv7vo,27
|
6
|
+
argenta/command/entity.py,sha256=tssojZMXUdI7o5LKxf9a07LT1VOyMk2gwL_zCj2Bljg,4230
|
7
|
+
argenta/command/exceptions.py,sha256=ZCDnAmEvJRoOMpX02778YEQg3QCtDczRzu_fdkqKxus,547
|
8
|
+
argenta/command/params/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
|
+
argenta/command/params/flag/__init__.py,sha256=y6rJLdag5qxONg1CzcP7gi6rCeix9UsG1AVANX3fnJs,68
|
10
|
+
argenta/command/params/flag/entity.py,sha256=wqCLVCDUqvuPVQQyz2mOeslH6Xha0nwiKUqD1CCBpns,1737
|
11
|
+
argenta/command/params/flag/flags_group/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
|
+
argenta/command/params/flag/flags_group/entity.py,sha256=qcVbRkfWblR53a1N0C8tpZ8UOH5aNlQmkyxRfCrrwMo,1011
|
13
|
+
argenta/router/__init__.py,sha256=vIU2o3JJ7misRm9mUzUQw5HdverdMDfvHNzkWuYFRBY,26
|
14
|
+
argenta/router/entity.py,sha256=ph2A0XeMQFbmlh1jcUSK659W9ai55JKXNM9iAbrZL-0,4932
|
15
|
+
argenta/router/exceptions.py,sha256=dW3FIdHA_tZYt1-IEts7IY46KLBaKulfdW_ALKpvAic,657
|
16
|
+
argenta-0.3.7.dist-info/LICENSE,sha256=zmqoGh2n5rReBv4s8wPxF_gZEZDgauJYSPMuPczgOiU,1082
|
17
|
+
argenta-0.3.7.dist-info/METADATA,sha256=AjQqZ6-XiiZr3ua0k0KKvlv0WzNOm9esx2_l3k3Ekxw,17977
|
18
|
+
argenta-0.3.7.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
19
|
+
argenta-0.3.7.dist-info/RECORD,,
|
argenta-0.3.5.dist-info/METADATA
DELETED
@@ -1,289 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.3
|
2
|
-
Name: argenta
|
3
|
-
Version: 0.3.5
|
4
|
-
Summary: python library for creating custom shells
|
5
|
-
License: MIT
|
6
|
-
Author: kolo
|
7
|
-
Author-email: kolo.is.main@gmail.com
|
8
|
-
Requires-Python: >=3.11
|
9
|
-
Classifier: License :: OSI Approved :: MIT License
|
10
|
-
Classifier: Programming Language :: Python :: 3
|
11
|
-
Classifier: Programming Language :: Python :: 3.11
|
12
|
-
Classifier: Programming Language :: Python :: 3.12
|
13
|
-
Classifier: Programming Language :: Python :: 3.13
|
14
|
-
Description-Content-Type: text/markdown
|
15
|
-
|
16
|
-
# Argenta
|
17
|
-
|
18
|
-
---
|
19
|
-
|
20
|
-
## Описание
|
21
|
-
**Argenta** — это библиотека для создания CLI-приложений на Python. Она предоставляет удобные инструменты для маршрутизации команд и обработки пользовательского ввода.
|
22
|
-
|
23
|
-
---
|
24
|
-
|
25
|
-
# Установка
|
26
|
-
```bash
|
27
|
-
pip install argenta
|
28
|
-
```
|
29
|
-
or
|
30
|
-
```bash
|
31
|
-
poetry add argenta
|
32
|
-
```
|
33
|
-
|
34
|
-
---
|
35
|
-
|
36
|
-
# Быстрый старт
|
37
|
-
Пример базового CLI-приложения с Argenta:
|
38
|
-
```python
|
39
|
-
#routers.py
|
40
|
-
from argenta.router import Router
|
41
|
-
|
42
|
-
router = Router()
|
43
|
-
|
44
|
-
@router.command("hello")
|
45
|
-
def hello():
|
46
|
-
print("Hello, world!")
|
47
|
-
|
48
|
-
@router.unknown_command
|
49
|
-
def unlnown_command(command):
|
50
|
-
print(f'Command "{command}" undefined')
|
51
|
-
```
|
52
|
-
```python
|
53
|
-
#main.py
|
54
|
-
from argenta.app import App
|
55
|
-
from routers import router
|
56
|
-
|
57
|
-
app: App = App()
|
58
|
-
|
59
|
-
def main() -> None:
|
60
|
-
app.include_router(router)
|
61
|
-
app.start_polling()
|
62
|
-
|
63
|
-
|
64
|
-
if __name__ == '__main__':
|
65
|
-
main()
|
66
|
-
```
|
67
|
-
|
68
|
-
---
|
69
|
-
|
70
|
-
# Техническая документация
|
71
|
-
|
72
|
-
---
|
73
|
-
|
74
|
-
## declared *classes* :
|
75
|
-
|
76
|
-
---
|
77
|
-
|
78
|
-
### *class* :: `App`
|
79
|
-
Класс, определяющий поведение и состояние приложения
|
80
|
-
|
81
|
-
#### Конструктор
|
82
|
-
```python
|
83
|
-
App(prompt: str = 'Enter a command',
|
84
|
-
initial_greeting: str = '\nHello, I am Argenta\n',
|
85
|
-
farewell_message: str = '\nGoodBye\n',
|
86
|
-
exit_command: str = 'Q',
|
87
|
-
exit_command_description: str = 'Exit command',
|
88
|
-
exit_command_title: str = 'System points:',
|
89
|
-
ignore_exit_command_register: bool = True,
|
90
|
-
ignore_command_register: bool = False,
|
91
|
-
line_separate: str = '',
|
92
|
-
command_group_description_separate: str = '',
|
93
|
-
repeat_command_groups: bool = True,
|
94
|
-
print_func: Callable[[str], None] = print)
|
95
|
-
```
|
96
|
-
**Аргументы:**
|
97
|
-
- **name : mean**
|
98
|
-
- `prompt` (`str`): Сообщение перед вводом команды.
|
99
|
-
- `initial_greeting` (`str`): Приветственное сообщение при запуске.
|
100
|
-
- `farewell_message` (`str`): Сообщение при выходе.
|
101
|
-
- `exit_command` (`str`): Команда выхода (по умолчанию `'Q'`).
|
102
|
-
- `exit_command_description` (`str`): Описание команды выхода.
|
103
|
-
- `exit_command_title` (`str`): Заголовок перед списком команд выхода.
|
104
|
-
- `ignore_exit_command_register` (`bool`): Игнорировать регистр команды выхода.
|
105
|
-
- `ignore_command_register` (`bool`): Игнорировать регистр всех команд.
|
106
|
-
- `line_separate` (`str`): Разделительная строка между командами.
|
107
|
-
- `command_group_description_separate` (`str`): Разделитель между группами команд.
|
108
|
-
- `repeat_command_groups` (`bool`): Повторять описание команд перед вводом.
|
109
|
-
- `print_func` (`Callable[[str], None]`): Функция вывода текста в терминал (по умолчанию `print`).
|
110
|
-
|
111
|
-
---
|
112
|
-
|
113
|
-
#### **declared *methods***
|
114
|
-
|
115
|
-
---
|
116
|
-
|
117
|
-
**App().**`start_polling() -> None`
|
118
|
-
|
119
|
-
*method mean* **::** запускает жизненный цикл приложения
|
120
|
-
|
121
|
-
---
|
122
|
-
|
123
|
-
**App().**`include_router(router: Router, is_main: bool = False) -> None`
|
124
|
-
|
125
|
-
*param* `router: Router` **::** регистрируемый роутер
|
126
|
-
|
127
|
-
*param* `is_main: bool` **::** будет ли являться регистрируемый роутер главным
|
128
|
-
*example* **::** `True` или `False`
|
129
|
-
|
130
|
-
*method mean* **::** регистрирует роутер в приложении
|
131
|
-
|
132
|
-
---
|
133
|
-
|
134
|
-
**App().**`set_initial_message(message: str) -> None`
|
135
|
-
|
136
|
-
*param* `message: str` **::** устанавливаемое приветственное сообщение
|
137
|
-
*example* **::** `"Hello, I'm a cli example app"`
|
138
|
-
|
139
|
-
*method mean* **::** устанавливает сообщение, которое будет отображено при запуске программы
|
140
|
-
|
141
|
-
---
|
142
|
-
|
143
|
-
**App().**`set_farewell_message(message: str) -> None`
|
144
|
-
|
145
|
-
*param* `message: str` **::** устанавливаемое сообщение при выходе
|
146
|
-
*example* **::** `"GoodBye !"`
|
147
|
-
|
148
|
-
*method mean* **::** устанавливает сообщение, которое будет отображено при выходе
|
149
|
-
|
150
|
-
---
|
151
|
-
|
152
|
-
**App().**`set_description_message_pattern(pattern: str) -> None`
|
153
|
-
|
154
|
-
*param* `pattern: str` **::** паттерн описания команды при её выводе в консоль
|
155
|
-
*example* **::** `"[{command}] *=*=* {description}"`
|
156
|
-
|
157
|
-
*method mean* **::** устанавливает приветственное сообщение
|
158
|
-
|
159
|
-
---
|
160
|
-
|
161
|
-
**App().**`get_main_router() -> Router`
|
162
|
-
|
163
|
-
*method mean* **::** возвращает `Router()`, который является главным в приложении
|
164
|
-
|
165
|
-
---
|
166
|
-
|
167
|
-
**App().**`get_all_app_commands() -> list[str]`
|
168
|
-
|
169
|
-
*method mean* **::** возвращает список команд всех зарегистрированных роутеров, сохраняя их регистр
|
170
|
-
|
171
|
-
---
|
172
|
-
|
173
|
-
#### Примечания
|
174
|
-
|
175
|
-
- Среди зарегистрированных в приложении роутеров должен быть один главный, является ли роутер главным
|
176
|
-
определяется значением аргумента `is_main` равным `True`, в методе `App().include_router()`, который по умолчанию равен
|
177
|
-
`False`, если в приложении зарегистрирован лишь один роутер, то он неявно устанавливается главным, если
|
178
|
-
зарегистрировано больше одного роутера, то требуется явное указание главного. При регистрации более одного
|
179
|
-
главного роутера вызывается исключение `OnlyOneMainRouterIsAllowedException`. При регистрации более одного
|
180
|
-
роутера и отсутствии указания главного вызывается исключение `MissingMainRouterException`
|
181
|
-
|
182
|
-
- В устанавливаемом паттерне сообщения описания команды необходимы быть два ключевых слова:
|
183
|
-
`command` и `description`, каждое из которых должно быть заключено в фигурные скобки, после обработки
|
184
|
-
паттерна на места этих ключевых слов будут подставлены соответствующие значения команды, при отсутствии
|
185
|
-
этих двух ключевых слов будет вызвано исключение `InvalidDescriptionMessagePatternException`
|
186
|
-
|
187
|
-
- Команды приложения не должны повторяться, при значении атрибута `ignore_command_register` равным `True`
|
188
|
-
допускается создание обработчиков для разных регистров одинаковых символов в команде, для примера `u` и `U`,
|
189
|
-
при значении атрибута `ignore_command_register` класса `App` равным `False` тот же пример вызывает исключение
|
190
|
-
`RepeatedCommandInDifferentRoutersException`. Исключение вызывается только при наличии пересекающихся команд
|
191
|
-
у __<u>разных</u>__ роутеров
|
192
|
-
|
193
|
-
- У главного обработчика должен быть зарегистрирован обработчик неизвестных команд:
|
194
|
-
```python
|
195
|
-
router = Router()
|
196
|
-
|
197
|
-
@router.unknown_command
|
198
|
-
def unknown_command(command):
|
199
|
-
print(f'Command "{command}" undefined')
|
200
|
-
```
|
201
|
-
При отсутствии обработчика неизвестных команд у главного роутера будет вызвано исключение
|
202
|
-
`MissingHandlerForUnknownCommandsException`. При регистрации обработчика неизвестных команд у
|
203
|
-
__<u>не</u>__ главного роутера будет вызвано исключение `HandlerForUnknownCommandsOnNonMainRouterException`
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
#### Исключения
|
209
|
-
|
210
|
-
- `InvalidRouterInstanceException` — Переданный объект в метод `App().include_router()` не является экземпляром класса `Router`.
|
211
|
-
- `InvalidDescriptionMessagePatternException` — Неправильный формат паттерна описания команд.
|
212
|
-
- `OnlyOneMainRouterIsAllowedException` — Регистрация более одного главного роутера.
|
213
|
-
- `MissingMainRouterException` — Отсутствует главный роутер.
|
214
|
-
- `MissingHandlerForUnknownCommandsException` — В основном роутере отсутствует обработчик неизвестных команд.
|
215
|
-
- `HandlerForUnknownCommandsOnNonMainRouterException` — Обработчик неизвестных команд определён не у основного роутера.
|
216
|
-
- `NoRegisteredRoutersException` — Отсутствуют зарегистрированные роутеры.
|
217
|
-
- `NoRegisteredHandlersException` — У роутера нет ни одного обработчика команд.
|
218
|
-
- `RepeatedCommandInDifferentRoutersException` — Одна и та же команда зарегистрирована в разных роутерах.
|
219
|
-
|
220
|
-
---
|
221
|
-
|
222
|
-
### *class* :: `Router`
|
223
|
-
Класс, который определяет и конфигурирует обработчики команд
|
224
|
-
|
225
|
-
#### Конструктор
|
226
|
-
```python
|
227
|
-
Router(title: str = 'Commands group title:',
|
228
|
-
name: str = 'subordinate')
|
229
|
-
```
|
230
|
-
|
231
|
-
**Аргументы:**
|
232
|
-
- **name : mean**
|
233
|
-
- `title` (`str`): Заголовок группы команд.
|
234
|
-
- `name` (`str`): Персональное название роутера
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
#### **declared *methods***
|
239
|
-
|
240
|
-
---
|
241
|
-
|
242
|
-
**`@`Router().**`command(command: str, description: str = None)`
|
243
|
-
|
244
|
-
*param* `command: str` **::** строковый триггер, который будет выполнять указанные действия
|
245
|
-
*example* **::** `U` / `update` / `ExaMPLE`
|
246
|
-
|
247
|
-
*param* `description: str` **::** описание команды, которое будет выведено в консоль
|
248
|
-
*example* **::** `description for update command` или `example description`
|
249
|
-
|
250
|
-
*method mean* **::** декоратор регистрирует функцию как обработчик команды
|
251
|
-
|
252
|
-
---
|
253
|
-
|
254
|
-
**`@`Router().**`unknown_command`
|
255
|
-
|
256
|
-
*method mean* **::** декоратор регистрирует функцию как обработчик неизвестных команд
|
257
|
-
|
258
|
-
---
|
259
|
-
|
260
|
-
**Router().**`get_name() -> str`
|
261
|
-
|
262
|
-
*method mean* **::** возвращает установленное название роутера
|
263
|
-
|
264
|
-
---
|
265
|
-
|
266
|
-
**Router().**`get_title() -> str`
|
267
|
-
|
268
|
-
*method mean* **::** возвращает установленный заголовок группы команд данного роутера
|
269
|
-
|
270
|
-
---
|
271
|
-
|
272
|
-
**Router().**`get_router_info() -> dict`
|
273
|
-
|
274
|
-
*method mean* **::** возвращает информацию о роутере
|
275
|
-
|
276
|
-
---
|
277
|
-
|
278
|
-
**Router().**`get_all_commands() -> list[str]`
|
279
|
-
|
280
|
-
*method mean* **::** возвращает все зарегистрированные команды для данного роутера
|
281
|
-
|
282
|
-
---
|
283
|
-
|
284
|
-
#### Исключения
|
285
|
-
- `InvalidCommandInstanceException` - Переданный объект для регистрации команды не является строкой
|
286
|
-
- `InvalidDescriptionInstanceException` - Переданный объект для регистрации описания команды не является строкой
|
287
|
-
- `UnknownCommandHandlerHasAlreadyBeenCreatedException` - Обработчик неизвестных команд уже создан
|
288
|
-
- `RepeatedCommandException` - Одна и та же команда зарегистрирована в одном роутере
|
289
|
-
|
argenta-0.3.5.dist-info/RECORD
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
argenta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
argenta/app/__init__.py,sha256=yOt8-2lholVRUtLPwAXuemh115q1unP1PKLBR_7cd4E,152
|
3
|
-
argenta/app/entity.py,sha256=Vrg7C1EifCJK-96jlLOQ0Jd3EBgGhsotNrYimEkg72k,11250
|
4
|
-
argenta/app/exceptions.py,sha256=ruI_MwJQtBLrnWxJbKlSRE50c5FjnZ9qXJma34kPZhk,1253
|
5
|
-
argenta/command/__init__.py,sha256=yRSj5CtLjxwjKiokUGdSmuBZPOF_qheRyG0NW1pv7vo,27
|
6
|
-
argenta/command/entity.py,sha256=nphBNvvXbl_4m6csWttXhU2DmNNCwjGCsGcBDV0u05s,4801
|
7
|
-
argenta/command/exceptions.py,sha256=jo-jtGHtvwsblElioo5AVHrAmmYBa2xldPHwRKFeFiI,917
|
8
|
-
argenta/command/params/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
|
-
argenta/command/params/flag/__init__.py,sha256=y6rJLdag5qxONg1CzcP7gi6rCeix9UsG1AVANX3fnJs,68
|
10
|
-
argenta/command/params/flag/entity.py,sha256=cBGUiA9h9ytcQDGp5HVMM4EOcx7jveYmhY6V_1CsOO4,1721
|
11
|
-
argenta/command/params/flag/flags_group/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
|
-
argenta/command/params/flag/flags_group/entity.py,sha256=vicuhXVyf9szr7mt1jokfjBCnaCac_HE8GUM_PJqMMM,591
|
13
|
-
argenta/router/__init__.py,sha256=ZedowNgGR9OphLSg9fXp6-uvjyf23rbq-rEtuHScAIM,87
|
14
|
-
argenta/router/entity.py,sha256=QcAwmwah1Noe5Zkf_gJoXiJ5YJeEwuUfRhyjOvCZlgg,4962
|
15
|
-
argenta/router/exceptions.py,sha256=l9rD_ySeWLYBDPv7R8XYMBWpAE2QOKjYAcZPcTjfUMI,981
|
16
|
-
argenta-0.3.5.dist-info/LICENSE,sha256=zmqoGh2n5rReBv4s8wPxF_gZEZDgauJYSPMuPczgOiU,1082
|
17
|
-
argenta-0.3.5.dist-info/METADATA,sha256=jBTRzYbdrYYQJ1I5rENFgyAC7CDTUHalj5QqN56_XX4,12638
|
18
|
-
argenta-0.3.5.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
19
|
-
argenta-0.3.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|