B
    [$                 @   s   d Z ddlZddl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mZmZmZmZmZmZmZ ddd	Zd
d ZedededdZdd ZG dd deZG dd deZdZdS )z*Tornado handlers for extension management.    N)ThreadPoolExecutor)
APIHandler)genweb   )get_app_infoinstall_extensionuninstall_extensionenable_extensiondisable_extensionread_package_AppHandler&get_latest_compatible_package_versionsc	       
   
   C   s,   t | |||||||d}	|dk	r(||	d< |	S )z8Create an extension entry that can be sent to the client)namedescriptionurlenabledcorelatest_versioninstalled_versionstatusN	installed)dict)
r   r   r   r   r   r   r   r   r   Zret r   Clib/python3.7/site-packages/jupyterlab/extension_manager_handler.py_make_extension_entry   s    r   c             C   s   t ||}| | d< dS )z0Ensure that the app info has compat_errors fieldcompat_errorsN)r   Z_get_extension_compat)infoapp_dirloggerhandlerr   r   r   _ensure_compat_errors(   s    
r!   z*(?P<name>.*) needs to be included in buildz+(?P<name>.*) needs to be removed from buildz:(?P<name>.*) changed from (?P<oldver>.*) to (?P<newver>.*))install	uninstallupdatec       	      C   sl   t | |}|jdd}g g g d}xD|D ]<}x6t D ]*\}}||}|r6|| |d q6W q(W |S )z8Get info about packages scheduled for (un)install/updateT)Zfast)r"   r#   r$   r   )r   Zbuild_check_message_mapitemsmatchappendgroup)	r   r   r    Zmessagesr   msgkeypatternr'   r   r   r   _build_check_info4   s    


r-   c               @   s   e Zd ZeddZdd Zejdd Zejdd Z	ejd	d
 Z
ejdd Zejdd Zejdd Zdd Zdd Zejdd Zejdd ZdS )ExtensionManagerr   )Zmax_workersc             C   s   || _ || _d | _d S )N)logr   	_outdated)selfr/   r   r   r   r   __init__E   s    zExtensionManager.__init__c       	      c   s0  t | j| jd}t| j| j}t|| j| j g }x|d  D ]\}}d}| ||V }|d |drpd}nx| D ]}||krzd}qzW |	t
||d |d	 ||d
 kd|d |d |d q@W xX|d D ]L}| |V }|dk	r|	t
||d |ddddd|d |d dd	 qW t|dS )z-Handle a request for all installed extensions)r   r   
extensionsokr   NerrorZwarningr   r   ZdisabledFr   version)r   r   r   r   r   r   r   r   r#   Zhomepage )	r   r   r   r   r   r   r   r   r   )r   r   r/   r-   r!   r&   _get_pkg_infogetvaluesr(   r   _get_scheduled_uninstall_infor   Return)	r1   r   Zbuild_check_infor3   r   datar   Zpkg_infoZpackagesr   r   r   list_extensionsL   sF    

z ExtensionManager.list_extensionsc          
   C   sd   yt || j| jd W n8 tk
rN } zttdt|dW dd}~X Y nX ttdddS )z Handle an install/update request)r   r   r5   )r   messageNr4   )r   )r   r   r/   
ValueErrorr   r<   r   str)r1   	extensioner   r   r   r"   y   s
    (zExtensionManager.installc             C   s.   t || j| jd}tt|r dndddS )zHandle an uninstall request)r   r   r4   r5   )r   N)r	   r   r/   r   r<   r   )r1   rB   Zdid_uninstallr   r   r   r#      s    zExtensionManager.uninstallc             C   s&   t || j| jd ttdddS )zHandle an enable request)r   r   r4   )r   N)r
   r   r/   r   r<   r   )r1   rB   r   r   r   enable   s    zExtensionManager.enablec             C   s&   t || j| jd ttdddS )zHandle a disable request)r   r   r4   )r   N)r   r   r/   r   r<   r   )r1   rB   r   r   r   disable   s    zExtensionManager.disablec             c   sJ   t |d }|  V }|r0||kr0|| |d< n|d |d< t|dS )zGet information about a packagepathr   r6   N)r   _get_outdatedr   r<   )r1   r   r=   r   Zoutdatedr   r   r   r8      s    
zExtensionManager._get_pkg_infoc             C   s   | j dkr|  | _ | j S )zGet a Future to information from `npm/yarn outdated`.

        This will cache the results. To refresh the cache, set
        self._outdated to None before calling. To bypass the cache,
        call self._load_outdated directly.
        N)r0   _load_outdated)r1   r   r   r   rG      s    

zExtensionManager._get_outdatedc             C   s   |   | _| jS )N)rH   r0   )r1   r   r   r   refresh_outdated   s    
z!ExtensionManager.refresh_outdatedc             c   sH   t | j| jd}t|d  }| jjt|| j| jdV }t	|dS )z!Get the latest compatible version)r   r   r3   N)
r   r   r/   tuplekeysexecutorZsubmitr   r   r<   )r1   r   namesr=   r   r   r   rH      s    zExtensionManager._load_outdatedc          	   C   sV   t j| jdd|d}t j|rHt|}tt	|W dQ R X n
tddS )zDGet information about a package that is scheduled for uninstallationZstagingZnode_moduleszpackage.jsonN)
osrF   joinr   existsopenr   r<   jsonload)r1   r   targetZfidr   r   r   r;      s    
z.ExtensionManager._get_scheduled_uninstall_infoN)__name__
__module____qualname__r   rL   r2   r   	coroutiner>   r"   r#   rD   rE   r8   rG   rI   rH   r;   r   r   r   r   r.   B   s   
-	r.   c               @   s<   e Zd Zdd Zejejdd Zejejdd Z	dS )ExtensionHandlerc             C   s
   || _ d S )N)manager)r1   rZ   r   r   r   
initialize   s    zExtensionHandler.initializec             c   s<   |  dddkr| j V  | j V }| t| dS )z2GET query returns info on all installed extensionsZrefreshF1N)Zget_argumentrZ   rI   r>   finishrR   dumps)r1   r3   r   r   r   r9      s    zExtensionHandler.getc          
   c   s$  |   }|d }|d }|dks$|s8tdd||f d}yb|dkrV| j|V }nF|dkrn| j|V }n.|d	kr| j|V }n|d
kr| j|V }W nZ tj	k
r } z
|j
}W dd}~X Y n2 tk
r } ztdt|W dd}~X Y nX |dkr| d n| t| dS )z5POST query performs an action on a specific extensioncmdZextension_name)r"   r#   rD   rE   i  z6Could not process instrution %r with extension name %rNr"   r#   rD   rE   i     )Zget_json_bodyr   Z	HTTPErrorrZ   r"   r#   rD   rE   r   r<   value	ExceptionrA   Z
set_statusr]   rR   r^   )r1   r=   r_   r   Z	ret_valuerC   r   r   r   post   s2    "
zExtensionHandler.postN)
rU   rV   rW   r[   r   Zauthenticatedr   rX   r9   rc   r   r   r   r   rY      s
   rY   z/lab/api/extensions)N)__doc__rR   rN   reZconcurrent.futuresr   Znotebook.base.handlersr   Ztornador   r   Zcommandsr   r   r	   r
   r   r   r   r   r   r!   compiler%   r-   objectr.   rY   Zextensions_handler_pathr   r   r   r   <module>   s"   (
 4