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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
import argparse
from collections import namedtuple
import sys
ArgumentPack = namedtuple('ArgumentPack', ['name_or_flags', 'options'])
ArgumentGroup = namedtuple('ArgumentGroup', ['type', 'args', 'options'])
# list of available parsing options
MULTIPLIER = 1
PORT_LIST = 2
ALL_PORTS = 3
PORT_LIST_WITH_ALL = 4
FILE_PATH = 5
FILE_FROM_DB = 6
STREAM_FROM_PATH_OR_FILE = 7
# list of ArgumentGroup types
MUTEX = 1
OPTIONS_DB = {MULTIPLIER: ArgumentPack(['-m', '--multiplier'],
{'help': "Set multiplier for stream", 'dest': "mult", 'type': float}),
PORT_LIST: ArgumentPack(['--port'],
{"nargs": '+',
# "action": "store_"
'help': "A list of ports on which to apply the command",
'default': []}),
ALL_PORTS: ArgumentPack(['-a'],
{"action": "store_true",
"dest": "all",
'help': "Set this flag to apply the command on all available ports"}),
FILE_PATH: ArgumentPack(['-f'],
{'help': "File path to YAML file that describes a stream pack"}),
FILE_FROM_DB: ArgumentPack(['--db'],
{'help': "A stream pack which already loaded into console cache."}),
# advanced options
PORT_LIST_WITH_ALL: ArgumentGroup(MUTEX, [PORT_LIST,
ALL_PORTS],
{'required': True}),
STREAM_FROM_PATH_OR_FILE: ArgumentGroup(MUTEX, [FILE_PATH,
FILE_FROM_DB],
{'required': True})
}
class CCmdArgParser(argparse.ArgumentParser):
def __init__(self, *args, **kwargs):
super(CCmdArgParser, self).__init__(*args, **kwargs)
pass
# def error(self, message):
# try:
# super(CCmdArgParser, self).error(message) # this will trigger system exit!
# except SystemExit:
# return -1
#
# # self.print_usage(sys.stderr)
# # print ('%s: error: %s\n') % (self.prog, message)
# # self.print_help()
# return
def exit(self, status=0, message=None):
try:
super(CCmdArgParser, self).exit(status, message) # this will trigger system exit!
except SystemExit:
return -1
return
def gen_parser(op_name, description, *args):
parser = CCmdArgParser(prog=op_name, conflict_handler='resolve',
# add_help=False,
description=description)
for param in args:
try:
argument = OPTIONS_DB[param]
if isinstance(argument, ArgumentGroup):
if argument.type == MUTEX:
# handle as mutually exclusive group
group = parser.add_mutually_exclusive_group(**argument.options)
for sub_argument in argument.args:
group.add_argument(*OPTIONS_DB[sub_argument].name_or_flags,
**OPTIONS_DB[sub_argument].options)
else:
# ignore invalid objects
continue
elif isinstance(argument, ArgumentPack):
parser.add_argument(*argument.name_or_flags,
**argument.options)
else:
# ignore invalid objects
continue
except KeyError as e:
cause = e.args[0]
raise KeyError("The attribute '{0}' is missing as a field of the {1} option.\n".format(cause, param))
return parser
if __name__ == "__main__":
pass
|