Skip to content

Commit 8f00c1b

Browse files
committed
Supporting 5 and 6 versions of ipykernel
1 parent c801ff5 commit 8f00c1b

File tree

2 files changed

+35
-8
lines changed

2 files changed

+35
-8
lines changed

jupyter_ui_poll/_poll.py

+34-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import asyncio
22
import sys
33
import time
4+
from inspect import iscoroutinefunction
45

56
import zmq
67
from IPython import get_ipython
@@ -18,17 +19,30 @@ def __init__(self, shell, loop) -> None:
1819
self._shell = shell
1920
self._kernel = kernel
2021
self._loop = loop
21-
self._original_parent = (kernel._parent_ident, kernel.get_parent())
22+
self._original_parent = (
23+
kernel._parent_ident,
24+
kernel.get_parent() # ipykernel 6+
25+
if hasattr(kernel, "get_parent")
26+
else kernel._parent_header, # ipykernel < 6
27+
)
2228
self._events = []
2329
self._backup_execute_request = kernel.shell_handlers["execute_request"]
2430
self._aproc = None
31+
self._kernel_is_async = iscoroutinefunction(self._backup_execute_request)
32+
33+
if self._kernel_is_async: # ipykernel 6+
34+
kernel.shell_handlers["execute_request"] = self._execute_request_async
35+
else:
36+
# ipykernel < 6
37+
kernel.shell_handlers["execute_request"] = self._execute_request
2538

2639
shell.events.register("post_run_cell", self._post_run_cell_hook)
27-
kernel.shell_handlers["execute_request"] = self._execute_request_async
2840

2941
def restore(self):
3042
if self._backup_execute_request is not None:
31-
self._kernel.shell_handlers["execute_request"] = self._backup_execute_request
43+
self._kernel.shell_handlers[
44+
"execute_request"
45+
] = self._backup_execute_request
3246
self._backup_execute_request = None
3347

3448
def _reset_output(self):
@@ -48,17 +62,27 @@ async def replay(self):
4862

4963
sys.stdout.flush()
5064
sys.stderr.flush()
65+
shell_stream = getattr(
66+
kernel, "shell_stream", None
67+
) # ipykernel 6 vs 5 differences
68+
5169
for stream, ident, parent in self._events:
5270
kernel.set_parent(ident, parent)
5371
if kernel._aborting:
5472
kernel._send_abort_reply(stream, parent, ident)
5573
else:
56-
await kernel.execute_request(stream, ident, parent)
74+
rr = kernel.execute_request(stream, ident, parent)
75+
if self._kernel_is_async:
76+
await rr
77+
5778
# replicate shell_dispatch behaviour
5879
sys.stdout.flush()
5980
sys.stderr.flush()
60-
kernel._publish_status('idle', 'shell')
61-
kernel.shell_stream.flush(zmq.POLLOUT)
81+
if shell_stream is not None: # 6+
82+
kernel._publish_status("idle", "shell")
83+
shell_stream.flush(zmq.POLLOUT)
84+
else:
85+
kernel._publish_status("idle")
6286

6387
async def do_one_iteration(self):
6488
try:
@@ -100,7 +124,9 @@ def wrap_iterator(self, its, n: int = 1):
100124
@staticmethod
101125
def get():
102126
if KernelWrapper._current is None:
103-
KernelWrapper._current = KernelWrapper(get_ipython(), asyncio.get_event_loop())
127+
KernelWrapper._current = KernelWrapper(
128+
get_ipython(), asyncio.get_event_loop()
129+
)
104130
return KernelWrapper._current
105131

106132

@@ -130,6 +156,7 @@ async def _loop(kernel, its, n):
130156
for x in its:
131157
await poll(n)
132158
yield x
159+
133160
return _loop(self._kernel, self._its, self._n)
134161

135162

setup.cfg

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ test_suite = tests
3030
setup_requires =
3131
setuptools
3232
install_requires =
33-
ipykernel>=6.0.0,<7
33+
ipython
3434
tornado
3535
pyzmq
3636
test_requires =

0 commit comments

Comments
 (0)