diff options
author | Kevin Van Brunt <kmvanbrunt@gmail.com> | 2020-08-12 17:59:21 -0400 |
---|---|---|
committer | Kevin Van Brunt <kmvanbrunt@gmail.com> | 2020-08-12 17:59:21 -0400 |
commit | d12a601edb21ae1e9e637d820d1e53c4d3e90c45 (patch) | |
tree | a51e9f02ac150731a1806f049d9bf66f55ca2858 /cmd2 | |
parent | 133e71a5a3074fc21fa52532d00c4d2364964cd3 (diff) | |
download | cmd2-git-d12a601edb21ae1e9e637d820d1e53c4d3e90c45.tar.gz |
Fixed bug when trying to format help text of argument which used a tuple as its metavar
Diffstat (limited to 'cmd2')
-rw-r--r-- | cmd2/argparse_custom.py | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/cmd2/argparse_custom.py b/cmd2/argparse_custom.py index d724cb88..12c18644 100644 --- a/cmd2/argparse_custom.py +++ b/cmd2/argparse_custom.py @@ -733,7 +733,8 @@ class Cmd2HelpFormatter(argparse.RawTextHelpFormatter): return ', '.join(action.option_strings) + ' ' + args_string # End cmd2 customization - def _metavar_formatter(self, action, default_metavar) -> Callable: + def _determine_metavar(self, action, default_metavar) -> Union[str, Tuple]: + """Custom method to determine what to use as the metavar value of an action""" if action.metavar is not None: result = action.metavar elif action.choices is not None: @@ -743,38 +744,46 @@ class Cmd2HelpFormatter(argparse.RawTextHelpFormatter): # End cmd2 customization else: result = default_metavar + return result + + def _metavar_formatter(self, action, default_metavar) -> Callable: + metavar = self._determine_metavar(action, default_metavar) # noinspection PyMissingOrEmptyDocstring def format(tuple_size): - if isinstance(result, tuple): - return result + if isinstance(metavar, tuple): + return metavar else: - return (result, ) * tuple_size + return (metavar, ) * tuple_size return format # noinspection PyProtectedMember def _format_args(self, action, default_metavar) -> str: - get_metavar = self._metavar_formatter(action, default_metavar) - # Begin cmd2 customization (less verbose) - nargs_range = getattr(action, ATTR_NARGS_RANGE, None) + """Customized to handle ranged nargs and make other output less verbose""" + metavar = self._determine_metavar(action, default_metavar) + metavar_formatter = self._metavar_formatter(action, default_metavar) + # Handle nargs specified as a range + nargs_range = getattr(action, ATTR_NARGS_RANGE, None) if nargs_range is not None: if nargs_range[1] == constants.INFINITY: range_str = '{}+'.format(nargs_range[0]) else: range_str = '{}..{}'.format(nargs_range[0], nargs_range[1]) - result = '{}{{{}}}'.format('%s' % get_metavar(1), range_str) - elif action.nargs == ZERO_OR_MORE: - result = '[%s [...]]' % get_metavar(1) - elif action.nargs == ONE_OR_MORE: - result = '%s [...]' % get_metavar(1) - elif isinstance(action.nargs, int) and action.nargs > 1: - result = '{}{{{}}}'.format('%s' % get_metavar(1), action.nargs) - # End cmd2 customization - else: - result = super()._format_args(action, default_metavar) - return result + return '{}{{{}}}'.format('%s' % metavar_formatter(1), range_str) + + # Make this output less verbose. Do not customize the output when metavar is a + # tuple of strings. Allow argparse's formatter to handle that instead. + elif isinstance(metavar, str): + if action.nargs == ZERO_OR_MORE: + return '[%s [...]]' % metavar_formatter(1) + elif action.nargs == ONE_OR_MORE: + return '%s [...]' % metavar_formatter(1) + elif isinstance(action.nargs, int) and action.nargs > 1: + return '{}{{{}}}'.format('%s' % metavar_formatter(1), action.nargs) + + return super()._format_args(action, default_metavar) # noinspection PyCompatibility |