Skip to content

Commit 5d64ebe

Browse files
authored
Merge pull request #411 from python-cmd2/autocompleter
Fixes problem with not passing the parameter hint suppression down to…
2 parents c2594ff + 3d95362 commit 5d64ebe

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

cmd2/argcomplete_bridge.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
except AttributeError:
1717
DEFAULT_COMPLETER = argcomplete.completers.FilesCompleter()
1818

19+
from cmd2.argparse_completer import ACTION_ARG_CHOICES, ACTION_SUPPRESS_HINT
1920
from contextlib import redirect_stdout
2021
import copy
2122
from io import StringIO
@@ -245,11 +246,22 @@ def __call__(self, argument_parser, completer=None, always_complete_options=True
245246
if comp_type == 63: # type is 63 for second tab press
246247
print(outstr.rstrip(), file=argcomplete.debug_stream, end='')
247248

248-
output_stream.write(ifs.join([ifs, ' ']).encode(argcomplete.sys_encoding))
249+
if completions is not None:
250+
output_stream.write(ifs.join([ifs, ' ']).encode(argcomplete.sys_encoding))
251+
else:
252+
output_stream.write(ifs.join([]).encode(argcomplete.sys_encoding))
249253
else:
250254
# if completions is None we assume we don't know how to handle it so let bash
251255
# go forward with normal filesystem completion
252256
output_stream.write(ifs.join([]).encode(argcomplete.sys_encoding))
253257
output_stream.flush()
254258
argcomplete.debug_stream.flush()
255259
exit_method(0)
260+
261+
262+
def bash_complete(action, show_hint: bool=True):
263+
"""Helper function to configure an argparse action to fall back to bash completion"""
264+
def complete_none(*args, **kwargs):
265+
return None
266+
setattr(action, ACTION_SUPPRESS_HINT, not show_hint)
267+
setattr(action, ACTION_ARG_CHOICES, (complete_none,))

cmd2/argparse_completer.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ def my_completer(text: str, line: str, begidx: int, endidx:int, extra_param: str
7575
# attribute that can optionally added to an argparse argument (called an Action) to
7676
# define the completion choices for the argument. You may provide a Collection or a Function.
7777
ACTION_ARG_CHOICES = 'arg_choices'
78+
ACTION_SUPPRESS_HINT = 'suppress_hint'
7879

7980

8081
class _RangeAction(object):
@@ -261,6 +262,7 @@ def __init__(self,
261262
sub_completers[subcmd] = AutoCompleter(action.choices[subcmd], subcmd_start,
262263
arg_choices=subcmd_args,
263264
subcmd_args_lookup=subcmd_lookup,
265+
tab_for_arg_help=tab_for_arg_help,
264266
cmd2_app=cmd2_app)
265267
sub_commands.append(subcmd)
266268
self._positional_completers[action.dest] = sub_completers
@@ -555,8 +557,19 @@ def _resolve_choices_for_arg(self, action: argparse.Action, used_values=()) -> L
555557
return []
556558

557559
def _print_action_help(self, action: argparse.Action) -> None:
560+
# is parameter hinting disabled globally?
558561
if not self._tab_for_arg_help:
559562
return
563+
564+
# is parameter hinting disabled for this parameter?
565+
try:
566+
suppress_hint = getattr(action, ACTION_SUPPRESS_HINT)
567+
except AttributeError:
568+
pass
569+
else:
570+
if suppress_hint:
571+
return
572+
560573
if action.option_strings:
561574
flags = ', '.join(action.option_strings)
562575
param = ''

examples/subcommands.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
parser_foo = base_subparsers.add_parser('foo', help='foo help')
2020
parser_foo.add_argument('-x', type=int, default=1, help='integer')
2121
parser_foo.add_argument('y', type=float, help='float')
22+
input_file = parser_foo.add_argument('input_file', type=str, help='Input File')
23+
if __name__ == '__main__':
24+
from cmd2.argcomplete_bridge import bash_complete
25+
bash_complete(input_file)
2226

2327
# create the parser for the "bar" subcommand
2428
parser_bar = base_subparsers.add_parser('bar', help='bar help')

0 commit comments

Comments
 (0)