Skip to content

Commit 8321cf2

Browse files
Make ypywidgets optional (#375)
1 parent 190a70e commit 8321cf2

File tree

3 files changed

+68
-53
lines changed

3 files changed

+68
-53
lines changed

plugins/kernels/fps_kernels/kernel_driver/driver.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ async def _handle_iopub(self, msg_id: str, ycell: Map) -> None:
181181
ycell["execution_state"] = "idle"
182182

183183
async def _handle_comms(self) -> None:
184-
if self.yjs is None:
184+
if self.yjs is None or self.yjs.widgets is None: # type: ignore
185185
return
186186

187187
while True:
@@ -247,7 +247,7 @@ async def _handle_outputs(self, outputs: Array, msg: Dict[str, Any]):
247247
if "application/vnd.jupyter.ywidget-view+json" in content["data"]:
248248
# this is a collaborative widget
249249
model_id = content["data"]["application/vnd.jupyter.ywidget-view+json"]["model_id"]
250-
if self.yjs is not None:
250+
if self.yjs is not None and self.yjs.widgets is not None: # type: ignore
251251
if model_id in self.yjs.widgets.widgets: # type: ignore
252252
doc = self.yjs.widgets.widgets[model_id]["model"].ydoc # type: ignore
253253
path = f"ywidget:{doc.guid}"

plugins/yjs/fps_yjs/routes.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ def __init__(
5050
super().__init__(app=app, auth=auth)
5151
self.contents = contents
5252
self.room_manager = RoomManager(contents)
53-
self.widgets = Widgets()
53+
if Widgets is None:
54+
self.widgets = None
55+
else:
56+
self.widgets = Widgets() # type: ignore
5457

5558
async def collaboration_room_websocket(
5659
self,
Lines changed: 62 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,64 @@
1+
from typing import Any
2+
13
import pkg_resources
24
from pycrdt import TransactionEvent
3-
from ypywidgets.utils import ( # type: ignore
4-
YMessageType,
5-
YSyncMessageType,
6-
create_update_message,
7-
process_sync_message,
8-
sync,
9-
)
10-
11-
12-
class Widgets:
13-
def __init__(self):
14-
self.ydocs = {
15-
ep.name: ep.load() for ep in pkg_resources.iter_entry_points(group="ypywidgets")
16-
}
17-
self.widgets = {}
18-
19-
def comm_open(self, msg, comm) -> None:
20-
target_name = msg["content"]["target_name"]
21-
if target_name != "ywidget":
22-
return
23-
24-
name = msg["metadata"]["ymodel_name"]
25-
comm_id = msg["content"]["comm_id"]
26-
self.comm = comm
27-
model = self.ydocs[f"{name}Model"]()
28-
self.widgets[comm_id] = {"model": model, "comm": comm}
29-
msg = sync(model.ydoc)
30-
comm.send(**msg)
31-
32-
def comm_msg(self, msg) -> None:
33-
comm_id = msg["content"]["comm_id"]
34-
message = bytes(msg["buffers"][0])
35-
if message[0] == YMessageType.SYNC:
36-
ydoc = self.widgets[comm_id]["model"].ydoc
37-
reply = process_sync_message(
38-
message[1:],
39-
ydoc,
40-
)
41-
if reply:
42-
self.widgets[comm_id]["comm"].send(buffers=[reply])
43-
if message[1] == YSyncMessageType.SYNC_STEP2:
44-
ydoc.observe(self._send)
45-
46-
def _send(self, event: TransactionEvent):
47-
update = event.update # type: ignore
48-
message = create_update_message(update)
49-
try:
50-
self.comm.send(buffers=[message])
51-
except Exception:
52-
pass
5+
6+
try:
7+
from ypywidgets.utils import ( # type: ignore
8+
YMessageType,
9+
YSyncMessageType,
10+
create_update_message,
11+
process_sync_message,
12+
sync,
13+
)
14+
ypywidgets_installed = True
15+
except ImportError:
16+
ypywidgets_installed = False
17+
18+
19+
Widgets: Any
20+
21+
if ypywidgets_installed:
22+
class Widgets: # type: ignore
23+
def __init__(self):
24+
self.ydocs = {
25+
ep.name: ep.load() for ep in pkg_resources.iter_entry_points(group="ypywidgets")
26+
}
27+
self.widgets = {}
28+
29+
def comm_open(self, msg, comm) -> None:
30+
target_name = msg["content"]["target_name"]
31+
if target_name != "ywidget":
32+
return
33+
34+
name = msg["metadata"]["ymodel_name"]
35+
comm_id = msg["content"]["comm_id"]
36+
self.comm = comm
37+
model = self.ydocs[f"{name}Model"]()
38+
self.widgets[comm_id] = {"model": model, "comm": comm}
39+
msg = sync(model.ydoc)
40+
comm.send(**msg)
41+
42+
def comm_msg(self, msg) -> None:
43+
comm_id = msg["content"]["comm_id"]
44+
message = bytes(msg["buffers"][0])
45+
if message[0] == YMessageType.SYNC:
46+
ydoc = self.widgets[comm_id]["model"].ydoc
47+
reply = process_sync_message(
48+
message[1:],
49+
ydoc,
50+
)
51+
if reply:
52+
self.widgets[comm_id]["comm"].send(buffers=[reply])
53+
if message[1] == YSyncMessageType.SYNC_STEP2:
54+
ydoc.observe(self._send)
55+
56+
def _send(self, event: TransactionEvent):
57+
update = event.update # type: ignore
58+
message = create_update_message(update)
59+
try:
60+
self.comm.send(buffers=[message])
61+
except Exception:
62+
pass
63+
else:
64+
Widgets = None

0 commit comments

Comments
 (0)