B
    3¢\  ã               @   s   d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ G d	d
„ d
eƒZG dd„ deƒZdZde efdefgZdS )zÀTornado handlers for the sessions web service.

Preliminary documentation at https://github.com/ipython/ipython/wiki/IPEP-16%3A-Notebook-multi-directory-dashboard-and-URL-mapping#sessions-api
é    N)ÚgenÚwebé   )Ú
APIHandler)Údate_default)Úurl_path_join)ÚNoSuchKernelc               @   s4   e Zd Zejejdd„ ƒƒZejejdd„ ƒƒZdS )ÚSessionRootHandlerc             c   s.   | j }t | ¡ ¡V }|  tj|td¡ d S )N)Údefault)Úsession_managerr   Úmaybe_futureZlist_sessionsÚfinishÚjsonÚdumpsr   )ÚselfÚsmÚsessions© r   úBlib/python3.7/site-packages/notebook/services/sessions/handlers.pyÚget   s    zSessionRootHandler.getc             c   sê  | j }|  ¡ }|d kr"t dd¡‚d|krZd|d krZ| j d¡ |d d |d< d|d< y|d }W n  tk
r†   t dd¡‚Y nX y|d }W n  tk
r´   t dd¡‚Y nX | d	d ¡}| d
i ¡}| d	d ¡}| dd ¡}|sþ|sþ| j d¡ d }t	 
|j|d¡V }	|	r.t	 
|j|d¡V }nzy t	 
|j|||||d¡V }W nX tk
r¦   d| }
d| }| j d| ¡ |  d¡ |  t t|
|d¡¡ d S X t| jdd|d ƒ}|  d|¡ |  d¡ |  tj|td¡ d S )Ni  zNo JSON data providedÚnotebookÚpathz.Sessions API changed, see updated swagger docsÚtypez Missing field in JSON data: pathz Missing field in JSON data: typeÚnameÚkernelÚidz)No kernel specified, using default kernel)r   )r   Úkernel_nameÚ	kernel_idr   r   zfThe '%s' kernel is not available. Please pick another suitable kernel instead, or install that kernel.z%s not foundzKernel not found: %siõ  )ÚmessageZshort_messageZapir   ZLocationéÉ   )r
   )r   Úget_json_bodyr   Ú	HTTPErrorÚlogÚwarningÚKeyErrorr   Údebugr   r   Zsession_existsÚget_sessionZcreate_sessionr   Ú
set_statusr   r   r   Údictr   Zbase_urlZ
set_headerr   )r   r   Úmodelr   Zmtyper   r   r   r   ÚexistsÚmsgZ
status_msgÚlocationr   r   r   Úpost   sV    

zSessionRootHandler.postN)	Ú__name__Ú
__module__Ú__qualname__r   Úauthenticatedr   Ú	coroutiner   r-   r   r   r   r   r	      s   r	   c               @   sH   e Zd Zejejdd„ ƒƒZejejdd„ ƒƒZejejdd„ ƒƒZ	dS )ÚSessionHandlerc             c   s2   | j }t |j|d¡V }|  tj|td¡ d S )N)Ú
session_id)r
   )r   r   r   r&   r   r   r   r   )r   r4   r   r)   r   r   r   r   [   s    zSessionHandler.getc       	      c   s¾  | j }| j}|  ¡ }|dkr(t dd¡‚t |j|d¡V }i }d|krxd|d krx| j 	d¡ |d d |d< d|d< d|krŒ|d |d< d	|kr |d	 |d	< d|kr´|d |d< d
|krH|d
  
d¡dk	rþ|d
 d }||krôt dd| ¡‚||d< nJ|d
  
d	¡dk	rH|d
 d	 }|j|||d	 |d |d dV }||d< t |j|f|Ž¡V  t |j|d¡V }|d
 d |d
 d kr¦t | |d
 d ¡¡V  |  tj|td¡ dS )z™Patch updates sessions:

        - path updates session to track renamed paths
        - kernel.name starts a new kernel with a given kernelspec
        Ni  zNo JSON data provided)r4   r   r   z.Sessions API changed, see updated swagger docsr   r   r   r   zNo such kernel: %sr   )r   r   r   r   )r
   )r   Zkernel_managerr    r   r!   r   r   r&   r"   r#   r   Zstart_kernel_for_sessionZupdate_sessionZshutdown_kernelr   r   r   r   )	r   r4   r   Zkmr)   ZbeforeZchangesr   r   r   r   r   Úpatchc   sF    


zSessionHandler.patchc             c   sT   | j }yt | |¡¡V  W n  tk
r<   t dd¡‚Y nX |  d¡ |  ¡  d S )Niš  zKernel deleted before sessionéÌ   )	r   r   r   Zdelete_sessionr$   r   r!   r'   r   )r   r4   r   r   r   r   Údelete˜   s    
zSessionHandler.deleteN)
r.   r/   r0   r   r1   r   r2   r   r5   r7   r   r   r   r   r3   Y   s   4r3   z#(?P<session_id>\w+-\w+-\w+-\w+-\w+)z/api/sessions/%sz/api/sessions)Ú__doc__r   ÚosZtornador   r   Zbase.handlersr   Zjupyter_client.jsonutilr   Znotebook.utilsr   Zjupyter_client.kernelspecr   r	   r3   Z_session_id_regexZdefault_handlersr   r   r   r   Ú<module>   s   EQ
