summaryrefslogtreecommitdiff
path: root/cmd2/argparse_custom.py
diff options
context:
space:
mode:
authorKevin Van Brunt <kmvanbrunt@gmail.com>2020-08-13 12:54:49 -0400
committerGitHub <noreply@github.com>2020-08-13 12:54:49 -0400
commitb26974e977ec3b7406b285ce4567c68106ed4425 (patch)
tree8faed77f34a8c8f4be114b34b536e6c9ab8e6154 /cmd2/argparse_custom.py
parent133e71a5a3074fc21fa52532d00c4d2364964cd3 (diff)
parentac26caeccfd525c5ff81aa0ade0164c40faeef4c (diff)
downloadcmd2-git-b26974e977ec3b7406b285ce4567c68106ed4425.tar.gz
Merge pull request #975 from python-cmd2/help_format_fix
Fix tuple metavar crash in Cmd2HelpFormatter and ArgparseCompleter
Diffstat (limited to 'cmd2/argparse_custom.py')
-rw-r--r--cmd2/argparse_custom.py45
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