This commit is contained in:
lda
2026-08-31 19:49:17 +07:00 Verified
parent c2c41ea9ce
commit d9ef330beb
9 changed files with 27 additions and 28 deletions
+2 -2
View File
@@ -7,8 +7,8 @@ from .events import (
event_from_history_output, event_from_history_output,
) )
from .jupyter.app import JupyterApp from .jupyter.app import JupyterApp
from .jupyter.shell import JupyterShell
from .jupyter.messages import JupyterMessage, KernelMessage, ParsedJupyterMessage from .jupyter.messages import JupyterMessage, KernelMessage, ParsedJupyterMessage
from .jupyter.shell import JupyterShell
from .jupyter.transport import InputRequest, JupyterTransport from .jupyter.transport import InputRequest, JupyterTransport
from .models import ( from .models import (
AppInfo, AppInfo,
@@ -46,9 +46,9 @@ __all__ = [
"InputRequest", "InputRequest",
"JSONValue", "JSONValue",
"JupyterApp", "JupyterApp",
"JupyterMessage",
"JupyterShell", "JupyterShell",
"JupyterTransport", "JupyterTransport",
"JupyterMessage",
"KernelMessage", "KernelMessage",
"ParsedJupyterMessage", "ParsedJupyterMessage",
"Shell", "Shell",
+2 -2
View File
@@ -18,17 +18,17 @@ from .shell import JupyterShell
from .transport import InputRequest, JupyterTransport from .transport import InputRequest, JupyterTransport
__all__ = [ __all__ = [
"InputRequest",
"DisplayDataMessage", "DisplayDataMessage",
"ErrorMessage", "ErrorMessage",
"ExecuteReplyMessage", "ExecuteReplyMessage",
"ExecuteResultMessage", "ExecuteResultMessage",
"InputRequest",
"InputRequestMessage", "InputRequestMessage",
"JupyterApp", "JupyterApp",
"JupyterMessage", "JupyterMessage",
"KernelMessage",
"JupyterShell", "JupyterShell",
"JupyterTransport", "JupyterTransport",
"KernelMessage",
"KnownJupyterMessage", "KnownJupyterMessage",
"ParsedJupyterMessage", "ParsedJupyterMessage",
"StatusMessage", "StatusMessage",
+10 -11
View File
@@ -2,20 +2,19 @@ from typing import Annotated, ClassVar, Final, Literal
from pydantic import BaseModel, ConfigDict, Field, TypeAdapter, ValidationError from pydantic import BaseModel, ConfigDict, Field, TypeAdapter, ValidationError
type JupyterChannel = Literal["iopub", "shell", "stdin"] type JupyterChannel = Literal["iopub", "shell", "stdin"]
type MessageStatus = Literal["ok", "error", "abort"] type MessageStatus = Literal["ok", "error", "abort"]
STREAM: Final[Literal["stream"]] = "stream" STREAM: Final = "stream"
DISPLAY_DATA: Final[Literal["display_data"]] = "display_data" DISPLAY_DATA: Final = "display_data"
UPDATE_DISPLAY_DATA: Final[Literal["update_display_data"]] = "update_display_data" UPDATE_DISPLAY_DATA: Final = "update_display_data"
EXECUTE_RESULT: Final[Literal["execute_result"]] = "execute_result" EXECUTE_RESULT: Final = "execute_result"
ERROR: Final[Literal["error"]] = "error" ERROR: Final = "error"
STATUS: Final[Literal["status"]] = "status" STATUS: Final = "status"
EXECUTE_INPUT: Final[Literal["execute_input"]] = "execute_input" EXECUTE_INPUT: Final = "execute_input"
CLEAR_OUTPUT: Final[Literal["clear_output"]] = "clear_output" CLEAR_OUTPUT: Final = "clear_output"
EXECUTE_REPLY: Final[Literal["execute_reply"]] = "execute_reply" EXECUTE_REPLY: Final = "execute_reply"
INPUT_REQUEST: Final[Literal["input_request"]] = "input_request" INPUT_REQUEST: Final = "input_request"
class MimeContent(BaseModel): class MimeContent(BaseModel):
+6 -4
View File
@@ -11,8 +11,6 @@ from .messages import (
ExecuteReplyMessage, ExecuteReplyMessage,
InputRequestMessage, InputRequestMessage,
JupyterChannel, JupyterChannel,
JupyterMessage,
KernelMessage,
ParsedJupyterMessage, ParsedJupyterMessage,
StatusMessage, StatusMessage,
parse_jupyter_message, parse_jupyter_message,
@@ -116,7 +114,9 @@ class JupyterTransport:
async def execute(self, code: str) -> str: async def execute(self, code: str) -> str:
"""Submit one cell and return its Jupyter message ID.""" """Submit one cell and return its Jupyter message ID."""
if self._reader_failure is not None: if self._reader_failure is not None:
raise RuntimeError("JupyterTransport channel reader failed") from self._reader_failure raise RuntimeError(
"JupyterTransport channel reader failed"
) from self._reader_failure
if self.client is None: if self.client is None:
raise RuntimeError("JupyterTransport has not been started") raise RuntimeError("JupyterTransport has not been started")
@@ -131,7 +131,9 @@ class JupyterTransport:
) -> AsyncIterator[ParsedJupyterMessage | InputRequest]: ) -> AsyncIterator[ParsedJupyterMessage | InputRequest]:
"""Yield decoded output, input, and completion messages for one call.""" """Yield decoded output, input, and completion messages for one call."""
if self._reader_failure is not None: if self._reader_failure is not None:
raise RuntimeError("JupyterTransport channel reader failed") from self._reader_failure raise RuntimeError(
"JupyterTransport channel reader failed"
) from self._reader_failure
if self.client is None: if self.client is None:
raise RuntimeError("JupyterTransport has not been started") raise RuntimeError("JupyterTransport has not been started")
if self._active_call != call_id: if self._active_call != call_id:
+3 -2
View File
@@ -10,7 +10,6 @@ from pathlib import Path
from uuid import uuid4 from uuid import uuid4
from ipython_shell.jupyter import InputRequest, JupyterApp, ParsedJupyterMessage from ipython_shell.jupyter import InputRequest, JupyterApp, ParsedJupyterMessage
from st_demo.ui import event_to_record, latex_body, preferred_mime from st_demo.ui import event_to_record, latex_body, preferred_mime
@@ -28,7 +27,9 @@ class _CallFailed:
@dataclass @dataclass
class _BackgroundCall: class _BackgroundCall:
events: queue.Queue[ParsedJupyterMessage | InputRequest | _CallFinished | _CallFailed] events: queue.Queue[
ParsedJupyterMessage | InputRequest | _CallFinished | _CallFailed
]
task: Future[None] | None = None task: Future[None] | None = None
-1
View File
@@ -13,7 +13,6 @@ from ipython_shell.jupyter.messages import (
) )
from ipython_shell.jupyter.transport import InputRequest from ipython_shell.jupyter.transport import InputRequest
MIME_PRIORITY: Final[tuple[str, ...]] = ( MIME_PRIORITY: Final[tuple[str, ...]] = (
"text/html", "text/html",
"image/svg+xml", "image/svg+xml",
+1 -1
View File
@@ -2,10 +2,10 @@ import unittest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from ipython_agent.ipython_wrapper import get_app_info
from ipython_mcp.app import app as mcp_app from ipython_mcp.app import app as mcp_app
from ipython_shell import App, AppInfo from ipython_shell import App, AppInfo
from ipython_webapp.app import app as web_app from ipython_webapp.app import app as web_app
from ipython_agent.ipython_wrapper import get_app_info
class AppInfoTests(unittest.IsolatedAsyncioTestCase): class AppInfoTests(unittest.IsolatedAsyncioTestCase):
+1 -1
View File
@@ -3,8 +3,8 @@ import re
import unittest import unittest
from ipython_shell.jupyter.app import JupyterApp from ipython_shell.jupyter.app import JupyterApp
from ipython_shell.jupyter.shell import JupyterShell
from ipython_shell.jupyter.messages import ExecuteResultMessage from ipython_shell.jupyter.messages import ExecuteResultMessage
from ipython_shell.jupyter.shell import JupyterShell
from ipython_shell.jupyter.transport import InputRequest from ipython_shell.jupyter.transport import InputRequest
+2 -4
View File
@@ -211,12 +211,10 @@ class AsyncTransportTests(unittest.IsolatedAsyncioTestCase):
await transport.start() await transport.start()
try: try:
call_id = await transport.execute( call_id = await transport.execute(
"import matplotlib.pyplot as plt\n" "import matplotlib.pyplot as plt\nplt.plot([1, 2, 3], [4, 5, 6])"
"plt.plot([1, 2, 3], [4, 5, 6])"
) )
messages = [ messages = [
message message async for message in transport.messages_for(call_id)
async for message in transport.messages_for(call_id)
] ]
finally: finally:
await transport.shutdown() await transport.shutdown()