llvm-project/lldb/test/argparse_compat.py

81 lines
2.6 KiB
Python
Executable File

#!/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) + ')'