U
    luf                     @  s^   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ G d	d
 d
ZdS )zAn output widget mimic.    )annotations)Any)KernelClient)NotebookNode)output_from_msg   )
json_cleanc                   @  s   e Zd ZdZdddddddd	Zd
ddddddZddddZd$dddddddddZd%dddddddZd
dddddddZ	ddddd Z
ddd!d"d#ZdS )&OutputWidgetz+This class mimics a front end output widgetstrzdict[str, Any]r   r   None)comm_idstatekernel_clientexecutorreturnc                 C  s@   || _ || _|| _|| _d| j  d| _| jd | _d| _dS )zInitialize the widget.zcomm-%sasciioutputsFN)r   r   r   r   encodeZtopicr   clear_before_next_output)selfr   r   r   r    r   :/tmp/pip-unpacked-wheel-72rqhnyi/nbclient/output_widget.py__init__   s    zOutputWidget.__init__zlist[NotebookNode]int)outsmsg
cell_indexr   c                 C  sV   |d | _ |d }|dr$d| _n.g | _|   t| jdrR| j| jj| j d< dS )zClear output.parent_headercontentwaitTwidget_stater   N)	r   getr   r   
sync_statehasattrr   r    r   )r   r   r   r   r   r   r   r   clear_output   s    

zOutputWidget.clear_output)r   c                 C  s$   d| j i}d|g d}| | dS )zSync state.r   update)methodr   Zbuffer_pathsN)r   send)r   r   r   r   r   r   r"   *   s    
zOutputWidget.sync_stateNzdict[str, Any] | Nonezlist[Any] | None)msg_typedatametadatabufferskeysr   c                 K  sd   |dkri n|}|dkri n|}t tf || jd|}| jjj||| j|d}| jj| dS )z*Helper for sending a comm message on IOPubN)r)   r   )r   parentr*   )	r   dictr   r   sessionr   r   Zshell_channelr'   )r   r(   r)   r*   r+   r,   r   r   r   r   r   _publish_msg0   s    	   zOutputWidget._publish_msg)r)   r*   r+   r   c                 C  s   | j d|||d dS )zSend a comm message.Zcomm_msg)r)   r*   r+   N)r0   )r   r)   r*   r+   r   r   r   r'   A   s    zOutputWidget.send)r   r   
display_idr   r   c                 C  s   | j rg | _d| _ |d | _t|}| jr| jd }|d dkrr|d dkrr|d |d krr|d  |d 7  < q| j| n| j| |   t| jdr| j| jj| j	 d	< d
S )zHandle output.Fr   output_typestreamnametextr    r   N)
r   r   r   r   appendr"   r#   r   r    r   )r   r   r   r1   r   outputZlast_outputr   r   r   r8   J   s&    



zOutputWidget.output)r   r   c                 C  sF   d|krB| d}|r,| j||  || _n| j| j|  || _dS )zSet the state.msg_idN)r!   r   Zregister_output_hookr9   Zremove_output_hook)r   r   r9   r   r   r   	set_statef   s    
zOutputWidget.set_state)r   r   c                 C  sD   |d }|d }|| j kr"td|d }d|kr@| |d  dS )zHandle a message.r   r   zMismatched comm idr)   r   N)r   AssertionErrorr:   )r   r   r   r   r)   r   r   r   
handle_msgq   s    
zOutputWidget.handle_msg)NNN)NNN)__name__
__module____qualname____doc__r   r$   r"   r0   r'   r8   r:   r<   r   r   r   r   r	      s   	      	r	   N)r@   
__future__r   typingr   Zjupyter_client.clientr   Znbformatr   Znbformat.v4r   Zjsonutilr   r	   r   r   r   r   <module>   s   