U
    luf-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	 e
eee
ef dddZed	ejZed
ejZedejejB Ze
ee
dddZG dd dZe
ee dddZG dd deZG dd deZe	d fee
ef eee
ef d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   s>   | sdS |  dD ]"}t|}||kr0||8 }q q6q||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   :/tmp/pip-unpacked-wheel-naub1w99/jupyter_client/adapter.pycode_to_line   s    
r   z\([^\(\)]+\)z	\([^\(]*$z[a-z_][0-9a-z._]*c                 C   sb   t | |\}}|}td|}||kr8|}td|}qtd|}t|}|rZ|d S dS dS )ztReimplement token-finding logic from IPython 2.x javascript

    for adapting object_info_request from v5 to v4
    r   N)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< eeef eeef dddZ	eeef eeef dddZ
eeef eeef ddd	Zeeef eeef dd
dZeeef eeef d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   |S )Update the header.r   selfr   r   r   r   update_header@   s    zAdapter.update_headerc                 C   s   |S )zUpdate the metadata.r   r!   r   r   r   update_metadataD   s    zAdapter.update_metadatac                 C   s4   |d }|d }|| j kr0| 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   s   |S )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 krB|S |d dd dkr`| |S ||S )Nr%   r&   contentstatus>   erroraborted)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   )versionr
   c              	   C   s@   g }|  dD ],}z|t| W q tk
r8   Y qX q|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eeef eeef d	d
dZ	eeef eeef d	ddZ
eeef eeef d	ddZeeef eeef d	ddZeeef eeef d	ddZeeef eeef d	ddZeeef eeef d	ddZeeef eeef d	ddZeeef eeef d	ddZeeef eeef d	ddZeeef eeef d	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   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 ]}||krt || ||< q|dddkrVd|krVt |d |d< |di }|d	d}|d
| d|kr|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   s   |d }| d|d< |S )Handle a stream message.r)   r^   datarG   rY   r   r   r   stream   s    zV5toV4.streamc                 C   sT   |d }| dd |d }d|krPzt|d |d< W n tk
rN   Y nX |S )zHandle a display data message.r)   sourceZdisplayrn   application/json)rS   jsondumps	Exceptionr"   r   r)   rn   r   r   r   display_data   s    zV5toV4.display_datac                 C   s   |d  dd |S )Handle an input request.r)   passwordNrG   r!   r   r   r   input_request   s    zV5toV4.input_requestN)r1   r2   r3   r4   r7   r   r   r5   r   r#   rU   rZ   r\   ra   rg   rB   rC   ro   rv   ry   r   r   r   r   r@   u   s&         
    r@   c                   @   s  e Zd ZdZdZdd ej D Zee	e
f ee	e
f dddZee	e
f ee	e
f ddd	Zee	e
f ee	e
f dd
dZee	e
f ee	e
f dddZee	e
f ee	e
f dddZee	e
f ee	e
f dddZee	e
f ee	e
f dddZee	e
f ee	e
f dddZee	e
f ee	e
f dddZee	e
f ee	e
f dddZee	e
f ee	e
f d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   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 ]$}||krd tt|| ||< q|dd |d drjd|krjd	|d
< |d|d< |d}|di }|d| d|krd 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|kr:d	|krfi |d	< |d|d	 d
< q:|S )r[   r)   r   rW   payloadrp   Npager^   rn   
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< |rg }dD ]"}| |drH|||   qlqHd	D ]"}| |drp|||   qqp|s|d
 d||d< |S )rj   r)   r*   r   rl   rn   rf   )Zcall_defZinit_definitionZ
definitionF)Zcall_docstringZinit_docstringZ	docstringz<empty docstring>
r   )r.   r:   r   )r"   r   r)   r`   rl   rn   linesrT   r   r   r   rE   V  s&    
zV4toV5.inspect_replyc                 C   s   |d }| d|d< |S )rm   r)   rn   r^   rG   rY   r   r   r   ro   n  s    zV4toV5.streamc                 C   sT   |d }| dd |d }d|krPzt|d |d< W n tk
rN   Y nX |S )zHandle display data.r)   rp   Nrn   rq   )rH   rr   loadsrt   ru   r   r   r   rv   t  s    zV4toV5.display_datac                 C   s   |d  dd |S )rw   r)   rx   FrX   r!   r   r   r   ry     s    zV4toV5.input_requestN)r1   r2   r3   r4   r7   r@   r   itemsr   r5   r   r#   rU   rZ   r\   ra   rg   rD   rE   ro   rv   ry   r   r   r   r   rz      s    	  	  	     rz   )r   
to_versionr
   c                 C   sn   ddl m} | d }d|kr&| |d< d|krFt|d dd }nd}t||fd	}|d	krf| 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   rr   retypingr   r   r   r   _versionr   r5   r;   r   compileUNICODEr   r   Ir   r   r   r?   r@   rz   r   r   r   r   r   r   <module>   s$   /y *$