]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
manager: client: uknown_args removed
authorAleš Mrázek <ales.mrazek@nic.cz>
Fri, 2 Dec 2022 16:11:39 +0000 (17:11 +0100)
committerAleš Mrázek <ales.mrazek@nic.cz>
Tue, 10 Jan 2023 18:57:14 +0000 (19:57 +0100)
12 files changed:
manager/knot_resolver_manager/cli/cmd/completion.py
manager/knot_resolver_manager/cli/cmd/config.py
manager/knot_resolver_manager/cli/cmd/convert.py
manager/knot_resolver_manager/cli/cmd/exit.py
manager/knot_resolver_manager/cli/cmd/metrics.py
manager/knot_resolver_manager/cli/cmd/reload.py
manager/knot_resolver_manager/cli/cmd/schema.py
manager/knot_resolver_manager/cli/cmd/stop.py
manager/knot_resolver_manager/cli/cmd/validate.py
manager/knot_resolver_manager/cli/command.py
manager/knot_resolver_manager/cli/kresctl.py
manager/knot_resolver_manager/cli/main.py

index 4e4146ac94426cafedc377c411f8387ca02e0c7f..56286f6fcbc255b35742237a18858e4e27f833df 100644 (file)
@@ -1,8 +1,8 @@
 import argparse
 from enum import Enum
-from typing import Dict, List, Optional, Tuple, Type
+from typing import List, Optional, Tuple, Type
 
-from knot_resolver_manager.cli.command import Command, CommandArgs, register_command
+from knot_resolver_manager.cli.command import Command, CommandArgs, CompWords, register_command
 
 
 class Shells(Enum):
@@ -10,9 +10,6 @@ class Shells(Enum):
     FISH = 1
 
 
-CompWords = Dict[str, Optional[str]]
-
-
 def _parser_top_lvl_words(actions: List[argparse.Action]) -> CompWords:
     words: CompWords = {}
 
@@ -26,14 +23,14 @@ def _parser_top_lvl_words(actions: List[argparse.Action]) -> CompWords:
     return words
 
 
-def _subparser_words(unknown_args: List[str], actions: List[argparse.Action]) -> Optional[CompWords]:
-    for arg in unknown_args:
+def _subparser_words(comp_args: List[str], actions: List[argparse.Action]) -> Optional[CompWords]:
+    for arg in comp_args:
         for action in actions:
             if isinstance(action, argparse._SubParsersAction) and arg in action.choices:
                 subparser: argparse.ArgumentParser = action.choices[arg]
                 command: Command = subparser._defaults["command"]
 
-                subparser_args = unknown_args[unknown_args.index(arg) + 1 :]
+                subparser_args = comp_args[comp_args.index(arg) + 1 :]
                 if subparser_args:
                     return command.completion(subparser_args, subparser)
     return None
@@ -41,14 +38,14 @@ def _subparser_words(unknown_args: List[str], actions: List[argparse.Action]) ->
 
 @register_command
 class CompletionCommand(Command):
-    def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None:
-        super().__init__(namespace, unknown_args)
+    def __init__(self, namespace: argparse.Namespace) -> None:
+        super().__init__(namespace)
         self.shell: Shells = namespace.shell
         self.space = namespace.space
-        self.unknown_args: List[str] = unknown_args
+        self.comp_args: List[str] = namespace.comp_args
 
         if self.space:
-            self.unknown_args.append("")
+            self.comp_args.append("")
 
     @staticmethod
     def register_args_subparser(
@@ -62,6 +59,12 @@ class CompletionCommand(Command):
             action="store_true",
             default=False,
         )
+        completion.add_argument(
+            "comp_args",
+            type=str,
+            help="arguments to complete",
+            nargs="*",
+        )
 
         shells_dest = "shell"
         shells = completion.add_mutually_exclusive_group()
@@ -71,8 +74,8 @@ class CompletionCommand(Command):
         return completion, CompletionCommand
 
     @staticmethod
-    def completion(args: List[str], parser: argparse.ArgumentParser) -> Dict[str, Optional[str]]:
-        comp: Dict[str, Optional[str]] = {}
+    def completion(args: List[str], parser: argparse.ArgumentParser) -> CompWords:
+        comp: CompWords = {}
 
         for action in parser._actions:
             for opt in action.option_strings:
@@ -84,7 +87,7 @@ class CompletionCommand(Command):
         words: CompWords = {}
 
         if parser._subparsers:
-            subparser_words = _subparser_words(self.unknown_args, parser._subparsers._actions)
+            subparser_words = _subparser_words(self.comp_args, parser._subparsers._actions)
 
             if subparser_words is None:
                 # parser top level options/commands
index 84673e283d4dac86efdbd2c405209a3374fc9342..a454dd57498e6bddc127f75b1a41b4c3cdd46145 100644 (file)
@@ -6,7 +6,7 @@ from typing import Any, Dict, List, Optional, Tuple, Type
 import yaml
 from typing_extensions import Literal
 
-from knot_resolver_manager.cli.command import Command, CommandArgs, register_command
+from knot_resolver_manager.cli.command import Command, CommandArgs, CompWords, register_command
 from knot_resolver_manager.datamodel.config_schema import KresConfig
 from knot_resolver_manager.utils.modeling import try_to_parse
 from knot_resolver_manager.utils.requests import request
@@ -40,14 +40,14 @@ def reformat(data: str, req_format: Formats) -> str:
     return json.dumps(dict, indent=4)
 
 
-def properties_comp(props: Dict[str, Any]) -> Dict[str, Optional[str]]:
-    comp: Dict[str, Optional[str]] = {}
+def properties_comp(props: Dict[str, Any]) -> CompWords:
+    comp: CompWords = {}
     for name, prop in props.items():
         comp[name] = prop["description"] if "description" in prop else None
     return comp
 
 
-def node_comp(nodes: List[str], props: Dict[str, Any]) -> Dict[str, Optional[str]]:
+def node_comp(nodes: List[str], props: Dict[str, Any]) -> CompWords:
 
     if len(nodes) > 1 and nodes[0] in props:
         prop = props[nodes[0]]
@@ -77,8 +77,8 @@ def subparser_comp(parser: argparse.ArgumentParser) -> Dict[str, Optional[str]]:
 
 @register_command
 class ConfigCommand(Command):
-    def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None:
-        super().__init__(namespace, unknown_args)
+    def __init__(self, namespace: argparse.Namespace) -> None:
+        super().__init__(namespace)
         self.path: str = str(namespace.path)
         self.value_or_file: Optional[str] = namespace.value_or_file
         self.operation: Operations = namespace.operation
index a820a5aaa9b6dabcc740c99b3a2c13627e705353..729e6272c590fcb62f717298d269864e137b2caf 100644 (file)
@@ -1,7 +1,7 @@
 import argparse
-from typing import Dict, List, Optional, Tuple, Type
+from typing import List, Optional, Tuple, Type
 
-from knot_resolver_manager.cli.command import Command, CommandArgs, register_command
+from knot_resolver_manager.cli.command import Command, CommandArgs, CompWords, register_command
 from knot_resolver_manager.datamodel import KresConfig
 from knot_resolver_manager.utils.modeling import try_to_parse
 from knot_resolver_manager.utils.modeling.exceptions import DataParsingError
@@ -9,8 +9,8 @@ from knot_resolver_manager.utils.modeling.exceptions import DataParsingError
 
 @register_command
 class ConvertCommand(Command):
-    def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None:
-        super().__init__(namespace, unknown_args)
+    def __init__(self, namespace: argparse.Namespace) -> None:
+        super().__init__(namespace)
         self.input_file: str = namespace.input_file
         self.output_file: Optional[str] = namespace.output_file
 
@@ -37,7 +37,7 @@ class ConvertCommand(Command):
         return convert, ConvertCommand
 
     @staticmethod
-    def completion(args: List[str], parser: argparse.ArgumentParser) -> Dict[str, Optional[str]]:
+    def completion(args: List[str], parser: argparse.ArgumentParser) -> CompWords:
         return {}
 
     def run(self, args: CommandArgs) -> None:
index 9d351f89c45c7080851956598c32e562a8db15f0..4f0d37305c24ab34504d5ca69140a649ddeb240e 100644 (file)
@@ -1,20 +1,20 @@
 import argparse
 import sys
-from typing import Dict, List, Optional, Tuple, Type
+from typing import List, Tuple, Type
 
-from knot_resolver_manager.cli.command import Command, CommandArgs, register_command
+from knot_resolver_manager.cli.command import Command, CommandArgs, CompWords, register_command
 
 
 @register_command
 class ExitCommand(Command):
-    def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None:
-        super().__init__(namespace, unknown_args)
+    def __init__(self, namespace: argparse.Namespace) -> None:
+        super().__init__(namespace)
 
     def run(self, args: CommandArgs) -> None:
         sys.exit()
 
     @staticmethod
-    def completion(args: List[str], parser: argparse.ArgumentParser) -> Dict[str, Optional[str]]:
+    def completion(args: List[str], parser: argparse.ArgumentParser) -> CompWords:
         return {}
 
     @staticmethod
index 328440246d43a971ab04f2e72df193523df8673a..81fc8828544d81695867d7cbc7fb5bb6bb5d5d51 100644 (file)
@@ -1,16 +1,16 @@
 import argparse
-from typing import Dict, List, Optional, Tuple, Type
+from typing import List, Optional, Tuple, Type
 
-from knot_resolver_manager.cli.command import Command, CommandArgs, register_command
+from knot_resolver_manager.cli.command import Command, CommandArgs, CompWords, register_command
 from knot_resolver_manager.utils.requests import request
 
 
 @register_command
 class MetricsCommand(Command):
-    def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None:
+    def __init__(self, namespace: argparse.Namespace) -> None:
         self.file: Optional[str] = namespace.file
 
-        super().__init__(namespace, unknown_args)
+        super().__init__(namespace)
 
     @staticmethod
     def register_args_subparser(
@@ -21,7 +21,7 @@ class MetricsCommand(Command):
         return metrics, MetricsCommand
 
     @staticmethod
-    def completion(args: List[str], parser: argparse.ArgumentParser) -> Dict[str, Optional[str]]:
+    def completion(args: List[str], parser: argparse.ArgumentParser) -> CompWords:
         return {}
 
     def run(self, args: CommandArgs) -> None:
index f5b02ea319c34f6e269316c071b689d5314742ba..7f6d753a0329466f051c90ac721e8131050e1a65 100644 (file)
@@ -1,14 +1,14 @@
 import argparse
-from typing import Dict, List, Optional, Tuple, Type
+from typing import List, Tuple, Type
 
-from knot_resolver_manager.cli.command import Command, CommandArgs, register_command
+from knot_resolver_manager.cli.command import Command, CommandArgs, CompWords, register_command
 from knot_resolver_manager.utils.requests import request
 
 
 @register_command
 class ReloadCommand(Command):
-    def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None:
-        super().__init__(namespace, unknown_args)
+    def __init__(self, namespace: argparse.Namespace) -> None:
+        super().__init__(namespace)
 
     @staticmethod
     def register_args_subparser(
@@ -19,7 +19,7 @@ class ReloadCommand(Command):
         return reload, ReloadCommand
 
     @staticmethod
-    def completion(args: List[str], parser: argparse.ArgumentParser) -> Dict[str, Optional[str]]:
+    def completion(args: List[str], parser: argparse.ArgumentParser) -> CompWords:
         return {}
 
     def run(self, args: CommandArgs) -> None:
index eace243e2f12d37d07cc1eb1f5aee5b5266184e3..32c14b045a4237d22ea0591c138f04b7c3bec495 100644 (file)
@@ -1,18 +1,17 @@
 import argparse
 import json
-from typing import Dict, List, Optional, Tuple, Type
+from typing import List, Optional, Tuple, Type
 
-from knot_resolver_manager.cli.command import Command, CommandArgs, register_command
+from knot_resolver_manager.cli.command import Command, CommandArgs, CompWords, register_command
 from knot_resolver_manager.datamodel.config_schema import KresConfig
 
 
 @register_command
 class SchemaCommand(Command):
-    def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None:
+    def __init__(self, namespace: argparse.Namespace) -> None:
+        super().__init__(namespace)
         self.file: Optional[str] = namespace.file
 
-        super().__init__(namespace, unknown_args)
-
     @staticmethod
     def register_args_subparser(
         subparser: "argparse._SubParsersAction[argparse.ArgumentParser]",
@@ -22,7 +21,7 @@ class SchemaCommand(Command):
         return schema, SchemaCommand
 
     @staticmethod
-    def completion(args: List[str], parser: argparse.ArgumentParser) -> Dict[str, Optional[str]]:
+    def completion(args: List[str], parser: argparse.ArgumentParser) -> CompWords:
         return {}
 
     def run(self, args: CommandArgs) -> None:
index 01e9f43a6999f88fc55b0eb31264fc15ee85e20b..c81eceb0a5e406537c42a9c97be3465678e193a5 100644 (file)
@@ -1,14 +1,14 @@
 import argparse
-from typing import Dict, List, Optional, Tuple, Type
+from typing import List, Tuple, Type
 
-from knot_resolver_manager.cli.command import Command, CommandArgs, register_command
+from knot_resolver_manager.cli.command import Command, CommandArgs, CompWords, register_command
 from knot_resolver_manager.utils.requests import request
 
 
 @register_command
 class StopCommand(Command):
-    def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None:
-        super().__init__(namespace, unknown_args)
+    def __init__(self, namespace: argparse.Namespace) -> None:
+        super().__init__(namespace)
 
     def run(self, args: CommandArgs) -> None:
         url = f"{args.socket}/stop"
@@ -16,7 +16,7 @@ class StopCommand(Command):
         print(response)
 
     @staticmethod
-    def completion(args: List[str], parser: argparse.ArgumentParser) -> Dict[str, Optional[str]]:
+    def completion(args: List[str], parser: argparse.ArgumentParser) -> CompWords:
         return {}
 
     @staticmethod
index e1457d2e735b4fd040b9266876ea407dfdeae54e..9f2f0d880ce745e22f09958b318e52e630f9138f 100644 (file)
@@ -1,7 +1,7 @@
 import argparse
-from typing import Dict, List, Optional, Tuple, Type
+from typing import List, Tuple, Type
 
-from knot_resolver_manager.cli.command import Command, CommandArgs, register_command
+from knot_resolver_manager.cli.command import Command, CommandArgs, CompWords, register_command
 from knot_resolver_manager.datamodel import KresConfig
 from knot_resolver_manager.utils.modeling import try_to_parse
 from knot_resolver_manager.utils.modeling.exceptions import DataParsingError, DataValidationError
@@ -9,8 +9,8 @@ from knot_resolver_manager.utils.modeling.exceptions import DataParsingError, Da
 
 @register_command
 class ValidateCommand(Command):
-    def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None:
-        super().__init__(namespace, unknown_args)
+    def __init__(self, namespace: argparse.Namespace) -> None:
+        super().__init__(namespace)
         self.input_file: str = namespace.input_file
 
     @staticmethod
@@ -29,7 +29,7 @@ class ValidateCommand(Command):
         return validate, ValidateCommand
 
     @staticmethod
-    def completion(args: List[str], parser: argparse.ArgumentParser) -> Dict[str, Optional[str]]:
+    def completion(args: List[str], parser: argparse.ArgumentParser) -> CompWords:
         return {}
 
     def run(self, args: CommandArgs) -> None:
index f3228690e516dd98e24c98de2fab1a41789cb574..625ad39d52611e1960de4b6df61bf1a29f3ec3c2 100644 (file)
@@ -6,6 +6,8 @@ from urllib.parse import quote
 
 T = TypeVar("T", bound=Type["Command"])
 
+CompWords = Dict[str, Optional[str]]
+
 _registered_commands: List[Type["Command"]] = []
 
 
@@ -43,7 +45,7 @@ class Command(ABC):
         raise NotImplementedError()
 
     @abstractmethod
-    def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None:
+    def __init__(self, namespace: argparse.Namespace) -> None:
         super().__init__()
 
     @abstractmethod
@@ -52,5 +54,5 @@ class Command(ABC):
 
     @staticmethod
     @abstractmethod
-    def completion(args: List[str], parser: argparse.ArgumentParser) -> Dict[str, Optional[str]]:
+    def completion(args: List[str], parser: argparse.ArgumentParser) -> CompWords:
         raise NotImplementedError()
index caa43736dad826d3695d9c560b4886846d9074b0..05f9b445c6d33fa9a0007c9d1eb906740151922c 100644 (file)
@@ -1,5 +1,4 @@
 import argparse
-from typing import List
 
 from knot_resolver_manager.cli.command import CommandArgs
 
@@ -8,19 +7,17 @@ class Kresctl:
     def __init__(
         self,
         namespace: argparse.Namespace,
-        unknown_args: List[str],
         parser: argparse.ArgumentParser,
         prompt: str = "kresctl",
     ) -> None:
         self.path = None
         self.prompt = prompt
         self.namespace = namespace
-        self.unknown_args = unknown_args
         self.parser = parser
 
     def execute(self):
         cmd_args = CommandArgs(self.namespace, self.parser)
-        command = self.namespace.command(self.namespace, self.unknown_args)
+        command = self.namespace.command(self.namespace)
         command.run(cmd_args)
 
     def _prompt_format(self) -> str:
index 5b51856ba0fa29ae0c2c228b45d2154d732d5514..bed5f57cb3a17c26a07d882e0cc7506779638990 100644 (file)
@@ -41,8 +41,8 @@ def main() -> None:
     autoimport_commands()
     parser = create_main_argument_parser()
     install_commands_parsers(parser)
-    namespace, unknown_args = parser.parse_known_args()
-    kresctl = Kresctl(namespace, unknown_args, parser)
+    namespace = parser.parse_args()
+    kresctl = Kresctl(namespace, parser)
 
     if namespace.interactive or len(vars(namespace)) == 2:
         kresctl.interactive()