diff --git a/argenta/command/__pycache__/__init__.cpython-313.pyc b/argenta/command/__pycache__/__init__.cpython-313.pyc index 26ac58c..7a8b8f9 100644 Binary files a/argenta/command/__pycache__/__init__.cpython-313.pyc and b/argenta/command/__pycache__/__init__.cpython-313.pyc differ diff --git a/argenta/command/__pycache__/entity.cpython-313.pyc b/argenta/command/__pycache__/entity.cpython-313.pyc index b4af686..e8c89ad 100644 Binary files a/argenta/command/__pycache__/entity.cpython-313.pyc and b/argenta/command/__pycache__/entity.cpython-313.pyc differ diff --git a/argenta/command/__pycache__/exceptions.cpython-313.pyc b/argenta/command/__pycache__/exceptions.cpython-313.pyc index 83cd0ea..b333e71 100644 Binary files a/argenta/command/__pycache__/exceptions.cpython-313.pyc and b/argenta/command/__pycache__/exceptions.cpython-313.pyc differ diff --git a/argenta/command/entity.py b/argenta/command/entity.py index 61b8fb6..93c17ae 100644 --- a/argenta/command/entity.py +++ b/argenta/command/entity.py @@ -30,10 +30,11 @@ class Command: self._command = command def validate_commands_params(self): + print(self._flags) if not isinstance(self._command, str): raise InvalidCommandInstanceException(self._command) if not isinstance(self._description, str): raise InvalidDescriptionInstanceException() - if not (isinstance(self._flags, Flag) or isinstance(self._flags, FlagsGroup)): + if not (isinstance(self._flags, Flag) or not isinstance(self._flags, FlagsGroup)) or not self._flags is None: raise InvalidFlagsInstanceException diff --git a/argenta/command/params/__pycache__/__init__.cpython-313.pyc b/argenta/command/params/__pycache__/__init__.cpython-313.pyc index f90c4e8..e7facaa 100644 Binary files a/argenta/command/params/__pycache__/__init__.cpython-313.pyc and b/argenta/command/params/__pycache__/__init__.cpython-313.pyc differ diff --git a/argenta/command/params/flag/__pycache__/__init__.cpython-313.pyc b/argenta/command/params/flag/__pycache__/__init__.cpython-313.pyc index 65a5e01..38c8200 100644 Binary files a/argenta/command/params/flag/__pycache__/__init__.cpython-313.pyc and b/argenta/command/params/flag/__pycache__/__init__.cpython-313.pyc differ diff --git a/argenta/command/params/flag/__pycache__/entity.cpython-313.pyc b/argenta/command/params/flag/__pycache__/entity.cpython-313.pyc index 44ef5fe..0d607b6 100644 Binary files a/argenta/command/params/flag/__pycache__/entity.cpython-313.pyc and b/argenta/command/params/flag/__pycache__/entity.cpython-313.pyc differ diff --git a/argenta/command/params/flags_group/__pycache__/__init__.cpython-313.pyc b/argenta/command/params/flags_group/__pycache__/__init__.cpython-313.pyc index e0f1d5f..6c90035 100644 Binary files a/argenta/command/params/flags_group/__pycache__/__init__.cpython-313.pyc and b/argenta/command/params/flags_group/__pycache__/__init__.cpython-313.pyc differ diff --git a/argenta/command/params/flags_group/__pycache__/entity.cpython-313.pyc b/argenta/command/params/flags_group/__pycache__/entity.cpython-313.pyc index f51981b..06c8237 100644 Binary files a/argenta/command/params/flags_group/__pycache__/entity.cpython-313.pyc and b/argenta/command/params/flags_group/__pycache__/entity.cpython-313.pyc differ diff --git a/argenta/command/parse_input_command/__pycache__/__init__.cpython-313.pyc b/argenta/command/parse_input_command/__pycache__/__init__.cpython-313.pyc index e4c8bb6..3ae01c0 100644 Binary files a/argenta/command/parse_input_command/__pycache__/__init__.cpython-313.pyc and b/argenta/command/parse_input_command/__pycache__/__init__.cpython-313.pyc differ diff --git a/argenta/command/parse_input_command/__pycache__/entity.cpython-313.pyc b/argenta/command/parse_input_command/__pycache__/entity.cpython-313.pyc index 0ae991d..51b6d51 100644 Binary files a/argenta/command/parse_input_command/__pycache__/entity.cpython-313.pyc and b/argenta/command/parse_input_command/__pycache__/entity.cpython-313.pyc differ diff --git a/argenta/command/parse_input_command/__pycache__/exceptions.cpython-313.pyc b/argenta/command/parse_input_command/__pycache__/exceptions.cpython-313.pyc new file mode 100644 index 0000000..f6ee0b8 Binary files /dev/null and b/argenta/command/parse_input_command/__pycache__/exceptions.cpython-313.pyc differ diff --git a/argenta/command/parse_input_command/entity.py b/argenta/command/parse_input_command/entity.py index 5e463a3..d54000c 100644 --- a/argenta/command/parse_input_command/entity.py +++ b/argenta/command/parse_input_command/entity.py @@ -12,22 +12,39 @@ class ParseInputCommand: @staticmethod def parse(raw_command: str) -> Command: - list_of__ = raw_command.split() - command = list_of__[0] - list_of__.pop(0) + list_of_tokens = raw_command.split() + command_name = list_of_tokens[0] + list_of_tokens.pop(0) flags = [] - for k, _ in enumerate(list_of__): - if not _.startswith('-') or len( _[:len(_.lstrip('-'))]) > 3: - raise InvalidInputFlagsException() + current_flag_name = None + current_flag_value = None + for _ in list_of_tokens: + flag_prefix_last_symbol_index = _.rfind('-') + if _.startswith('-'): + if current_flag_name or len(_) < 2 or len(_[:flag_prefix_last_symbol_index]) > 3: + raise + else: + current_flag_name = _ else: - flag_name: str = _.lstrip('-') - flag_prefix = _[:len(flag_name)] + if not current_flag_name: + raise + else: + current_flag_value = _ + if current_flag_name and current_flag_value: + flag_prefix = _[:flag_prefix_last_symbol_index] + flag_name = _[flag_prefix_last_symbol_index:] + + flags.append(Flag(flag_name=flag_name, flag_prefix=flag_prefix)) + + current_flag_name = None + current_flag_value = None + + command = Command(command_name, flags) + + return command - parse_flag = Flag(flag_name=flag_name, - flag_prefix=flag_prefix) - flags.append(parse_flag) if len(flags) == 0: return Command(command=command) diff --git a/tests/test.py b/tests/test.py new file mode 100644 index 0000000..39f49a9 --- /dev/null +++ b/tests/test.py @@ -0,0 +1,53 @@ +import re +from pprint import pprint + + +class CommandParseError(Exception): + pass + +def parse_command(command: str) -> dict: + pattern = re.compile(r""" + (?P^\S+) + | + (?P-{1,3})(?P\w+) + | + (?P\S+) + """, re.VERBOSE) + + tokens = pattern.findall(command) + if not tokens: + raise CommandParseError("Invalid command format") + + result = {} + args = {} + current_arg = None + + for token in tokens: + command_name, arg_prefix, arg_name, value = token + + if command_name: + if "command" in result: + raise CommandParseError("Multiple command names found") + result["command"] = command_name + + elif arg_name: + if current_arg: + raise CommandParseError(f"Argument {current_arg} has no value") + current_arg = f"{arg_prefix}{arg_name}" + + elif value: + if not current_arg: + raise CommandParseError(f"Unexpected value: {value}") + args[current_arg] = value + current_arg = None + + if current_arg: + raise CommandParseError(f"Argument {current_arg} has no value") + + result["args"] = args + return result + + +command_str = "run" +parsed = (command_str) +pprint(parsed)