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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
from __future__ import annotations
import argparse
import functools
import logging
import sys
from typing import Any
from . import tools
log = logging.getLogger(__name__)
def parse_args(args: str | None = None, testmode: bool = False) -> dict[str, Any]:
"""parses args from the command line
Args:
args: command line arguments or None to pull from sys.argv
testmode: internal flag, if set will not SystemExit but will
raises tools.AbortExecution
"""
class F(
argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter
):
pass
parser = argparse.ArgumentParser(formatter_class=F, description=__doc__)
parser.add_argument("-n", "--dry-run", dest="dryrun", action="store_true")
parser.add_argument("-v", "--verbose", action="store_true")
options = parser.parse_args(args)
def error(message, explain="", hint="", parser=None, testmode=False):
out = []
if parser:
out.extend(tools.indent(parser.format_usage()).split("\n"))
if message:
out.extend(tools.indent(message).split("\n"))
if explain:
out.append("reason:")
out.extend(tools.indent(explain).split("\n"))
if hint:
out.append("hint:")
out.extend(tools.indent(hint).split("\n"))
if testmode:
raise tools.AbortExecution(message, explain, hint)
else:
print() # noqa: T201
print("\n".join(out), file=sys.stderr) # noqa: T201
raise SystemExit(2)
options.error = functools.partial(error, parser=parser, testmode=testmode)
logging.basicConfig(
format="%(levelname)s:%(name)s:(dry-run) %(message)s"
if options.dryrun
else "%(levelname)s:%(name)s:%(message)s",
level=logging.DEBUG if options.verbose else logging.INFO,
)
for d in [
"verbose",
]:
delattr(options, d)
return options.__dict__
def run():
pass
def main():
run(**parse_args())
if __name__ == "__main__":
main()
|