Skip to content

Commit 37dd9fe

Browse files
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
1 parent 2100b20 commit 37dd9fe

File tree

6 files changed

+110
-84
lines changed

6 files changed

+110
-84
lines changed

jupyter_server/gateway/v3/managers.py

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
"""Gateway kernel manager that integrates with our kernel monitoring system."""
22

33
import asyncio
4-
from jupyter_server.gateway.managers import GatewayMappingKernelManager
5-
from jupyter_server.gateway.managers import GatewayKernelManager as _GatewayKernelManager
6-
from jupyter_server.gateway.managers import GatewayKernelClient as _GatewayKernelClient
7-
from traitlets import default, Instance, Type
84

5+
from traitlets import Instance, Type, default
6+
7+
from jupyter_server.gateway.managers import GatewayKernelClient as _GatewayKernelClient
8+
from jupyter_server.gateway.managers import GatewayKernelManager as _GatewayKernelManager
9+
from jupyter_server.gateway.managers import GatewayMappingKernelManager
910
from jupyter_server.services.kernels.v3.client import JupyterServerKernelClientMixin
1011

1112

@@ -38,22 +39,22 @@ def _send_message(self, channel_name: str, msg: list[bytes]):
3839
# Send to gateway channel
3940
try:
4041
channel = getattr(self, f"{channel_name}_channel", None)
41-
if channel and hasattr(channel, 'send'):
42+
if channel and hasattr(channel, "send"):
4243
# Convert raw message to gateway format
4344
header = self.session.unpack(msg[0])
4445
parent_header = self.session.unpack(msg[1])
4546
metadata = self.session.unpack(msg[2])
4647
content = self.session.unpack(msg[3])
4748

4849
full_msg = {
49-
'header': header,
50-
'parent_header': parent_header,
51-
'metadata': metadata,
52-
'content': content,
53-
'buffers': msg[4:] if len(msg) > 4 else [],
54-
'channel': channel_name,
55-
'msg_id': header.get('msg_id'),
56-
'msg_type': header.get('msg_type')
50+
"header": header,
51+
"parent_header": parent_header,
52+
"metadata": metadata,
53+
"content": content,
54+
"buffers": msg[4:] if len(msg) > 4 else [],
55+
"channel": channel_name,
56+
"msg_id": header.get("msg_id"),
57+
"msg_type": header.get("msg_type"),
5758
}
5859

5960
channel.send(full_msg)
@@ -74,7 +75,7 @@ async def _monitor_channel_messages(self, channel_name: str, channel):
7475
channel_name,
7576
message,
7677
parent_msg_id=message.get("parent_header", {}).get("msg_id"),
77-
execution_state=message.get("content", {}).get("execution_state")
78+
execution_state=message.get("content", {}).get("execution_state"),
7879
)
7980

8081
# Serialize message to standard format for listeners
@@ -83,10 +84,14 @@ async def _monitor_channel_messages(self, channel_name: str, channel):
8384
serialized = self.session.serialize(message)
8485

8586
# Skip delimiter (index 0) and signature (index 1) to get [header, parent_header, metadata, content, ...]
86-
if serialized and len(serialized) >= 6: # Need delimiter + signature + 4 message parts
87+
if (
88+
serialized and len(serialized) >= 6
89+
): # Need delimiter + signature + 4 message parts
8790
msg_list = serialized[2:]
8891
else:
89-
self.log.warning(f"Gateway message too short: {len(serialized) if serialized else 0} parts")
92+
self.log.warning(
93+
f"Gateway message too short: {len(serialized) if serialized else 0} parts"
94+
)
9095
continue
9196

9297
# Route to listeners
@@ -124,14 +129,15 @@ class GatewayKernelManager(_GatewayKernelManager):
124129
When jupyter_server is configured to use a gateway, this manager ensures that
125130
remote kernels receive the same level of monitoring as local kernels.
126131
"""
132+
127133
# Configure the manager to use our enhanced gateway client
128134
client_class = GatewayKernelClient
129135
client_factory = GatewayKernelClient
130136

131137
kernel_client = Instance(
132-
'jupyter_client.client.KernelClient',
138+
"jupyter_client.client.KernelClient",
133139
allow_none=True,
134-
help="""Pre-created kernel client instance. Created on initialization."""
140+
help="""Pre-created kernel client instance. Created on initialization.""",
135141
)
136142

137143
def __init__(self, **kwargs):
@@ -184,7 +190,9 @@ async def cleanup_resources(self, restart=False):
184190
if restart:
185191
# On restart, clear client state but keep connection
186192
# The connection will be refreshed in post_start_kernel after restart
187-
self.log.debug(f"Clearing kernel client state for restart of kernel {self.kernel_id}")
193+
self.log.debug(
194+
f"Clearing kernel client state for restart of kernel {self.kernel_id}"
195+
)
188196
self.kernel_client.last_shell_status_time = None
189197
self.kernel_client.last_control_status_time = None
190198
# Disconnect before restart - will reconnect after
@@ -208,7 +216,6 @@ def _default_kernel_manager_class(self):
208216

209217
def start_watching_activity(self, kernel_id):
210218
pass
211-
219+
212220
def stop_buffering(self, kernel_id):
213221
pass
214-

jupyter_server/serverapp.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,11 +1652,15 @@ def template_file_path(self) -> list[str]:
16521652
@default("kernel_manager_class")
16531653
def _default_kernel_manager_class(self) -> t.Union[str, type[AsyncMappingKernelManager]]:
16541654
if self.kernels_api_version == 3:
1655-
gateway_enabled = getattr(self, 'gateway_config', None) and getattr(self.gateway_config, 'gateway_enabled', False)
1655+
gateway_enabled = getattr(self, "gateway_config", None) and getattr(
1656+
self.gateway_config, "gateway_enabled", False
1657+
)
16561658
if gateway_enabled:
16571659
return "jupyter_server.gateway.v3.managers.GatewayMultiKernelManager"
16581660
return "jupyter_server.services.kernels.v3.kernelmanager.AsyncMappingKernelManager"
1659-
gateway_enabled = getattr(self, 'gateway_config', None) and getattr(self.gateway_config, 'gateway_enabled', False)
1661+
gateway_enabled = getattr(self, "gateway_config", None) and getattr(
1662+
self.gateway_config, "gateway_enabled", False
1663+
)
16601664
if gateway_enabled:
16611665
return "jupyter_server.gateway.managers.GatewayMappingKernelManager"
16621666
return AsyncMappingKernelManager
@@ -1685,7 +1689,9 @@ def _default_kernel_websocket_connection_class(
16851689
if self.kernels_api_version == 3:
16861690
# V3 uses shared kernel client connection for both local and gateway
16871691
return "jupyter_server.services.kernels.v3.connection.client_connection.KernelClientWebsocketConnection"
1688-
gateway_enabled = getattr(self, 'gateway_config', None) and getattr(self.gateway_config, 'gateway_enabled', False)
1692+
gateway_enabled = getattr(self, "gateway_config", None) and getattr(
1693+
self.gateway_config, "gateway_enabled", False
1694+
)
16891695
if gateway_enabled:
16901696
return "jupyter_server.gateway.connections.GatewayWebSocketConnection"
16911697
return ZMQChannelsWebsocketConnection

jupyter_server/services/kernels/v3/connection/client_connection.py

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
from jupyter_client.session import Session
12
from tornado.websocket import WebSocketClosedError
2-
from traitlets import List as TraitletsList, Tuple as TraitletsTuple
3+
from traitlets import List as TraitletsList
4+
from traitlets import Tuple as TraitletsTuple
5+
36
from jupyter_server.services.kernels.connection.base import (
47
BaseKernelWebsocketConnection,
8+
deserialize_msg_from_ws_v1,
9+
serialize_msg_to_ws_v1,
510
)
6-
from jupyter_server.services.kernels.connection.base import deserialize_msg_from_ws_v1, serialize_msg_to_ws_v1
7-
from jupyter_client.session import Session
11+
812
from ..message_utils import encode_cell_id_in_message, strip_encoding_from_message
913

1014

@@ -54,7 +58,7 @@ class KernelClientWebsocketConnection(BaseKernelWebsocketConnection):
5458
these (msg_type, channel) pairs will be sent to the websocket.
5559
5660
Example: [("status", "iopub"), ("execute_reply", "shell")]
57-
"""
61+
""",
5862
)
5963

6064
exclude_msg_types = TraitletsList(
@@ -71,7 +75,7 @@ class KernelClientWebsocketConnection(BaseKernelWebsocketConnection):
7175
7276
Note: Cannot be used together with msg_types. If both are specified,
7377
msg_types takes precedence.
74-
"""
78+
""",
7579
)
7680

7781
def _get_kernel_client(self):
@@ -90,7 +94,7 @@ def _get_kernel_client(self):
9094
raise RuntimeError(f"No kernel manager found for kernel {self.kernel_id}")
9195

9296
# Get the pre-created kernel client from the kernel manager
93-
if not hasattr(km, 'kernel_client') or km.kernel_client is None:
97+
if not hasattr(km, "kernel_client") or km.kernel_client is None:
9498
raise RuntimeError(f"Kernel manager for {self.kernel_id} has no kernel_client")
9599

96100
return km.kernel_client
@@ -115,8 +119,12 @@ async def connect(self):
115119
client.add_listener(self.handle_outgoing_message, msg_types=msg_types_list)
116120
elif self.exclude_msg_types is not None:
117121
# Convert list of tuples to list for the API
118-
exclude_msg_types_list = [tuple(item) for item in self.exclude_msg_types] if self.exclude_msg_types else None
119-
client.add_listener(self.handle_outgoing_message, exclude_msg_types=exclude_msg_types_list)
122+
exclude_msg_types_list = (
123+
[tuple(item) for item in self.exclude_msg_types] if self.exclude_msg_types else None
124+
)
125+
client.add_listener(
126+
self.handle_outgoing_message, exclude_msg_types=exclude_msg_types_list
127+
)
120128
else:
121129
# No filtering - listen to all messages (default)
122130
client.add_listener(self.handle_outgoing_message)
@@ -170,7 +178,9 @@ def handle_outgoing_message(self, channel_name, msg):
170178
try:
171179
# Validate message has minimum required parts
172180
if not msg or len(msg) < 4:
173-
self.log.warning(f"Message on {channel_name} has insufficient parts: {len(msg) if msg else 0}")
181+
self.log.warning(
182+
f"Message on {channel_name} has insufficient parts: {len(msg) if msg else 0}"
183+
)
174184
return
175185

176186
# Validate parts are bytes
@@ -192,4 +202,6 @@ def handle_outgoing_message(self, channel_name, msg):
192202
except WebSocketClosedError:
193203
self.log.warning("A Kernel Socket message arrived on a closed websocket channel.")
194204
except Exception as err:
195-
self.log.error(f"Error handling outgoing message on {channel_name}: {err}", exc_info=True)
205+
self.log.error(
206+
f"Error handling outgoing message on {channel_name}: {err}", exc_info=True
207+
)

jupyter_server/services/kernels/v3/kernelmanager.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
"""Kernel manager for the Apple JupyterLab Kernel Monitor Extension."""
22

33
from jupyter_client.multikernelmanager import AsyncMultiKernelManager
4-
from traitlets import Type, observe, Instance, default
4+
from traitlets import Instance, Type, default, observe
55

66
from jupyter_server.services.kernels.kernelmanager import (
77
MappingKernelManager,
8+
)
9+
from jupyter_server.services.kernels.kernelmanager import (
810
ServerKernelManager as _ServerKernelManager,
911
)
1012

@@ -24,22 +26,22 @@ class ServerKernelManager(_ServerKernelManager):
2426

2527
client_class = Type(
2628
default_value=JupyterServerKernelClient,
27-
klass='jupyter_client.client.KernelClient',
29+
klass="jupyter_client.client.KernelClient",
2830
config=True,
29-
help="""The kernel client class to use for creating kernel clients."""
31+
help="""The kernel client class to use for creating kernel clients.""",
3032
)
3133

3234
client_factory = Type(
3335
default_value=JupyterServerKernelClient,
34-
klass='jupyter_client.client.KernelClient',
36+
klass="jupyter_client.client.KernelClient",
3537
config=True,
36-
help="""The kernel client factory class to use."""
38+
help="""The kernel client factory class to use.""",
3739
)
3840

3941
kernel_client = Instance(
40-
'jupyter_client.client.KernelClient',
42+
"jupyter_client.client.KernelClient",
4143
allow_none=True,
42-
help="""Pre-created kernel client instance. Created on initialization."""
44+
help="""Pre-created kernel client instance. Created on initialization.""",
4345
)
4446

4547
def __init__(self, **kwargs):
@@ -49,11 +51,11 @@ def __init__(self, **kwargs):
4951
# Create a kernel client instance immediately
5052
self.kernel_client = self.client(session=self.session)
5153

52-
@observe('client_class')
54+
@observe("client_class")
5355
def _client_class_changed(self, change):
5456
"""Override parent's _client_class_changed to handle Type trait instead of DottedObjectName."""
5557
# Set client_factory to the same class
56-
self.client_factory = change['new']
58+
self.client_factory = change["new"]
5759

5860
async def _async_post_start_kernel(self, **kwargs):
5961
"""After kernel starts, connect the kernel client.
@@ -97,7 +99,9 @@ async def cleanup_resources(self, restart=False):
9799
if restart:
98100
# On restart, clear client state but keep connection
99101
# The connection will be refreshed in post_start_kernel after restart
100-
self.log.debug(f"Clearing kernel client state for restart of kernel {self.kernel_id}")
102+
self.log.debug(
103+
f"Clearing kernel client state for restart of kernel {self.kernel_id}"
104+
)
101105
self.kernel_client.last_shell_status_time = None
102106
self.kernel_client.last_control_status_time = None
103107
# Disconnect before restart - will reconnect after
@@ -110,11 +114,11 @@ async def cleanup_resources(self, restart=False):
110114
self.kernel_client.stop_channels()
111115

112116
await super().cleanup_resources(restart=restart)
113-
117+
114118

115119
class AsyncMappingKernelManager(MappingKernelManager, AsyncMultiKernelManager): # type:ignore[misc]
116120
"""Custom kernel manager that uses enhanced monitoring kernel manager with v3 API."""
117-
121+
118122
@default("kernel_manager_class")
119123
def _default_kernel_manager_class(self):
120-
return "jupyter_server.services.kernels.v3.kernelmanager.ServerKernelManager"
124+
return "jupyter_server.services.kernels.v3.kernelmanager.ServerKernelManager"

0 commit comments

Comments
 (0)