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