Sideband/sbapp/kivymd/tools/argument_parser.py

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()