argenta 0.4.1__py3-none-any.whl → 0.4.5__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 CHANGED
@@ -1 +1,3 @@
1
+ __all__ = ["App"]
2
+
1
3
  from .entity import App
argenta/app/entity.py CHANGED
@@ -2,18 +2,18 @@ from typing import Callable
2
2
  from inspect import getfullargspec
3
3
  import re
4
4
 
5
- from argenta.command import Command
5
+ from argenta.command.models import Command, InputCommand
6
6
  from argenta.router import Router
7
7
  from argenta.router.defaults import system_router
8
8
  from argenta.command.exceptions import (UnprocessedInputFlagException,
9
9
  RepeatedInputFlagsException,
10
10
  EmptyInputCommandException)
11
- from .exceptions import (InvalidRouterInstanceException,
11
+ from argenta.app.exceptions import (InvalidRouterInstanceException,
12
12
  InvalidDescriptionMessagePatternException,
13
13
  NoRegisteredRoutersException,
14
14
  NoRegisteredHandlersException,
15
- RepeatedCommandInDifferentRoutersException,
16
15
  IncorrectNumberOfHandlerArgsException)
16
+ from argenta.app.registered_routers.entity import RegisteredRouters
17
17
 
18
18
 
19
19
  class App:
@@ -47,13 +47,12 @@ class App:
47
47
  self.repeat_command_groups = repeat_command_groups
48
48
  self.messages_on_startup = messages_on_startup if messages_on_startup else []
49
49
 
50
- self._routers: list[Router] = []
51
50
  self._description_message_pattern: str = '[{command}] *=*=* {description}'
52
- self._registered_router_entities: list[dict[str, str | list[dict[str, Callable[[], None] | Command]] | Router]] = []
51
+ self._registered_routers: RegisteredRouters = RegisteredRouters()
53
52
  self._invalid_input_flags_handler: Callable[[str], None] = lambda raw_command: print_func(f'Incorrect flag syntax: "{raw_command}"')
54
53
  self._repeated_input_flags_handler: Callable[[str], None] = lambda raw_command: print_func(f'Repeated input flags: "{raw_command}"')
55
- self._empty_input_command_handler: Callable[[], None] = lambda: print_func(f'Empty input command')
56
- self._unknown_command_handler: Callable[[Command], None] = lambda command: print_func(f"Unknown command: {command.get_trigger()}")
54
+ self._empty_input_command_handler: Callable[[], None] = lambda: print_func('Empty input command')
55
+ self._unknown_command_handler: Callable[[InputCommand], None] = lambda command: print_func(f"Unknown command: {command.get_trigger()}")
57
56
  self._exit_command_handler: Callable[[], None] = lambda: print_func(self.farewell_message)
58
57
 
59
58
 
@@ -61,7 +60,6 @@ class App:
61
60
  self._setup_system_router()
62
61
  self._validate_number_of_routers()
63
62
  self._validate_included_routers()
64
- self._validate_all_router_commands()
65
63
 
66
64
  self.print_func(self.initial_message)
67
65
 
@@ -80,28 +78,12 @@ class App:
80
78
  raw_command: str = input()
81
79
 
82
80
  try:
83
- input_command: Command = Command.parse_input_command(raw_command=raw_command)
84
- except UnprocessedInputFlagException:
81
+ input_command: InputCommand = InputCommand.parse(raw_command=raw_command)
82
+ except (UnprocessedInputFlagException,
83
+ RepeatedInputFlagsException,
84
+ EmptyInputCommandException) as error:
85
85
  self.print_func(self.line_separate)
86
- self._invalid_input_flags_handler(raw_command)
87
- self.print_func(self.line_separate)
88
-
89
- if not self.repeat_command_groups:
90
- self.print_func(self.prompt)
91
- continue
92
-
93
- except RepeatedInputFlagsException:
94
- self.print_func(self.line_separate)
95
- self._repeated_input_flags_handler(raw_command)
96
- self.print_func(self.line_separate)
97
-
98
- if not self.repeat_command_groups:
99
- self.print_func(self.prompt)
100
- continue
101
-
102
- except EmptyInputCommandException:
103
- self.print_func(self.line_separate)
104
- self._empty_input_command_handler()
86
+ self._error_handler(error, raw_command)
105
87
  self.print_func(self.line_separate)
106
88
 
107
89
  if not self.repeat_command_groups:
@@ -122,8 +104,8 @@ class App:
122
104
  self.print_func(self.prompt)
123
105
  continue
124
106
 
125
- for router in self._routers:
126
- router.input_command_handler(input_command)
107
+ for registered_router in self._registered_routers:
108
+ registered_router.input_command_handler(input_command)
127
109
 
128
110
  self.print_func(self.line_separate)
129
111
  self.print_func(self.command_group_description_separate)
@@ -198,53 +180,35 @@ class App:
198
180
  raise InvalidRouterInstanceException()
199
181
 
200
182
  router.set_ignore_command_register(self.ignore_command_register)
201
- self._routers.append(router)
183
+ self._registered_routers.add_registered_router(router)
202
184
 
203
- command_entities: list[dict[str, Callable[[], None] | Command]] = router.get_command_entities()
204
- self._registered_router_entities.append({'name': router.get_name(),
205
- 'title': router.get_title(),
206
- 'entity': router,
207
- 'commands': command_entities})
185
+
186
+ def include_routers(self, *routers: Router) -> None:
187
+ for router in routers:
188
+ self.include_router(router)
208
189
 
209
190
 
210
191
  def _validate_number_of_routers(self) -> None:
211
- if not self._routers:
192
+ if not self._registered_routers:
212
193
  raise NoRegisteredRoutersException()
213
194
 
214
195
 
215
196
  def _validate_included_routers(self) -> None:
216
- for router in self._routers:
217
- if not router.get_command_entities():
197
+ for router in self._registered_routers:
198
+ if not router.get_command_handlers():
218
199
  raise NoRegisteredHandlersException(router.get_name())
219
200
 
220
201
 
221
- def _validate_all_router_commands(self) -> None:
222
- for idx in range(len(self._registered_router_entities)):
223
- current_router: Router = self._registered_router_entities[idx]['entity']
224
- routers_without_current_router = self._registered_router_entities.copy()
225
- routers_without_current_router.pop(idx)
226
-
227
- current_router_all_commands: list[str] = current_router.get_all_commands()
228
-
229
- for router_entity in routers_without_current_router:
230
- if len(set(current_router_all_commands).intersection(set(router_entity['entity'].get_all_commands()))) > 0:
231
- raise RepeatedCommandInDifferentRoutersException()
232
- if self.ignore_command_register:
233
- if len(set([x.lower() for x in current_router_all_commands]).intersection(set([x.lower() for x in router_entity['entity'].get_all_commands()]))) > 0:
234
- raise RepeatedCommandInDifferentRoutersException()
235
-
236
-
237
202
  def _setup_system_router(self):
238
203
  system_router.set_title(self.system_points_title)
239
204
  @system_router.command(Command(self.exit_command, self.exit_command_description))
240
205
  def exit_command():
241
206
  self._exit_command_handler()
242
-
243
- if system_router not in [router['entity'] for router in self._registered_router_entities]:
207
+ if system_router not in self._registered_routers.get_registered_routers():
244
208
  self.include_router(system_router)
245
209
 
246
210
 
247
- def _is_exit_command(self, command: Command):
211
+ def _is_exit_command(self, command: InputCommand):
248
212
  if command.get_trigger().lower() == self.exit_command.lower():
249
213
  if self.ignore_exit_command_register:
250
214
  system_router.input_command_handler(command)
@@ -256,27 +220,43 @@ class App:
256
220
  return False
257
221
 
258
222
 
259
- def _check_is_command_unknown(self, command: Command):
260
- registered_router_entities: list[dict[str, str | list[dict[str, Callable[[], None] | Command]] | Router]] = self._registered_router_entities
261
- for router_entity in registered_router_entities:
262
- for command_entity in router_entity['commands']:
263
- if command_entity['command'].get_trigger().lower() == command.get_trigger().lower():
223
+ def _check_is_command_unknown(self, command: InputCommand):
224
+ for router_entity in self._registered_routers:
225
+ for command_handler in router_entity.get_command_handlers():
226
+ handled_command_trigger = command_handler.get_handled_command().get_trigger()
227
+ if handled_command_trigger.lower() == command.get_trigger().lower():
264
228
  if self.ignore_command_register:
265
229
  return False
266
230
  else:
267
- if command_entity['command'].get_trigger() == command.get_trigger():
231
+ if handled_command_trigger == command.get_trigger():
268
232
  return False
269
233
  self._unknown_command_handler(command)
270
234
  return True
271
235
 
272
236
 
273
237
  def _print_command_group_description(self):
274
- for router_entity in self._registered_router_entities:
275
- self.print_func(router_entity['title'])
276
- for command_entity in router_entity['commands']:
238
+ for registered_router in self._registered_routers:
239
+ self.print_func(registered_router.get_title())
240
+ for command_handler in registered_router.get_command_handlers():
277
241
  self.print_func(self._description_message_pattern.format(
278
- command=command_entity['command'].get_trigger(),
279
- description=command_entity['command'].get_description()
242
+ command=command_handler.get_handled_command().get_trigger(),
243
+ description=command_handler.get_handled_command().get_description()
280
244
  )
281
245
  )
282
246
  self.print_func(self.command_group_description_separate)
247
+
248
+
249
+ def _error_handler(self,
250
+ error: UnprocessedInputFlagException |
251
+ RepeatedInputFlagsException |
252
+ EmptyInputCommandException,
253
+ raw_command: str) -> None:
254
+ match error:
255
+ case UnprocessedInputFlagException():
256
+ self._invalid_input_flags_handler(raw_command)
257
+ case RepeatedInputFlagsException():
258
+ self._repeated_input_flags_handler(raw_command)
259
+ case EmptyInputCommandException():
260
+ self._empty_input_command_handler()
261
+
262
+
argenta/app/exceptions.py CHANGED
@@ -25,11 +25,6 @@ class NoRegisteredHandlersException(Exception):
25
25
  return f"No Registered Handlers Found For '{self.router_name}'"
26
26
 
27
27
 
28
- class RepeatedCommandInDifferentRoutersException(Exception):
29
- def __str__(self):
30
- return "Commands in different handlers cannot be repeated"
31
-
32
-
33
28
  class IncorrectNumberOfHandlerArgsException(Exception):
34
29
  def __str__(self):
35
30
  return "Incorrect Input Flags Handler has incorrect number of arguments"
File without changes
@@ -0,0 +1,21 @@
1
+ from argenta.router import Router
2
+
3
+
4
+ class RegisteredRouters:
5
+ def __init__(self, registered_routers: list[Router] = None) -> None:
6
+ self._registered_routers = registered_routers if registered_routers else []
7
+
8
+ def get_registered_routers(self) -> list[Router]:
9
+ return self._registered_routers
10
+
11
+ def add_registered_router(self, router: Router):
12
+ self._registered_routers.append(router)
13
+
14
+ def add_registered_routers(self, *routers: Router):
15
+ self._registered_routers.extend(routers)
16
+
17
+ def __iter__(self):
18
+ return iter(self._registered_routers)
19
+
20
+ def __next__(self):
21
+ return next(iter(self._registered_routers))
@@ -1 +1,3 @@
1
- from .entity import Command
1
+ __all__ = ["Command"]
2
+
3
+ from .models import Command
@@ -1,4 +1,4 @@
1
- from argenta.command.flag.entity import Flag
1
+ from argenta.command.flag.models import InputFlag, Flag
2
2
 
3
3
 
4
4
  class UnprocessedInputFlagException(Exception):
@@ -7,7 +7,7 @@ class UnprocessedInputFlagException(Exception):
7
7
 
8
8
 
9
9
  class RepeatedInputFlagsException(Exception):
10
- def __init__(self, flag: Flag):
10
+ def __init__(self, flag: Flag | InputFlag):
11
11
  self.flag = flag
12
12
  def __str__(self):
13
13
  return ("Repeated Input Flags\n"
@@ -1,2 +1,4 @@
1
- from .entity import Flag
2
- from .flags_group.entity import FlagsGroup
1
+ __all__ = ('InputFlags', 'InputFlag', 'Flag', 'Flags')
2
+
3
+
4
+ from .models import InputFlags, InputFlag, Flags, Flag
@@ -1,21 +1,21 @@
1
1
  from dataclasses import dataclass
2
- from argenta.command.flag import Flag
2
+ from argenta.command.flag.models import Flag
3
3
  import re
4
4
 
5
5
 
6
6
  @dataclass
7
- class DefaultFlags:
8
- help_flag = Flag(flag_name='help', possible_flag_values=False)
9
- short_help_flag = Flag(flag_name='h', flag_prefix='-', possible_flag_values=False)
7
+ class PredeterminedFlags:
8
+ HELP = Flag(name='help', possible_values=False)
9
+ SHORT_HELP = Flag(name='h', prefix='-', possible_values=False)
10
10
 
11
- info_flag = Flag(flag_name='info', possible_flag_values=False)
12
- short_info_flag = Flag(flag_name='i', flag_prefix='-', possible_flag_values=False)
11
+ INFO = Flag(name='info', possible_values=False)
12
+ SHORT_INFO = Flag(name='i', prefix='-', possible_values=False)
13
13
 
14
- all_flag = Flag(flag_name='all', possible_flag_values=False)
15
- short_all_flag = Flag(flag_name='a', flag_prefix='-', possible_flag_values=False)
14
+ ALL = Flag(name='all', possible_values=False)
15
+ SHORT_ALL = Flag(name='a', prefix='-', possible_values=False)
16
16
 
17
- host_flag = Flag(flag_name='host', possible_flag_values=re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'))
18
- short_host_flag = Flag(flag_name='h', flag_prefix='-', possible_flag_values=re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'))
17
+ HOST = Flag(name='host', possible_values=re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'))
18
+ SHORT_HOST = Flag(name='h', prefix='-', possible_values=re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'))
19
19
 
20
- port_flag = Flag(flag_name='port', possible_flag_values=re.compile(r'^\d{1,5}$'))
21
- short_port_flag = Flag(flag_name='p', flag_prefix='-', possible_flag_values=re.compile(r'^\d{1,5}$'))
20
+ PORT = Flag(name='port', possible_values=re.compile(r'^\d{1,5}$'))
21
+ SHORT_PORT = Flag(name='p', prefix='-', possible_values=re.compile(r'^\d{1,5}$'))
@@ -0,0 +1,140 @@
1
+ from typing import Literal, Pattern
2
+ from abc import ABC, abstractmethod
3
+
4
+
5
+ class BaseFlag:
6
+ def __init__(self, name: str,
7
+ prefix: Literal['-', '--', '---'] = '--'):
8
+ self._name = name
9
+ self._prefix = prefix
10
+
11
+ def get_string_entity(self):
12
+ string_entity: str = self._prefix + self._name
13
+ return string_entity
14
+
15
+ def get_name(self):
16
+ return self._name
17
+
18
+ def get_prefix(self):
19
+ return self._prefix
20
+
21
+
22
+
23
+ class InputFlag(BaseFlag):
24
+ def __init__(self, name: str,
25
+ prefix: Literal['-', '--', '---'] = '--',
26
+ value: str = None):
27
+ super().__init__(name, prefix)
28
+ self._flag_value = value
29
+
30
+ def get_value(self):
31
+ return self._flag_value
32
+
33
+ def set_value(self, value):
34
+ self._flag_value = value
35
+
36
+
37
+
38
+ class Flag(BaseFlag):
39
+ def __init__(self, name: str,
40
+ prefix: Literal['-', '--', '---'] = '--',
41
+ possible_values: list[str] | Pattern[str] | False = True):
42
+ super().__init__(name, prefix)
43
+ self.possible_values = possible_values
44
+
45
+ def validate_input_flag_value(self, input_flag_value: str | None):
46
+ if self.possible_values is False:
47
+ if input_flag_value is None:
48
+ return True
49
+ else:
50
+ return False
51
+ elif isinstance(self.possible_values, Pattern):
52
+ if isinstance(input_flag_value, str):
53
+ is_valid = bool(self.possible_values.match(input_flag_value))
54
+ if bool(is_valid):
55
+ return True
56
+ else:
57
+ return False
58
+ else:
59
+ return False
60
+
61
+ elif isinstance(self.possible_values, list):
62
+ if input_flag_value in self.possible_values:
63
+ return True
64
+ else:
65
+ return False
66
+ else:
67
+ return True
68
+
69
+
70
+
71
+ class BaseFlags(ABC):
72
+ __slots__ = ('_flags',)
73
+
74
+ @abstractmethod
75
+ def get_flags(self):
76
+ pass
77
+
78
+ @abstractmethod
79
+ def add_flag(self, flag: Flag | InputFlag):
80
+ pass
81
+
82
+ @abstractmethod
83
+ def add_flags(self, flags: list[Flag] | list[InputFlag]):
84
+ pass
85
+
86
+ @abstractmethod
87
+ def get_flag(self, name: str):
88
+ pass
89
+
90
+ def __iter__(self):
91
+ return iter(self._flags)
92
+
93
+ def __next__(self):
94
+ return next(iter(self))
95
+
96
+ def __getitem__(self, item):
97
+ return self._flags[item]
98
+
99
+
100
+
101
+ class Flags(BaseFlags, ABC):
102
+ def __init__(self, *flags: Flag):
103
+ self._flags = flags if flags else []
104
+
105
+ def get_flags(self) -> list[Flag]:
106
+ return self._flags
107
+
108
+ def add_flag(self, flag: Flag):
109
+ self._flags.append(flag)
110
+
111
+ def add_flags(self, flags: list[Flag]):
112
+ self._flags.extend(flags)
113
+
114
+ def get_flag(self, name: str) -> Flag | None:
115
+ if name in [flag.get_name() for flag in self._flags]:
116
+ return list(filter(lambda flag: flag.get_name() == name, self._flags))[0]
117
+ else:
118
+ return None
119
+
120
+
121
+
122
+ class InputFlags(BaseFlags, ABC):
123
+ def __init__(self, *flags: InputFlag):
124
+ self._flags = flags if flags else []
125
+
126
+ def get_flags(self) -> list[InputFlag]:
127
+ return self._flags
128
+
129
+ def add_flag(self, flag: InputFlag):
130
+ self._flags.append(flag)
131
+
132
+ def add_flags(self, flags: list[InputFlag]):
133
+ self._flags.extend(flags)
134
+
135
+ def get_flag(self, name: str) -> InputFlag | None:
136
+ if name in [flag.get_name() for flag in self._flags]:
137
+ return list(filter(lambda flag: flag.get_name() == name, self._flags))[0]
138
+ else:
139
+ return None
140
+
@@ -0,0 +1,105 @@
1
+ from argenta.command.flag.models import Flag, InputFlag, Flags, InputFlags
2
+ from argenta.command.exceptions import (UnprocessedInputFlagException,
3
+ RepeatedInputFlagsException,
4
+ EmptyInputCommandException)
5
+ from typing import Generic, TypeVar, cast, Literal
6
+
7
+
8
+ InputCommandType = TypeVar('InputCommandType')
9
+
10
+
11
+ class BaseCommand:
12
+ def __init__(self, trigger: str):
13
+ self._trigger = trigger
14
+
15
+ def get_trigger(self) -> str:
16
+ return self._trigger
17
+
18
+
19
+ class Command(BaseCommand):
20
+ def __init__(self, trigger: str,
21
+ description: str = None,
22
+ flags: Flag | Flags = None):
23
+ super().__init__(trigger)
24
+ self._registered_flags: Flags = flags if isinstance(flags, Flags) else Flags(flags) if isinstance(flags, Flag) else Flags()
25
+ self._description = f'description for "{self._trigger}" command' if not description else description
26
+
27
+ def get_registered_flags(self) -> Flags:
28
+ return self._registered_flags
29
+
30
+ def validate_input_flag(self, flag: InputFlag):
31
+ registered_flags: Flags | None = self.get_registered_flags()
32
+ if registered_flags:
33
+ if isinstance(registered_flags, Flag):
34
+ if registered_flags.get_string_entity() == flag.get_string_entity():
35
+ is_valid = registered_flags.validate_input_flag_value(flag.get_value())
36
+ if is_valid:
37
+ return True
38
+ else:
39
+ for registered_flag in registered_flags:
40
+ if registered_flag.get_string_entity() == flag.get_string_entity():
41
+ is_valid = registered_flag.validate_input_flag_value(flag.get_value())
42
+ if is_valid:
43
+ return True
44
+ return False
45
+
46
+ def get_description(self) -> str:
47
+ return self._description
48
+
49
+
50
+
51
+ class InputCommand(BaseCommand, Generic[InputCommandType]):
52
+ def __init__(self, trigger: str,
53
+ input_flags: InputFlag | InputFlags = None):
54
+ super().__init__(trigger)
55
+ self._input_flags: InputFlags = input_flags if isinstance(input_flags, InputFlags) else InputFlags(input_flags) if isinstance(input_flags, InputFlag) else InputFlags()
56
+
57
+ def _set_input_flags(self, input_flags: InputFlags):
58
+ self._input_flags = input_flags
59
+
60
+ def get_input_flags(self) -> InputFlags:
61
+ return self._input_flags
62
+
63
+ @staticmethod
64
+ def parse(raw_command: str) -> InputCommandType:
65
+ if not raw_command:
66
+ raise EmptyInputCommandException()
67
+
68
+ list_of_tokens = raw_command.split()
69
+ command = list_of_tokens.pop(0)
70
+
71
+ input_flags: InputFlags = InputFlags()
72
+ current_flag_name, current_flag_value = None, None
73
+
74
+ for k, _ in enumerate(list_of_tokens):
75
+ if _.startswith('-'):
76
+ if current_flag_name or len(_) < 2 or len(_[:_.rfind('-')]) > 3:
77
+ raise UnprocessedInputFlagException()
78
+ current_flag_name = _
79
+ else:
80
+ if not current_flag_name:
81
+ raise UnprocessedInputFlagException()
82
+ current_flag_value = _
83
+
84
+ if current_flag_name:
85
+ if not len(list_of_tokens) == k+1:
86
+ if not list_of_tokens[k+1].startswith('-'): continue
87
+
88
+ input_flag = InputFlag(name=current_flag_name[current_flag_name.rfind('-')+1:],
89
+ prefix=cast(Literal['-', '--', '---'],
90
+ current_flag_name[:current_flag_name.rfind('-')+1]),
91
+ value=current_flag_value)
92
+
93
+ all_flags = [flag.get_string_entity() for flag in input_flags.get_flags()]
94
+ if input_flag.get_string_entity() not in all_flags:
95
+ input_flags.add_flag(input_flag)
96
+ else:
97
+ raise RepeatedInputFlagsException(input_flag)
98
+
99
+ current_flag_name, current_flag_value = None, None
100
+
101
+ if any([current_flag_name, current_flag_value]):
102
+ raise UnprocessedInputFlagException()
103
+ else:
104
+ return InputCommand(trigger=command, input_flags=input_flags)
105
+
@@ -1 +1,4 @@
1
+ __all__ = ["Router"]
2
+
3
+
1
4
  from .entity import Router
File without changes
@@ -0,0 +1,21 @@
1
+ from typing import Callable
2
+ from argenta.command import Command
3
+ from argenta.command.flag.models import InputFlags
4
+
5
+
6
+ class CommandHandler:
7
+ def __init__(self, handler: Callable[[], None] | Callable[[InputFlags], None], handled_command: Command):
8
+ self.handler = handler
9
+ self.handled_command = handled_command
10
+
11
+ def handling(self, input_flags: InputFlags):
12
+ if input_flags.get_flags():
13
+ self.handler(input_flags)
14
+ else:
15
+ self.handler()
16
+
17
+ def get_handler(self):
18
+ return self.handler
19
+
20
+ def get_handled_command(self):
21
+ return self.handled_command
File without changes
@@ -0,0 +1,21 @@
1
+ from argenta.router.command_handler.entity import CommandHandler
2
+
3
+
4
+ class CommandHandlers:
5
+ def __init__(self, command_handlers: list[CommandHandler] = None):
6
+ self.command_handlers = command_handlers if command_handlers else []
7
+
8
+ def get_command_handlers(self) -> list[CommandHandler]:
9
+ return self.command_handlers
10
+
11
+ def add_command_handler(self, command_handler: CommandHandler):
12
+ self.command_handlers.append(command_handler)
13
+
14
+ def add_command_handlers(self, *command_handlers: CommandHandler):
15
+ self.command_handlers.extend(command_handlers)
16
+
17
+ def __iter__(self):
18
+ return iter(self.command_handlers)
19
+
20
+ def __next__(self):
21
+ return next(iter(self.command_handlers))
argenta/router/entity.py CHANGED
@@ -1,26 +1,26 @@
1
1
  from typing import Callable, Any
2
2
  from inspect import getfullargspec
3
3
 
4
- from ..command.entity import Command
5
- from argenta.command.flag.entity import Flag
6
- from argenta.command.flag.flags_group import FlagsGroup
7
- from ..router.exceptions import (RepeatedCommandException,
8
- RepeatedFlagNameException,
9
- TooManyTransferredArgsException,
10
- RequiredArgumentNotPassedException,
11
- IncorrectNumberOfHandlerArgsException,
12
- TriggerCannotContainSpacesException)
4
+ from argenta.command import Command
5
+ from argenta.command.models import InputCommand
6
+ from argenta.router.command_handlers.entity import CommandHandlers
7
+ from argenta.router.command_handler.entity import CommandHandler
8
+ from argenta.command.flag.models import Flag, Flags, InputFlags
9
+ from argenta.router.exceptions import (RepeatedFlagNameException,
10
+ TooManyTransferredArgsException,
11
+ RequiredArgumentNotPassedException,
12
+ IncorrectNumberOfHandlerArgsException,
13
+ TriggerCannotContainSpacesException)
13
14
 
14
15
 
15
16
  class Router:
16
17
  def __init__(self,
17
18
  title: str = 'Commands group title:',
18
19
  name: str = 'Default'):
19
-
20
20
  self._title = title
21
21
  self._name = name
22
22
 
23
- self._command_entities: list[dict[str, Callable[[], None] | Command]] = []
23
+ self._command_handlers: CommandHandlers = CommandHandlers()
24
24
  self._ignore_command_register: bool = False
25
25
 
26
26
  self._not_valid_flag_handler: Callable[[Flag], None] = lambda flag: print(f"Undefined or incorrect input flag: {flag.get_string_entity()}{(' '+flag.get_value()) if flag.get_value() else ''}")
@@ -31,14 +31,15 @@ class Router:
31
31
 
32
32
  def command_decorator(func):
33
33
  Router._validate_func_args(command, func)
34
- self._command_entities.append({'handler_func': func,
35
- 'command': command})
34
+ self._command_handlers.add_command_handler(CommandHandler(func, command))
35
+
36
36
  def wrapper(*args, **kwargs):
37
37
  return func(*args, **kwargs)
38
38
  return wrapper
39
39
 
40
40
  return command_decorator
41
41
 
42
+
42
43
  def set_invalid_input_flag_handler(self, func):
43
44
  processed_args = getfullargspec(func).args
44
45
  if len(processed_args) != 1:
@@ -47,40 +48,40 @@ class Router:
47
48
  self._not_valid_flag_handler = func
48
49
 
49
50
 
50
- def input_command_handler(self, input_command: Command):
51
+ def input_command_handler(self, input_command: InputCommand):
51
52
  input_command_name: str = input_command.get_trigger()
52
- input_command_flags: FlagsGroup = input_command.get_input_flags()
53
- for command_entity in self._command_entities:
54
- if input_command_name.lower() == command_entity['command'].get_trigger().lower():
55
- if command_entity['command'].get_registered_flags():
53
+ input_command_flags: InputFlags = input_command.get_input_flags()
54
+ for command_handler in self._command_handlers:
55
+ handle_command = command_handler.get_handled_command()
56
+ if input_command_name.lower() == handle_command.get_trigger().lower():
57
+ if handle_command.get_registered_flags():
56
58
  if input_command_flags:
57
59
  for flag in input_command_flags:
58
- is_valid = command_entity['command'].validate_input_flag(flag)
60
+ is_valid = handle_command.validate_input_flag(flag)
59
61
  if not is_valid:
60
62
  self._not_valid_flag_handler(flag)
61
63
  return
62
- return command_entity['handler_func'](input_command_flags.unparse_to_dict())
64
+ command_handler.handling(input_command_flags)
65
+ return
63
66
  else:
64
- return command_entity['handler_func']({})
67
+ command_handler.handling({})
68
+ return
65
69
  else:
66
70
  if input_command_flags:
67
71
  self._not_valid_flag_handler(input_command_flags[0])
68
72
  return
69
73
  else:
70
- return command_entity['handler_func']()
74
+ command_handler.handling()
75
+ return
71
76
 
72
77
 
73
- def _validate_command(self, command: Command):
78
+ @staticmethod
79
+ def _validate_command(command: Command):
74
80
  command_name: str = command.get_trigger()
75
81
  if command_name.find(' ') != -1:
76
82
  raise TriggerCannotContainSpacesException()
77
- if command_name in self.get_all_commands():
78
- raise RepeatedCommandException()
79
- if self._ignore_command_register:
80
- if command_name.lower() in [x.lower() for x in self.get_all_commands()]:
81
- raise RepeatedCommandException()
82
83
 
83
- flags: FlagsGroup = command.get_registered_flags()
84
+ flags: Flags = command.get_registered_flags()
84
85
  if flags:
85
86
  flags_name: list = [x.get_string_entity().lower() for x in flags]
86
87
  if len(set(flags_name)) < len(flags_name):
@@ -91,12 +92,12 @@ class Router:
91
92
  def _validate_func_args(command: Command, func: Callable):
92
93
  registered_args = command.get_registered_flags()
93
94
  transferred_args = getfullargspec(func).args
94
- if registered_args and transferred_args:
95
+ if registered_args.get_flags() and transferred_args:
95
96
  if len(transferred_args) != 1:
96
97
  raise TooManyTransferredArgsException()
97
- elif registered_args and not transferred_args:
98
+ elif registered_args.get_flags() and not transferred_args:
98
99
  raise RequiredArgumentNotPassedException()
99
- elif not registered_args and transferred_args:
100
+ elif not registered_args.get_flags() and transferred_args:
100
101
  raise TooManyTransferredArgsException()
101
102
 
102
103
 
@@ -104,8 +105,8 @@ class Router:
104
105
  self._ignore_command_register = ignore_command_register
105
106
 
106
107
 
107
- def get_command_entities(self) -> list[dict[str, Callable[[], None] | Command]]:
108
- return self._command_entities
108
+ def get_command_handlers(self) -> CommandHandlers:
109
+ return self._command_handlers
109
110
 
110
111
 
111
112
  def get_name(self) -> str:
@@ -122,7 +123,7 @@ class Router:
122
123
 
123
124
  def get_all_commands(self) -> list[str]:
124
125
  all_commands: list[str] = []
125
- for command_entity in self._command_entities:
126
- all_commands.append(command_entity['command'].get_trigger())
126
+ for command_handler in self._command_handlers:
127
+ all_commands.append(command_handler.get_handled_command().get_trigger())
127
128
 
128
129
  return all_commands
@@ -1,11 +1,6 @@
1
- class RepeatedCommandException(Exception):
2
- def __str__(self):
3
- return "Commands in handler cannot be repeated"
4
-
5
-
6
1
  class RepeatedFlagNameException(Exception):
7
2
  def __str__(self):
8
- return "Repeated flag name in register command"
3
+ return "Repeated registered_flag name in register command"
9
4
 
10
5
 
11
6
  class TooManyTransferredArgsException(Exception):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: argenta
3
- Version: 0.4.1
3
+ Version: 0.4.5
4
4
  Summary: python library for creating custom shells
5
5
  License: MIT
6
6
  Author: kolo
@@ -71,14 +71,14 @@ if __name__ == '__main__':
71
71
  import re
72
72
  from argenta.router import Router
73
73
  from argenta.command import Command
74
- from argenta.command.flag import FlagsGroup, Flag
74
+ from argenta.command.flag import Flags, Flag, InputFlags
75
75
 
76
76
  router = Router()
77
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}$')),
78
+ registered_flags = Flags(
79
+ Flag(name='host',
80
+ prefix='--',
81
+ possible_values=re.compile(r'^192.168.\d{1,3}.\d{1,3}$')),
82
82
  Flag('port', '--', re.compile(r'^[0-9]{1,4}$')))
83
83
 
84
84
 
@@ -90,10 +90,10 @@ def handler():
90
90
  @router.command(Command(trigger="ssh",
91
91
  description='connect via ssh',
92
92
  flags=registered_flags))
93
- def handler_with_flags(flags: dict):
93
+ def handler_with_flags(flags: InputFlags):
94
94
  for flag in flags:
95
- print(f'Flag name: {flag['name']}\n'
96
- f'Flag value: {flag['value']}')
95
+ print(f'Flag name: {flag.get_name()}\n'
96
+ f'Flag value: {flag.get_value()}')
97
97
  ```
98
98
 
99
99
  ---
@@ -314,7 +314,6 @@ Router(title: str = 'Commands group title:',
314
314
  ---
315
315
 
316
316
  ### Исключения
317
- - `RepeatedCommandException` - Одна и та же команда зарегистрирована в одном роутере
318
317
  - `RepeatedFlagNameException` - Повторяющиеся зарегистрированные флаги в команде
319
318
  - `TooManyTransferredArgsException` - Слишком много зарегистрированных аргументов у обработчика команды
320
319
  - `RequiredArgumentNotPassedException` - Не зарегистрирован обязательный аргумент у обработчика команды(аргумент, через который будут переданы флаги введённой команды)
@@ -330,14 +329,14 @@ Router(title: str = 'Commands group title:',
330
329
  ```python
331
330
  Command(trigger: str,
332
331
  description: str = None,
333
- flags: Flag | FlagsGroup = None)
332
+ flags: Flag | Flags = None)
334
333
  ```
335
334
 
336
335
  **Аргументы:**
337
336
  - **name : mean**
338
337
  - `trigger` (`str`): Строковый триггер
339
338
  - `description` (`str`): Описание команды, которое будет выведено в консоль при запуске оболочки
340
- - `flags` (`Flag | FlagsGroup`): Флаги, которые будут обработаны при их наличии во вводе юзера
339
+ - `flags` (`Flag | Flags`): Флаги, которые будут обработаны при их наличии во вводе юзера
341
340
 
342
341
  ---
343
342
 
@@ -353,7 +352,7 @@ Command(trigger: str,
353
352
 
354
353
  ---
355
354
 
356
- #### **.get_registered_flags() -> `FlagsGroup | None`**
355
+ #### **.get_registered_flags() -> `Flags | None`**
357
356
 
358
357
  *method mean* **::** возвращает зарегистрированные флаги экземпляра
359
358
 
@@ -417,14 +416,14 @@ Flag(flag_name: str,
417
416
 
418
417
  ---
419
418
 
420
- ## *class* :: `FlagsGroup`
419
+ ## *class* :: `Flags`
421
420
  Класс, объединяющий список флагов в один объект, используется в качестве
422
421
  передаваемого аргумента `flags` экземпляру класса `Command`, при регистрации
423
422
  хэндлера
424
423
 
425
424
  ### Конструктор
426
425
  ```python
427
- FlagsGroup(*flagы: Flag)
426
+ Flags(*flagы: Flag)
428
427
  ```
429
428
 
430
429
  ---
@@ -0,0 +1,24 @@
1
+ argenta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ argenta/app/__init__.py,sha256=5BZcyJqfexO8t43j1LkWUB5BtGtZXpkR7170YvfeM30,46
3
+ argenta/app/entity.py,sha256=3oo3eCiUockvTQVjGnkt17yEno8aRshohGTGEox87P4,11195
4
+ argenta/app/exceptions.py,sha256=hItqsh76Fq6FfeanHqX8dvF00ERHXbQYjap5UODwg3o,1095
5
+ argenta/app/registered_routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ argenta/app/registered_routers/entity.py,sha256=OQZyrF4eoCoDHzRJ22zZxhNEx-bOUDu7NZIFDfO-fuY,688
7
+ argenta/command/__init__.py,sha256=Yx5Zl5Diwhjs8SZrsYEBNJscTMxWkLP0nqPvAJZtu30,52
8
+ argenta/command/exceptions.py,sha256=J3kNY6CFoOxJXsZ23Bfl6f5uVUSiKZfwiGPBmlOwN5M,578
9
+ argenta/command/flag/__init__.py,sha256=Ew-ZRFVY7sC_PMvavN0AEcsvdYGHkLAPOYMrReY3NC0,116
10
+ argenta/command/flag/defaults.py,sha256=ktKmDT0rSSBoFUghTlEQ6OletoFxCiD37hRzO73mUUc,875
11
+ argenta/command/flag/models.py,sha256=X1MFpAtnUX6mi1huycAtwAPXPeh9YFO-lH91TNyD3G4,3755
12
+ argenta/command/models.py,sha256=ZVgJjS2uZbO2YaRYaXeT8a-IfO1IOiylWJXOMsx6fJw,4409
13
+ argenta/router/__init__.py,sha256=uP58EfcmtK2NuMBQaspD_Gmq3LqgDXus4rfB6hp9Uig,52
14
+ argenta/router/command_handler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ argenta/router/command_handler/entity.py,sha256=-qV_Ysw6WcklW0WN5nAD8U3QLbqBNGT-WeMFHuhfrf4,639
16
+ argenta/router/command_handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ argenta/router/command_handlers/entity.py,sha256=KgFKjAMUr_mOcn9xahTxMUKB6lIxXgqCuAsuc4TgP6E,747
18
+ argenta/router/defaults.py,sha256=huftOg1HMjrT_R2SHHOL4eJ5uZHspNEYBSg-mCq9xhU,126
19
+ argenta/router/entity.py,sha256=-88RWF2IEKBUwM7zfUiN0rrDjVpU94m4y5nuspld5ao,5073
20
+ argenta/router/exceptions.py,sha256=tdeaR8zDvnytgRYo_wQWKHt3if2brapgauIhhMIsTsA,678
21
+ argenta-0.4.5.dist-info/LICENSE,sha256=zmqoGh2n5rReBv4s8wPxF_gZEZDgauJYSPMuPczgOiU,1082
22
+ argenta-0.4.5.dist-info/METADATA,sha256=qI8PsEalTHJ7WYK4mB1Zer4n8rxafBMEO9rbp2qkcsg,18031
23
+ argenta-0.4.5.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
24
+ argenta-0.4.5.dist-info/RECORD,,
argenta/command/entity.py DELETED
@@ -1,110 +0,0 @@
1
- from argenta.command.flag.entity import Flag
2
- from argenta.command.flag.flags_group import FlagsGroup
3
- from .exceptions import (UnprocessedInputFlagException,
4
- RepeatedInputFlagsException,
5
- EmptyInputCommandException)
6
-
7
- from typing import Generic, TypeVar, cast, Literal
8
-
9
-
10
- CommandType = TypeVar('CommandType')
11
-
12
-
13
- class Command(Generic[CommandType]):
14
- def __init__(self, trigger: str,
15
- description: str = None,
16
- flags: Flag | FlagsGroup = None):
17
- self._trigger = trigger
18
- self._description = f'description for "{self._trigger}" command' if not description else description
19
- self._registered_flags: FlagsGroup | None = flags if isinstance(flags, FlagsGroup) else FlagsGroup(flags) if isinstance(flags, Flag) else flags
20
- self._input_flags: FlagsGroup | None = None
21
-
22
-
23
- def get_trigger(self) -> str:
24
- return self._trigger
25
-
26
-
27
- def get_description(self) -> str:
28
- return self._description
29
-
30
-
31
- def get_registered_flags(self) -> FlagsGroup | None:
32
- return self._registered_flags
33
-
34
-
35
- def validate_input_flag(self, flag: Flag):
36
- registered_flags: FlagsGroup | None = self.get_registered_flags()
37
- if registered_flags:
38
- if isinstance(registered_flags, Flag):
39
- if registered_flags.get_string_entity() == flag.get_string_entity():
40
- is_valid = registered_flags.validate_input_flag_value(flag.get_value())
41
- if is_valid:
42
- return True
43
- else:
44
- for registered_flag in registered_flags:
45
- if registered_flag.get_string_entity() == flag.get_string_entity():
46
- is_valid = registered_flag.validate_input_flag_value(flag.get_value())
47
- if is_valid:
48
- return True
49
- return False
50
-
51
-
52
- def _set_input_flags(self, input_flags: FlagsGroup):
53
- self._input_flags = input_flags
54
-
55
- def get_input_flags(self) -> FlagsGroup:
56
- return self._input_flags
57
-
58
- @staticmethod
59
- def parse_input_command(raw_command: str) -> CommandType:
60
- if not raw_command:
61
- raise EmptyInputCommandException()
62
- list_of_tokens = raw_command.split()
63
- command = list_of_tokens[0]
64
- list_of_tokens.pop(0)
65
-
66
- flags: FlagsGroup = FlagsGroup()
67
- current_flag_name = None
68
- current_flag_value = None
69
- for k, _ in enumerate(list_of_tokens):
70
- if _.startswith('-'):
71
- flag_prefix_last_symbol_index = _.rfind('-')
72
- if current_flag_name or len(_) < 2 or len(_[:flag_prefix_last_symbol_index]) > 3:
73
- raise UnprocessedInputFlagException()
74
- else:
75
- current_flag_name = _
76
- else:
77
- if not current_flag_name:
78
- raise UnprocessedInputFlagException()
79
- else:
80
- current_flag_value = _
81
- if current_flag_name:
82
- if not len(list_of_tokens) == k+1:
83
- if not list_of_tokens[k+1].startswith('-'):
84
- continue
85
- flag_prefix_last_symbol_index = current_flag_name.rfind('-')
86
- flag_prefix = current_flag_name[:flag_prefix_last_symbol_index+1]
87
- flag_name = current_flag_name[flag_prefix_last_symbol_index+1:]
88
- input_flag = Flag(flag_name=flag_name,
89
- flag_prefix=cast(Literal['-', '--', '---'], flag_prefix))
90
- input_flag.set_value(current_flag_value)
91
-
92
- all_flags = [x.get_string_entity() for x in flags.get_flags()]
93
- if input_flag.get_string_entity() not in all_flags:
94
- flags.add_flag(input_flag)
95
- else:
96
- raise RepeatedInputFlagsException(input_flag)
97
-
98
- current_flag_name = None
99
- current_flag_value = None
100
- if any([current_flag_name, current_flag_value]):
101
- raise UnprocessedInputFlagException()
102
- if len(flags.get_flags()) == 0:
103
- return Command(trigger=command)
104
- else:
105
- input_command = Command(trigger=command)
106
- input_command._set_input_flags(flags)
107
- return input_command
108
-
109
-
110
-
@@ -1,49 +0,0 @@
1
- from typing import Literal, Pattern
2
-
3
-
4
- class Flag:
5
- def __init__(self, flag_name: str,
6
- flag_prefix: Literal['-', '--', '---'] = '--',
7
- possible_flag_values: list[str] | Pattern[str] | False = True):
8
- self._flag_name = flag_name
9
- self._flag_prefix = flag_prefix
10
- self.possible_flag_values = possible_flag_values
11
-
12
- self._flag_value = None
13
-
14
- def get_string_entity(self):
15
- string_entity: str = self._flag_prefix + self._flag_name
16
- return string_entity
17
-
18
- def get_flag_name(self):
19
- return self._flag_name
20
-
21
- def get_flag_prefix(self):
22
- return self._flag_prefix
23
-
24
- def get_value(self):
25
- return self._flag_value
26
-
27
- def set_value(self, value):
28
- self._flag_value = value
29
-
30
- def validate_input_flag_value(self, input_flag_value: str | None):
31
- if self.possible_flag_values is False:
32
- if input_flag_value is None:
33
- return True
34
- else:
35
- return False
36
- elif isinstance(self.possible_flag_values, Pattern):
37
- is_valid = bool(self.possible_flag_values.match(input_flag_value))
38
- if bool(is_valid):
39
- return True
40
- else:
41
- return False
42
-
43
- elif isinstance(self.possible_flag_values, list):
44
- if input_flag_value in self.possible_flag_values:
45
- return True
46
- else:
47
- return False
48
- else:
49
- return True
@@ -1 +0,0 @@
1
- from .entity import FlagsGroup
@@ -1,35 +0,0 @@
1
- from argenta.command.flag import Flag
2
-
3
-
4
- class FlagsGroup:
5
- def __init__(self, *flags: Flag):
6
- self._flags: list[Flag] = [] if not flags else flags
7
-
8
- def get_flags(self) -> list[Flag]:
9
- return self._flags
10
-
11
- def add_flag(self, flag: Flag):
12
- self._flags.append(flag)
13
-
14
- def add_flags(self, flags: list[Flag]):
15
- self._flags.extend(flags)
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
-
28
- def __iter__(self):
29
- return iter(self._flags)
30
-
31
- def __next__(self):
32
- return next(iter(self))
33
-
34
- def __getitem__(self, item):
35
- return self._flags[item]
@@ -1,20 +0,0 @@
1
- argenta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- argenta/app/__init__.py,sha256=NoKJpO5inI4bEtptNj7BZtNpGQidCNoFSw2-JoK6P98,25
3
- argenta/app/entity.py,sha256=9vRk66GQD-3kC--alv21gM_rqyA9ZzKfzXy0jVD6cO0,12506
4
- argenta/app/exceptions.py,sha256=ruI_MwJQtBLrnWxJbKlSRE50c5FjnZ9qXJma34kPZhk,1253
5
- argenta/command/__init__.py,sha256=yRSj5CtLjxwjKiokUGdSmuBZPOF_qheRyG0NW1pv7vo,27
6
- argenta/command/entity.py,sha256=uICQk5zaD_IG52q2IpFTDiGkTK0G6guPR6Eb9Y-3n0E,4454
7
- argenta/command/exceptions.py,sha256=ZhJS_ThdmTgGnZqhSfCfkT_VcfkHTiAU7hAgrme6gQY,555
8
- argenta/command/flag/__init__.py,sha256=y6rJLdag5qxONg1CzcP7gi6rCeix9UsG1AVANX3fnJs,68
9
- argenta/command/flag/defaults.py,sha256=FjmqepLflYhp2yQcH2bCLi8nip9Bihb5d_HInuEWD4I,1037
10
- argenta/command/flag/entity.py,sha256=osMAh-PVP_1MhRhe4Zf1NmJu5NJWAyY6oOKT9mtZnWw,1542
11
- argenta/command/flag/flags_group/__init__.py,sha256=f1q3albNnoQYrY56Exb75oh62miTdxD0ALo5aBWW9_g,30
12
- argenta/command/flag/flags_group/entity.py,sha256=NcyKjC_N-8d4xARkVCLSK8-PoPrKjSlIbR4SHSa7_us,985
13
- argenta/router/__init__.py,sha256=vIU2o3JJ7misRm9mUzUQw5HdverdMDfvHNzkWuYFRBY,26
14
- argenta/router/defaults.py,sha256=huftOg1HMjrT_R2SHHOL4eJ5uZHspNEYBSg-mCq9xhU,126
15
- argenta/router/entity.py,sha256=w4_LO3jVbQPMu8GHjSW6q-_AdQ_IPQkGJHjYaCVXw-Q,5195
16
- argenta/router/exceptions.py,sha256=NseEKrhwvG-H5_qdN-hzq83eJ98jku-PzHspz4CG9PM,796
17
- argenta-0.4.1.dist-info/LICENSE,sha256=zmqoGh2n5rReBv4s8wPxF_gZEZDgauJYSPMuPczgOiU,1082
18
- argenta-0.4.1.dist-info/METADATA,sha256=r7hxvBwmXnaa3GDn3x3bvUlIode_EGFW1E2iCB6wkZY,18187
19
- argenta-0.4.1.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
20
- argenta-0.4.1.dist-info/RECORD,,