~ubuntu-branches/debian/jessie/armory/jessie

« back to all changes in this revision

Viewing changes to BitTornado/parseargs.py

  • Committer: Package Import Robot
  • Author(s): Joseph Bisch
  • Date: 2014-10-07 10:22:45 UTC
  • Revision ID: package-import@ubuntu.com-20141007102245-2s3x3rhjxg689hek
Tags: upstream-0.92.3
ImportĀ upstreamĀ versionĀ 0.92.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Written by Bill Bumgarner and Bram Cohen
 
2
# see LICENSE.txt for license information
 
3
 
 
4
from types import *
 
5
from cStringIO import StringIO
 
6
 
 
7
 
 
8
def splitLine(line, COLS=80, indent=10):
 
9
    indent = " " * indent
 
10
    width = COLS - (len(indent) + 1)
 
11
    if indent and width < 15:
 
12
        width = COLS - 2
 
13
        indent = " "
 
14
    s = StringIO()
 
15
    i = 0
 
16
    for word in line.split():
 
17
        if i == 0:
 
18
            s.write(indent+word)
 
19
            i = len(word)
 
20
            continue
 
21
        if i + len(word) >= width:
 
22
            s.write('\n'+indent+word)
 
23
            i = len(word)
 
24
            continue
 
25
        s.write(' '+word)
 
26
        i += len(word) + 1
 
27
    return s.getvalue()
 
28
 
 
29
def formatDefinitions(options, COLS, presets = {}):
 
30
    s = StringIO()
 
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):
 
35
            try:
 
36
                default = int(default)
 
37
            except:
 
38
                pass
 
39
        if default is not None:
 
40
            doc += ' (defaults to ' + repr(default) + ')'
 
41
        s.write(splitLine(doc,COLS,10))
 
42
        s.write('\n\n')
 
43
    return s.getvalue()
 
44
 
 
45
 
 
46
def usage(str):
 
47
    raise ValueError(str)
 
48
 
 
49
 
 
50
def defaultargs(options):
 
51
    l = {}
 
52
    for (longname, default, doc) in options:
 
53
        if default is not None:
 
54
            l[longname] = default
 
55
    return l
 
56
        
 
57
 
 
58
def parseargs(argv, options, minargs = None, maxargs = None, presets = {}):
 
59
    config = {}
 
60
    longkeyed = {}
 
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]
 
67
    options = []
 
68
    args = []
 
69
    pos = 0
 
70
    while pos < len(argv):
 
71
        if argv[pos][:2] != '--':
 
72
            args.append(argv[pos])
 
73
            pos += 1
 
74
        else:
 
75
            if pos == len(argv) - 1:
 
76
                usage('parameter passed in at end with no value')
 
77
 
 
78
            key, value = argv[pos][2:], argv[pos+1]
 
79
            pos += 2
 
80
 
 
81
            if not longkeyed.has_key(key):
 
82
                usage('unknown key --' + key)
 
83
 
 
84
            longname, default, doc = longkeyed[key]
 
85
 
 
86
            try:
 
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)
 
92
                elif t is FloatType:
 
93
                    config[longname] = float(value)
 
94
                else:
 
95
                    assert 0
 
96
            except ValueError, e:
 
97
                usage('wrong format of --%s - %s' % (key, str(e)))
 
98
 
 
99
    for key, value in config.items():
 
100
        if value is None:
 
101
            usage("Option --%s is required." % key)
 
102
 
 
103
    if minargs is not None and len(args) < minargs:
 
104
        usage("Must supply at least %d args." % minargs)
 
105
 
 
106
    if maxargs is not None and len(args) > maxargs:
 
107
        usage("Too many args - %d max." % maxargs)
 
108
 
 
109
    return (config, args)
 
110
 
 
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'}, [])
 
115
    try:
 
116
        parseargs([], [('a', 'x', '')])
 
117
    except ValueError:
 
118
        pass
 
119
    try:
 
120
        parseargs(['--a', 'x'], [])
 
121
    except ValueError:
 
122
        pass
 
123
    try:
 
124
        parseargs(['--a'], [('a', 'x', '')])
 
125
    except ValueError:
 
126
        pass
 
127
    try:
 
128
        parseargs([], [], 1, 2)
 
129
    except ValueError:
 
130
        pass
 
131
    assert parseargs(['x'], [], 1, 2) == ({}, ['x'])
 
132
    assert parseargs(['x', 'y'], [], 1, 2) == ({}, ['x', 'y'])
 
133
    try:
 
134
        parseargs(['x', 'y', 'z'], [], 1, 2)
 
135
    except ValueError:
 
136
        pass
 
137
    try:
 
138
        parseargs(['--a', '2.0'], [('a', 3, '')])
 
139
    except ValueError:
 
140
        pass
 
141
    try:
 
142
        parseargs(['--a', 'z'], [('a', 2.1, '')])
 
143
    except ValueError:
 
144
        pass
 
145