B
    í\œ0  ã               @   sº   d Z ddlZddlZddlmZ dd„ Ze dej¡Ze dej¡Z	e dej
ejB ¡Zd	d
„ ZG dd„ deƒZdd„ ZG dd„ deƒZG dd„ deƒZed fdd„Zeƒ eƒ dœZdS )z'Adapters for Jupyter msg spec versions.é    N)Úprotocol_version_infoc             C   s@   | sdS x.|   d¡D ] }t|ƒ}||kr2||8 }qP qW ||fS )z¡Turn 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)ÚcodeÚ
cursor_posÚlineÚn© r
   ú5lib/python3.7/site-packages/jupyter_client/adapter.pyÚcode_to_line   s    
r   z\([^\(\)]+\)z	\([^\(]*$z[a-z_][0-9a-z._]*c             C   sf   t | |ƒ\}}|}t d|¡}x||kr:|}t d|¡}q W t d|¡}t |¡}|r^|d S dS dS )zxReimplement 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dZi Zdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Z	dS )ÚAdapterzaBase class for adapting messages

    Override message_type(msg) methods to create adapters.
    c             C   s   |S )Nr
   )ÚselfÚmsgr
   r
   r   Úupdate_header?   s    zAdapter.update_headerc             C   s   |S )Nr
   )r   r   r
   r
   r   Úupdate_metadataB   s    zAdapter.update_metadatac             C   s4   |d }|d }|| j kr0| j |  |d< |d< |S )NÚheaderÚmsg_type)Úmsg_type_map)r   r   r   r   r
   r
   r   Úupdate_msg_typeE   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
   r   Úhandle_reply_status_errorL   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   Zhandlerr
   r
   r   Ú__call__S   s    



zAdapter.__call__N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r&   r
   r
   r
   r   r   7   s   r   c          	   C   sD   g }x:|   d¡D ],}y| t|ƒ¡ W q tk
r:   Y qX qW |S )zRconvert a version string to a list of ints

    non-int segments are excluded
    Ú.)ÚsplitÚappendÚintÚ
ValueError)ÚversionÚvÚpartr
   r
   r   Ú_version_str_to_listb   s    
r3   c               @   s|   e Zd ZdZdZdddd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dd„ Zdd„ Zdd„ ZdS ) ÚV5toV4zAdapt msg protocol v5 to v4z4.1ZpyoutZpyinZpyerrÚobject_info_requestÚobject_info_reply)Zexecute_resultZexecute_inputr"   Úinspect_requestÚinspect_replyc             C   s$   |d   dd ¡ |d   dd ¡ |S )Nr   r0   Úparent_header)Úpop)r   r   r
   r
   r   r   |   s    zV5toV4.update_headerc             C   s¦   i }|d }x$dD ]}||krt || ƒ||< qW | dd¡dkrZd|krZt |d ƒ|d< | di ¡}| d	d¡}| d
|¡ d|krš| dt |d ƒ¡ ||d< |S )Nr    )Úlanguage_versionÚprotocol_versionÚimplementationr   ÚipythonÚimplementation_versionÚipython_versionÚlanguage_infoÚnameÚlanguager0   r;   )r3   r%   Ú
setdefault)r   r   Zv4cr    ÚkeyrA   rC   r
   r
   r   Úkernel_info_replyƒ   s    
zV5toV4.kernel_info_replyc             C   s   |d }|  dg ¡ |S )Nr    Úuser_variables)rD   )r   r   r    r
   r
   r   Úexecute_request”   s    zV5toV4.execute_requestc             C   s   |d }|  di ¡ |S )Nr    rG   )rD   )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 )Nr    r   r   r   Útextr   Ú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 )Nr    Úcursor_startÚ
cursor_endr   r   Úmatched_textÚmetadata)r:   )r   r   r    rN   rO   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 )Nr    r   r   ÚonameÚdetail_level)r   r   )r   r   r    r   r   r   r   rL   r
   r
   r   r5   µ   s    zV5toV4.object_info_requestc             C   s   dddœ|d< |S )z1inspect_reply can't be easily backward compatibleFÚunknown)ÚfoundrS   r    r
   )r   r   r
   r
   r   r6   À   s    zV5toV4.object_info_replyc             C   s   |d }|  d¡|d< |S )Nr    rJ   Údata)r:   )r   r   r    r
   r
   r   ÚstreamÇ   s    zV5toV4.streamc             C   sT   |d }|  dd¡ |d }d|krPyt |d ¡|d< W n tk
rN   Y nX |S )Nr    ÚsourceZdisplayrW   zapplication/json)rD   ÚjsonÚdumpsÚ	Exception)r   r   r    rW   r
   r
   r   Údisplay_dataÌ   s    zV5toV4.display_datac             C   s   |d   dd ¡ |S )Nr    Úpassword)r:   )r   r   r
   r
   r   Úinput_requestÚ   s    zV5toV4.input_requestN)r'   r(   r)   r*   r0   r   r   rF   rH   rI   rM   rR   r5   r6   rX   r]   r_   r
   r
   r
   r   r4   o   s$   	r4   c               @   s€   e Zd ZdZdZdd„ ej ¡ 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dd„ Zdd„ ZdS )ÚV4toV5zConvert msg spec V4 to V5z5.0c             C   s   i | ]\}}||“qS r
   r
   )Ú.0Úkr1   r
   r
   r   ú
<dictcomp>ä   s    zV4toV5.<dictcomp>c             C   s(   | j |d d< |d r$| j |d d< |S )Nr   r0   r9   )r0   )r   r   r
   r
   r   r   æ   s    zV4toV5.update_headerc             C   sÆ   |d }x,dD ]$}||krd  tt|| ƒ¡||< qW | dd¡ |d  d¡rnd|krnd	|d
< | d¡|d< | d¡}| di ¡}| d|¡ d|krºd  tt| d¡ƒ¡}| d|¡ d|d< |S )Nr    )r<   r@   r+   r<   z4.1rC   Zpythonr@   r>   r=   r?   rA   rB   r;   r0   r   Zbanner)ÚjoinÚmapÚstrrD   Ú
startswithr:   )r   r   r    rE   rC   rA   r;   r
   r
   r   rF   î   s     

zV4toV5.kernel_info_replyc             C   s:   |d }|  dg ¡}| di ¡}x|D ]}|||< q&W |S )Nr    rG   Úuser_expressions)r:   rD   )r   r   r    rG   rh   r1   r
   r
   r   rH     s    
zV4toV5.execute_requestc             C   s‚   |d }|  di ¡}| di ¡}|r.| |¡ xN| dg ¡D ]>}| dd ¡dkr<d|kr<d|krhi |d< | d¡|d d	< q<W |S )
Nr    rh   rG   ÚpayloadrY   ZpagerJ   rW   z
text/plain)rD   r:   Úupdater%   )r   r   r    rh   rG   ri   r
   r
   r   rI     s    
zV4toV5.execute_replyc             C   s0   |d }i  }|d< |d |d< |d |d< |S )Nr    r   r   r   r
   )r   r   Zold_contentrL   r
   r
   r   rM     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 )	Nr    r!   Úokr   rP   rN   rO   rQ   )r   )r   r   r    rL   r
   r
   r   rR   $  s    zV4toV5.complete_replyc             C   s@   |d }|d }i  }|d< ||d< t |ƒ|d< |d |d< |S )Nr    rS   r   r   rT   )r   )r   r   r    rB   rL   r
   r
   r   r7   5  s    zV4toV5.inspect_requestc             C   s¸   |d }ddi }|d< |d  }|d< i  |d< }i |d< |r´g }x(dD ] }|  |d¡rJ| || ¡ P qJW x(d	D ] }|  |d¡rt| || ¡ P qtW |s¦| d
¡ d |¡|d< |S )z1inspect_reply can't be easily backward compatibler    r!   rk   rV   rW   rQ   )Zcall_defZinit_definitionZ
definitionF)Zcall_docstringZinit_docstringZ	docstringz<empty docstring>Ú
z
text/plain)r%   r-   rd   )r   r   r    rL   rV   rW   ÚlinesrE   r
   r
   r   r8   ?  s&    


zV4toV5.inspect_replyc             C   s   |d }|  d¡|d< |S )Nr    rW   rJ   )r:   )r   r   r    r
   r
   r   rX   W  s    zV4toV5.streamc             C   sT   |d }|  dd ¡ |d }d|krPyt |d ¡|d< W n tk
rN   Y nX |S )Nr    rY   rW   zapplication/json)r:   rZ   Úloadsr\   )r   r   r    rW   r
   r
   r   r]   \  s    zV4toV5.display_datac             C   s   |d   dd¡ |S )Nr    r^   F)rD   )r   r   r
   r
   r   r_   j  s    zV4toV5.input_requestN)r'   r(   r)   r*   r0   r4   r   Úitemsr   rF   rH   rI   rM   rR   r7   r8   rX   r]   r_   r
   r
   r
   r   r`   ß   s   
r`   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.
    é   )Úutcnowr   Zdater0   r+   r   é   N)Zsessionrq   r.   r,   Úadaptersr%   )r   Z
to_versionrq   r   Zfrom_versionZadapterr
   r
   r   Úadaptp  s    
rt   ))é   rr   )rr   ru   )r*   ÚrerZ   Zjupyter_clientr   r   ÚcompileÚUNICODEr   r   ÚIr   r   Úobjectr   r3   r4   r`   rt   rs   r
   r
   r
   r   Ú<module>   s    +p #