Skip to content

Commit 34c7e65

Browse files
committed
Bug fixes due to API differences in older versions of argcomplete
NOTES: - I didn't implement this correctly because I don't know how to programmatically determine the version of argcomplete; instead I based it on the version of Python - We should make sure this works correctly even if no version of argcomplete is installed
1 parent b75a2ee commit 34c7e65

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

cmd2/argcomplete_bridge.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,16 @@
66
import argcomplete
77
except ImportError: # pragma: no cover
88
# not installed, skip the rest of the file
9-
pass
10-
9+
DEFAULT_COMPLETER = None
1110
else:
1211
# argcomplete is installed
1312

13+
# Newer versions of argcomplete have FilesCompleter at top level, older versions only have it under completers
14+
try:
15+
DEFAULT_COMPLETER = argcomplete.FilesCompleter()
16+
except AttributeError:
17+
DEFAULT_COMPLETER = argcomplete.completers.FilesCompleter()
18+
1419
from contextlib import redirect_stdout
1520
import copy
1621
from io import StringIO
@@ -102,7 +107,7 @@ class CompletionFinder(argcomplete.CompletionFinder):
102107

103108
def __call__(self, argument_parser, completer=None, always_complete_options=True, exit_method=os._exit, output_stream=None,
104109
exclude=None, validator=None, print_suppressed=False, append_space=None,
105-
default_completer=argcomplete.FilesCompleter()):
110+
default_completer=DEFAULT_COMPLETER):
106111
"""
107112
:param argument_parser: The argument parser to autocomplete on
108113
:type argument_parser: :class:`argparse.ArgumentParser`
@@ -140,9 +145,14 @@ def __call__(self, argument_parser, completer=None, always_complete_options=True
140145
added to argcomplete.safe_actions, if their values are wanted in the ``parsed_args`` completer argument, or
141146
their execution is otherwise desirable.
142147
"""
143-
self.__init__(argument_parser, always_complete_options=always_complete_options, exclude=exclude,
144-
validator=validator, print_suppressed=print_suppressed, append_space=append_space,
145-
default_completer=default_completer)
148+
# Older versions of argcomplete have fewer keyword arguments
149+
if sys.version_info >= (3, 5):
150+
self.__init__(argument_parser, always_complete_options=always_complete_options, exclude=exclude,
151+
validator=validator, print_suppressed=print_suppressed, append_space=append_space,
152+
default_completer=default_completer)
153+
else:
154+
self.__init__(argument_parser, always_complete_options=always_complete_options, exclude=exclude,
155+
validator=validator, print_suppressed=print_suppressed)
146156

147157
if "_ARGCOMPLETE" not in os.environ:
148158
# not an argument completion invocation

0 commit comments

Comments
 (0)