
    Xh)                       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j                  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      Z G d d	      Zdd	gZy)
z?Default classes for Comm and CommManager, for usage in IPython.    )annotationsN)	ZMQStreamCommBaseCommc                      e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d f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 x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.
    c                   t        |   di | |r|nt        j                         j                  | _        || _        || _        || _        |r|nd| j
                   j                  d      | _
        |	r|	ni | _        |
r|
ni | _        d | _        d | _        d| _        | j                  r| j!                  |||       y d| _        y )Nzcomm-asciiTdatametadatabuffersF )super__init__uuiduuid4hexcomm_idprimarytarget_nametarget_moduleencodetopic
_open_data_close_data_msg_callback_close_callback_closedopen)selfr   r   r   r   r   r   r   r   r   r   kwargs	__class__s               B/var/www/html/myenv/lib/python3.12/site-packages/comm/base_comm.pyr   zBaseComm.__init__!   s     	"6"")wtzz|/?/?&*#UE$,,*@)H)H)Q
(2**5;22648<<II4(GID DL    c                    d}t        |      )Nz*publish_msg Comm method is not implemented)NotImplementedError)r    msg_typer   r   r   keysmsgs          r#   publish_msgzBaseComm.publish_msgE   s     ;!#&&r$   c                    t        j                  t              5  | j                  d       ddd       y# 1 sw Y   yxY w)ztrigger close on gcT)deletingN)
contextlibsuppress	Exceptioncloser    s    r#   __del__zBaseComm.__del__P   s5      + 	& JJJ%	& 	& 	&s   6?c                ,   || j                   }t        j                         }|d}t        |      |j	                  |        	 | j                  d|||| j                  | j                         d| _        y# t        $ r |j                  |         w x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   commget_comm_managerRuntimeErrorregister_commr*   r   r   r   r/   unregister_comm)r    r   r   r   comm_managerr)   s         r#   r   zBaseComm.openY   s    
 <??D,,.BCs##""4(	! ,,"00   !DL 	((.	s   2A7 7Bc                    | j                   ryd| _         || j                  }| j                  d|||       |s$t        j                         j                  |        yy)z,Close the frontend-side version of this commNT
comm_closer
   )r   r   r*   r5   r6   r9   )r    r   r   r   r,   s        r#   r0   zBaseComm.closet   se     <<<##D	 	 	
 !!#33D9 r$   c                .    | j                  d|||       y)z8Send a message to the frontend-side version of this commcomm_msgr
   N)r*   )r    r   r   r   s       r#   sendzBaseComm.send   s#     		 	 	
r$   c                    || _         y)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    callbacks     r#   on_closezBaseComm.on_close   s      (r$   c                    || _         y)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   rA   s     r#   on_msgzBaseComm.on_msg   s     &r$   c                    t         j                  d| j                  |       | j                  r| j                  |       yy)zHandle a comm_close messagezhandle_close[%s](%s)N)loggerdebugr   r   )r    r)   s     r#   handle_closezBaseComm.handle_close   s3    +T\\3?  %  r$   c                   t         j                  d| j                  |       | j                  rZddlm}  |       }|r|j                  j                  d       | j                  |       |r|j                  j                  d       yyy)zHandle a comm_msg messagezhandle_msg[%s](%s)r   )get_ipythonpre_executepost_executeN)rG   rH   r   r   IPythonrK   eventstrigger)r    r)   rK   shells       r#   
handle_msgzBaseComm.handle_msg   sl    )4<<=+ME$$]3s#$$^4  r$   )
r5   NNNNTNNNN)r   strr   	MaybeDictr   rT   r   BuffersTyper   
str | Noner   boolr   rV   r   zbytes | Noner   rT   r   rT   r!   t.AnyreturnNone)NNN)r'   rS   r   rT   r   rT   r   rU   r(   rX   rY   rZ   rY   rZ   )r   rT   r   rT   r   rU   rY   rZ   )NNNF)
r   rT   r   rT   r   rU   r,   rW   rY   rZ   )rB   zCommCallback | NonerY   rZ   )r)   MessageTyperY   rZ   )__name__
__module____qualname____doc__r   r*   r2   r   r0   r?   rC   rE   rI   rR   __classcell__)r"   s   @r#   r   r      s    ""#"$(" $!%"!"! "! 	"!
 "! "! "! ""! "! "! "! "! 
"!N "#	'	' 	' 		'
 	' 	' 
	'& Z^09KV	: "#:: : 	:
 : 
:2 Z^	
	
09	
KV	
		
(&&5r$   c                  X    e Zd ZdZddZddZddZddZddZddZ	ddZ
dd	Zdd
Zy)CommManagerzDDefault CommManager singleton implementation for Comms in the Kernelc                     i | _         i | _        y )N)commstargetsr1   s    r#   r   zCommManager.__init__   s    *,
68r$   c                T   t        |t              rO|j                  dd      }t        |      dk(  r!|\  }}t	        ||g      }	 t        ||      }nt	        |d         }t        j                  t        |      | j                  |<   y# t        $ r}d| }t        |      |d}~ww xY w)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   )
isinstancerS   rsplitlen
__import__getattrAttributeErrorImportErrortcastCommTargetCallbackrf   )	r    r   fpartspackageobjmodulee	error_msgs	            r#   register_targetzCommManager.register_target   s     aHHS!$E5zQ$#Gse<8,A uQx($%FF+=q$A[! & 8"23% 8I%i0a78s   B 	B'B""B'c                8    | j                   j                  |      S )z5Unregister a callable registered with register_target)rf   pop)r    r   rv   s      r#   unregister_targetzCommManager.unregister_target   s    ||,,r$   c                <    |j                   }|| j                  |<   |S )zRegister a new comm)r   re   )r    r5   r   s      r#   r8   zCommManager.register_comm   s    ,,"

7r$   c                N    | j                   j                  |j                        }y)z,Unregister a comm, and close its counterpartN)re   r   r   )r    r5   s     r#   r9   zCommManager.unregister_comm   s     zz~~dll+r$   c                    	 | j                   |   S # t        $ rs t        j                  d|       t        j	                  t
        j                        r7t        j                  dt        | j                   j                                      Y yw xY 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)
re   KeyErrorrG   warningisEnabledForloggingDEBUGrH   listr(   )r    r   s     r#   get_commzCommManager.get_comm   sh    	::g&& 	NN-w7""7==10$tzz7H2IJ	s    A9BBc                   ddl m} |d   }|d   }|d   }| j                  j                  |d      } ||d|      }	| j	                  |	       |t
        j                  d	|       n	  ||	|       y	  |	j                          y# t        $ r t
        j                  d
|d       Y 6w xY w# t        $ r t
        j                  dd       Y yw xY 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.)	r5   r   rf   getr8   rG   errorr/   r0   )
r    streamidentr)   r   r   r   r   rv   r5   s
             r#   r4   zCommManager.comm_open  s    $i.)$m,LL[$/#

 	4 9LL={Kc$
	DJJL  cE{]abc  	LLE  	s$   (	B 3B, !B)(B), CCc                    |d   }|d   }| j                  |      }|y	  |j                  |       y# t        $ r t        j	                  d|d       Y yw xY w)zHandler for comm_msg messagesr   r   NzException in comm_msg for %sTr   )r   rR   r/   rG   r   r    r   r   r)   r   r   r5   s          r#   r>   zCommManager.comm_msg(  sc    i.)$}}W%<	QDOOC  	QLL74LP	Qs   3 !AAc                    |d   }|d   }| j                  |      }|yd| j                  |   _        | j                  |= 	  |j                  |       y# t        $ r t
        j                  d|d       Y yw xY w)zHandler for comm_close messagesr   r   NTzException in comm_close for %sr   )r   re   r   rI   r/   rG   r   r   s          r#   r<   zCommManager.comm_close5  s    i.)$}}W%<&*

7#JJw	SDc" 	SLL97TLR	Ss   A !A87A8Nr[   )r   rS   rv   zCommTargetCallback | strrY   rZ   )r   rS   rv   ru   rY   ru   )r5   r   rY   rS   )r5   r   rY   rZ   )r   rS   rY   zBaseComm | None)r   r   r   rS   r)   r\   rY   rZ   )r]   r^   r_   r`   r   r}   r   r8   r9   r   r4   r>   r<   r   r$   r#   rc   rc      s6    N9B6-,
&BQSr$   rc   )r`   
__future__r   r-   r   typingrs   r   r5   TYPE_CHECKINGzmq.eventloop.zmqstreamr   	getLoggerrG   DictrS   Anyr\   OptionalrT   ListbytesrU   CallableCommCallbackru   r   rc   __all__r   r$   r#   <module>r      s    E #     ??1			6	"ffS!%%Z JJqvvc155j)*	jj'zz;--.ZZ[ 94 ?@ d5 d5NBS BSJ }
%r$   