ó
¬X[c           @   s4  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 d d l m Z m Z m Z m Z m Z m Z m Z m Z d d	 „ Z d
 „  Z i e j d ƒ d 6e j d ƒ d 6e j d ƒ d 6Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d Z d S(   s*   Tornado handlers for extension management.iÿÿÿÿN(   t   ThreadPoolExecutor(   t
   APIHandler(   t   gent   web(   t   IOLoopi   (   t   get_app_infot   install_extensiont   uninstall_extensiont   enable_extensiont   disable_extensiont   read_packaget   _AppHandlert&   get_latest_compatible_package_versionsc   	      C   sP   t  d |  d | d | d | d | d | d | ƒ } | d	 k	 rL | | d <n  | S(
   s8   Create an extension entry that can be sent to the clientt   namet   descriptiont   enabledt   coret   latest_versiont   installed_versiont   statust	   installedN(   t   dictt   None(	   R   R   R   R   R   R   R   R   t   ret(    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyt   _make_extension_entry   s    	c         C   s#   t  | | ƒ } | j ƒ  |  d <d S(   s0   Ensure that the app info has compat_errors fieldt   compat_errorsN(   R   t   _get_extension_compat(   t   infot   app_dirt   loggert   handler(    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyt   _ensure_compat_errors(   s    s*   (?P<name>.*) needs to be included in buildt   installs+   (?P<name>.*) needs to be removed from buildt	   uninstalls:   (?P<name>.*) changed from (?P<oldver>.*) to (?P<newver>.*)t   updatec   	      C   s    t  |  | ƒ } | j d t ƒ } i g  d 6g  d 6g  d 6} x] | D]U } xL t j ƒ  D]> \ } } | j | ƒ } | rV | | j | j d ƒ ƒ qV qV WqC W| S(   s8   Get info about packages scheduled for (un)install/updatet   fastR    R!   R"   R   (   R   t   build_checkt   Truet   _message_mapt   itemst   matcht   appendt   group(	   R   R   R   t   messagesR   t   msgt   keyt   patternR(   (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyt   _build_check_info4   s    %t   ExtensionManagerc           B   sÂ   e  Z e d  d ƒ Z d „  Z e j d „  ƒ Z e j d „  ƒ Z e j d „  ƒ Z	 e j d „  ƒ Z
 e j d „  ƒ Z e j d „  ƒ Z d	 „  Z d
 „  Z e j d „  ƒ Z e j d „  ƒ Z RS(   t   max_workersi   c         C   s   | |  _  | |  _ d  |  _ d  S(   N(   t   logR   R   t	   _outdated(   t   selfR2   R   (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyt   __init__E   s    		c   	      c   s´  t  d |  j d |  j ƒ } t |  j |  j ƒ } t | |  j |  j ƒ g  } xÒ | d j ƒ  D]À \ } } d } |  j | | ƒ V} | d j | d ƒ r¡ d } n, x) | j	 ƒ  D] } | | k r® d } q® q® W| j
 t d | d	 | d	 d
 | | d k d t d | d d | d d | ƒ ƒ q] Wx} | d D]q } |  j | ƒ V} | d k	 r,| j
 t d | d	 | d	 d t d
 t d t d | d d | d d d ƒ ƒ q,q,Wt j | ƒ ‚ d S(   s-   Handle a request for all installed extensionsR   R   t
   extensionst   okR   t   errort   warningR   R   R   t   disabledR   R   R   t   versionR   R!   R   N(   R   R   R2   R/   R   R'   t   _get_pkg_infot   getR   t   valuesR)   R   t   Falset   _get_scheduled_uninstall_infoR   t   Return(	   R4   R   t   build_check_infoR6   R   t   dataR   t   pkg_infot   packages(    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyt   list_extensionsL   sB    	





c         C   sv   y  t  | d |  j d |  j ƒWn7 t k
 rY } t j t d d d t | ƒ ƒ ƒ ‚ n Xt j t d d ƒ ƒ ‚ d S(   s    Handle an install/update requestR   R   R   R8   t   messageR7   N(   R   R   R2   t
   ValueErrorR   RA   R   t   str(   R4   t	   extensiont   e(    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyR    w   s
     (c         C   sF   t  | d |  j d |  j ƒ} t j t d | r6 d n d ƒ ƒ ‚ d S(   s   Handle an uninstall requestR   R   R   R7   R8   N(   R   R   R2   R   RA   R   (   R4   RJ   t   did_uninstall(    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyR!   €   s    c         C   s8   t  | d |  j d |  j ƒt j t d d ƒ ƒ ‚ d S(   s   Handle an enable requestR   R   R   R7   N(   R   R   R2   R   RA   R   (   R4   RJ   (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyt   enable†   s    c         C   s8   t  | d |  j d |  j ƒt j t d d ƒ ƒ ‚ d S(   s   Handle a disable requestR   R   R   R7   N(   R	   R   R2   R   RA   R   (   R4   RJ   (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyt   disableŒ   s    c         c   sa   t  | d ƒ } |  j ƒ  V} | r@ | | k r@ | | | d <n | d | d <t j | ƒ ‚ d S(   s   Get information about a packaget   pathR   R;   N(   R
   t   _get_outdatedR   RA   (   R4   R   RC   R   t   outdated(    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyR<   ’   s    c         C   s(   |  j  d k r! |  j ƒ  |  _  n  |  j  S(   sí   Get 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(   R3   R   t   _load_outdated(   R4   (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyRP   ¡   s    c         C   s   |  j  ƒ  |  _ |  j S(   N(   RR   R3   (   R4   (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyt   refresh_outdated®   s    c         c   sl   t  d |  j d |  j ƒ } t | d j ƒ  ƒ } |  j j t | d |  j d |  j ƒV} t j	 | ƒ ‚ d S(   s!   Get the latest compatible versionR   R   R6   N(
   R   R   R2   t   tuplet   keyst   executort   submitR   R   RA   (   R4   R   t   namesRC   (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyRR   ²   s    		c         C   sv   t  j j |  j d d | d ƒ } t  j j | ƒ rc t | ƒ  } t j t j	 | ƒ ƒ ‚ Wd QXn t j d ƒ ‚ d S(   sD   Get information about a package that is scheduled for uninstallationt   stagingt   node_moduless   package.jsonN(   t   osRO   t   joinR   t   existst   openR   RA   t   jsont   loadR   (   R4   R   t   targett   fid(    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyR@   ¿   s    	!(   t   __name__t
   __module__R    RV   R5   R   t	   coroutineRF   R    R!   RM   RN   R<   RP   RS   RR   R@   (    (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyR0   B   s   	+			t   ExtensionHandlerc           B   sG   e  Z d  „  Z e j e j d „  ƒ ƒ Z e j e j d „  ƒ ƒ Z RS(   c         C   s   | |  _  d  S(   N(   t   manager(   R4   Rg   (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyt
   initializeÍ   s    c         c   sS   |  j  d t ƒ d k r) |  j j ƒ  Vn  |  j j ƒ  V} |  j t j | ƒ ƒ d S(   s2   GET query returns info on all installed extensionst   refresht   1N(   t   get_argumentR?   Rg   RS   RF   t   finishR_   t   dumps(   R4   R6   (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyR=   Ð   s    c         c   sf  |  j  ƒ  } | d } | d } | d k s3 | rR t j d d | | f ƒ ‚ n  d } yŒ | d k r} |  j j | ƒ V} nf | d k rŸ |  j j | ƒ V} nD | d k rÁ |  j j | ƒ V} n" | d k rã |  j j | ƒ V} n  WnI t	 j
 k
 r} | j } n+ t k
 r/} t j d	 t | ƒ ƒ ‚ n X| d k rL|  j d
 ƒ n |  j t j | ƒ ƒ d S(   s5   POST query performs an action on a specific extensiont   cmdt   extension_nameR    R!   RM   RN   i¦  s6   Could not process instrution %r with extension name %riô  iÈ   N(   R    R!   RM   RN   (   t   get_json_bodyR   t	   HTTPErrorR   Rg   R    R!   RM   RN   R   RA   t   valuet	   ExceptionRI   t
   set_statusRl   R_   Rm   (   R4   RC   Rn   R   t	   ret_valueRK   (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyt   postÙ   s2    

(	   Rc   Rd   Rh   R   t   authenticatedR   Re   R=   Rv   (    (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyRf   Ë   s
   	s   /lab/api/extensions(    t   __doc__R_   R[   t   ret   concurrent.futuresR    t   notebook.base.handlersR   t   tornadoR   R   t   tornado.ioloopR   t   commandsR   R   R   R   R	   R
   R   R   R   R   R   t   compileR&   R/   t   objectR0   Rf   t   extensions_handler_path(    (    (    sC   lib/python2.7/site-packages/jupyterlab/extension_manager_handler.pyt   <module>   s$   :		‰4