You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			101 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			101 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
"""Base class for a Comm"""
 | 
						|
 | 
						|
# Copyright (c) IPython Development Team.
 | 
						|
# Distributed under the terms of the Modified BSD License.
 | 
						|
 | 
						|
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
 | 
						|
 | 
						|
 | 
						|
# this is the class that will be created if we do comm.create_comm
 | 
						|
class BaseComm(comm.base_comm.BaseComm):  # type:ignore[misc]
 | 
						|
    """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,
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
# but for backwards compatibility, we need to inherit from LoggingConfigurable
 | 
						|
class Comm(BaseComm, traitlets.config.LoggingConfigurable):
 | 
						|
    """Class for communicating between a Frontend and a Kernel"""
 | 
						|
 | 
						|
    kernel = Instance("ipykernel.kernelbase.Kernel", allow_none=True)  # type:ignore[assignment]
 | 
						|
    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,
 | 
						|
            )
 | 
						|
 | 
						|
        # Handle differing arguments between base classes.
 | 
						|
        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)  # type:ignore[call-arg]
 | 
						|
        # only re-add kernel if explicitly provided
 | 
						|
        if had_kernel:
 | 
						|
            kwargs["kernel"] = kernel
 | 
						|
        traitlets.config.LoggingConfigurable.__init__(self, **kwargs)
 | 
						|
 | 
						|
 | 
						|
__all__ = ["Comm"]
 |