Mercurial > hg > gut
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 |
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 | 186 elif type(value) in set([type(()), type([])]): |
187 if value: | |
188 help += ' [DEFAULT: %s]' % value | |
189 parser.add_option('--%s' % key, action='append', | |
190 default=list(value), | |
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 |