-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathdrovecli.py
More file actions
59 lines (49 loc) · 1.96 KB
/
drovecli.py
File metadata and controls
59 lines (49 loc) · 1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import argparse
import droveclient
from plugins import DrovePlugin
from types import SimpleNamespace
import shtab
class DroveCli:
def __init__(self, parser: argparse.ArgumentParser):
self.parser = parser
self.plugins: dict[str, DrovePlugin] = {}
self.debug = False
subparsers = parser.add_subparsers(help="Available plugins", dest="plugin")
drove_client = droveclient.DroveClient()
for plugin_class in DrovePlugin.plugins:
plugin = plugin_class()
# print("Loading plugin: " + str(plugin))
plugin.populate_options(drove_client=drove_client, subparser=subparsers)
self.plugins[plugin.name()] = plugin
parser.set_defaults(func=self.show_help)
@staticmethod
def _print_full_help(parser: argparse.ArgumentParser) -> None:
"""Recursively print help for a parser and all its subcommands."""
separator = "=" * 72
print(separator)
print(parser.format_help())
for action in parser._actions:
if isinstance(action, argparse._SubParsersAction):
for _name, subparser in sorted(action.choices.items()):
DroveCli._print_full_help(subparser)
break
def run(self):
args = self.parser.parse_args()
self.debug = args.debug
if args.print_completion:
print(shtab.complete(self.parser, shell=args.print_completion))
exit(0)
if args.full_help:
self._print_full_help(self.parser)
exit(0)
# Load plugins
if args.debug:
print("Selected plugin: " + args.plugin)
if args.plugin:
plugin = self.plugins.get(args.plugin)
if plugin and plugin.needs_client():
droveclient.build_drove_client(plugin.drove_client, args)
args.func(args)
def show_help(self, options: SimpleNamespace) -> None:
self.parser.print_help()
exit(-1)