B
    2de;                 @   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mZ ddlm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ejjZdZG dd deZedej Z!dd Z"dZ#dd Z$dd Z%G dd de&Z'G dd  d eZ(d!d" Z)d#d$ Z*d*d&d'Z+e(j+j e+_ d+d(d)Z,e(j,j e,_ dS ),zTools for managing kernel specs    N)jupyter_data_dir)jupyter_path)SYSTEM_JUPYTER_PATH)Bool)CaselessStrEnum)Dict)	HasTraits)List)observe)Set)Type)Unicode)LoggingConfigurable   )KernelProvisionerFactorypython3c               @   sh   e Zd Ze Ze Ze Ze Ze Z	e
 Ze ZeddgddZe
 Zedd Zdd Zdd	 Zd
S )
KernelSpecmessagesignal)default_valuec          	   C   sB   t |d}tj|ddd}t|}W dQ R X | f d|i|S )z|Create a KernelSpec object by reading kernel.json

        Pass the path to the *directory* containing kernel.json.
        zkernel.jsonrzutf-8)encodingNresource_dir)pjoinioopenjsonload)clsr   Zkernel_filefZkernel_dict r    f/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/jupyter_client/kernelspec.pyfrom_resource_dir+   s    
zKernelSpec.from_resource_dirc             C   s$   t | j| j| j| j| j| jd}|S )N)argvenvdisplay_namelanguageinterrupt_modemetadata)dictr#   r$   r%   r&   r'   r(   )selfdr    r    r!   to_dict6   s    
zKernelSpec.to_dictc             C   s   t |  S )zOSerialise this kernelspec to a JSON object.

        Returns a string.
        )r   dumpsr,   )r*   r    r    r!   to_jsonB   s    zKernelSpec.to_jsonN)__name__
__module____qualname__r	   r#   r   namemimetyper%   r&   r   r$   r   r   r'   r(   classmethodr"   r,   r.   r    r    r    r!   r       s   r   z^[a-z0-9._\-]+$c             C   s
   t | S )z"Check that a kernel name is valid.)_kernel_name_patmatch)r2   r    r    r!   _is_valid_kernel_nameM   s    r7   zuKernel names can only contain ASCII letters and numbers and these separators: - . _ (hyphen, period, and underscore).c             C   s   t j| ot jt| dS )zIs ``path`` a kernel directory?zkernel.json)ospathisdirisfiler   )r9   r    r    r!   _is_kernel_dirY   s    r<   c             C   sv   | dkst j| si S i }xTt | D ]F}t| |}t|s@q(| }t|sftj	dt
|f dd |||< q(W |S )zReturn a mapping of kernel names to resource directories from dir.

    If dir is None or does not exist, returns an empty dict.
    Nz*Invalid kernelspec directory name (%s): %s   )
stacklevel)r8   r9   r:   listdirr   r<   lowerr7   warningswarn_kernel_name_description)dirkernelsr   r9   keyr    r    r!   _list_kernels_in^   s    

rG   c               @   s   e Zd Zdd Zdd ZdS )NoSuchKernelc             C   s
   || _ d S )N)r2   )r*   r2   r    r    r!   __init__u   s    zNoSuchKernel.__init__c             C   s   d | jS )NzNo such kernel named {})formatr2   )r*   r    r    r!   __str__x   s    zNoSuchKernel.__str__N)r/   r0   r1   rI   rK   r    r    r    r!   rH   t   s   rH   c               @   s   e Zd ZeedddZeddddZe Z	dd Z
e Zdd Zedd	dZedd
dZeddZddiZeee dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd'd!d"Zd(d#d$Zd)d%d&Zd S )*KernelSpecManagerTzThe kernel spec class.  This is configurable to allow
        subclassing of the KernelSpecManager for customized behavior.
        )confighelpzIf 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*   r    r    r!   _data_dir_default   s    z#KernelSpecManager._data_dir_defaultc             C   s   t | jdS )NrE   )r   data_dir)r*   r    r    r!   _user_kernel_dir_default   s    z*KernelSpecManager._user_kernel_dir_defaultz@Deprecated, use `KernelSpecManager.allowed_kernelspecs`
        z^List of allowed kernel names.

        By default, all installed kernels are allowed.
        zLList of kernel directories to search. Later ones take priority over earlier.)rN   	whitelist)allowed_kernelspecsz7.0c             C   sX   |j }| j| \}}t| |}||jkrT| jdj| jj|||d t	| ||j dS )zobserver for deprecated traitszN{cls}.{old} is deprecated in jupyter_client {version}, use {cls}.{new} instead)r   oldnewversionN)
r2   _deprecated_aliasesgetattrrU   logwarningrJ   	__class__r/   setattr)r*   Zchangeold_attrnew_attrrV   	new_valuer    r    r!   _deprecated_trait   s    


z#KernelSpecManager._deprecated_traitc             C   sz   t d}yddlm} W n> tk
rV   yddlm} W n tk
rP   d }Y nX Y nX |d k	rv|tj| d |S )NrE   r   )get_ipython_dir)	r   ZIPython.pathsra   ImportErrorZIPython.utils.pathappendr8   r9   join)r*   dirsra   r    r    r!   _kernel_dirs_default   s    z&KernelSpecManager._kernel_dirs_defaultc                s   i }xL j D ]B}t|}x4| D ](\}}||kr" jd|| |||< q"W qW  jrt|kry(ddlm}  jdt| ||t< W n" t	k
r    j
dt Y nX  jrȇ fdd| D }|S )z<Returns a dict mapping kernel names to resource directories.zFound kernel %s in %sr   )	RESOURCESz$Native kernel (%s) available from %sz#Native kernel (%s) is not availablec                s    i | ]\}}| j kr||qS r    )rS   ).0r2   spec)r*   r    r!   
<dictcomp>   s    z7KernelSpecManager.find_kernel_specs.<locals>.<dictcomp>)kernel_dirsrG   itemsrY   debugensure_native_kernelNATIVE_KERNEL_NAMEipykernel.kernelspecrg   rb   rZ   rS   )r*   r+   
kernel_dirrE   knameri   rg   r    )r*   r!   find_kernel_specs   s(    z#KernelSpecManager.find_kernel_specsc             C   s   d}|t krTyddlm}m} W n tk
r4   Y n X ||krT| jf d|i| }|sd| j|}tj| j	d
|st||S )zaReturns a :class:`KernelSpec` instance for a given kernel_name
        and resource_dir.
        Nr   )rg   get_kernel_dictr   )parent)ro   rp   rg   rt   rb   kernel_spec_classr"   KPFinstanceru   Zis_provisioner_availablerH   )r*   kernel_namer   Zkspecrg   rt   r    r    r!   _get_kernel_spec_by_name   s    z*KernelSpecManager._get_kernel_spec_by_namec             C   s   xRdd | j D D ]>}t|}x.|D ]&}t||}| |kr&t|r&|S q&W qW |tkryddlm} W n t	k
r   Y nX |S dS )z2Find the resource directory of a named kernel specc             S   s   g | ]}t j|r|qS r    )r8   r9   r:   )rh   kdr    r    r!   
<listcomp>
  s    z:KernelSpecManager._find_spec_directory.<locals>.<listcomp>r   )rg   N)
rk   r8   r?   r   r@   r<   ro   rp   rg   rb   )r*   ry   rq   filesr   r9   rg   r    r    r!   _find_spec_directory  s    


z&KernelSpecManager._find_spec_directoryc             C   s^   t |s | jd| dt  | | }|dkrR| jd| d t|| ||S )zReturns a :class:`KernelSpec` instance for the given kernel_name.

        Raises :exc:`NoSuchKernel` if the given kernel name is not found.
        zKernelspec name z is invalid: Nz cannot be found!)r7   rY   rZ   rC   r~   r@   rH   rz   )r*   ry   r   r    r    r!   get_kernel_spec  s    z!KernelSpecManager.get_kernel_specc          	   C   s   |   }i }x| D ]z\}}y8| jtkr8| ||}n
| |}|| d||< W q tk
rj   Y q tk
r   | j	j
d|dd Y qX qW |S )a*  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   ri   zError loading kernelspec %rT)exc_info)rs   rl   r[   rL   rz   r   r,   rH   	ExceptionrY   rZ   )r*   r+   resrr   r   ri   r    r    r!   get_all_specs*  s    

zKernelSpecManager.get_all_specsc             C   s^   | j }zd| _ |  }W d|| _ X || }| jd| tj|rPt| n
t	| |S )z\Remove a kernel spec directory by name.

        Returns the path that was deleted.
        FNzRemoving %s)
rn   rs   rY   rm   r8   r9   islinkremoveshutilrmtree)r*   r2   Zsave_nativespecsZspec_dirr    r    r!   remove_kernel_specJ  s    
z$KernelSpecManager.remove_kernel_specFNc             C   sL   |rt j| j|S |r4t jt j|ddd|S t jtd d|S d S )NZsharejupyterrE   r   )r8   r9   rd   user_kernel_dirabspathr   )r*   ry   userprefixr    r    r!   _get_destination_dir]  s
    z&KernelSpecManager._get_destination_dirc             C   s   | d}|stj|}| }t|s:td|tf |rJ|rJtd|dk	rbtj	dt
dd | j|||d}| jd	| tj|}|| jkr| jd
|| j tj|r| jd| t| t|| | jd|| |S )a#  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.
        z/\zInvalid kernel name %r.  %szCCan't specify both user and prefix. Please choose one or the other.NzTreplace is ignored. Installing a kernelspec always replaces an existing installation   )r>   )r   r   zInstalling kernelspec in %szFInstalling to %s, which is not in %s. The kernelspec may not be found.z"Removing existing kernelspec in %szInstalled kernelspec %s in %s)rstripr8   r9   basenamer@   r7   
ValueErrorrC   rA   rB   DeprecationWarningr   rY   rm   dirnamerk   rZ   r:   infor   r   copytree)r*   
source_dirry   r   replacer   destinationrq   r    r    r!   install_kernel_spece  s8    


z%KernelSpecManager.install_kernel_specc             C   s*   t jddd ddlm} || |d dS )z,DEPRECATED: Use ipykernel.kernelspec.installzRinstall_native_kernel_spec is deprecated. Use ipykernel.kernelspec import install.r   )r>   r   )install)r   N)rA   rB   rp   r   )r*   r   r   r    r    r!   install_native_kernel_spec  s
    z,KernelSpecManager.install_native_kernel_spec)FN)NFNN)F) r/   r0   r1   r   r   rv   r   rn   r   rP   rO   r   rQ   r   rR   rS   r	   rk   rW   r
   listr`   rf   rs   rz   r~   r   r   r   r   r   r   r    r    r    r!   rL   |   s@    
	
6rL   c               C   s
   t   S )z<Returns a dict mapping kernel names to resource directories.)rL   rs   r    r    r    r!   rs     s    rs   c             C   s   t  | S )zReturns a :class:`KernelSpec` instance for the given kernel_name.

    Raises KeyError if the given kernel name is not found.
    )rL   r   )ry   r    r    r!   r     s    r   Fc             C   s   t  | ||||S )N)rL   r   )r   ry   r   r   r   r    r    r!   r     s    r   c             C   s   t  j| dS )N)r   )rL   r   )r   r    r    r!   r     s    r   )NFFN)F)-__doc__r   r   r8   rer   rA   Zjupyter_core.pathsr   r   r   Z	traitletsr   r   r   r   r	   r
   r   r   r   Ztraitlets.configr   Zprovisioningr   rw   r9   rd   r   ro   r   compile
IGNORECASEr5   r7   rC   r<   rG   KeyErrorrH   rL   rs   r   r   r   r    r    r    r!   <module>   sL   *  -


