Skip to content

Commit 58f3edf

Browse files
Allow global completion in brackets
Make DictKeyCompletion return None when no matches found so other completers can take over. Perhaps ideal would be comulative, but this seems like good behavior -- it's clear to the user in most cases that what's now being completed are keys, then other completion.
1 parent 4d9767b commit 58f3edf

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

bpython/autocomplete.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -387,12 +387,13 @@ def matches(self, cursor_offset, line, **kwargs):
387387
try:
388388
obj = safe_eval(dexpr, locals_)
389389
except EvaluationError:
390-
return set()
390+
return None
391391
if isinstance(obj, dict) and obj.keys():
392-
return set("{0!r}]".format(k) for k in obj.keys()
393-
if repr(k).startswith(r.word))
392+
matches = set("{0!r}]".format(k) for k in obj.keys()
393+
if repr(k).startswith(r.word))
394+
return matches if matches else None
394395
else:
395-
return set()
396+
return None
396397

397398
def locate(self, current_offset, line):
398399
return lineparts.current_dict_key(current_offset, line)

bpython/test/test_autocomplete.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,20 +190,25 @@ def test_set_of_keys_returned_when_matches_found(self):
190190
self.assertSetEqual(com.matches(2, "d[", locals_=local),
191191
set(["'ab']", "'cd']"]))
192192

193-
def test_empty_set_returned_when_eval_error(self):
193+
def test_none_returned_when_eval_error(self):
194194
com = autocomplete.DictKeyCompletion()
195195
local = {'e': {"ab": 1, "cd": 2}}
196-
self.assertSetEqual(com.matches(2, "d[", locals_=local), set())
196+
self.assertEqual(com.matches(2, "d[", locals_=local), None)
197197

198-
def test_empty_set_returned_when_not_dict_type(self):
198+
def test_none_returned_when_not_dict_type(self):
199199
com = autocomplete.DictKeyCompletion()
200200
local = {'l': ["ab", "cd"]}
201-
self.assertSetEqual(com.matches(2, "l[", locals_=local), set())
201+
self.assertEqual(com.matches(2, "l[", locals_=local), None)
202+
203+
def test_none_returned_when_no_matches_left(self):
204+
com = autocomplete.DictKeyCompletion()
205+
local = {'d': {"ab": 1, "cd": 2}}
206+
self.assertEqual(com.matches(3, "d[r", locals_=local), None)
202207

203208
def test_obj_that_does_not_allow_conversion_to_bool(self):
204209
com = autocomplete.DictKeyCompletion()
205210
local = {'mNumPy': MockNumPy()}
206-
self.assertSetEqual(com.matches(7, "mNumPy[", locals_=local), set())
211+
self.assertEqual(com.matches(7, "mNumPy[", locals_=local), None)
207212

208213

209214
class Foo(object):

0 commit comments

Comments
 (0)