Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions pauperformance_bot/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from importlib.metadata import version
from importlib.metadata import version as _get_version

version = version("pauperformance_bot")
version: str = _get_version("pauperformance_bot")
10 changes: 6 additions & 4 deletions pauperformance_bot/cli/builder/command.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from argparse import ArgumentParser
from typing import Any

import argcomplete

from pauperformance_bot.cli.builder.options import CLIOption
from pauperformance_bot.cli.builder.runnable import CLIRunnable
from pauperformance_bot.cli.builder.utils import (
get_default_parent_parser,
Expand All @@ -10,22 +12,22 @@


class CLICommand(CLIRunnable):
def __init__(self, name, description, options):
def __init__(self, name: str, description: str, options: list[CLIOption]) -> None:
super().__init__(name)
self.description = description
self.options = options

def add_parser_argument(self, tool_parser):
def add_parser_argument(self, tool_parser: ArgumentParser) -> None:
for option in self.options:
option.add_to_parser(tool_parser, self.name)

def get_cli_parser(self):
def get_cli_parser(self) -> ArgumentParser:
parser = ArgumentParser(
description=self.description, parents=[get_default_parent_parser()]
)
self.add_parser_argument(parser)
argcomplete.autocomplete(parser)
return parser

def dispatch_cmd(self, *args, **kwargs):
def dispatch_cmd(self, *args: Any, **kwargs: Any) -> None:
handle_default_cli_options(*args, **kwargs)
10 changes: 6 additions & 4 deletions pauperformance_bot/cli/builder/group.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from argparse import ArgumentParser
from typing import Any

import argcomplete

from pauperformance_bot.cli.builder.command import CLICommand
from pauperformance_bot.cli.builder.runnable import CLIRunnable
from pauperformance_bot.cli.builder.utils import (
build_commands_sub_parser,
Expand All @@ -11,14 +13,14 @@


class CLIGroup(CLIRunnable):
def __init__(self, name, cli_commands):
def __init__(self, name: str, cli_commands: list[CLICommand]) -> None:
super().__init__(name)
self.cli_commands = cli_commands

def add_parser_argument(self, tool_parser):
def add_parser_argument(self, tool_parser: ArgumentParser) -> None:
build_commands_sub_parser(tool_parser, self.cli_commands)

def get_cli_parser(self):
def get_cli_parser(self) -> ArgumentParser:
parser = ArgumentParser(
description="A collection of {}-related tools.".format(self.name),
parents=[get_default_parent_parser()],
Expand All @@ -27,7 +29,7 @@ def get_cli_parser(self):
argcomplete.autocomplete(parser)
return parser

def dispatch_cmd(self, command, *args, **kwargs):
def dispatch_cmd(self, command: str, *args: Any, **kwargs: Any) -> None:
handle_default_cli_options(*args, **kwargs)
dispatcher = next(filter(lambda c: c.name == command, self.cli_commands))
dispatcher.dispatch_cmd(*args, **kwargs)
50 changes: 26 additions & 24 deletions pauperformance_bot/cli/builder/options.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
from abc import abstractmethod
from argparse import ArgumentParser, _ActionsContainer
from functools import partial
from typing import Any


class CLIOption:
def __init__(self, dest_var, help_msg):
def __init__(self, dest_var: str, help_msg: str) -> None:
self.dest_var = dest_var
self.help_msg = help_msg

@abstractmethod
def add_to_parser(self, arg_parser, command_name):
def add_to_parser(self, arg_parser: ArgumentParser, command_name: str) -> None:
pass


class FlagCLIOption(CLIOption):
def add_to_parser(self, arg_parser, command_name):
def add_to_parser(self, arg_parser: ArgumentParser, command_name: str) -> None:
arg_parser.add_argument(
"--" + self.dest_var, action="store_true", help=self.help_msg
)
Expand All @@ -22,13 +24,13 @@ def add_to_parser(self, arg_parser, command_name):
class ValuedCLIOption(CLIOption):
def __init__(
self,
dest_var,
choices,
default_value,
required,
multiple_allowed,
help_msg,
):
dest_var: str,
choices: list[str] | None,
default_value: str | None,
required: bool,
multiple_allowed: bool,
help_msg: str,
) -> None:
super().__init__(dest_var, help_msg)

if default_value and required:
Expand All @@ -38,11 +40,11 @@ def __init__(
)
)
self.choices = choices
self.default_value = default_value
self.default_value: Any = default_value
self.required = required
self.multiple_allowed = multiple_allowed

def add_to_parser(self, arg_parser, command_name):
def add_to_parser(self, arg_parser: ArgumentParser, command_name: str) -> None:
add_args_fn = arg_parser.add_argument

if self.multiple_allowed:
Expand All @@ -60,23 +62,23 @@ def add_to_parser(self, arg_parser, command_name):


class QuietCLIOption(FlagCLIOption):
def __init__(self):
def __init__(self) -> None:
super().__init__("quiet", "suppress non-error messages")


class VerboseCLIOption(FlagCLIOption):
def __init__(self):
def __init__(self) -> None:
super().__init__("verbose", "verbose logging")


class InputFileCLIOption(ValuedCLIOption):
def __init__(
self,
choices=None,
default_value=None,
required=False,
multiple_allowed=False,
):
choices: list[str] | None = None,
default_value: str | None = None,
required: bool = False,
multiple_allowed: bool = False,
) -> None:
super().__init__(
"input-file",
choices,
Expand All @@ -90,11 +92,11 @@ def __init__(
class OutputFileCLIOption(ValuedCLIOption):
def __init__(
self,
choices=None,
default_value=None,
required=False,
multiple_allowed=False,
):
choices: list[str] | None = None,
default_value: str | None = None,
required: bool = False,
multiple_allowed: bool = False,
) -> None:
super().__init__(
"output-file",
choices,
Expand Down
19 changes: 12 additions & 7 deletions pauperformance_bot/cli/builder/runnable.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
from abc import abstractmethod
from argparse import ArgumentParser, Namespace
from typing import Any


class CLIRunnable:
def __init__(self, name):
def __init__(self, name: str) -> None:
self._name = name

@property
def name(self):
def name(self) -> str:
return self._name

def add_parser_argument(self, tool_parser: ArgumentParser) -> None:
pass

@abstractmethod
def get_cli_parser(self):
def get_cli_parser(self) -> ArgumentParser:
pass

@abstractmethod
def dispatch_cmd(self, *args, **kwargs):
def dispatch_cmd(self, *args: Any, **kwargs: Any) -> None:
pass

def run(self):
args = self.get_cli_parser().parse_args()
def run(self) -> None:
args: Namespace = self.get_cli_parser().parse_args()
# CLI params may contain '-', an invalid character for python variables
# identifiers: replace it with '_'
params = {k.replace("-", "_"): v for k, v in vars(args).items()}
params: dict[str, Any] = {k.replace("-", "_"): v for k, v in vars(args).items()}
self.dispatch_cmd(**params)
13 changes: 9 additions & 4 deletions pauperformance_bot/cli/builder/utils.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,26 @@
import argparse
import logging
from typing import Any

from pauperformance_bot.cli.builder.options import QuietCLIOption, VerboseCLIOption
from pauperformance_bot.constant.cli import GROUP_CLI_DEST_ID
from pauperformance_bot.util.log import get_application_logger


def get_default_parent_parser():
def get_default_parent_parser() -> argparse.ArgumentParser:
arg_parser = argparse.ArgumentParser(add_help=False)
add_default_options(arg_parser)
return arg_parser


def add_default_options(arg_parser):
def add_default_options(arg_parser: argparse.ArgumentParser) -> None:
QuietCLIOption().add_to_parser(arg_parser, "")
VerboseCLIOption().add_to_parser(arg_parser, "")


def handle_default_cli_options(quiet, verbose, *args, **kwargs):
def handle_default_cli_options(
quiet: bool, verbose: bool, *args: Any, **kwargs: Any
) -> None:
logger = get_application_logger()
if quiet and verbose:
raise ValueError("Unable to set both quiet and verbose flags")
Expand All @@ -27,7 +30,9 @@ def handle_default_cli_options(quiet, verbose, *args, **kwargs):
logger.setLevel(logging.DEBUG)


def build_commands_sub_parser(tool_parser, cli_commands):
def build_commands_sub_parser(
tool_parser: argparse.ArgumentParser, cli_commands: list[Any]
) -> None:
description = (
"Type 'command-name -h' to show its help message "
"(e.g. '{} -h)'".format(next(iter(cli_commands)).name)
Expand Down
14 changes: 8 additions & 6 deletions pauperformance_bot/cli/group/academy.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#!/usr/bin/env python3
from typing import Any

from pauperformance_bot.cli.builder.command import CLICommand
from pauperformance_bot.cli.builder.group import CLIGroup
from pauperformance_bot.constant.cli import (
Expand All @@ -14,35 +16,35 @@


class UpdateCommand(CLICommand):
def __init__(self):
def __init__(self) -> None:
super().__init__(
UPDATE_ACADEMY_CMD,
"Update Academy web site (old version).",
[],
)

def dispatch_cmd(self, *args, **kwargs):
def dispatch_cmd(self, *args: Any, **kwargs: Any) -> None:
super().dispatch_cmd(*args, **kwargs)
main_v1()


class UpdateCommand2(CLICommand):
def __init__(self):
def __init__(self) -> None:
super().__init__(
UPDATE2_ACADEMY_CMD,
"Update Academy web site (new version).",
[],
)

def dispatch_cmd(self, *args, **kwargs):
def dispatch_cmd(self, *args: Any, **kwargs: Any) -> None:
super().dispatch_cmd(*args, **kwargs)
main_v2()


class AcademyGroup(CLIGroup):
_cli_commands = [UpdateCommand(), UpdateCommand2()]
_cli_commands: list[CLICommand] = [UpdateCommand(), UpdateCommand2()]

def __init__(self):
def __init__(self) -> None:
super().__init__(ACADEMY_CLI_GROUP, self._cli_commands)


Expand Down
12 changes: 8 additions & 4 deletions pauperformance_bot/cli/group/silver.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#!/usr/bin/env python3
from typing import Any

from pauperformance_bot.cli.builder.command import CLICommand
from pauperformance_bot.cli.builder.group import CLIGroup
from pauperformance_bot.cli.builder.options import (
Expand All @@ -13,7 +15,7 @@


class DPLMetaCommand(CLICommand):
def __init__(self):
def __init__(self) -> None:
super().__init__(
DPL_META_SILVER_CMD,
"Generate meta for a Dutch Pauper League tournament.",
Expand All @@ -23,15 +25,17 @@ def __init__(self):
],
)

def dispatch_cmd(self, input_file, output_file, *args, **kwargs):
def dispatch_cmd(
self, input_file: str, output_file: str, *args: Any, **kwargs: Any
) -> None:
super().dispatch_cmd(*args, **kwargs)
main(input_file, output_file)


class SilverGroup(CLIGroup):
_cli_commands = [DPLMetaCommand()]
_cli_commands: list[CLICommand] = [DPLMetaCommand()]

def __init__(self):
def __init__(self) -> None:
super().__init__(SILVER_CLI_GROUP, self._cli_commands)


Expand Down
10 changes: 6 additions & 4 deletions pauperformance_bot/cli/group/test.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#!/usr/bin/env python3
from typing import Any

from pauperformance_bot.cli.builder.command import CLICommand
from pauperformance_bot.cli.builder.group import CLIGroup
from pauperformance_bot.constant.cli import HELLO_TEST_CMD, TEST_CLI_GROUP
Expand All @@ -8,22 +10,22 @@


class HelloCommand(CLICommand):
def __init__(self):
def __init__(self) -> None:
super().__init__(
HELLO_TEST_CMD,
"Call Myr.",
[],
)

def dispatch_cmd(self, *args, **kwargs):
def dispatch_cmd(self, *args: Any, **kwargs: Any) -> None:
super().dispatch_cmd(*args, **kwargs)
print("Myr ready to serve you, Milord!")


class TestGroup(CLIGroup):
_cli_commands = [HelloCommand()]
_cli_commands: list[CLICommand] = [HelloCommand()]

def __init__(self):
def __init__(self) -> None:
super().__init__(TEST_CLI_GROUP, self._cli_commands)


Expand Down
Loading
Loading