U
    luf/=                     @  sx  d Z ddlm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mZmZ ddlmZ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 ejjZd	Z G d
d deZ!e"dej#Z$dddddZ%dZ&dddddZ'dddddZ(G dd de)Z*G dd deZ+dd d!d"Z,ddd#d$d%Z-d/dddd'ddd(d)d*Z.e+j.j e._ d0dd+d,d-d.Z/e+j/j e/_ dS )1zTools for managing kernel specs    )annotationsN)SYSTEM_JUPYTER_PATHjupyter_data_dirjupyter_path)	BoolCaselessStrEnumDict	HasTraitsListSetTypeUnicodeobserve)LoggingConfigurable   )KernelProvisionerFactorypython3c                   @  s   e Zd ZU dZe Zded< e Ze Z	e Z
e Ze Ze ZeddgddZe Zeddd d	d
dZddddZddddZdS )
KernelSpeczA kernel spec model object.	List[str]argvmessagesignal)default_valueztype[KernelSpec]str)clsresource_dirreturnc              	   C  s>   t |d}t|dd}t|}W 5 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.
        kernel.jsonzutf-8)encodingr   )pjoinopenjsonload)r   r   Zkernel_filefZkernel_dict r$   =/tmp/pip-unpacked-wheel-naub1w99/jupyter_client/kernelspec.pyfrom_resource_dir%   s    
zKernelSpec.from_resource_dirdict[str, t.Any]r   c                 C  s"   | j | j| j| j| j| jd}|S )z"Convert the kernel spec to a dict.r   envdisplay_namelanguageinterrupt_modemetadatar)   )selfdr$   r$   r%   to_dict0   s    	zKernelSpec.to_dictc                 C  s   t |  S )zOSerialise this kernelspec to a JSON object.

        Returns a string.
        )r!   dumpsr1   r/   r$   r$   r%   to_json=   s    zKernelSpec.to_jsonN)__name__
__module____qualname____doc__r
   r   __annotations__r   namemimetyper+   r,   r   r*   r   r   r-   r.   classmethodr&   r1   r4   r$   r$   r$   r%   r      s   

r   z^[a-z0-9._\-]+$r   t.Anyr:   r   c                 C  s
   t | S )z"Check that a kernel name is valid.)_kernel_name_patmatchr:   r$   r$   r%   _is_valid_kernel_nameH   s    rB   zuKernel names can only contain ASCII letters and numbers and these separators: - . _ (hyphen, period, and underscore).bool)pathr   c                 C  s   t j| ot jt| dS )zIs ``path`` a kernel directory?r   )osrD   isdirisfiler   )rD   r$   r$   r%   _is_kernel_dirT   s    rH   
str | Nonedict[str, str])dirr   c                 C  sv   | dkst j| si S i }t | D ]J}t| |}t|s>q&| }t|shtj	dt
 d| dd |||< q&|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 (z):    
stacklevel)rE   rD   rF   listdirr   rH   lowerrB   warningswarn_kernel_name_description)rK   kernelsr#   rD   keyr$   r$   r%   _list_kernels_inY   s    

rV   c                   @  s.   e Zd ZdZdddddZdddd	Zd
S )NoSuchKernelz7An error raised when there is no kernel of a give name.r   Noner>   c                 C  s
   || _ dS )zInitialize the error.NrA   )r/   r:   r$   r$   r%   __init__r   s    zNoSuchKernel.__init__r(   c                 C  s   d| j  S )NzNo such kernel named rA   r3   r$   r$   r%   __str__v   s    zNoSuchKernel.__str__N)r5   r6   r7   r8   rY   rZ   r$   r$   r$   r%   rW   o   s   rW   c                   @  sR  e Zd ZU dZeedddZeddddZe	 Z
dddd	Ze	 Zddd
dZedddZedddZeddZded< ddiZeee dddddZddddZddddZdddd d!d"Zdd#d$d%d&Zddd$d'd(Zd)dd*d+Zddd,d-d.Zd<dd1d#dd2d3d4Zd=dd#d1d5d#dd6d7d8Z d>d1dd9d:d;Z!d0S )?KernelSpecManagerzA manager for kernel specs.TzThe 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.
        r   r(   c                 C  s   t  S )N)r   r3   r$   r$   r%   _data_dir_default   s    z#KernelSpecManager._data_dir_defaultc                 C  s   t | jdS )NrT   )r   data_dirr3   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.)r]   r   kernel_dirs	whitelist)allowed_kernelspecsz7.0r=   rX   )changer   c                 C  sl   |j }| j| \}}t| |}||jkrh| j| jj d| d| d| jj d| d
 t| ||j dS )zobserver for deprecated traits.z! is deprecated in jupyter_client z, use z insteadN)	r:   _deprecated_aliasesgetattrnewlogwarning	__class__r5   setattr)r/   rd   old_attrnew_attrversion	new_valuer$   r$   r%   _deprecated_trait   s    

(z#KernelSpecManager._deprecated_traitz	list[str]c                 C  sH   t d}z&ddlm} |tj| d W n tk
rB   Y nX |S )NrT   r   )get_ipython_dir)r   ZIPython.pathsrr   appendrE   rD   joinModuleNotFoundError)r/   dirsrr   r$   r$   r%   _kernel_dirs_default   s    z&KernelSpecManager._kernel_dirs_defaultrJ   c                   s   i } j D ]>}t|}| D ](\}}||kr jd|| |||< qq
 jrt|krz(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 )<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$   )rc   ).0r:   specr3   r$   r%   
<dictcomp>   s     
  z7KernelSpecManager.find_kernel_specs.<locals>.<dictcomp>)ra   rV   itemsri   debugensure_native_kernelNATIVE_KERNEL_NAMEipykernel.kernelspecrz   ImportErrorrj   rc   )r/   r0   
kernel_dirrT   knamer|   rz   r$   r3   r%   find_kernel_specs   s*    
z#KernelSpecManager.find_kernel_specsr   )kernel_namer   r   c                 C  s   d}|t krXzddlm}m} W n tk
r4   Y n$X ||krX| }| jf d|i|}|sh| j|}tj| j	d
|st||S )zaReturns a :class:`KernelSpec` instance for a given kernel_name
        and resource_dir.
        Nr   )rz   get_kernel_dictr   )parent)r   r   rz   r   r   kernel_spec_classr&   KPFinstancer   Zis_provisioner_availablerW   )r/   r   r   Zkspecrz   r   Zkdictr$   r$   r%   _get_kernel_spec_by_name   s    z*KernelSpecManager._get_kernel_spec_by_namerI   r   r   c                 C  s   dd | j D D ]B}t|}|D ].}t||}| |kr"t|r"|    S q"q|tkrz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$   )rE   rD   rF   )r{   Zkdr$   r$   r%   
<listcomp>   s      z:KernelSpecManager._find_spec_directory.<locals>.<listcomp>r   ry   N)
ra   rE   rO   r   rP   rH   r   r   rz   r   )r/   r   r   filesr#   rD   rz   r$   r$   r%   _find_spec_directory   s    

z&KernelSpecManager._find_spec_directoryc                 C  sX   t |s | jd| dt  | | }|dkrL| j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#Kernelspec name %s cannot be found!)rB   ri   rj   rS   r   rP   rW   r   )r/   r   r   r$   r$   r%   get_kernel_spec  s    z!KernelSpecManager.get_kernel_specr'   c              	   C  s   |   }i }| D ]z\}}z8| jtkr6| ||}n
| |}|| d||< W q tk
rh   Y q tk
r   | j	j
d|dd Y qX q|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   r|   zError loading kernelspec %rT)exc_info)r   r~   rk   r[   r   r   r1   rW   	Exceptionri   rj   )r/   r0   resr   r   r|   r$   r$   r%   get_all_specs!  s    

zKernelSpecManager.get_all_specsr>   c                 C  s^   | j }zd| _ |  }W 5 || _ X || }| jd| tj|rPt| n
t	| |S )z\Remove a kernel spec directory by name.

        Returns the path that was deleted.
        FzRemoving %s)
r   r   ri   r   rE   rD   islinkremoveshutilrmtree)r/   r:   Zsave_nativespecsZspec_dirr$   r$   r%   remove_kernel_specA  s    
z$KernelSpecManager.remove_kernel_specFNrC   )r   userprefixr   c                 C  sL   |rt j| j|S |r4t jt j|ddd|S t jtd d|S d S )NshareZjupyterrT   r   )rE   rD   rt   user_kernel_dirabspathr   )r/   r   r   r   r$   r$   r%   _get_destination_dirT  s
    z&KernelSpecManager._get_destination_dirbool | None
source_dirr   r   replacer   r   c           	      C  s   | d}|stj|}| }t|sBd|dt }t||rV|rVd}t||dk	rnt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 z.  zCCan't specify both user and prefix. Please choose one or the other.NzTreplace is ignored. Installing a kernelspec always replaces an existing installation   rM   )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)rstriprE   rD   basenamerP   rB   rS   
ValueErrorrQ   rR   DeprecationWarningr   ri   r   dirnamera   rj   rF   infor   r   copytree)	r/   r   r   r   r   r   msgZdestinationr   r$   r$   r%   install_kernel_spec^  s>    


z%KernelSpecManager.install_kernel_specr   r   c                 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   rM   r   )installr   N)rQ   rR   r   r   )r/   r   r   r$   r$   r%   install_native_kernel_spec  s    z,KernelSpecManager.install_native_kernel_spec)FN)NFNN)F)"r5   r6   r7   r8   r   r   r   r   r   r   r_   r^   r   r`   r   rb   rc   r
   ra   r9   rf   r   listrq   rw   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   r[   z   s^   
 
        <r[   r(   c                   C  s
   t   S )rx   )r[   r   r$   r$   r$   r%   r     s    r   r   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.
    )r[   r   )r   r$   r$   r%   r     s    r   Fr   r   c                 C  s   t  | ||||S )z+Install a kernel spec in a given directory.)r[   r   )r   r   r   r   r   r$   r$   r%   r     s    r   rX   r   c                 C  s   t  j| d dS )zInstall the native kernel spec.r   N)r[   r   r   r$   r$   r%   r     s    r   )NFFN)F)0r8   
__future__r   r!   rE   rer   typingtrQ   Zjupyter_core.pathsr   r   r   Z	traitletsr   r   r   r	   r
   r   r   r   r   Ztraitlets.configr   Zprovisioningr   r   rD   rt   r   r   r   compile
IGNORECASEr?   rB   rS   rH   rV   KeyErrorrW   r[   r   r   r   r   r$   r$   r$   r%   <module>   sD   ,-  -
    
