| #!/usr/bin/env python |
| |
| """ |
| Compatibility module to use the lldb test-suite with Python 2.6. |
| |
| Warning: This may be buggy. It has not been extensively tested and should only |
| be used when it is impossible to use a newer Python version. |
| It is also a special-purpose class for lldb's test-suite. |
| """ |
| |
| import sys |
| |
| if sys.version_info >= (2, 7): |
| raise "This module shouldn't be used when argparse is available (Python >= 2.7)" |
| else: |
| print "Using Python 2.6 compatibility layer. Some command line options may not be supported" |
| |
| |
| import optparse |
| |
| |
| class ArgumentParser(object): |
| def __init__(self, description="My program's description", prefix_chars='-', add_help=True): |
| self.groups = [] |
| self.parser = optparse.OptionParser(description=description, add_help_option=add_help) |
| self.prefix_chars = prefix_chars |
| |
| def add_argument_group(self, name): |
| group = optparse.OptionGroup(self.parser, name) |
| # Hack around our test directories argument (what's left after the |
| # options) |
| if name != 'Test directories': |
| self.groups.append(group) |
| return ArgumentGroup(group) |
| |
| def add_argument(self, *opt_strs, **kwargs): |
| self.parser.add_option(*opt_strs, **kwargs) |
| # def add_argument(self, opt_str, action='store', dest=None, metavar=None, help=''): |
| # if dest is None and metavar is None: |
| # self.parser.add_argument(opt_str, action=action, help=help) |
| |
| def parse_args(self, arguments=sys.argv[1:]): |
| map(lambda g: self.parser.add_option_group(g), self.groups) |
| (options, args) = self.parser.parse_args(arguments) |
| d = vars(options) |
| d['args'] = args |
| return Namespace(d) |
| |
| def print_help(self): |
| self.parser.print_help() |
| |
| |
| class ArgumentGroup(object): |
| def __init__(self, option_group): |
| self.option_group = option_group |
| |
| def add_argument(self, *opt_strs, **kwargs): |
| # Hack around our positional argument (the test directories) |
| if opt_strs == ('args',): |
| return |
| |
| # Hack around the options that start with '+' |
| if len(opt_strs) == 1 and opt_strs[0] == '+a': |
| opt_strs = ('--plus_a',) |
| if len(opt_strs) == 1 and opt_strs[0] == '+b': |
| opt_strs = ('--plus_b',) |
| self.option_group.add_option(*opt_strs, **kwargs) |
| |
| |
| class Namespace(object): |
| def __init__(self, d): |
| self.__dict__ = d |
| |
| def __str__(self): |
| strings = [] |
| for (k, v) in self.__dict__.iteritems(): |
| strings.append(str(k) + '=' + str(v)) |
| strings.sort() |
| |
| return self.__class__.__name__ + '(' + ', '.join(strings) + ')' |