]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - www/pages/torrent/client/parseargs.py
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')
77 key
, value
= argv
[pos
][2:], argv
[pos
+1]
79 if not longkeyed
.has_key(key
):
80 usage('unknown key --' + key
)
81 longname
, default
, doc
= longkeyed
[key
]
83 t
= type(config
[longname
])
84 if t
is NoneType
or t
is StringType
:
85 config
[longname
] = value
86 elif t
in (IntType
, LongType
):
87 config
[longname
] = long(value
)
89 config
[longname
] = float(value
)
93 usage('wrong format of --%s - %s' % (key
, str(e
)))
94 for key
, value
in config
.items():
96 usage("Option --%s is required." % key
)
97 if minargs
is not None and len(args
) < minargs
:
98 usage("Must supply at least %d args." % minargs
)
99 if maxargs
is not None and len(args
) > maxargs
:
100 usage("Too many args - %d max." % maxargs
)
101 return (config
, args
)
103 def test_parseargs():
104 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'])
105 assert parseargs([], [('a', 'x', '')]) == ({'a': 'x'}, [])
106 assert parseargs(['--a', 'x', '--a', 'y'], [('a', '', '')]) == ({'a': 'y'}, [])
108 parseargs([], [('a', 'x', '')])
112 parseargs(['--a', 'x'], [])
116 parseargs(['--a'], [('a', 'x', '')])
120 parseargs([], [], 1, 2)
123 assert parseargs(['x'], [], 1, 2) == ({}, ['x'])
124 assert parseargs(['x', 'y'], [], 1, 2) == ({}, ['x', 'y'])
126 parseargs(['x', 'y', 'z'], [], 1, 2)
130 parseargs(['--a', '2.0'], [('a', 3, '')])
134 parseargs(['--a', 'z'], [('a', 2.1, '')])