from __future__ import annotations import abc import argparse from abc import ABC from argparse import ArgumentParser, _SubParsersAction from typing import List, Type, Union, TypeVar from jwutils import log # full blown example of one level of nested subcommands # git -C project remote -v show -n myremote class Cmd(ABC): # export @abc.abstractmethod async def run(self, args): pass def __init__(self, name: str, help: str) -> None: self.name = name self.help = help self.parent = None self.children: List[Cmd] = [] self.child_classes: List[Type[Cmd]] = [] async def _run(self, args): pass def add_parser(self, parsers) -> ArgumentParser: r = parsers.add_parser(self.name, help=self.help, formatter_class=argparse.ArgumentDefaultsHelpFormatter) r.set_defaults(func=self.run) return r def add_subcommands(self, cmd: Union[Type[Cmd], List[Type[Cmd]]]) -> None: if isinstance(cmd, list): for c in cmd: self.add_subcommands(c) return self.child_classes.append(cmd) def add_arguments(self, parser: ArgumentParser) -> None: pass