B
    [6                 @   s   d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZ dd	lmZmZmZ G d
d deZG dd deZdZdS )z-Tornado handlers for frontend config storage.    )ThreadPoolExecutorN)Event)
APIHandler)genweb)run_on_executor   )buildcleanbuild_checkc               @   st   e Zd ZdZeddZdZdZdZdZ	dd Z
ejdd Zejd	d
 Zejdd Zedd Zedd ZdS )BuilderF   )Zmax_workersNc             C   s   || _ || _|| _d S )N)log	core_modeapp_dir)selfr   r   r    r   7lib/python3.7/site-packages/jupyterlab/build_handler.py__init__   s    zBuilder.__init__c          
   #   s    j rttddd jr0ttdddyR  j jV }|rLdnd}|rt jd  fdd|D  n j	d	 W n6 t
k
r } z jd
 d}g }W d d }~X Y nX tt|d|dd S )NZstable )statusmessagebuildingZneededzBuild recommendedc                s   g | ]} j |qS r   )r   warn).0m)r   r   r   
<listcomp>)   s    z&Builder.get_status.<locals>.<listcomp>zBuild is up to datez:Could not determine jupyterlab build status without nodejs
)r   r   ZReturndictr   _run_build_checkr   r   r   info
ValueErrorjoin)r   Zmessagesr   er   )r   r   
get_status   s"    zBuilder.get_statusc          
   c   s   | j rtd| jsd| _t  | _}d| _t  | _}zly"| 	| j
| j|V  |d W nD tk
r } z&t|dkr|d n
|| W d d }~X Y nX W d d| _X y| jV  W n& tk
r } z|W d d }~X Y nX d S )NzCancel in progressFTZAborted)
_cancelingr!   r   canceledr   ZFuture_futurer   _kill_event
_run_buildr   r   Z
set_result	ExceptionstrZset_exception)r   ZfutureZevtr#   r   r   r   r	   5   s&     zBuilder.buildc             c   s,   | j stdd| _| jV  d| _d| _d S )NzNo current buildTF)r   r!   r%   r'   r&   )r   r   r   r   cancelM   s    zBuilder.cancelc             C   s   t ||dS )N)r   logger)r   )r   r   r-   r   r   r   r   V   s    zBuilder._run_build_checkc          
   C   sj   t |||dd}y
tf |S  tk
rd } z,| j r:d S | jd t| tf |S d }~X Y nX d S )Nr	   )r   r-   
kill_eventZcommandz)Build failed, running a clean and rebuild)r   r	   r*   r(   Zis_setr   r   r
   )r   r   r-   r.   kwargsr#   r   r   r   r)   Z   s    

zBuilder._run_build)__name__
__module____qualname__r   r   Zexecutorr&   r%   r(   r'   r   r   	coroutiner$   r	   r,   r   r   r)   r   r   r   r   r      s   
	r   c               @   sP   e Zd Zd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 )
BuildHandlerc             C   s
   || _ d S )N)builder)r   r5   r   r   r   
initializei   s    zBuildHandler.initializec             c   s    | j  V }| t| d S )N)r5   r$   Zfinishjsondumps)r   datar   r   r   getl   s    zBuildHandler.getc          
   c   s^   | j d y| j V  W n2 tk
rN } ztdt|W d d }~X Y nX | d d S )NzCanceling buildi     )	r   r   r5   r,   r*   r   	HTTPErrorr+   
set_status)r   r#   r   r   r   deleter   s    "zBuildHandler.deletec          
   c   s~   | j d y| j V  W n2 tk
rN } ztdt|W d d }~X Y nX | jjrdtdd| j d | 	d d S )NzStarting buildi  i  zBuild canceledzBuild succeeded   )
r   debugr5   r	   r*   r   r<   r+   r&   r=   )r   r#   r   r   r   post|   s    "zBuildHandler.postN)r0   r1   r2   r6   r   Zauthenticatedr   r3   r:   r>   rA   r   r   r   r   r4   g   s   	r4   z/lab/api/build)__doc__Zconcurrent.futuresr   r7   Z	threadingr   Znotebook.base.handlersr   Ztornador   r   Ztornado.concurrentr   Zcommandsr	   r
   r   objectr   r4   Z
build_pathr   r   r   r   <module>   s   W&