Skip to content

Commit 15a7cfb

Browse files
committed
Account for global options with server side completion
1 parent 4e23b1d commit 15a7cfb

File tree

4 files changed

+69
-7
lines changed

4 files changed

+69
-7
lines changed

awsshell/autocomplete.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def autocomplete(self, line):
6363
return self._current['commands']
6464

6565
last_word = line.split()[-1]
66-
if last_word in self.arg_metadata:
66+
if last_word in self.arg_metadata or last_word in self._global_options:
6767
# The last thing we completed was an argument, record
6868
# this as self.last_arg
6969
self.last_option = last_word

awsshell/resource/index.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def _get_client(self, service_name):
163163
self._client_cache[service_name] = client
164164
return client
165165

166-
def autocomplete(self, service, operation, param):
166+
def retrieve_candidate_values(self, service, operation, param):
167167
if service not in self._services_with_completions:
168168
return
169169
# Example call:

awsshell/shellcomplete.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
"""
1212
import logging
1313
from prompt_toolkit.completion import Completer, Completion
14+
from awsshell import fuzzy
1415

1516

16-
logging.basicConfig(filename='/tmp/completions', level=logging.DEBUG)
1717
LOG = logging.getLogger(__name__)
1818

1919

@@ -93,8 +93,6 @@ def get_completions(self, document, complete_event):
9393
completions = self._completer.autocomplete(text_before_cursor)
9494
prompt_completions = list(self._convert_to_prompt_completions(
9595
completions, text_before_cursor))
96-
LOG.debug("num_completions: %s, text: %s", len(prompt_completions),
97-
text_before_cursor)
9896
if (not prompt_completions and self._completer.last_option and
9997
len(self._completer.cmd_path) == 3):
10098
# If we couldn't complete anything from the JSON model
@@ -114,12 +112,22 @@ def get_completions(self, document, complete_event):
114112
param = self._completer.arg_metadata.get(
115113
self._completer.last_option, {}).get('api_name')
116114
if param is not None:
117-
results = self._server_side_completer.autocomplete(
115+
LOG.debug("Trying to retrieve autcompletion for: "
116+
"%s, %s, %s", service, operation, param)
117+
results = self._server_side_completer.retrieve_candidate_values(
118118
service, operation, param)
119+
LOG.debug("Results for %s, %s, %s: %s",
120+
service, operation, param, results)
121+
word_before_cursor = text_before_cursor.strip().split()[-1]
122+
location = 0
123+
if text_before_cursor[-1] != ' ' and word_before_cursor and results:
124+
# Filter the results down by fuzzy searching what
125+
# the user has provided.
126+
results = fuzzy.fuzzy_search(word_before_cursor, results)
127+
location = -len(word_before_cursor)
119128
if results is not None:
120129
for result in results:
121130
# Insert at the end
122-
location = 0
123131
yield Completion(result, location,
124132
display=result,
125133
display_meta='')

tests/test_completions.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,3 +283,57 @@ def test_cmd_path_updated_on_completions(index_data):
283283
'--tags': {'example': 'bar', 'minidoc': 'baz'},
284284
}
285285

286+
287+
def test_last_option_updated_up_releated_api_params(index_data):
288+
index_data['aws']['commands'] = ['ec2']
289+
index_data['aws']['children'] = {
290+
'ec2': {
291+
'commands': ['create-tags'],
292+
'argument_metadata': {},
293+
'arguments': [],
294+
'children': {
295+
'create-tags': {
296+
'commands': [],
297+
'argument_metadata': {
298+
'--resources': {'example': '', 'minidoc': 'foo'},
299+
'--tags': {'example': 'bar', 'minidoc': 'baz'},
300+
},
301+
'arguments': ['--resources', '--tags'],
302+
'children': {},
303+
}
304+
}
305+
}
306+
}
307+
completer = AWSCLIModelCompleter(index_data)
308+
completer.autocomplete('ec2 create-tags --resources ')
309+
assert completer.last_option == '--resources'
310+
completer.autocomplete('ec2 create-tags --resources f --tags ')
311+
# last_option should be updated.
312+
assert completer.last_option == '--tags'
313+
314+
315+
def test_last_option_is_updated_on_global_options(index_data):
316+
index_data['aws']['arguments'] = ['--no-sign-request']
317+
index_data['aws']['commands'] = ['ec2']
318+
index_data['aws']['children'] = {
319+
'ec2': {
320+
'commands': ['create-tags'],
321+
'argument_metadata': {},
322+
'arguments': [],
323+
'children': {
324+
'create-tags': {
325+
'commands': [],
326+
'argument_metadata': {
327+
'--resources': {'example': '', 'minidoc': 'foo'},
328+
},
329+
'arguments': ['--resources'],
330+
'children': {},
331+
}
332+
}
333+
}
334+
}
335+
completer = AWSCLIModelCompleter(index_data)
336+
completer.autocomplete('ec2 create-tags --resources ')
337+
assert completer.last_option == '--resources'
338+
completer.autocomplete('ec2 create-tags --resources f --no-sign-request ')
339+
assert completer.last_option == '--no-sign-request'

0 commit comments

Comments
 (0)