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