summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Leonhardt <todd.leonhardt@gmail.com>2018-05-23 16:23:48 -0400
committerGitHub <noreply@github.com>2018-05-23 16:23:48 -0400
commit5d64ebee348aeffb02fc385f903c9af431e3721b (patch)
tree5802d2d54efba2402a8b13d73c14b6be975ba91b
parentc2594ff278ac50556cf4781910439ea1977a5873 (diff)
parent3d953628f1dbf7119001fa0751086b3b6016f764 (diff)
downloadcmd2-git-5d64ebee348aeffb02fc385f903c9af431e3721b.tar.gz
Merge pull request #411 from python-cmd2/autocompleter
Fixes problem with not passing the parameter hint suppression down to…
-rw-r--r--cmd2/argcomplete_bridge.py14
-rwxr-xr-xcmd2/argparse_completer.py13
-rwxr-xr-xexamples/subcommands.py4
3 files changed, 30 insertions, 1 deletions
diff --git a/cmd2/argcomplete_bridge.py b/cmd2/argcomplete_bridge.py
index 0ac68f1c..824710b0 100644
--- a/cmd2/argcomplete_bridge.py
+++ b/cmd2/argcomplete_bridge.py
@@ -16,6 +16,7 @@ else:
except AttributeError:
DEFAULT_COMPLETER = argcomplete.completers.FilesCompleter()
+ from cmd2.argparse_completer import ACTION_ARG_CHOICES, ACTION_SUPPRESS_HINT
from contextlib import redirect_stdout
import copy
from io import StringIO
@@ -245,7 +246,10 @@ else:
if comp_type == 63: # type is 63 for second tab press
print(outstr.rstrip(), file=argcomplete.debug_stream, end='')
- output_stream.write(ifs.join([ifs, ' ']).encode(argcomplete.sys_encoding))
+ if completions is not None:
+ output_stream.write(ifs.join([ifs, ' ']).encode(argcomplete.sys_encoding))
+ else:
+ output_stream.write(ifs.join([]).encode(argcomplete.sys_encoding))
else:
# if completions is None we assume we don't know how to handle it so let bash
# go forward with normal filesystem completion
@@ -253,3 +257,11 @@ else:
output_stream.flush()
argcomplete.debug_stream.flush()
exit_method(0)
+
+
+ def bash_complete(action, show_hint: bool=True):
+ """Helper function to configure an argparse action to fall back to bash completion"""
+ def complete_none(*args, **kwargs):
+ return None
+ setattr(action, ACTION_SUPPRESS_HINT, not show_hint)
+ setattr(action, ACTION_ARG_CHOICES, (complete_none,))
diff --git a/cmd2/argparse_completer.py b/cmd2/argparse_completer.py
index 1995b8d5..d98a6eac 100755
--- a/cmd2/argparse_completer.py
+++ b/cmd2/argparse_completer.py
@@ -75,6 +75,7 @@ from .rl_utils import rl_force_redisplay
# attribute that can optionally added to an argparse argument (called an Action) to
# define the completion choices for the argument. You may provide a Collection or a Function.
ACTION_ARG_CHOICES = 'arg_choices'
+ACTION_SUPPRESS_HINT = 'suppress_hint'
class _RangeAction(object):
@@ -261,6 +262,7 @@ class AutoCompleter(object):
sub_completers[subcmd] = AutoCompleter(action.choices[subcmd], subcmd_start,
arg_choices=subcmd_args,
subcmd_args_lookup=subcmd_lookup,
+ tab_for_arg_help=tab_for_arg_help,
cmd2_app=cmd2_app)
sub_commands.append(subcmd)
self._positional_completers[action.dest] = sub_completers
@@ -555,8 +557,19 @@ class AutoCompleter(object):
return []
def _print_action_help(self, action: argparse.Action) -> None:
+ # is parameter hinting disabled globally?
if not self._tab_for_arg_help:
return
+
+ # is parameter hinting disabled for this parameter?
+ try:
+ suppress_hint = getattr(action, ACTION_SUPPRESS_HINT)
+ except AttributeError:
+ pass
+ else:
+ if suppress_hint:
+ return
+
if action.option_strings:
flags = ', '.join(action.option_strings)
param = ''
diff --git a/examples/subcommands.py b/examples/subcommands.py
index 3dd2c683..55be7711 100755
--- a/examples/subcommands.py
+++ b/examples/subcommands.py
@@ -19,6 +19,10 @@ base_subparsers = base_parser.add_subparsers(title='subcommands', help='subcomma
parser_foo = base_subparsers.add_parser('foo', help='foo help')
parser_foo.add_argument('-x', type=int, default=1, help='integer')
parser_foo.add_argument('y', type=float, help='float')
+input_file = parser_foo.add_argument('input_file', type=str, help='Input File')
+if __name__ == '__main__':
+ from cmd2.argcomplete_bridge import bash_complete
+ bash_complete(input_file)
# create the parser for the "bar" subcommand
parser_bar = base_subparsers.add_parser('bar', help='bar help')