Skip to content

Commit 889df33

Browse files
committed
Handle async do_complete.
A number of methods of ipykernel can optinally return `awaitable[T]` instead of just `T`, this is the case for `do_complete`. I think it's a mistake ; see ipython/ipykernel#1295 ; in particular because it's easy to forget / hard to properly type-check, and I'd like to make it mandatory in the long term to have await. Spyder seem to not handle the case where do_completer return an awaitable (or more partiularly is `do_complete` is a coroutine function. This tries to handle it – and as of course `do_completer` _can_ be async, all caller _must_ be async. So I try to do all the required updates. Note: I also add explict imports in some test, to get better error message in case those deps are not installed.
1 parent 6725970 commit 889df33

File tree

3 files changed

+14
-8
lines changed

3 files changed

+14
-8
lines changed

Diff for: spyder_kernels/console/tests/test_console_kernel.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -875,13 +875,15 @@ def test_matplotlib_inline(kernel):
875875
assert 'inline' in value
876876

877877

878-
def test_do_complete(kernel):
878+
async def test_do_complete(kernel):
879879
"""
880880
Check do complete works in normal and debugging mode.
881881
"""
882882
asyncio.run(kernel.do_execute('abba = 1', True))
883883
assert kernel.get_value('abba') == 1
884884
match = kernel.do_complete('ab', 2)
885+
if isawaitable(match):
886+
match = await match
885887
assert 'abba' in match['matches']
886888

887889
# test pdb
@@ -890,6 +892,8 @@ def test_do_complete(kernel):
890892
pdb_obj.completenames = lambda *ignore: ['baba']
891893
kernel.shell._namespace_stack = [pdb_obj]
892894
match = kernel.do_complete('ba', 2)
895+
if isawaitable(match):
896+
match = await match
893897
assert 'baba' in match['matches']
894898
pdb_obj.curframe = None
895899

@@ -1390,6 +1394,7 @@ def test_django_settings(kernel):
13901394
13911395
This is a regression test for issue spyder-ide/spyder#19516
13921396
"""
1397+
import django
13931398
asyncio.run(kernel.do_execute('from django.conf import settings', True))
13941399
nsview = repr(kernel.get_namespace_view())
13951400
assert "'settings':" in nsview

Diff for: spyder_kernels/customize/spyderpdb.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -351,16 +351,16 @@ def do_where(self, arg):
351351
do_bt = do_where
352352

353353
# --- Method defined by us to respond to ipython complete protocol
354-
def do_complete(self, code, cursor_pos):
354+
async def do_complete(self, code, cursor_pos):
355355
"""
356356
Respond to a complete request.
357357
"""
358358
if self.pdb_use_exclamation_mark:
359-
return self._complete_exclamation(code, cursor_pos)
359+
return await self._complete_exclamation(code, cursor_pos)
360360
else:
361-
return self._complete_default(code, cursor_pos)
361+
return await self._complete_default(code, cursor_pos)
362362

363-
def _complete_default(self, code, cursor_pos):
363+
async def _complete_default(self, code, cursor_pos):
364364
"""
365365
Respond to a complete request if not pdb_use_exclamation_mark.
366366
"""
@@ -422,7 +422,7 @@ def is_name_or_composed(text):
422422
else:
423423
frame = self.curframe
424424
self.shell.set_completer_frame(frame)
425-
result = self.shell.kernel._do_complete(code, cursor_pos)
425+
result = await self.shell.kernel._do_complete(code, cursor_pos)
426426
# Reset frame
427427
self.shell.set_completer_frame()
428428
# If there is no Pdb results to merge, return the result
@@ -450,7 +450,7 @@ def is_name_or_composed(text):
450450
'metadata': {},
451451
'status': 'ok'}
452452

453-
def _complete_exclamation(self, code, cursor_pos):
453+
async def _complete_exclamation(self, code, cursor_pos):
454454
"""
455455
Respond to a complete request if pdb_use_exclamation_mark.
456456
"""
@@ -529,7 +529,7 @@ def is_name_or_composed(text):
529529
else:
530530
frame = self.curframe
531531
self.shell.set_completer_frame(frame)
532-
result = self.shell.kernel._do_complete(code, cursor_pos)
532+
result = await self.shell.kernel._do_complete(code, cursor_pos)
533533
# Reset frame
534534
self.shell.set_completer_frame()
535535
return result

Diff for: spyder_kernels/utils/tests/test_iofuncs.py

+1
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,7 @@ def test_spydata_export(input_namespace, expected_namespace,
342342

343343
def test_save_load_hdf5_files(tmp_path):
344344
"""Simple test to check that we can save and load HDF5 files."""
345+
import h5py
345346
h5_file = tmp_path / "test.h5"
346347
data = {'a' : [1, 2, 3, 4], 'b' : 4.5}
347348
iofuncs.save_hdf5(data, h5_file)

0 commit comments

Comments
 (0)