B
    U[                 @   sn   d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZ G dd deZdgZdS )	zBase class for a Comm    N)LoggingConfigurable)Kernel)
json_clean)InstanceUnicodeBytesBoolDictAnydefaultc                   s  e Zd ZdZedddZeddd Ze Z	edd	d
 Z
edddZedZeddddZe Zeddd ZeddZeddZe Ze ZedZd+ fdd	Zd,ddZdd Zd-ddZd.dd Zd/d!d"Zd#d$ Zd%d& Z d'd( Z!d)d* Z"  Z#S )0Commz7Class for communicating between a Frontend and a Kernelzipykernel.kernelbase.KernelT)
allow_nonekernelc             C   s   t  rt  S d S )N)r   Zinitializedinstance)self r   2lib/python3.7/site-packages/ipykernel/comm/comm.py_default_kernel   s    zComm._default_kernelcomm_idc             C   s
   t  jS )N)uuidZuuid4hex)r   r   r   r   _default_comm_id   s    zComm._default_comm_idz#Am I the primary or secondary Comm?)helpZcommNz8requirejs module from
        which to load comm target.)r   r   topicc             C   s   d| j  dS )Nzcomm-%sascii)r   encode)r   r   r   r   _default_topic&   s    zComm._default_topicz.data dict, if any, to be included in comm_openz/data dict, if any, to be included in comm_close c                sF   |r||d< t t| jf | | jrB| jr<| j|||d nd| _d S )Ntarget_name)datametadatabuffersF)superr   __init__r   primaryopen_closed)r   r   r   r    r!   kwargs)	__class__r   r   r#   2   s    zComm.__init__c          	   K   sh   |dkri n|}|dkri n|}t tf || jd|}| jjj| jj||t || jj| j|d dS )z*Helper for sending a comm message on IOPubN)r   r   )r    parentZidentr!   )	r   dictr   r   ZsessionsendZiopub_socketZ_parent_headerr   )r   Zmsg_typer   r    r!   keysZcontentr   r   r   _publish_msg=   s    zComm._publish_msgc             C   s   |    dS )ztrigger close on gcN)close)r   r   r   r   __del__J   s    zComm.__del__c             C   sx   |dkr| j }t| jdd}|dkr,td||  y$| jd|||| j| jd d| _W n   |	|   Y nX dS )z+Open the frontend-side version of this commNcomm_managerzSComms cannot be opened without a kernel and a comm_manager attached to that kernel.Z	comm_open)r   r    r!   r   target_moduleF)

_open_datagetattrr   RuntimeErrorZregister_commr-   r   r1   r&   unregister_comm)r   r   r    r!   r0   r   r   r   r%   P   s    



z	Comm.openc             C   sL   | j r
dS d| _ | jsdS |dkr(| j}| jd|||d | jj|  dS )z,Close the frontend-side version of this commNTZ
comm_close)r   r    r!   )r&   r   _close_datar-   r0   r5   )r   r   r    r!   r   r   r   r.   e   s    z
Comm.closec             C   s   | j d|||d dS )z8Send a message to the frontend-side version of this commZcomm_msg)r   r    r!   N)r-   )r   r   r    r!   r   r   r   r+   v   s    z	Comm.sendc             C   s
   || _ dS )zRegister a callback for comm_close

        Will be called with the `data` of the close message.

        Call `on_close(None)` to disable an existing callback.
        N)_close_callback)r   callbackr   r   r   on_close~   s    zComm.on_closec             C   s
   || _ dS )zRegister a callback for comm_msg

        Will be called with the `data` of any comm_msg messages.

        Call `on_msg(None)` to disable an existing callback.
        N)_msg_callback)r   r8   r   r   r   on_msg   s    zComm.on_msgc             C   s&   | j d| j| | jr"| | dS )zHandle a comm_close messagezhandle_close[%s](%s)N)logdebugr   r7   )r   msgr   r   r   handle_close   s    zComm.handle_closec             C   sN   | j d| j| | jrJ| jj}|r0|jd | | |rJ|jd dS )zHandle a comm_msg messagezhandle_msg[%s](%s)Zpre_executeZpost_executeN)r<   r=   r   r:   r   shellZeventsZtrigger)r   r>   r@   r   r   r   
handle_msg   s    
zComm.handle_msg)r   NNN)NNN)NNN)NNN)NNN)$__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r$   r   r1   r   r   r   r	   r2   r6   r
   r:   r7   r&   r#   r-   r/   r%   r.   r+   r9   r;   r?   rA   __classcell__r   r   )r(   r   r      s4   





	r   )rE   r   Ztraitlets.configr   Zipykernel.kernelbaser   Zipykernel.jsonutilr   Z	traitletsr   r   r   r   r	   r
   r   r   __all__r   r   r   r   <module>   s   $ 