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, |     def __init__(self, want_app=True, want_app_no_instance=False, | ||||||
|                  vmname_nargs=None, **kwargs): |                  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 = want_app | ||||||
|         self._want_app_no_instance = want_app_no_instance |         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', |         self.add_argument('--force-root', action='store_true', | ||||||
|                           default=False, help=argparse.SUPPRESS) |                           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]: |         if self._vmname_nargs in [argparse.ZERO_OR_MORE, argparse.ONE_OR_MORE]: | ||||||
|             vm_name_group = VmNameGroup(self, |             vm_name_group = VmNameGroup(self, | ||||||
|                 required=(self._vmname_nargs |                 required=(self._vmname_nargs | ||||||
| @ -436,6 +439,37 @@ class QubesArgumentParser(argparse.ArgumentParser): | |||||||
|         print(*args, file=sys.stderr, **kwargs) |         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): | class AliasedSubParsersAction(argparse._SubParsersAction): | ||||||
|     '''SubParser with support for action aliases''' |     '''SubParser with support for action aliases''' | ||||||
|     # source https://gist.github.com/sampsyo/471779 |     # source https://gist.github.com/sampsyo/471779 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki