From 27a12921083b5ea276ddc994869784a6c55ff149 Mon Sep 17 00:00:00 2001 From: lda Date: Sun, 30 Aug 2026 18:34:53 +0700 Subject: [PATCH] feat: define Jupyter transport message boundary --- src/ipython_shell/transport.py | 20 ++++++++++++++++++++ tests/test_transport.py | 21 +++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/ipython_shell/transport.py create mode 100644 tests/test_transport.py diff --git a/src/ipython_shell/transport.py b/src/ipython_shell/transport.py new file mode 100644 index 0000000..f069d95 --- /dev/null +++ b/src/ipython_shell/transport.py @@ -0,0 +1,20 @@ +from dataclasses import dataclass + + +@dataclass +class KernelMessage: + """A decoded Jupyter message kept at the transport boundary.""" + + msg_type: str + parent_id: str | None + content: dict[str, object] + buffers: list[bytes] + + +@dataclass +class InputRequest: + """A request for user input emitted by a running kernel call.""" + + call_id: str + prompt: str + password: bool diff --git a/tests/test_transport.py b/tests/test_transport.py new file mode 100644 index 0000000..8c4b7f7 --- /dev/null +++ b/tests/test_transport.py @@ -0,0 +1,21 @@ +import unittest + +from ipython_shell.transport import KernelMessage + + +class TransportTests(unittest.TestCase): + def test_kernel_message_keeps_content_and_buffers(self): + message = KernelMessage( + msg_type="display_data", + parent_id="call-1", + content={"data": {"text/plain": "42"}}, + buffers=[b"binary"], + ) + + self.assertEqual(message.parent_id, "call-1") + self.assertEqual(message.content["data"], {"text/plain": "42"}) + self.assertEqual(message.buffers, [b"binary"]) + + +if __name__ == "__main__": + unittest.main()