93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
# Copyright (c) 2019-2021 Artem Bulgakov
|
|
#
|
|
# This file is distributed under the terms of the same license,
|
|
# as the Kivy framework.
|
|
|
|
import argparse
|
|
import sys
|
|
|
|
|
|
class ArgumentParserWithHelp(argparse.ArgumentParser):
|
|
def parse_args(self, args=None, namespace=None):
|
|
# Add help when no arguments specified
|
|
if not args and not len(sys.argv) > 1:
|
|
self.print_help()
|
|
self.exit(1)
|
|
return super().parse_args(args, namespace)
|
|
|
|
def error(self, message):
|
|
# Add full help on error
|
|
self.print_help()
|
|
self.exit(2, f"\nError: {message}\n")
|
|
|
|
def format_help(self):
|
|
# Add subparsers usage and help to full help text
|
|
formatter = self._get_formatter()
|
|
|
|
# Get subparsers
|
|
subparsers_actions = [
|
|
action
|
|
for action in self._actions
|
|
if isinstance(action, argparse._SubParsersAction)
|
|
]
|
|
|
|
# Description
|
|
formatter.add_text(self.description)
|
|
|
|
# Usage
|
|
formatter.add_usage(
|
|
self.usage,
|
|
self._actions,
|
|
self._mutually_exclusive_groups,
|
|
prefix="Usage:\n",
|
|
)
|
|
|
|
# Subparsers usage
|
|
for subparsers_action in subparsers_actions:
|
|
for choice, subparser in subparsers_action.choices.items():
|
|
formatter.add_usage(
|
|
subparser.usage,
|
|
subparser._actions,
|
|
subparser._mutually_exclusive_groups,
|
|
prefix="",
|
|
)
|
|
|
|
# Positionals, optionals and user-defined groups
|
|
for action_group in self._action_groups:
|
|
if not any(
|
|
[
|
|
action in subparsers_actions
|
|
for action in action_group._group_actions
|
|
]
|
|
):
|
|
formatter.start_section(action_group.title)
|
|
formatter.add_text(action_group.description)
|
|
formatter.add_arguments(action_group._group_actions)
|
|
formatter.end_section()
|
|
else:
|
|
# Process subparsers differently
|
|
# Just show list of choices
|
|
formatter.start_section(action_group.title)
|
|
# formatter.add_text(action_group.description)
|
|
for action in action_group._group_actions:
|
|
for choice in action.choices:
|
|
formatter.add_text(choice)
|
|
formatter.end_section()
|
|
|
|
# Subparsers help
|
|
for subparsers_action in subparsers_actions:
|
|
for choice, subparser in subparsers_action.choices.items():
|
|
formatter.start_section(choice)
|
|
for action_group in subparser._action_groups:
|
|
formatter.start_section(action_group.title)
|
|
formatter.add_text(action_group.description)
|
|
formatter.add_arguments(action_group._group_actions)
|
|
formatter.end_section()
|
|
formatter.end_section()
|
|
|
|
# Epilog
|
|
formatter.add_text(self.epilog)
|
|
|
|
# Determine help from format above
|
|
return formatter.format_help()
|