o
    Zh-8                  	   @   s   d Z ddlZddlZddlmZmZmZ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DictListTuple   )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   M/var/www/html/lang_env/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   _Z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_header@      zAdapter.update_headerc                 C   r   )zUpdate the metadata.r   r!   r   r   r   update_metadataD   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_typeH   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_errorP   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>   Zabortederror)r#   r%   r(   getattrgetr)   )r"   r   r&   handlerr   r   r   __call__W   s   



zAdapter.__call__N)__name__
__module____qualname____doc__r   r   str__annotations__r   r#   r%   r(   r)   r0   r   r   r   r   r   8   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_listg   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.1ZpyoutZpyinZpyerrobject_info_requestobject_info_reply)Zexecute_resultZ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   rJ   )r?   r.   
setdefault)r"   r   Zv4cr*   keyrP   rR   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rS   r"   r   r*   r   r   r   execute_request   s   zV5toV4.execute_requestc                 C   s   |d }| di  |S )Handle an execute reply.r*   rW   rX   rY   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metadatarG   )r"   r   r*   rc   rd   Z	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	   r   r   r`   r   r   r   rB      s   zV5toV4.object_info_requestc                 C   s   ddd|d< |S )1inspect_reply can't be easily backward compatibleFunknown)foundrh   r*   r   r!   r   r   r   rC      s   zV5toV4.object_info_replyc                 C      |d }| d|d< |S )Handle a stream message.r*   r^   datarG   rY   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displayro   application/json)rS   jsondumps	Exceptionr"   r   r*   ro   r   r   r   display_data      zV5toV4.display_datac                 C      |d  dd |S )Handle an input request.r*   passwordNrG   r!   r   r   r   input_request      zV5toV4.input_requestN)r1   r2   r3   r4   r7   r   r   r5   r   r#   rU   rZ   r\   ra   rg   rB   rC   rp   rz   r   r   r   r   r   r@   u   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   rF   )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 )rI   r*   )rK   rO   r8   rK   rA   rR   pythonrO   rM   rL   rN   rP   rQ   rJ   r7   r   Zbanner)joinmapr5   rS   
startswithrH   )r"   r   r*   rT   rR   rP   rJ   r   r   r   rU      s"   
zV4toV5.kernel_info_replyc                 C   s6   |d }| dg }|di }|D ]}|||< q|S )rV   r*   rW   user_expressions)rH   rS   )r"   r   r*   rW   r   r=   r   r   r   rZ     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 )r[   r*   r   rW   payloadrs   Npager^   ro   
text/plain)rS   rH   updater.   )r"   r   r*   r   rW   r   r   r   r   r\     s   
zV4toV5.execute_replyc                 C   s0   |d }i  }|d< |d |d< |d |d< |S )r]   r*   r   r   r	   r   )r"   r   Zold_contentr`   r   r   r   ra   0  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 )
rb   r*   r+   okr   re   rc   Nrd   rf   r   )r"   r   r*   r`   r   r   r   rg   9  s   zV4toV5.complete_replyc                 C   s@   |d }|d }i  }|d< ||d< t ||d< |d |d< |S )zHandle an inspect request.r*   rh   r   r	   ri   r   )r"   r   r*   rQ   r`   r   r   r   rD   K  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 )rj   r*   r+   r   rl   ro   rf   )Zcall_defZinit_definitionZ
definitionF)Zcall_docstringZinit_docstring	docstringz<empty docstring>
r   )r.   r:   r   )r"   r   r*   r`   rl   ro   linesrT   r   r   r   rE   V  s*   
zV4toV5.inspect_replyc                 C   rm   )rn   r*   ro   r^   rG   rY   r   r   r   rp   n  rq   zV4toV5.streamc                 C   rr   )zHandle display data.r*   rs   Nro   ru   )rH   rv   loadsrx   ry   r   r   r   rz   t  r{   zV4toV5.display_datac                 C   r|   )r}   r*   r~   FrX   r!   r   r   r   r     r   zV4toV5.input_requestN)r1   r2   r3   r4   r7   r@   r   itemsr   r5   r   r#   rU   rZ   r\   ra   rg   rD   rE   rp   rz   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&   Zfrom_versionadapterr   r   r   adapt  s   
r   ))   r   )r   r   )r4   rv   retypingr   r   r   r   _versionr   r5   r;   r   compileUNICODEr   r   Ir   r   r   r?   r@   r   r   r   r   r   r   r   <module>   s&    /y .$
