o
    i;                     @   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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 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)SYSTEM_JUPYTER_PATHjupyter_data_dirjupyter_path)	BoolCaselessStrEnumDict	HasTraitsListSetTypeUnicodeobserve)LoggingConfigurable   )KernelProvisionerFactorypython3c                   @   sl   e Zd 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 )
KernelSpeczA kernel spec model object.messagesignal)default_valuec                 C   sR   t |d}t|dd}t|}W d   n1 sw   Y  | d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)encodingNresource_dir )pjoinopenjsonload)clsr   kernel_filefkernel_dictr   r   T/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/jupyter_client/kernelspec.pyfrom_resource_dir"   s
   
zKernelSpec.from_resource_dirc                 C   s"   | j | j| j| j| j| jd}|S )z"Convert the kernel spec to a dict.argvenvdisplay_namelanguageinterrupt_modemetadatar$   )selfdr   r   r"   to_dict-   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_json:   s   zKernelSpec.to_jsonN)__name__
__module____qualname____doc__r	   r%   r   namemimetyper'   r(   r   r&   r   r   r)   r*   classmethodr#   r-   r0   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r5   r   r   r"   _is_valid_kernel_nameE   s   
r;   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?r   )ospathisdirisfiler   )r=   r   r   r"   _is_kernel_dirQ   s   r@   c                 C   sv   | du s
t j| si S i }t | D ]%}t| |}t|sq| }t|s4t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)r<   r=   r>   listdirr   r@   lowerr;   warningswarn_kernel_name_description)dirkernelsr    r=   keyr   r   r"   _list_kernels_inV   s   

rL   c                   @   s    e Zd ZdZdd Zdd ZdS )NoSuchKernelz7An error raised when there is no kernel of a give name.c                 C   s
   || _ dS )zInitialize the error.Nr:   )r+   r5   r   r   r"   __init__o      
zNoSuchKernel.__init__c                 C   s   d| j  S )NzNo such kernel named r:   r/   r   r   r"   __str__s      zNoSuchKernel.__str__N)r1   r2   r3   r4   rN   rP   r   r   r   r"   rM   l   s    rM   c                   @   s   e Zd 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 )+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.
        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 )NrJ   )r   data_dirr/   r   r   r"   _user_kernel_dir_default   rQ   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.)rT   	whitelist)allowed_kernelspecsz7.0c                 C   s\   |j }| j| \}}t| |}||jkr,| jdj| jj|||d t	| ||j dS dS )zobserver for deprecated traitszN{cls}.{old} is deprecated in jupyter_client {version}, use {cls}.{new} instead)r   oldnewversionN)
r5   _deprecated_aliasesgetattrr[   logwarningformat	__class__r1   setattr)r+   changeold_attrnew_attrr\   	new_valuer   r   r"   _deprecated_trait   s   

z#KernelSpecManager._deprecated_traitc                 C   sF   t d}zddlm} |tj| d W |S  ty"   Y |S w )NrJ   r   )get_ipython_dir)r   IPython.pathsri   appendr<   r=   joinModuleNotFoundError)r+   dirsri   r   r   r"   _kernel_dirs_default   s   z&KernelSpecManager._kernel_dirs_defaultc                    s   i } j D ]}t|}| D ]\}}||vr# jd|| |||< qq jrQt|vrQzddlm}  jdt| ||t< W n t	yP    j
dt Y nw  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 v r||qS r   )rY   ).0r5   specr/   r   r"   
<dictcomp>   s     z7KernelSpecManager.find_kernel_specs.<locals>.<dictcomp>)kernel_dirsrL   itemsr_   debugensure_native_kernelNATIVE_KERNEL_NAMEipykernel.kernelspecrr   ImportErrorr`   rY   )r+   r,   
kernel_dirrJ   knamert   rr   r   r/   r"   find_kernel_specs   s0   
z#KernelSpecManager.find_kernel_specsc                 C   s   d}|t kr)z
ddlm}m} W n	 ty   Y nw ||kr)| jdd|i| }|s1| j|}tj| j	d
|s?t||S )zaReturns a :class:`KernelSpec` instance for a given kernel_name
        and resource_dir.
        Nr   )rr   get_kernel_dictr   )parentr   )rz   r{   rr   r   r|   kernel_spec_classr#   KPFinstancer   is_provisioner_availablerM   )r+   kernel_namer   kspecrr   r   r   r   r"   _get_kernel_spec_by_name   s   z*KernelSpecManager._get_kernel_spec_by_namec                 C   s   dd | j D D ]!}t|}|D ]}t||}| |kr(t|r(|    S qq|tkrBz	ddlm} W |S  t	yA   Y dS w dS )z2Find the resource directory of a named kernel specc                 S   s   g | ]
}t j|r|qS r   )r<   r=   r>   )rs   kdr   r   r"   
<listcomp>  s    z:KernelSpecManager._find_spec_directory.<locals>.<listcomp>r   rq   N)
rv   r<   rD   r   rE   r@   rz   r{   rr   r|   )r+   r   r}   filesr    r=   rr   r   r   r"   _find_spec_directory  s    

z&KernelSpecManager._find_spec_directoryc                 C   sX   t |s| jd| dt  | | }|du r&| 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!)r;   r_   r`   rH   r   rE   rM   r   )r+   r   r   r   r   r"   get_kernel_spec  s   z!KernelSpecManager.get_kernel_specc              	   C   s   |   }i }| D ]:\}}z| jtu r| ||}n| |}|| d||< W q
 ty3   Y q
 tyD   | j	j
d|dd Y 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   rt   zError loading kernelspec %rT)exc_info)r   rw   rb   rR   r   r   r-   rM   	Exceptionr_   r`   )r+   r,   resr~   r   rt   r   r   r"   get_all_specs#  s   

zKernelSpecManager.get_all_specsc                 C   sf   | j }zd| _ |  }W || _ n|| _ w || }| jd| tj|r,t| |S t	| |S )z\Remove a kernel spec directory by name.

        Returns the path that was deleted.
        FzRemoving %s)
ry   r   r_   rx   r<   r=   islinkremoveshutilrmtree)r+   r5   save_nativespecsspec_dirr   r   r"   remove_kernel_specC  s   


z$KernelSpecManager.remove_kernel_specFNc                 C   sH   |r
t j| j|S |rt jt j|ddd|S t jtd d|S )NsharejupyterrJ   r   )r<   r=   rl   user_kernel_dirabspathr   )r+   r   userprefixr   r   r"   _get_destination_dirV  s
   z&KernelSpecManager._get_destination_dirc           	      C   s   | d}|stj|}| }t|s!d|dt }t||r+|r+d}t||dur7tj	dt
dd | j|||d	}| jd
| tj|}|| jvrZ| jd|| j tj|rl| 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   rB   )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)rstripr<   r=   basenamerE   r;   rH   
ValueErrorrF   rG   DeprecationWarningr   r_   rx   dirnamerv   r`   r>   infor   r   copytree)	r+   
source_dirr   r   replacer   msgdestinationr}   r   r   r"   install_kernel_spec^  s>   


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   rB   r   )installr   N)rF   rG   r{   r   )r+   r   r   r   r   r"   install_native_kernel_spec  s   z,KernelSpecManager.install_native_kernel_spec)FN)NFNNF)!r1   r2   r3   r4   r   r   r   r   ry   r   rV   rU   r   rW   r
   rX   rY   r	   rv   r]   r   listrh   ro   r   r   r   r   r   r   r   r   r   r   r   r   r"   rR   w   sT    

 
	
7rR   c                   C   s
   t   S )rp   )rR   r   r   r   r   r"   r     rO   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.
    )rR   r   )r   r   r   r"   r     s   r   Fc                 C   s   t  | ||||S )z+Install a kernel spec in a given directory.)rR   r   )r   r   r   r   r   r   r   r"   r     s   r   c                 C   s   t  j| dS )zInstall the native kernel spec.r   )rR   r   r   r   r   r"   r     s   r   )NFFNr   ),r4   r   r<   rer   rF   jupyter_core.pathsr   r   r   	traitletsr   r   r   r   r	   r
   r   r   r   traitlets.configr   provisioningr   r   r=   rl   r   rz   r   compile
IGNORECASEr8   r;   rH   r@   rL   KeyErrorrM   rR   r   r   r   r   r   r   r   r"   <module>   s:    ,-  +


