o
    ^i)                     @  s   d Z ddlmZ ddlZddlZddlZddlZddlZej	r%ddl
mZ edZejeejf Zejejeejf  Zejeje  Zejegdf Zejdegdf ZG dd dZG dd	 d	Zdd	gZdS )
z?Default classes for Comm and CommManager, for usage in IPython.    )annotationsN)	ZMQStreamCommBaseCommc                      s   e Zd ZdZ										d5d6 fddZ			d7d8ddZd9dd Z	d7d:d!d"Z				#d;d<d%d&Z	d7d:d'd(Z	d=d+d,Z
d=d-d.Zd>d1d2Zd>d3d4Z  ZS )?r   zClass for communicating between a Frontend and a Kernel

    Must be subclassed with a publish_msg method implementation which
    sends comm messages through the iopub channel.
    commNTtarget_namestrdata	MaybeDictmetadatabuffersBuffersTypecomm_id
str | Noneprimarybooltarget_moduletopicbytes | None
_open_data_close_datakwargst.AnyreturnNonec                   s   t  jdi | |r|nt j| _|| _|| _|| _|r |nd| j 	d| _
|	r.|	ni | _|
r5|
ni | _d | _d | _d| _| jrN| j|||d d S d| _d S )Nzcomm-asciiTr	   r   r   F )super__init__uuiduuid4hexr   r   r   r   encoder   r   r   _msg_callback_close_callback_closedopen)selfr   r	   r   r   r   r   r   r   r   r   r   	__class__r   I/home/ubuntu/hpml_nyu/venv/lib/python3.10/site-packages/comm/base_comm.pyr   !   s   
zBaseComm.__init__msg_typekeysc                 K  s   d}t |)Nz*publish_msg Comm method is not implemented)NotImplementedError)r(   r,   r	   r   r   r-   msgr   r   r+   publish_msgE   s   zBaseComm.publish_msgc                 C  s<   t t | jdd W d   dS 1 sw   Y  dS )ztrigger close on gcT)deletingN)
contextlibsuppress	Exceptioncloser(   r   r   r+   __del__P   s   "zBaseComm.__del__c                 C  sv   |du r| j }t }|du rd}t|||  z| jd|||| j| jd d| _W dS  t	y:   |
|   w )z+Open the frontend-side version of this commNz.Comms cannot be opened without a comm_manager.	comm_open)r	   r   r   r   r   F)r   r   get_comm_managerRuntimeErrorregister_commr0   r   r   r&   r4   unregister_comm)r(   r	   r   r   comm_managerr/   r   r   r+   r'   Y   s*   

zBaseComm.openFr1   c                 C  sJ   | j rdS d| _ |du r| j}| jd|||d |s#t |  dS dS )z,Close the frontend-side version of this commNT
comm_closer   )r&   r   r0   r   r9   r<   )r(   r	   r   r   r1   r   r   r+   r5   t   s   zBaseComm.closec                 C  s   | j d|||d dS )z8Send a message to the frontend-side version of this commcomm_msgr   N)r0   )r(   r	   r   r   r   r   r+   send   s   
zBaseComm.sendcallbackCommCallback | Nonec                 C  
   || _ 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)r%   r(   rA   r   r   r+   on_close      
zBaseComm.on_closec                 C  rC   )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)r$   rD   r   r   r+   on_msg   rF   zBaseComm.on_msgr/   MessageTypec                 C  s(   t d| j| | jr| | dS dS )zHandle a comm_close messagezhandle_close[%s](%s)N)loggerdebugr   r%   )r(   r/   r   r   r+   handle_close   s   zBaseComm.handle_closec                 C  s^   t d| j| | jr+ddlm} | }|r|jd | | |r-|jd dS dS dS )zHandle a comm_msg messagezhandle_msg[%s](%s)r   )get_ipythonpre_executepost_executeN)rI   rJ   r   r$   IPythonrL   eventstrigger)r(   r/   rL   shellr   r   r+   
handle_msg   s   
zBaseComm.handle_msg)
r   NNNNTNNNN)r   r   r	   r
   r   r
   r   r   r   r   r   r   r   r   r   r   r   r
   r   r
   r   r   r   r   )NNN)r,   r   r	   r
   r   r
   r   r   r-   r   r   r   r   r   )r	   r
   r   r
   r   r   r   r   )NNNF)
r	   r
   r   r
   r   r   r1   r   r   r   )rA   rB   r   r   )r/   rH   r   r   )__name__
__module____qualname____doc__r   r0   r7   r'   r5   r@   rE   rG   rK   rS   __classcell__r   r   r)   r+   r      s>    '



	
c                   @  sj   e Zd ZdZd%ddZd&d
dZd'ddZd(ddZd)ddZd*ddZ	d+ddZ
d+d d!Zd+d"d#Zd$S ),CommManagerzDDefault CommManager singleton implementation for Comms in the Kernelr   r   c                 C  s   i | _ i | _d S )N)commstargetsr6   r   r   r+   r      s   
zCommManager.__init__r   r   fCommTargetCallback | strc           	   
   C  s   t |tr@|dd}t|dkr:|\}}t||gd}zt||}W n ty9 } z
d| }t||d}~ww t|d }t	t
|| j|< dS )a  Register a callable f for a given target name

        f will be called with two arguments when a comm_open message is received with `target`:

        - the Comm instance
        - the `comm_open` message itself.

        f can be a Python callable or an import string for one.
        .      )fromlistzNo module named Nr   )
isinstancer   rsplitlen
__import__getattrAttributeErrorImportErrortcastCommTargetCallbackr\   )	r(   r   r]   partspackageobjmodulee	error_msgr   r   r+   register_target   s   



zCommManager.register_targetrl   c                 C  s   | j |S )z5Unregister a callable registered with register_target)r\   pop)r(   r   r]   r   r   r+   unregister_target   s   zCommManager.unregister_targetr   r   c                 C  s   |j }|| j|< |S )zRegister a new comm)r   r[   )r(   r   r   r   r   r+   r;      s   
zCommManager.register_commc                 C  s   | j |j}dS )z,Unregister a comm, and close its counterpartN)r[   rt   r   )r(   r   r   r   r+   r<      s   zCommManager.unregister_commr   BaseComm | Nonec              	   C  sP   z| j | W S  ty'   td| ttjr$tdt| j 	  Y dS w )zGet a comm with a particular id

        Returns the comm if found, otherwise None.

        This will not raise an error,
        it will log messages if the comm cannot be found.
        zNo such comm: %szCurrent comms: %sN)
r[   KeyErrorrI   warningisEnabledForloggingDEBUGrJ   listr-   )r(   r   r   r   r+   get_comm   s   zCommManager.get_commstreamr   identr/   rH   c           
      C  s   ddl m} |d }|d }|d }| j|d}||d|d}	| |	 |du r0td	| nz||	| W dS  tyI   tjd
|dd Y nw z|	  W dS  tyb   tjddd Y dS w )zHandler for comm_open messagesr   )create_commcontentr   r   NF)r   r   r   z"No such comm target registered: %sz&Exception opening comm with target: %sTexc_infozqCould not close comm during `comm_open` failure
                clean-up.  The comm may not have been opened yet.)	r   r   r\   getr;   rI   errorr4   r5   )
r(   r~   r   r/   r   r   r   r   r]   r   r   r   r+   r8     s6   

zCommManager.comm_openc                 C  s\   |d }|d }|  |}|du rdS z|| W dS  ty-   tjd|dd Y dS w )zHandler for comm_msg messagesr   r   NzException in comm_msg for %sTr   )r}   rS   r4   rI   r   r(   r~   r   r/   r   r   r   r   r   r+   r?   (  s   
zCommManager.comm_msgc                 C  sp   |d }|d }|  |}|du rdS d| j| _| j|= z|| W dS  ty7   tjd|dd Y dS w )zHandler for comm_close messagesr   r   NTzException in comm_close for %sr   )r}   r[   r&   rK   r4   rI   r   r   r   r   r+   r>   5  s   
zCommManager.comm_closeNrT   )r   r   r]   r^   r   r   )r   r   r]   rl   r   rl   )r   r   r   r   )r   r   r   r   )r   r   r   rv   )r~   r   r   r   r/   rH   r   r   )rU   rV   rW   rX   r   rs   ru   r;   r<   r}   r8   r?   r>   r   r   r   r+   rZ      s    







!rZ   )rX   
__future__r   r2   rz   typingrj   r    r   TYPE_CHECKINGzmq.eventloop.zmqstreamr   	getLoggerrI   Dictr   AnyrH   Optionalr
   Listbytesr   CallableCommCallbackrl   r   rZ   __all__r   r   r   r+   <module>   s(    
 ( 