annotate gut/command.py @ 6:ef895ddba2d3

add an apply command
author Jeff Hammel <jhammel@mozilla.com>
date Wed, 21 Jul 2010 16:18:59 -0700
parents 6cf716c40bb6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 """
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2 a command-line interface to the command line, a la pythonpaste
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 """
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5 import inspect
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6 import sys
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7 from optparse import OptionParser
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
8 from pprint import pprint
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
9
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
10 class CommandParser(OptionParser):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
11 # TODO: add `help` command
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
12
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
13 def __init__(self, _class, description=None):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
14 self._class = _class
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
15 self.commands = {}
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
16 usage = '%prog [options] command [command-options]'
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
17 description = description or _class.__doc__
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18 OptionParser.__init__(self, usage=usage, description=description)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
19 commands = [ getattr(_class, i) for i in dir(_class)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
20 if not i.startswith('_') ]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
21 commands = [ method for method in commands
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
22 if hasattr(method, '__call__') ]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
23 for _command in commands:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
24 c = self.command(_command)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
25 self.commands[c['name']] = c
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
26
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
27 # get class options
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
28 init = self.command(_class.__init__)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
29 self.command2parser(init, self)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
30
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
31 self.disable_interspersed_args()
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
32
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
33 def print_help(self):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
34 # XXX should probably use the optparse formatters to help out here
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
35
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
36 OptionParser.print_help(self)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
37
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
38 # short descriptions for commands
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
39 command_descriptions = [dict(name=i,
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
40 description=self.commands[i]['doc'].strip().split('\n',1)[0])
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
41 for i in sorted(self.commands.keys())]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
42 max_len = max([len(i['name']) for i in command_descriptions])
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
43 description = "Commands: \n%s" % ('\n'.join([' %s%s %s' % (description['name'], ' ' * (max_len - len(description['name'])), description['description'])
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
44 for description in command_descriptions]))
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
45
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
46 print
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
47 print description
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
48
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
49 def parse(self, args=sys.argv[1:]):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
50 """global parse step"""
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
51
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
52 self.options, args = self.parse_args(args)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
53
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
54 # help/sanity check -- should probably be separated
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
55 if not len(args):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
56 self.print_help()
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
57 sys.exit(0)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
58 if args[0] == 'help':
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
59 if len(args) == 2:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
60 if args[1] in self.commands:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
61 name = args[1]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
62 commandparser = self.command2parser(name)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
63 commandparser.print_help()
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
64 else:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
65 self.error("No command '%s'" % args[1])
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
66 else:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
67 self.print_help()
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
68 sys.exit(0)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
69 command = args[0]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
70 if command not in self.commands:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71 self.error("No command '%s'" % command)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72 return command, args[1:]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
73
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
74 def invoke(self, args=sys.argv[1:]):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
75 """
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
76 invoke
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
77 """
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
78
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
79 # parse
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
80 name, args = self.parse(args)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
81
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
82 # setup
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
83 _object = self._class(**self.options.__dict__)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
84
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
85 # command specific args
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
86 command = self.commands[name]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
87 commandparser = self.command2parser(name)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
88 command_options, command_args = commandparser.parse_args(args)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
89 if len(command_args) < len(command['args']):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
90 commandparser.error("Not enough arguments given")
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
91 if len(command_args) != len(command['args']) and not command['varargs']:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
92 commandparser.error("Too many arguments given")
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
93
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
94 # invoke the command
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
95 retval = getattr(_object, name)(*command_args, **command_options.__dict__)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
96 if isinstance(retval, basestring):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
97 print retval
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
98 elif retval is None:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
99 pass
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
100 else:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
101 pprint(retval)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
102 return retval
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
103
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
104 def command(self, function):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
105 name = function.func_name
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
106 if function.__doc__:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
107 doc = inspect.cleandoc(function.__doc__)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
108 else:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
109 doc = ''
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
110 argspec = inspect.getargspec(function)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
111 defaults = argspec.defaults
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
112 if defaults:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
113 args = argspec.args[1:-len(defaults)]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
114 optional = dict(zip(argspec.args[-len(defaults):], defaults))
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
115 else:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
116 args = argspec.args[1:]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
117 optional = None
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
118 command = { 'doc': doc,
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
119 'name': name,
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
120 'args': args,
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
121 'optional': optional,
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
122 'varargs': argspec.varargs
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
123 }
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
124 return command
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
125
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
126 def commandargs2str(self, command):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
127 if isinstance(command, basestring):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
128 command = self.commands[command]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
129 retval = []
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
130 retval.extend(['<%s>' % arg for arg in command['args']])
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
131 varargs = command['varargs']
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
132 if varargs:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
133 retval.append('<%s> [%s] [...]' % (varargs, varargs))
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
134 if command['optional']:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
135 retval.append('[options]')
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
136 return ' '.join(retval)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
137
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
138 def doc2arghelp(self, docstring, decoration='-', delimeter=':'):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
139 """
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
140 Parse a docstring and get at the section describing arguments
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
141 - decoration: decoration character
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
142 - delimeter: delimter character
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
143
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
144 Yields a tuple of the stripped docstring and the arguments help
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
145 dictionary
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
146 """
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
147 lines = [ i.strip() for i in docstring.split('\n') ]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
148 argdict = {}
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
149 doc = []
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
150 option = None
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
151 for line in lines:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
152 if not line and option: # blank lines terminate [?]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
153 break
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
154 if line.startswith(decoration) and delimeter in line:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
155 name, description = line.split(delimeter, 1)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
156 name = name.lstrip(decoration).strip()
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
157 description = description.strip()
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
158 argdict[name] = [ description ]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
159 option = name
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
160 else:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
161 if option:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
162 argdict[name].append(line)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
163 else:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
164 doc.append(line)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
165 argdict = dict([(key, ' '.join(value))
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
166 for key, value in argdict.items()])
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
167 return ('\n'.join(doc), argdict)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
168
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
169 def command2parser(self, command, parser=None):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
170 if isinstance(command, basestring):
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
171 command = self.commands[command]
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
172 doc, argdict = self.doc2arghelp(command['doc'])
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
173 if parser is None:
1
6cf716c40bb6 use the command name, not the command repr
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
174 parser = OptionParser('%%prog %s %s' % (command['name'], self.commandargs2str(command)),
0
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
175 description=doc, add_help_option=False)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
176 if command['optional']:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
177 for key, value in command['optional'].items():
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
178 help = argdict.get(key, '')
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
179 if value is True:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
180 parser.add_option('--no-%s' % key, dest=key,
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
181 action='store_false', default=True,
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
182 help=help)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
183 elif value is False:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
184 parser.add_option('--%s' % key, action='store_true',
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
185 default=False, help=help)
6
ef895ddba2d3 add an apply command
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
186 elif type(value) in set([type(()), type([])]):
ef895ddba2d3 add an apply command
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
187 if value:
ef895ddba2d3 add an apply command
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
188 help += ' [DEFAULT: %s]' % value
ef895ddba2d3 add an apply command
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
189 parser.add_option('--%s' % key, action='append',
ef895ddba2d3 add an apply command
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
190 default=list(value),
ef895ddba2d3 add an apply command
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
191 help=help)
0
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
192 else:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
193 if value is not None:
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
194 help += ' [DEFAULT: %s]' % value
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
195 parser.add_option('--%s' % key, help=help, default=value)
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
196
9688c72a93c3 initial commit of gut, probably doesnt actually work
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
197 return parser