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):
FISH = 1
-CompWords = Dict[str, Optional[str]]
-
-
def _parser_top_lvl_words(actions: List[argparse.Action]) -> CompWords:
words: 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
@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(
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()
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:
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
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
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]]
@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
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
@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
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:
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
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(
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:
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(
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:
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]",
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:
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"
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
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
@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
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:
T = TypeVar("T", bound=Type["Command"])
+CompWords = Dict[str, Optional[str]]
+
_registered_commands: List[Type["Command"]] = []
raise NotImplementedError()
@abstractmethod
- def __init__(self, namespace: argparse.Namespace, unknown_args: List[str]) -> None:
+ def __init__(self, namespace: argparse.Namespace) -> None:
super().__init__()
@abstractmethod
@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()
import argparse
-from typing import List
from knot_resolver_manager.cli.command import CommandArgs
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:
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()