diff options
Diffstat (limited to 'src/tools/analyzer/parser.py')
-rw-r--r-- | src/tools/analyzer/parser.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/tools/analyzer/parser.py b/src/tools/analyzer/parser.py new file mode 100644 index 0000000..742694e --- /dev/null +++ b/src/tools/analyzer/parser.py @@ -0,0 +1,60 @@ +import argparse + + +# Based on patch from https://bugs.python.org/issue9341 +class SubparsersAction(argparse._SubParsersAction): + """ + Provide a subparser action that can create subparsers with ability of + grouping arguments. + + It is based on the patch from: + + - https://bugs.python.org/issue9341 + """ + + class _PseudoGroup(argparse.Action): + def __init__(self, container, title): + super().__init__(option_strings=[], dest=title) + self.container = container + self._choices_actions = [] + + def add_parser(self, name, **kwargs): + # add the parser to the main Action, but move the pseudo action + # in the group's own list + parser = self.container.add_parser(name, **kwargs) + choice_action = self.container._choices_actions.pop() + self._choices_actions.append(choice_action) + return parser + + def _get_subactions(self): + return self._choices_actions + + def add_parser_group(self, title): + # the formatter can handle recursive subgroups + grp = SubparsersAction._PseudoGroup(self, title) + self._choices_actions.append(grp) + return grp + + def add_parser_group(self, title): + """ + Add new parser group. + + :param title: Title. + :type title: str + :return: Parser group that can have additional parsers attached. + :rtype: ``argparse.Action`` extended with ``add_parser`` method + """ + grp = self._PseudoGroup(self, title) + self._choices_actions.append(grp) + return grp + + +class Option: + """ + Group option attributes for command/subcommand options + """ + def __init__(self, name, help_msg, opt_type, short_opt=None): + self.name = name + self.short_opt = short_opt + self.help_msg = help_msg + self.opt_type = opt_type |