|
| 1 | +from typing import Any |
| 2 | + |
1 | 3 | import pkg_resources |
2 | 4 | 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