feat: support Jupyter kernel transport input

This commit is contained in:
lda
2026-08-30 18:44:26 +07:00 Verified
parent 01c06218fb
commit 85d8945313
2 changed files with 86 additions and 4 deletions
+56 -1
View File
@@ -1,6 +1,7 @@
import asyncio
import unittest
from ipython_shell.transport import JupyterTransport, KernelMessage
from ipython_shell.transport import InputRequest, JupyterTransport, KernelMessage
class TransportTests(unittest.TestCase):
@@ -35,6 +36,60 @@ class AsyncTransportTests(unittest.IsolatedAsyncioTestCase):
self.assertEqual(messages[-1].msg_type, "execute_reply")
self.assertEqual(messages[-1].content["status"], "ok")
async def test_transport_preserves_mime_and_errors(self):
transport = JupyterTransport()
await transport.start()
try:
display_id = await transport.execute(
"from IPython.display import display\n"
"display({'text/plain': 'hello'}, raw=True)"
)
display_messages = [
message async for message in transport.messages_for(display_id)
]
error_id = await transport.execute("raise ValueError('boom')")
error_messages = [
message async for message in transport.messages_for(error_id)
]
finally:
await transport.shutdown()
display = next(
message
for message in display_messages
if message.msg_type == "display_data"
)
self.assertEqual(display.content["data"]["text/plain"], "hello")
error = next(
message for message in error_messages if message.msg_type == "error"
)
self.assertEqual(error.content["ename"], "ValueError")
async def test_transport_routes_input_reply_without_parent_stdin(self):
transport = JupyterTransport()
await transport.start()
try:
call_id = await transport.execute("answer = input('name? '); answer")
stream = transport.messages_for(call_id)
while True:
event = await asyncio.wait_for(anext(stream), timeout=5)
if isinstance(event, InputRequest):
input_request = event
break
self.assertEqual(input_request.prompt, "name? ")
await transport.reply_to_input("Ada")
messages = [message async for message in stream]
finally:
await transport.shutdown()
self.assertTrue(
any(message.msg_type == "execute_result" for message in messages)
)
if __name__ == "__main__":
unittest.main()