blob: 32f73db5a9f0cea951448af2b07c8b07fe289d80 [file] [log] [blame]
Filipe Cabecinhasd3eb8372013-02-16 09:05:23 +00001#!/usr/bin/env python
2
3"""
4Compatibility module to use the lldb test-suite with Python 2.6.
5
6Warning: This may be buggy. It has not been extensively tested and should only
7be used when it is impossible to use a newer Python version.
8It is also a special-purpose class for lldb's test-suite.
9"""
10
11import sys
12
13if sys.version_info >= (2, 7):
14 raise "This module shouldn't be used when argparse is available (Python >= 2.7)"
15else:
16 print "Using Python 2.6 compatibility layer. Some command line options may not be supported"
17
18
19import optparse
20
21
22class ArgumentParser(object):
23 def __init__(self, description="My program's description", prefix_chars='-', add_help=True):
24 self.groups = []
25 self.parser = optparse.OptionParser(description=description, add_help_option=add_help)
26 self.prefix_chars = prefix_chars
27
28 def add_argument_group(self, name):
29 group = optparse.OptionGroup(self.parser, name)
30 # Hack around our test directories argument (what's left after the
31 # options)
32 if name != 'Test directories':
33 self.groups.append(group)
34 return ArgumentGroup(group)
35
36 def add_argument(self, *opt_strs, **kwargs):
37 self.parser.add_option(*opt_strs, **kwargs)
38 # def add_argument(self, opt_str, action='store', dest=None, metavar=None, help=''):
39 # if dest is None and metavar is None:
40 # self.parser.add_argument(opt_str, action=action, help=help)
41
42 def parse_args(self, arguments=sys.argv[1:]):
43 map(lambda g: self.parser.add_option_group(g), self.groups)
44 (options, args) = self.parser.parse_args(arguments)
45 d = vars(options)
46 d['args'] = args
47 return Namespace(d)
48
49 def print_help(self):
50 self.parser.print_help()
51
52
53class ArgumentGroup(object):
54 def __init__(self, option_group):
55 self.option_group = option_group
56
57 def add_argument(self, *opt_strs, **kwargs):
58 # Hack around our positional argument (the test directories)
59 if opt_strs == ('args',):
60 return
61
62 # Hack around the options that start with '+'
63 if len(opt_strs) == 1 and opt_strs[0] == '+a':
64 opt_strs = ('--plus_a',)
65 if len(opt_strs) == 1 and opt_strs[0] == '+b':
66 opt_strs = ('--plus_b',)
67 self.option_group.add_option(*opt_strs, **kwargs)
68
69
70class Namespace(object):
71 def __init__(self, d):
72 self.__dict__ = d
73
74 def __str__(self):
75 strings = []
76 for (k, v) in self.__dict__.iteritems():
77 strings.append(str(k) + '=' + str(v))
78 strings.sort()
79
80 return self.__class__.__name__ + '(' + ', '.join(strings) + ')'