B
    2‹dí4  ã               @   s,  d Z ddlZddl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	 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eƒ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 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)r   r   ÚlineÚn© r   úc/work/yifan.wang/ringdown/master-ringdown-env/lib/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 )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 )Nr   )Úselfr   r   r   r   Úupdate_headerC   s    zAdapter.update_headerc             C   s   |S )Nr   )r   r   r   r   r   Úupdate_metadataF   s    zAdapter.update_metadatac             C   s4   |d }|d }|| j kr0| j |  |d< |d< |S )NÚheaderÚmsg_type)r   )r   r   r!   r"   r   r   r   Úupdate_msg_typeI   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_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>   Ú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$   r,   r   r   r   r   r   ;   s   
    r   )Úversionr	   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)r3   Ú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 v4z4.1ZpyoutZpyinZpyerrÚobject_info_requestÚobject_info_reply)Zexecute_resultZexecute_inputr(   Úinspect_requestÚinspect_reply)r   r	   c             C   s$   |d   dd ¡ |d   dd ¡ |S )Nr!   r3   Ú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Úlanguager3   rC   )r;   r*   Ú
setdefault)r   r   Zv4cr%   ÚkeyrI   rK   r   r   r   Úkernel_info_reply‰   s    
zV5toV4.kernel_info_replyc             C   s   |d }|  dg ¡ |S )Nr%   Úuser_variables)rL   )r   r   r%   r   r   r   Úexecute_request™   s    zV5toV4.execute_requestc             C   s   |d }|  di ¡ |S )Nr%   rO   )rL   )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)rB   )r   r   r%   rV   rW   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   rT   r   r   r   r=   º   s    zV5toV4.object_info_requestc             C   s   dddœ|d< |S )z1inspect_reply can't be easily backward compatibleFÚunknown)Úfoundr[   r%   r   )r   r   r   r   r   r>   Å   s    zV5toV4.object_info_replyc             C   s   |d }|  d¡|d< |S )Nr%   rR   Údata)rB   )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%   ÚsourceÚdisplayr_   zapplication/json)rL   ÚjsonÚdumpsÚ	Exception)r   r   r%   r_   r   r   r   Údisplay_dataÑ   s    zV5toV4.display_datac             C   s   |d   dd ¡ |S )Nr%   Úpassword)rB   )r   r   r   r   r   Úinput_requestß   s    zV5toV4.input_requestN)r-   r.   r/   r0   r3   r   r   r1   r   r   rN   rP   rQ   rU   rZ   r=   r>   r`   rf   rh   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Úkr9   r   r   r   ú
<dictcomp>ê   s    zV4toV5.<dictcomp>)r   r	   c             C   s(   | j |d d< |d r$| j |d d< |S )Nr!   r3   rA   )r3   )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%   )rD   rH   r4   rD   z4.1rK   ÚpythonrH   rF   rE   rG   rI   rJ   rC   r3   r
   Zbanner)ÚjoinÚmapr1   rL   Ú
startswithrB   )r   r   r%   rM   rK   rI   rC   r   r   r   rN   ô   s     

zV4toV5.kernel_info_replyc             C   s:   |d }|  dg ¡}| di ¡}x|D ]}|||< q&W |S )Nr%   rO   Úuser_expressions)rB   rL   )r   r   r%   rO   rq   r9   r   r   r   rP   
  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%   rq   rO   Úpayloadra   ÚpagerR   r_   z
text/plain)rL   rB   Úupdater*   )r   r   r%   rq   rO   rr   r   r   r   rQ     s    
zV4toV5.execute_replyc             C   s0   |d }i  }|d< |d |d< |d |d< |S )Nr%   r   r   r   r   )r   r   Zold_contentrT   r   r   r   rU   "  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   rX   rV   rW   rY   )r   )r   r   r%   rT   r   r   r   rZ   *  s    zV4toV5.complete_replyc             C   s@   |d }|d }i  }|d< ||d< t |ƒ|d< |d |d< |S )Nr%   r[   r   r   r\   )r   )r   r   r%   rJ   rT   r   r   r   r?   ;  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&   ru   r^   r_   rY   )Zcall_defZinit_definitionZ
definitionF)Zcall_docstringZinit_docstringZ	docstringz<empty docstring>Ú
z
text/plain)r*   r6   rn   )r   r   r%   rT   r^   r_   ÚlinesrM   r   r   r   r@   E  s&    


zV4toV5.inspect_replyc             C   s   |d }|  d¡|d< |S )Nr%   r_   rR   )rB   )r   r   r%   r   r   r   r`   ]  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%   ra   r_   zapplication/json)rB   rc   Úloadsre   )r   r   r%   r_   r   r   r   rf   b  s    zV4toV5.display_datac             C   s   |d   dd¡ |S )Nr%   rg   F)rL   )r   r   r   r   r   rh   p  s    zV4toV5.input_requestN)r-   r.   r/   r0   r3   r<   r   Úitemsr   r1   r   r   rN   rP   rQ   rU   rZ   r?   r@   r`   rf   rh   r   r   r   r   ri   ä   s          
   ri   )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.
    é   )Úutcnowr!   Údater3   r4   r   é   N)Úsessionr|   r7   r5   Úadaptersr*   )r   rz   r|   r!   Zfrom_versionÚadapterr   r   r   Úadaptu  s    
r‚   ))é   r~   )r~   rƒ   )r0   rc   ÚreÚtypingr   r   r   r   Zjupyter_clientr   r1   r7   r   ÚcompileÚUNICODEr   r   ÚIr   r   Úobjectr   r;   r<   ri   r‚   r€   r   r   r   r   Ú<module>   s(   ,o *$