2020-04-10 17:55:36 +02:00
|
|
|
from __future__ import annotations
|
2019-03-10 16:38:59 +01:00
|
|
|
import abc
|
2018-12-11 14:10:01 +01:00
|
|
|
import argparse
|
2020-04-10 14:17:15 +02:00
|
|
|
from abc import ABC
|
2020-04-10 17:55:36 +02:00
|
|
|
from argparse import ArgumentParser, _SubParsersAction
|
|
|
|
|
from typing import List, Type, Union, TypeVar
|
2017-10-14 17:25:24 +02:00
|
|
|
|
2020-04-04 16:32:39 +02:00
|
|
|
from jwutils import log
|
|
|
|
|
|
|
|
|
|
# full blown example of one level of nested subcommands
|
|
|
|
|
# git -C project remote -v show -n myremote
|
|
|
|
|
|
2019-03-10 16:38:59 +01:00
|
|
|
class Cmd(ABC): # export
|
2017-10-14 17:25:24 +02:00
|
|
|
|
2019-03-10 16:38:59 +01:00
|
|
|
@abc.abstractmethod
|
2019-12-20 08:41:58 +01:00
|
|
|
async def run(self, args):
|
2017-10-14 17:25:24 +02:00
|
|
|
pass
|
|
|
|
|
|
2020-04-10 17:55:36 +02:00
|
|
|
def __init__(self, name: str, help: str) -> None:
|
2019-03-10 16:38:59 +01:00
|
|
|
self.name = name
|
2017-10-14 17:25:24 +02:00
|
|
|
self.help = help
|
2020-04-04 16:32:39 +02:00
|
|
|
self.parent = None
|
2020-04-10 17:55:36 +02:00
|
|
|
self.children: List[Cmd] = []
|
|
|
|
|
self.child_classes: List[Type[Cmd]] = []
|
2017-10-14 17:25:24 +02:00
|
|
|
|
2019-12-20 08:41:58 +01:00
|
|
|
async def _run(self, args):
|
2017-10-14 17:25:24 +02:00
|
|
|
pass
|
|
|
|
|
|
2020-04-10 17:55:36 +02:00
|
|
|
def add_parser(self, parsers) -> ArgumentParser:
|
2019-03-10 16:38:59 +01:00
|
|
|
r = parsers.add_parser(self.name, help=self.help,
|
2017-10-14 17:25:24 +02:00
|
|
|
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
2019-03-10 16:38:59 +01:00
|
|
|
r.set_defaults(func=self.run)
|
2017-10-14 17:25:24 +02:00
|
|
|
return r
|
|
|
|
|
|
2020-04-10 17:55:36 +02:00
|
|
|
def add_subcommands(self, cmd: Union[Type[Cmd], List[Type[Cmd]]]) -> None:
|
2020-04-04 16:32:39 +02:00
|
|
|
if isinstance(cmd, list):
|
|
|
|
|
for c in cmd:
|
|
|
|
|
self.add_subcommands(c)
|
2020-04-07 09:23:13 +02:00
|
|
|
return
|
2020-04-04 16:32:39 +02:00
|
|
|
self.child_classes.append(cmd)
|
|
|
|
|
|
2020-04-10 17:55:36 +02:00
|
|
|
def add_arguments(self, parser: ArgumentParser) -> None:
|
2020-04-04 16:32:39 +02:00
|
|
|
pass
|