fancyopts.py
74 lines
| 1.9 KiB
| text/x-python
|
PythonLexer
/ mercurial / fancyopts.py
mark.williamson@cl.cam.ac.uk
|
r667 | import getopt | ||
mpm@selenic.com
|
r0 | |||
mpm@selenic.com
|
r596 | def fancyopts(args, options, state): | ||
Matt Mackall
|
r5638 | """ | ||
read args, parse options, and store options in state | ||||
each option is a tuple of: | ||||
short option or '' | ||||
long option | ||||
default value | ||||
description | ||||
option types include: | ||||
boolean or none - option sets variable in state to true | ||||
string - parameter string is stored in state | ||||
list - parameter string is added to a list | ||||
integer - parameter strings is stored as int | ||||
function - call function with parameter | ||||
mpm@selenic.com
|
r0 | |||
Matt Mackall
|
r5638 | non-option args are returned | ||
""" | ||||
namelist = [] | ||||
shortlist = '' | ||||
argmap = {} | ||||
defmap = {} | ||||
for short, name, default, comment in options: | ||||
# convert opts to getopt format | ||||
oname = name | ||||
name = name.replace('-', '_') | ||||
argmap['-' + short] = argmap['--' + oname] = name | ||||
defmap[name] = default | ||||
# copy defaults to state | ||||
if isinstance(default, list): | ||||
state[name] = default[:] | ||||
elif callable(default): | ||||
print "whoa", name, default | ||||
state[name] = None | ||||
Thomas Arendsen Hein
|
r5093 | else: | ||
Matt Mackall
|
r5638 | state[name] = default | ||
mpm@selenic.com
|
r0 | |||
Matt Mackall
|
r5638 | # does it take a parameter? | ||
if not (default is None or default is True or default is False): | ||||
if short: short += ':' | ||||
if oname: oname += '=' | ||||
if short: | ||||
shortlist += short | ||||
if name: | ||||
namelist.append(oname) | ||||
# parse arguments | ||||
opts, args = getopt.getopt(args, shortlist, namelist) | ||||
mpm@selenic.com
|
r0 | |||
Matt Mackall
|
r5638 | # transfer result to state | ||
for opt, val in opts: | ||||
name = argmap[opt] | ||||
t = type(defmap[name]) | ||||
if t is type(fancyopts): | ||||
state[name] = defmap[name](val) | ||||
elif t is type(1): | ||||
state[name] = int(val) | ||||
elif t is type(''): | ||||
state[name] = val | ||||
elif t is type([]): | ||||
state[name].append(val) | ||||
elif t is type(None) or t is type(False): | ||||
state[name] = True | ||||
mpm@selenic.com
|
r209 | |||
Matt Mackall
|
r5638 | # return unparsed args | ||
mpm@selenic.com
|
r0 | return args | ||