Revision dfee2caf kamaki/cli/utils.py
b/kamaki/cli/utils.py | ||
---|---|---|
30 | 30 |
# documentation are those of the authors and should not be |
31 | 31 |
# interpreted as representing official policies, either expressed |
32 | 32 |
# or implied, of GRNET S.A. |
33 |
from .errors import CLIUnknownCommand, CLISyntaxError, CLICmdSpecError |
|
34 |
|
|
35 |
class Argument(object): |
|
36 |
"""An argument that can be parsed from command line or otherwise""" |
|
37 |
|
|
38 |
def __init__(self, arity, help=None, parsed_name=None, default=None): |
|
39 |
self.arity = int(arity) |
|
40 |
|
|
41 |
if help is not None: |
|
42 |
self.help = help |
|
43 |
if parsed_name is not None: |
|
44 |
self.parsed_name = parsed_name |
|
45 |
if default is not None: |
|
46 |
self.default = default |
|
47 |
|
|
48 |
@property |
|
49 |
def parsed_name(self): |
|
50 |
return getattr(self, '_parsed_name', None) |
|
51 |
@parsed_name.setter |
|
52 |
def parsed_name(self, newname): |
|
53 |
self._parsed_name = getattr(self, '_parsed_name', []) |
|
54 |
if isinstance(newname, list) or isinstance(newname, tuple): |
|
55 |
self._parsed_name += list(newname) |
|
56 |
else: |
|
57 |
self._parsed_name.append(unicode(newname)) |
|
58 |
|
|
59 |
@property |
|
60 |
def help(self): |
|
61 |
return getattr(self, '_help', None) |
|
62 |
@help.setter |
|
63 |
def help(self, newhelp): |
|
64 |
self._help = unicode(newhelp) |
|
65 |
|
|
66 |
@property |
|
67 |
def arity(self): |
|
68 |
return getattr(self, '_arity', None) |
|
69 |
@arity.setter |
|
70 |
def arity(self, newarity): |
|
71 |
newarity = int(newarity) |
|
72 |
assert newarity >= 0 |
|
73 |
self._arity = newarity |
|
74 |
|
|
75 |
@property |
|
76 |
def default(self): |
|
77 |
if not hasattr(self, '_default'): |
|
78 |
self._default = False if self.arity == 0 else None |
|
79 |
return self._default |
|
80 |
@default.setter |
|
81 |
def default(self, newdefault): |
|
82 |
self._default = newdefault |
|
83 |
|
|
84 |
@property |
|
85 |
def value(self): |
|
86 |
return getattr(self, '_value', self.default) |
|
87 |
@value.setter |
|
88 |
def value(self, newvalue): |
|
89 |
self._value = newvalue |
|
90 |
|
|
91 |
def update_parser(self, parser, name): |
|
92 |
"""Update an argument parser with this argument info""" |
|
93 |
action = 'store_true' if self.arity==0 else 'store' |
|
94 |
parser.add_argument(*self.parsed_name, dest=name, action=action, |
|
95 |
default=self.default, help=self.help) |
|
96 |
|
|
97 |
def main(self): |
|
98 |
"""Overide this method to give functionality to ur args""" |
|
99 |
raise NotImplementedError |
|
100 |
|
|
101 |
@classmethod |
|
102 |
def test(self): |
|
103 |
h = Argument(arity=0, help='Display a help massage', parsed_name=('--help', '-h')) |
|
104 |
b = Argument(arity=1, help='This is a bbb', parsed_name='--bbb') |
|
105 |
c = Argument(arity=2, help='This is a ccc', parsed_name='--ccc') |
|
106 |
|
|
107 |
from argparse import ArgumentParser |
|
108 |
parser = ArgumentParser(add_help=False) |
|
109 |
h.update_parser(parser, 'hee') |
|
110 |
b.update_parser(parser, 'bee') |
|
111 |
c.update_parser(parser, 'cee') |
|
112 |
|
|
113 |
args, argv = parser.parse_known_args() |
|
114 |
print('args: %s\nargv: %s'%(args, argv)) |
|
33 |
try: |
|
34 |
from colors import magenta, red, yellow, bold |
|
35 |
except ImportError: |
|
36 |
#No colours? No worries, use dummy foo instead |
|
37 |
def bold(val): |
|
38 |
return val |
|
39 |
red = yellow = magenta = bold |
|
40 |
|
|
41 |
from .errors import CLIUnknownCommand, CLICmdSpecError, CLIError |
|
42 |
|
|
43 |
""" |
|
44 |
def magenta(val): |
|
45 |
return magenta(val) |
|
46 |
def red(val): |
|
47 |
return red(val) |
|
48 |
def yellow(val): |
|
49 |
return yellow(val) |
|
50 |
def bold(val): |
|
51 |
return bold(val) |
|
52 |
""" |
|
115 | 53 |
|
116 | 54 |
class CommandTree(object): |
117 | 55 |
"""A tree of command terms usefull for fast commands checking |
Also available in: Unified diff