in nubia/internal/typing/argparse.py [0:0]
def register_command(argparse_parser, inspection):
_command = inspection.command
# auto wrap the function with @command in case its not wrapped into one
subparsers = _resolve_subparsers(argparse_parser)
subparser = subparsers.add_parser(
_command.name, aliases=_command.aliases, help=_command.help
)
# Exclusive arguments needs to be added to argparse's mutually exclusive
# groups
exclusive_args = _command.exclusive_arguments or []
mutually_exclusive_groups = defaultdict(subparser.add_mutually_exclusive_group)
for arg in inspection.arguments.values():
add_argument_args, add_argument_kwargs = _argument_to_argparse_input(arg)
groups = [group for group in exclusive_args if arg.name in group]
if not groups:
subparser.add_argument(*add_argument_args, **add_argument_kwargs)
elif len(groups) == 1:
me_group = mutually_exclusive_groups[groups[0]]
me_group.add_argument(*add_argument_args, **add_argument_kwargs)
elif len(groups) > 1:
msg = (
"Argument {} is present in more than one exclusive "
"group: {}. This should not be allowed by the @command "
"decorator".format(arg.name, groups)
)
raise ValueError(msg)
# if we are adding a super command then we need to create a sub parser for
# this
if len(inspection.subcommands) > 0:
subcommand_parsers = subparser.add_subparsers(
dest="_subcmd",
help=_command.help,
parser_class=create_subparser_class(subparser),
metavar="[subcommand]".format(_command.name),
)
subcommand_parsers.required = True
# recursively add sub-commands
for _, v in inspection.subcommands:
register_command(subcommand_parsers, v)
return subparser