Upload the contribution of vstf as bottleneck network framework.
[bottlenecks.git] / vstf / vstf / common / vstfcli.py
1 import argparse
2 import sys
3
4
5 class VstfHelpFormatter(argparse.HelpFormatter):
6     def start_section(self, heading):
7         # Title-case the headings
8         heading = '%s%s' % (heading[0].upper(), heading[1:])
9         super(VstfHelpFormatter, self).start_section(heading)
10
11
12 class VstfParser(argparse.ArgumentParser):
13     def __init__(self,
14                  prog='vstf',
15                  description="",
16                  epilog='',
17                  add_help=True,
18                  formatter_class=VstfHelpFormatter):
19
20         super(VstfParser, self).__init__(
21             prog=prog,
22             description=description,
23             epilog=epilog,
24             add_help=add_help,
25             formatter_class=formatter_class)
26         self.subcommands = {}
27
28     def _find_actions(self, subparsers, actions_module):
29         for attr in (a for a in dir(actions_module) if a.startswith('do_')):
30             command = attr[3:].replace('_', '-')
31             callback = getattr(actions_module, attr)
32             desc = callback.__doc__ or ''
33             action_help = desc.strip()
34             arguments = getattr(callback, 'arguments', [])
35             subparser = subparsers.add_parser(command,
36                                               help=action_help,
37                                               description=desc,
38                                               add_help=False,
39                                               formatter_class=VstfHelpFormatter)
40             subparser.add_argument('-h', '--help',
41                                    action='help',
42                                    help=argparse.SUPPRESS)
43             self.subcommands[command] = subparser
44             for (args, kwargs) in arguments:
45                 subparser.add_argument(*args, **kwargs)
46             subparser.set_defaults(func=callback)
47
48     def set_subcommand_parser(self, target, metavar="<subcommand>"):
49         subparsers = self.add_subparsers(metavar=metavar)
50         self._find_actions(subparsers, target)
51         return subparsers
52
53     def set_parser_to_subcommand(self, subparser, target):
54         self._find_actions(subparser, target)
55
56
57 if __name__ == "__main__":
58     from vstf.common import test_func
59     parser = VstfParser(prog="vstf", description="test parser")
60     parser.set_subcommand_parser(test_func)
61     args = parser.parse_args(sys.argv[1:])
62     args.func(args)