ó
Ýŕ]c           @   sť  d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z e j j	 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 l m Z d d l m Z m Z m Z e rč d n d Z d	 e f d
     YZ e j d e j  Z  d   Z! d Z" d   Z# d   Z$ d e% f d     YZ& d e f d     YZ' d   Z( d   Z) d e+ e+ d d  Z, e' j, j  e, _  e+ d  Z- e' j- j  e- _  d S(   s   Tools for managing kernel specsi˙˙˙˙N(   t   PY3(   t	   HasTraitst   Listt   Unicodet   Dictt   Sett   Boolt   Typet   CaselessStrEnum(   t   LoggingConfigurable(   t   jupyter_data_dirt   jupyter_patht   SYSTEM_JUPYTER_PATHt   python3t   python2t
   KernelSpecc           B   sw   e  Z e   Z e   Z e   Z e   Z e   Z	 e
 d  d g d d Z e   Z e d    Z d   Z d   Z RS(   t   messaget   signalt   default_valuec         C   sO   t  | d  } t j | d d d  } t j |  } Wd QX|  d | |  S(   s|   Create a KernelSpec object by reading kernel.json

        Pass the path to the *directory* containing kernel.json.
        s   kernel.jsont   rt   encodings   utf-8Nt   resource_dir(   t   pjoint   iot   opent   jsont   load(   t   clsR   t   kernel_filet   ft   kernel_dict(    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   from_resource_dir'   s    c         C   sC   t  d |  j d |  j d |  j d |  j d |  j d |  j  } | S(   Nt   argvt   envt   display_namet   languaget   interrupt_modet   metadata(   t   dictR    R!   R"   R#   R$   R%   (   t   selft   d(    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   to_dict2   s    				c         C   s   t  j |  j    S(   sO   Serialise this kernelspec to a JSON object.

        Returns a string.
        (   R   t   dumpsR)   (   R'   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   to_json=   s    (   t   __name__t
   __module__R   R    R   R"   R#   R   R!   R   R   R$   R%   t   classmethodR   R)   R+   (    (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyR      s   							s   ^[a-z0-9._\-]+$c         C   s   t  j |   S(   s"   Check that a kernel name is valid.(   t   _kernel_name_patt   match(   t   name(    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   _is_valid_kernel_nameG   s    su   Kernel names can only contain ASCII letters and numbers and these separators: - . _ (hyphen, period, and underscore).c         C   s+   t  j j |   o* t  j j t |  d   S(   s   Is ``path`` a kernel directory?s   kernel.json(   t   ost   patht   isdirt   isfileR   (   R4   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   _is_kernel_dirQ   s    c         C   sŞ   |  d k s t j j |   r# i  Si  } xz t j |   D]i } t |  |  } t |  s` q9 n  | j   } t |  s t	 j
 d t | f d d n  | | | <q9 W| S(   s   Return a mapping of kernel names to resource directories from dir.

    If dir is None or does not exist, returns an empty dict.
    s*   Invalid kernelspec directory name (%s): %st
   stackleveli   N(   t   NoneR3   R4   R5   t   listdirR   R7   t   lowerR2   t   warningst   warnt   _kernel_name_description(   t   dirt   kernelsR   R4   t   key(    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   _list_kernels_inV   s    	t   NoSuchKernelc           B   s   e  Z d    Z d   Z RS(   c         C   s   | |  _  d  S(   N(   R1   (   R'   R1   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   __init__l   s    c         C   s   d j  |  j  S(   Ns   No such kernel named {}(   t   formatR1   (   R'   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   __str__o   s    (   R,   R-   RD   RF   (    (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyRC   k   s   	t   KernelSpecManagerc           B   sď   e  Z e e d  e d d Z e e d  e d d Z e   Z	 d   Z
 e   Z d   Z e d  e d d  Z e d d  Z d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z e d d  Z d e d d d  Z e d  Z RS(   t   configt   helps   The kernel spec class.  This is configurable to allow
        subclassing of the KernelSpecManager for customized behavior.
        s   If there is no Python kernelspec registered and the IPython
        kernel is available, ensure it is added to the spec list.
        c         C   s   t    S(   N(   R
   (   R'   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   _data_dir_default   s    c         C   s   t  |  j d  S(   NR@   (   R   t   data_dir(   R'   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   _user_kernel_dir_default   s    sc   Whitelist of allowed kernel names.

        By default, all installed kernels are allowed.
        sL   List of kernel directories to search. Later ones take priority over earlier.c         C   s   t  d  } y d d l m } Wn? t k
 ra y d d l m } Wqb t k
 r] d  } qb Xn X| d  k	 r | j t j j	 |   d   n  | S(   NR@   i˙˙˙˙(   t   get_ipython_dir(
   R   t   IPython.pathsRM   t   ImportErrort   IPython.utils.pathR9   t   appendR3   R4   t   join(   R'   t   dirsRM   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   _kernel_dirs_default   s    "c            s  i  } xi   j  D]^ } t |  } xI | j   D]; \ } } | | k r/   j j d | |  | | | <q/ q/ Wq W  j rĺ t | k rĺ y4 d d l m }   j j d t |  | | t <Wqĺ t	 k
 rá   j j
 d t  qĺ Xn    j r  f d   | j   D } n  | S(   s<   Returns a dict mapping kernel names to resource directories.s   Found kernel %s in %si˙˙˙˙(   t	   RESOURCESs$   Native kernel (%s) available from %ss#   Native kernel (%s) is not availablec            s.   i  |  ]$ \ } } |   j  k r | |  q S(    (   t	   whitelist(   t   .0R1   t   spec(   R'   (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pys
   <dictcomp>ˇ   s   	 (   t   kernel_dirsRB   t   itemst   logt   debugt   ensure_native_kernelt   NATIVE_KERNEL_NAMEt   ipykernel.kernelspecRU   RO   t   warningRV   (   R'   R(   t
   kernel_dirR@   t   knameRX   RU   (    (   R'   s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   find_kernel_specs˘   s$    
	c         C   so   | t  k r_ y d d l m } m } Wn t k
 r9 q_ X| | k r_ |  j d | |    Sn  |  j j |  S(   sb    Returns a :class:`KernelSpec` instance for a given kernel_name
        and resource_dir.
        i˙˙˙˙(   RU   t   get_kernel_dictR   (   R^   R_   RU   Rd   RO   t   kernel_spec_classR   (   R'   t   kernel_nameR   RU   Rd   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   _get_kernel_spec_by_nameť   s    c         C   sâ   x  |  j  D] } y t j |  } Wn7 t k
 r\ } | j t j t j f k rV q
 n    n Xx? | D]7 } t | |  } | j   | k rd t	 |  rd | Sqd Wq
 W| t
 k rŢ y d d l m } Wn t k
 rÖ qŢ X| Sn  d S(   s2   Find the resource directory of a named kernel speci˙˙˙˙(   RU   N(   RY   R3   R:   t   OSErrort   errnot   ENOTDIRt   ENOENTR   R;   R7   R^   R_   RU   RO   (   R'   Rf   Ra   t   filest   eR   R4   RU   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   _find_spec_directoryË   s"    c         C   se   t  |  s% |  j j d | t  n  |  j | j    } | d k rU t |   n  |  j | |  S(   s   Returns a :class:`KernelSpec` instance for the given kernel_name.

        Raises :exc:`NoSuchKernel` if the given kernel name is not found.
        s!   Kernelspec name %r is invalid: %sN(	   R2   R[   R`   R>   Rn   R;   R9   RC   Rg   (   R'   Rf   R   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   get_kernel_specá   s    
c         C   sľ   |  j    } i  } x | j   D] \ } } yU |  j t k rR |  j | |  } n |  j |  } i | d 6| j   d 6| | <Wq t k
 rŹ |  j j	 d | d t
 q Xq W| S(   s*  Returns a dict mapping kernel names to kernelspecs.

        Returns a dict of the form::

            {
              'kernel_name': {
                'resource_dir': '/path/to/kernel_name',
                'spec': {"the spec itself": ...}
              },
              ...
            }
        R   RX   s   Error loading kernelspec %rt   exc_info(   Rc   RZ   t	   __class__RG   Rg   Ro   R)   t	   ExceptionR[   R`   t   True(   R'   R(   t   resRb   R   RX   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   get_all_specsđ   s    !c         C   s   |  j  } z t |  _  |  j   } Wd | |  _  X| | } |  j j d |  t j j |  rn t j |  n t	 j
 |  | S(   s\   Remove a kernel spec directory by name.

        Returns the path that was deleted.
        Ns   Removing %s(   R]   t   FalseRc   R[   R\   R3   R4   t   islinkt   removet   shutilt   rmtree(   R'   R1   t   save_nativet   specst   spec_dir(    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   remove_kernel_spec  s    		

c         C   sh   | r t  j j |  j |  S| rJ t  j j t  j j |  d d d |  St  j j t d d |  Sd  S(   Nt   sharet   jupyterR@   i    (   R3   R4   RR   t   user_kernel_dirt   abspathR   (   R'   Rf   t   usert   prefix(    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   _get_destination_dir$  s
    (c         C   se  | j  d  } | s* t j j |  } n  | j   } t |  s[ t d | t f   n  | rv | rv t d   n  | d k	 r t	 j
 d t d d n  |  j | d | d | } |  j j d	 |  t j j |  } | |  j k r|  j j d
 | |  j  n  t j j |  r;|  j j d |  t j |  n  t j | |  |  j j d | |  | S(   s#  Install a kernel spec by copying its directory.

        If ``kernel_name`` is not given, the basename of ``source_dir`` will
        be used.

        If ``user`` is False, it will attempt to install into the systemwide
        kernel registry. If the process does not have appropriate permissions,
        an :exc:`OSError` will be raised.

        If ``prefix`` is given, the kernelspec will be installed to
        PREFIX/share/jupyter/kernels/KERNEL_NAME. This can be sys.prefix
        for installation inside virtual or conda envs.
        s   /\s   Invalid kernel name %r.  %ssC   Can't specify both user and prefix. Please choose one or the other.sT   replace is ignored. Installing a kernelspec always replaces an existing installationR8   i   R   R   s   Installing kernelspec in %ssF   Installing to %s, which is not in %s. The kernelspec may not be found.s"   Removing existing kernelspec in %ss   Installed kernelspec %s in %sN(   t   rstripR3   R4   t   basenameR;   R2   t
   ValueErrorR>   R9   R<   R=   t   DeprecationWarningR   R[   R\   t   dirnameRY   R`   R5   t   infoRy   Rz   t   copytree(   R'   t
   source_dirRf   R   t   replaceR   t   destinationRa   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   install_kernel_spec-  s2    
c         C   s7   t  j d d d d d l m } | |  d | d S(   s+   DEPRECATED: Use ipykernel.kenelspec.installsR   install_native_kernel_spec is deprecated. Use ipykernel.kernelspec import install.R8   i   i˙˙˙˙(   t   installR   N(   R<   R=   R_   R   (   R'   R   R   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   install_native_kernel_spec^  s    N(   R,   R-   R   R   Rs   Re   R   R]   R   RK   RJ   R   RL   R   RV   R   RY   RT   Rc   Rg   Rn   Ro   Ru   R~   Rv   R9   R   R   R   (    (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyRG   s   s.   														!		0c           C   s   t    j   S(   s<   Returns a dict mapping kernel names to resource directories.(   RG   Rc   (    (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyRc   f  s    c         C   s   t    j |   S(   s   Returns a :class:`KernelSpec` instance for the given kernel_name.

    Raises KeyError if the given kernel name is not found.
    (   RG   Ro   (   Rf   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyRo   j  s    c         C   s   t    j |  | | | |  S(   N(   RG   R   (   R   Rf   R   R   R   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyR   q  s    c         C   s   t    j d |   S(   NR   (   RG   R   (   R   (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyR   x  s    (.   t   __doc__Ri   R   R   R3   t   reRy   R<   R4   RR   R   t   ipython_genutils.py3compatR    t	   traitletsR   R   R   R   R   R   R   R   t   traitlets.configR	   t   jupyter_core.pathsR
   R   R   R^   R   t   compilet
   IGNORECASER/   R2   R>   R7   RB   t   KeyErrorRC   RG   Rc   Ro   R9   Rv   R   R   (    (    (    s8   lib/python2.7/site-packages/jupyter_client/kernelspec.pyt   <module>   s8   :)			ó			