77 def _make_parser(self, **kwargs):
78 """Create and register a subparser for this command."""
79
80 kwargs.setdefault('help', self.help)
81 kwargs.setdefault('formatter_class',argparse.RawDescriptionHelpFormatter)
82 kwargs.setdefault('description', self.description)
83 kwargs.setdefault('name', self.name)
84 names = (kwargs.get(
'name')
or self.name).
split(
'.')
85
86 def _get_subparser(a):
87 if a._subparsers:
88 for action in a._subparsers._actions:
89 if isinstance(action, argparse._SubParsersAction):
90 return action
91 raise RuntimeError('could not find adequate subparser')
92 return a.add_subparsers(dest='command',
93 title='commands',
94 metavar='COMMAND')
95 def _get_parser(node, idx, names):
96 name = names[idx]
97 if name in node.choices:
98 return node.choices[name]
99 args = {
100 'name' : name,
101 'help' : 'a group of sub-commands',
102 }
103 return node.add_parser(**args)
104
105 parser = ACMD_PARSER
106 node = _get_subparser(parser)
107
108 for i,n in enumerate(names[:-1]):
109 node = _get_subparser(parser)
110 parser = _get_parser(node, i, names)
111
112 node = _get_subparser(parser)
113 kwargs['name'] = names[-1]
114 parser = node.add_parser(**kwargs)
115 return parser
116
std::vector< std::string > split(const std::string &s, const std::string &t=":")