tools: add SubParsersHelpAction, which include subcommands details in --help
This commit is contained in:
		
							parent
							
								
									b9b9eb1f3b
								
							
						
					
					
						commit
						c70e440a6c
					
				| @ -339,7 +339,7 @@ class QubesArgumentParser(argparse.ArgumentParser): | ||||
|     def __init__(self, want_app=True, want_app_no_instance=False, | ||||
|                  vmname_nargs=None, **kwargs): | ||||
| 
 | ||||
|         super(QubesArgumentParser, self).__init__(**kwargs) | ||||
|         super(QubesArgumentParser, self).__init__(add_help=False, **kwargs) | ||||
| 
 | ||||
|         self._want_app = want_app | ||||
|         self._want_app_no_instance = want_app_no_instance | ||||
| @ -360,6 +360,9 @@ class QubesArgumentParser(argparse.ArgumentParser): | ||||
|         self.add_argument('--force-root', action='store_true', | ||||
|                           default=False, help=argparse.SUPPRESS) | ||||
| 
 | ||||
|         self.add_argument('--help', '-h', action=SubParsersHelpAction, | ||||
|                           help='show this help message and exit') | ||||
| 
 | ||||
|         if self._vmname_nargs in [argparse.ZERO_OR_MORE, argparse.ONE_OR_MORE]: | ||||
|             vm_name_group = VmNameGroup(self, | ||||
|                 required=(self._vmname_nargs | ||||
| @ -436,6 +439,37 @@ class QubesArgumentParser(argparse.ArgumentParser): | ||||
|         print(*args, file=sys.stderr, **kwargs) | ||||
| 
 | ||||
| 
 | ||||
| class SubParsersHelpAction(argparse._HelpAction): | ||||
|     ''' Print help for all options _and all subparsers_ ''' | ||||
|     # source https://stackoverflow.com/a/24122778 | ||||
|     # pylint: disable=protected-access,too-few-public-methods | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def _indent(indent, text): | ||||
|         '''Indent *text* by *indent* spaces''' | ||||
|         return '\n'.join((' ' * indent) + l for l in text.splitlines()) | ||||
| 
 | ||||
|     def __call__(self, parser, namespace, values, option_string=None): | ||||
|         parser.print_help() | ||||
| 
 | ||||
|         # retrieve subparsers from parser | ||||
|         subparsers_actions = [ | ||||
|             action for action in parser._actions | ||||
|             if isinstance(action, argparse._SubParsersAction)] | ||||
|         # there will probably only be one subparser_action, | ||||
|         # but better save than sorry | ||||
|         for subparsers_action in subparsers_actions: | ||||
|             # get all subparsers and print help | ||||
|             for pseudo_action in subparsers_action._choices_actions: | ||||
|                 choice = pseudo_action.dest.split(' ', 1)[0] | ||||
|                 subparser = subparsers_action.choices[choice] | ||||
|                 print("\nCommand '{}':".format(choice)) | ||||
|                 choice_help = subparser.format_usage() | ||||
|                 choice_help = self._indent(2, choice_help) | ||||
|                 print(choice_help) | ||||
|         parser.exit() | ||||
| 
 | ||||
| 
 | ||||
| class AliasedSubParsersAction(argparse._SubParsersAction): | ||||
|     '''SubParser with support for action aliases''' | ||||
|     # source https://gist.github.com/sampsyo/471779 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki