|
"""Base class for a Comm""" |
|
|
|
|
|
|
|
|
|
import uuid |
|
from typing import Optional |
|
from warnings import warn |
|
|
|
import comm.base_comm |
|
import traitlets.config |
|
from traitlets import Bool, Bytes, Instance, Unicode, default |
|
|
|
from ipykernel.jsonutil import json_clean |
|
from ipykernel.kernelbase import Kernel |
|
|
|
|
|
|
|
class BaseComm(comm.base_comm.BaseComm): |
|
"""The base class for comms.""" |
|
|
|
kernel: Optional["Kernel"] = None |
|
|
|
def publish_msg(self, msg_type, data=None, metadata=None, buffers=None, **keys): |
|
"""Helper for sending a comm message on IOPub""" |
|
if not Kernel.initialized(): |
|
return |
|
|
|
data = {} if data is None else data |
|
metadata = {} if metadata is None else metadata |
|
content = json_clean(dict(data=data, comm_id=self.comm_id, **keys)) |
|
|
|
if self.kernel is None: |
|
self.kernel = Kernel.instance() |
|
|
|
assert self.kernel.session is not None |
|
self.kernel.session.send( |
|
self.kernel.iopub_socket, |
|
msg_type, |
|
content, |
|
metadata=json_clean(metadata), |
|
parent=self.kernel.get_parent(), |
|
ident=self.topic, |
|
buffers=buffers, |
|
) |
|
|
|
|
|
|
|
class Comm(BaseComm, traitlets.config.LoggingConfigurable): |
|
"""Class for communicating between a Frontend and a Kernel""" |
|
|
|
kernel = Instance("ipykernel.kernelbase.Kernel", allow_none=True) |
|
comm_id = Unicode() |
|
primary = Bool(True, help="Am I the primary or secondary Comm?") |
|
|
|
target_name = Unicode("comm") |
|
target_module = Unicode( |
|
None, |
|
allow_none=True, |
|
help="""requirejs module from |
|
which to load comm target.""", |
|
) |
|
|
|
topic = Bytes() |
|
|
|
@default("kernel") |
|
def _default_kernel(self): |
|
if Kernel.initialized(): |
|
return Kernel.instance() |
|
return None |
|
|
|
@default("comm_id") |
|
def _default_comm_id(self): |
|
return uuid.uuid4().hex |
|
|
|
def __init__( |
|
self, target_name="", data=None, metadata=None, buffers=None, show_warning=True, **kwargs |
|
): |
|
"""Initialize a comm.""" |
|
if show_warning: |
|
warn( |
|
"The `ipykernel.comm.Comm` class has been deprecated. Please use the `comm` module instead." |
|
"For creating comms, use the function `from comm import create_comm`.", |
|
DeprecationWarning, |
|
stacklevel=2, |
|
) |
|
|
|
|
|
had_kernel = "kernel" in kwargs |
|
kernel = kwargs.pop("kernel", None) |
|
if target_name: |
|
kwargs["target_name"] = target_name |
|
BaseComm.__init__(self, data=data, metadata=metadata, buffers=buffers, **kwargs) |
|
|
|
if had_kernel: |
|
kwargs["kernel"] = kernel |
|
traitlets.config.LoggingConfigurable.__init__(self, **kwargs) |
|
|
|
|
|
__all__ = ["Comm"] |
|
|