Skip to content

Commit d12a601

Browse files
committed
Fixed bug when trying to format help text of argument which used a tuple as its metavar
1 parent 133e71a commit d12a601

File tree

1 file changed

+27
-18
lines changed

1 file changed

+27
-18
lines changed

cmd2/argparse_custom.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,8 @@ def _format_action_invocation(self, action) -> str:
733733
return ', '.join(action.option_strings) + ' ' + args_string
734734
# End cmd2 customization
735735

736-
def _metavar_formatter(self, action, default_metavar) -> Callable:
736+
def _determine_metavar(self, action, default_metavar) -> Union[str, Tuple]:
737+
"""Custom method to determine what to use as the metavar value of an action"""
737738
if action.metavar is not None:
738739
result = action.metavar
739740
elif action.choices is not None:
@@ -743,38 +744,46 @@ def _metavar_formatter(self, action, default_metavar) -> Callable:
743744
# End cmd2 customization
744745
else:
745746
result = default_metavar
747+
return result
748+
749+
def _metavar_formatter(self, action, default_metavar) -> Callable:
750+
metavar = self._determine_metavar(action, default_metavar)
746751

747752
# noinspection PyMissingOrEmptyDocstring
748753
def format(tuple_size):
749-
if isinstance(result, tuple):
750-
return result
754+
if isinstance(metavar, tuple):
755+
return metavar
751756
else:
752-
return (result, ) * tuple_size
757+
return (metavar, ) * tuple_size
753758
return format
754759

755760
# noinspection PyProtectedMember
756761
def _format_args(self, action, default_metavar) -> str:
757-
get_metavar = self._metavar_formatter(action, default_metavar)
758-
# Begin cmd2 customization (less verbose)
759-
nargs_range = getattr(action, ATTR_NARGS_RANGE, None)
762+
"""Customized to handle ranged nargs and make other output less verbose"""
763+
metavar = self._determine_metavar(action, default_metavar)
764+
metavar_formatter = self._metavar_formatter(action, default_metavar)
760765

766+
# Handle nargs specified as a range
767+
nargs_range = getattr(action, ATTR_NARGS_RANGE, None)
761768
if nargs_range is not None:
762769
if nargs_range[1] == constants.INFINITY:
763770
range_str = '{}+'.format(nargs_range[0])
764771
else:
765772
range_str = '{}..{}'.format(nargs_range[0], nargs_range[1])
766773

767-
result = '{}{{{}}}'.format('%s' % get_metavar(1), range_str)
768-
elif action.nargs == ZERO_OR_MORE:
769-
result = '[%s [...]]' % get_metavar(1)
770-
elif action.nargs == ONE_OR_MORE:
771-
result = '%s [...]' % get_metavar(1)
772-
elif isinstance(action.nargs, int) and action.nargs > 1:
773-
result = '{}{{{}}}'.format('%s' % get_metavar(1), action.nargs)
774-
# End cmd2 customization
775-
else:
776-
result = super()._format_args(action, default_metavar)
777-
return result
774+
return '{}{{{}}}'.format('%s' % metavar_formatter(1), range_str)
775+
776+
# Make this output less verbose. Do not customize the output when metavar is a
777+
# tuple of strings. Allow argparse's formatter to handle that instead.
778+
elif isinstance(metavar, str):
779+
if action.nargs == ZERO_OR_MORE:
780+
return '[%s [...]]' % metavar_formatter(1)
781+
elif action.nargs == ONE_OR_MORE:
782+
return '%s [...]' % metavar_formatter(1)
783+
elif isinstance(action.nargs, int) and action.nargs > 1:
784+
return '{}{{{}}}'.format('%s' % metavar_formatter(1), action.nargs)
785+
786+
return super()._format_args(action, default_metavar)
778787

779788

780789
# noinspection PyCompatibility

0 commit comments

Comments
 (0)