1
# Written by Bill Bumgarner and Bram Cohen
2
# see LICENSE.txt for license information
5
from cStringIO import StringIO
8
def splitLine(line, COLS=80, indent=10):
10
width = COLS - (len(indent) + 1)
11
if indent and width < 15:
16
for word in line.split():
21
if i + len(word) >= width:
22
s.write('\n'+indent+word)
29
def formatDefinitions(options, COLS, presets = {}):
31
for (longname, default, doc) in options:
32
s.write('--' + longname + ' <arg>\n')
33
default = presets.get(longname, default)
34
if type(default) in (IntType, LongType):
36
default = int(default)
39
if default is not None:
40
doc += ' (defaults to ' + repr(default) + ')'
41
s.write(splitLine(doc,COLS,10))
50
def defaultargs(options):
52
for (longname, default, doc) in options:
53
if default is not None:
58
def parseargs(argv, options, minargs = None, maxargs = None, presets = {}):
61
for option in options:
62
longname, default, doc = option
63
longkeyed[longname] = option
64
config[longname] = default
65
for longname in presets.keys(): # presets after defaults but before arguments
66
config[longname] = presets[longname]
70
while pos < len(argv):
71
if argv[pos][:2] != '--':
72
args.append(argv[pos])
75
if pos == len(argv) - 1:
76
usage('parameter passed in at end with no value')
78
key, value = argv[pos][2:], argv[pos+1]
81
if not longkeyed.has_key(key):
82
usage('unknown key --' + key)
84
longname, default, doc = longkeyed[key]
87
t = type(config[longname])
88
if t is NoneType or t is StringType:
89
config[longname] = value
90
elif t in (IntType, LongType):
91
config[longname] = long(value)
93
config[longname] = float(value)
97
usage('wrong format of --%s - %s' % (key, str(e)))
99
for key, value in config.items():
101
usage("Option --%s is required." % key)
103
if minargs is not None and len(args) < minargs:
104
usage("Must supply at least %d args." % minargs)
106
if maxargs is not None and len(args) > maxargs:
107
usage("Too many args - %d max." % maxargs)
109
return (config, args)
111
def test_parseargs():
112
assert parseargs(('d', '--a', 'pq', 'e', '--b', '3', '--c', '4.5', 'f'), (('a', 'x', ''), ('b', 1, ''), ('c', 2.3, ''))) == ({'a': 'pq', 'b': 3, 'c': 4.5}, ['d', 'e', 'f'])
113
assert parseargs([], [('a', 'x', '')]) == ({'a': 'x'}, [])
114
assert parseargs(['--a', 'x', '--a', 'y'], [('a', '', '')]) == ({'a': 'y'}, [])
116
parseargs([], [('a', 'x', '')])
120
parseargs(['--a', 'x'], [])
124
parseargs(['--a'], [('a', 'x', '')])
128
parseargs([], [], 1, 2)
131
assert parseargs(['x'], [], 1, 2) == ({}, ['x'])
132
assert parseargs(['x', 'y'], [], 1, 2) == ({}, ['x', 'y'])
134
parseargs(['x', 'y', 'z'], [], 1, 2)
138
parseargs(['--a', '2.0'], [('a', 3, '')])
142
parseargs(['--a', 'z'], [('a', 2.1, '')])