o
    +wi8                  	   @   s  d Z ddlZddlZddlmZ ddlmZ dedede	eef fd	d
Z
edejZedejZedejejB ZdededefddZG dd dZdedee fddZG dd deZG dd deZed fdeeef dedeeef fddZe e dZdS )z'Adapters for Jupyter msg spec versions.    N)Any   )protocol_version_infocode
cursor_posreturnc                 C   sB   | sdS |  dD ]}t|}||kr||8 }q	 ||fS ||fS )zTurn a multiline code block and cursor position into a single line
    and new cursor position.

    For adapting ``complete_`` and ``object_info_request``.
    ) r   T)
splitlineslen)r   r   linen r   S/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/jupyter_client/adapter.pycode_to_line   s   
r   z\([^\(\)]+\)z	\([^\(]*$z[a-z_][0-9a-z._]*c                 C   sd   t | |\}}|}td|}||kr|}td|}||kstd|}t|}|r0|d S dS )ztReimplement token-finding logic from IPython 2.x javascript

    for adapting object_info_request from v5 to v4
    r   )r   _match_bracketsub_end_bracket_identifierfindall)r   r   r   _oldlinematchesr   r   r   extract_oname_v4"   s   
r   c                   @   s   e Zd ZU dZi Zeeef ed< deeef deeef fddZ	deeef deeef fddZ
deeef deeef fd	d
Zdeeef deeef fddZdeeef deeef fddZdS )AdapterzaBase class for adapting messages

    Override message_type(msg) methods to create adapters.
    msg_type_mapmsgr   c                 C      |S )Update the header.r   selfr   r   r   r   update_headerA      zAdapter.update_headerc                 C   r   )zUpdate the metadata.r   r   r   r   r   update_metadataE   r"   zAdapter.update_metadatac                 C   s4   |d }|d }|| j v r| j |  |d< |d< |S )zUpdate the message type.headermsg_type)r   )r    r   r$   r%   r   r   r   update_msg_typeI   s
   
zAdapter.update_msg_typec                 C   r   )zeThis will be called *instead of* the regular handler

        on any reply with status != ok
        r   r   r   r   r   handle_reply_status_errorQ   s   z!Adapter.handle_reply_status_errorc                 C   sh   |  |}| |}| |}|d }t| |d d }|d u r!|S |d dd dv r0| |S ||S )Nr$   r%   contentstatus>   erroraborted)r!   r#   r&   getattrgetr'   )r    r   r$   handlerr   r   r   __call__X   s   



zAdapter.__call__N)__name__
__module____qualname____doc__r   dictstr__annotations__r   r!   r#   r&   r'   r/   r   r   r   r   r   9   s   
 """"&r   versionc              	   C   s<   g }|  dD ]}z	|t| W q ty   Y qw |S )zRconvert a version string to a list of ints

    non-int segments are excluded
    .)splitappendint
ValueError)r7   vpartr   r   r   _version_str_to_listh   s   r?   c                   @   s  e Zd ZdZdZddddddZd	eeef d
eeef fddZ	d	eeef d
eeef fddZ
d	eeef d
eeef fddZd	eeef d
eeef fddZd	eeef d
eeef fddZd	eeef d
eeef fddZd	eeef d
eeef fddZd	eeef d
eeef fddZd	eeef d
eeef fddZd	eeef d
eeef fddZd	eeef d
eeef fdd Zd!S )"V5toV4zAdapt msg protocol v5 to v44.1pyoutpyinpyerrobject_info_requestobject_info_reply)execute_resultexecute_inputr*   inspect_requestinspect_replyr   r   c                 C   s$   |d  dd |d  dd |S )r   r$   r7   Nparent_headerpopr   r   r   r   r!      s   zV5toV4.update_headerc                 C   s   i }|d }dD ]}||v rt || ||< q|dddkr+d|v r+t |d |d< |di }|d	d}|d
| d|v rK|dt |d  ||d< |S )Handle a kernel info reply.r(   )language_versionprotocol_versionimplementationr   ipythonimplementation_versionipython_versionlanguage_infonamelanguager7   rO   )r?   r-   
setdefault)r    r   v4cr(   keyrU   rW   r   r   r   kernel_info_reply   s   zV5toV4.kernel_info_replyc                 C   s   |d }| dg  |S )Handle an execute request.r(   user_variablesrX   r    r   r(   r   r   r   execute_request   s   zV5toV4.execute_requestc                 C   s   |d }| di  |S )Handle an execute reply.r(   r]   r^   r_   r   r   r   execute_reply   s   zV5toV4.execute_replyc                 C   sV   |d }|d }|d }t ||\}}i  }|d< d|d< ||d< d|d< ||d< |S )	Handle a complete request.r(   r   r   r   textr   Nblock)r   )r    r   r(   r   r   r   new_contentr   r   r   complete_request   s   zV5toV4.complete_requestc                 C   sL   |d }| d}| d}|| }|d d d| |d< | dd |S )	Handle a complete reply.r(   cursor_start
cursor_endr   r   Nmatched_textmetadatarL   )r    r   r(   ri   rj   	match_lenr   r   r   complete_reply   s   

zV5toV4.complete_replyc                 C   sP   |d }|d }|d }t ||\}}i  }|d< t|||d< |d |d< |S )zHandle an object info request.r(   r   r   onamedetail_level)r   r   )r    r   r(   r   r   _liner   rf   r   r   r   rE      s   zV5toV4.object_info_requestc                 C   s   ddd|d< |S )1inspect_reply can't be easily backward compatibleFunknown)foundro   r(   r   r   r   r   r   rF      s   zV5toV4.object_info_replyc                 C      |d }| d|d< |S )Handle a stream message.r(   rd   datarL   r_   r   r   r   stream      zV5toV4.streamc                 C   V   |d }| dd |d }d|v r)zt|d |d< W |S  ty(   Y |S w |S )zHandle a display data message.r(   sourcedisplayrw   application/json)rX   jsondumps	Exceptionr    r   r(   rw   r   r   r   display_data      zV5toV4.display_datac                 C      |d  dd |S )Handle an input request.r(   passwordNrL   r   r   r   r   input_request      zV5toV4.input_requestN)r0   r1   r2   r3   r7   r   r4   r5   r   r!   r[   r`   rb   rg   rn   rE   rF   rx   r   r   r   r   r   r   r@   v   s(    """""""
"""&r@   c                   @   s  e Zd ZdZdZdd ej D Zdee	e
f dee	e
f fddZdee	e
f dee	e
f fd	d
Zdee	e
f dee	e
f fddZdee	e
f dee	e
f fddZdee	e
f dee	e
f fddZdee	e
f dee	e
f fddZdee	e
f dee	e
f fddZdee	e
f dee	e
f fddZdee	e
f dee	e
f fddZdee	e
f dee	e
f fddZdee	e
f dee	e
f fddZdS )V4toV5zConvert msg spec V4 to V5z5.0c                 C   s   i | ]\}}||qS r   r   ).0kr=   r   r   r   
<dictcomp>   s    zV4toV5.<dictcomp>r   r   c                 C   s(   | j |d d< |d r| j |d d< |S )r   r$   r7   rK   )r7   r   r   r   r   r!      s   zV4toV5.update_headerc                 C   s   |d }dD ]}||v rd tt|| ||< q|dd |d dr5d|v r5d	|d
< |d|d< |d}|di }|d| d|v r[d tt|d}|d| d|d< |S )rN   r(   )rP   rT   r8   rP   rA   rW   pythonrT   rR   rQ   rS   rU   rV   rO   r7   r   banner)joinmapr5   rX   
startswithrM   )r    r   r(   rZ   rW   rU   rO   r   r   r   r[      s"   
zV4toV5.kernel_info_replyc                 C   s6   |d }| dg }|di }|D ]}|||< q|S )r\   r(   r]   user_expressions)rM   rX   )r    r   r(   r]   r   r=   r   r   r   r`     s   
zV4toV5.execute_requestc                 C   s~   |d }| di }|di }|r|| |dg D ]}|dddkr<d|v r<d	|vr3i |d	< |d|d	 d
< q|S )ra   r(   r   r]   payloadr{   Npagerd   rw   
text/plain)rX   rM   updater-   )r    r   r(   r   r]   r   r   r   r   rb      s   
zV4toV5.execute_replyc                 C   s0   |d }i  }|d< |d |d< |d |d< |S )rc   r(   r   r   r   r   )r    r   old_contentrf   r   r   r   rg   1  s
   zV4toV5.complete_requestc                 C   s\   |d }ddi }|d< |d |d< |d r t |d  |d< nd|d< d|d< i |d	< |S )
rh   r(   r)   okr   rk   ri   Nrj   rl   r
   )r    r   r(   rf   r   r   r   rn   :  s   zV4toV5.complete_replyc                 C   s@   |d }|d }i  }|d< ||d< t ||d< |d |d< |S )zHandle an inspect request.r(   ro   r   r   rp   r   )r    r   r(   rV   rf   r   r   r   rI   L  s   zV4toV5.inspect_requestc                 C   s   |d }ddi }|d< |d  }|d< i  |d< }i |d< |rXg }dD ]}| |dr5|||   nq$d	D ]}| |drI|||   nq8|sQ|d
 d||d< |S )rr   r(   r)   r   rt   rw   rl   )call_definit_definition
definitionF)call_docstringinit_docstring	docstringz<empty docstring>
r   )r-   r:   r   )r    r   r(   rf   rt   rw   linesrZ   r   r   r   rJ   W  s*   
zV4toV5.inspect_replyc                 C   ru   )rv   r(   rw   rd   rL   r_   r   r   r   rx   o  ry   zV4toV5.streamc                 C   rz   )zHandle display data.r(   r{   Nrw   r}   )rM   r~   loadsr   r   r   r   r   r   u  r   zV4toV5.display_datac                 C   r   )r   r(   r   Fr^   r   r   r   r   r     r   zV4toV5.input_requestN)r0   r1   r2   r3   r7   r@   r   itemsr4   r5   r   r!   r[   r`   rb   rg   rn   rI   rJ   rx   r   r   r   r   r   r   r      s    ""	""	""	""""&r   r   
to_versionc                 C   sn   ddl m} | d }d|vr| |d< d|v r#t|d dd }nd}t||fd	}|d	u r3| S || S )
aS  Adapt a single message to a target version

    Parameters
    ----------

    msg : dict
        A Jupyter message.
    to_version : int, optional
        The target major version.
        If unspecified, adapt to the current version.

    Returns
    -------

    msg : dict
        A Jupyter message appropriate in the new version.
    r   )utcnowr$   dater7   r8   r      N)sessionr   r;   r9   adaptersr-   )r   r   r   r$   from_versionadapterr   r   r   adapt  s   
r   ))   r   )r   r   )r3   r~   retypingr   _versionr   r5   r;   tupler   compileUNICODEr   r   Ir   r   r   listr?   r@   r   r4   r   r   r   r   r   r   <module>   s&    /y .$
