o
    Zh/=                     @  sP  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$d1ddZ%dZ&d2ddZ'd3ddZ(G dd de)Z*G dd  d eZ+d4d!d"Z,d5d$d%Z-		&	&	d6d7d,d-Z.e+j.j e._ d8d9d/d0Z/e+j/j e/_ dS ):z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ZdddZdddZdS )
KernelSpeczA kernel spec model object.	List[str]argvmessagesignal)default_valueclstype[KernelSpec]resource_dirstrreturnc                 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)encodingNr    )pjoinopenjsonload)r   r   Zkernel_filefZkernel_dictr    r    P/var/www/html/lang_env/lib/python3.10/site-packages/jupyter_client/kernelspec.pyfrom_resource_dir%   s
   
zKernelSpec.from_resource_dirdict[str, t.Any]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)r   r   r   r   r   r   r   r(   r   r   )__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<   r   r   t.Anyc                 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   
rC   zuKernel names can only contain ASCII letters and numbers and these separators: - . _ (hyphen, period, and underscore).pathboolc                 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   rI   dir
str | Nonedict[str, str]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)rF   rD   rG   listdirr!   rI   lowerrC   warningswarn_kernel_name_description)rJ   kernelsr%   rD   keyr    r    r&   _list_kernels_inY   s   

rW   c                   @  s$   e Zd ZdZdddZddd	Zd
S )NoSuchKernelz7An error raised when there is no kernel of a give name.r<   r   r   Nonec                 C  s
   || _ dS )zInitialize the error.NrB   )r/   r<   r    r    r&   __init__r      
zNoSuchKernel.__init__c                 C  s   d| j  S )NzNo such kernel named rB   r3   r    r    r&   __str__v      zNoSuchKernel.__str__N)r<   r   r   rY   r6   )r7   r8   r9   r:   rZ   r\   r    r    r    r&   rX   o   s    
rX   c                   @  s
  e Zd ZU dZeedddZeddddZe	 Z
d=dd	Ze	 Z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Zd?ddZd@ddZdAd"d#ZdBd%d&ZdCd'd(ZdDd*d+ZdEd-d.Z	0dFdGd4d5Z	0	/	0	0dHdId9d:Z dJdKd;d<Z!d0S )L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 )NrU   )r!   data_dirr3   r    r    r&   _user_kernel_dir_default   r]   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.0changer?   rY   c                 C  sp   |j }| j| \}}t| |}||jkr6| j| jj d| d| d| jj d| d
 t| ||j dS 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__r7   setattr)r/   rg   old_attrnew_attrversion	new_valuer    r    r&   _deprecated_trait   s   

z#KernelSpecManager._deprecated_trait	list[str]c                 C  sF   t d}zddlm} |tj| d W |S  ty"   Y |S w )NrU   r   )get_ipython_dir)r   ZIPython.pathsrv   appendrF   rD   joinModuleNotFoundError)r/   dirsrv   r    r    r&   _kernel_dirs_default   s   z&KernelSpecManager._kernel_dirs_defaultrL   c                   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    )rf   ).0r<   specr3   r    r&   
<dictcomp>   s     z7KernelSpecManager.find_kernel_specs.<locals>.<dictcomp>)rd   rW   itemsrl   debugensure_native_kernelNATIVE_KERNEL_NAMEipykernel.kernelspecr~   ImportErrorrm   rf   )r/   r0   
kernel_dirrU   knamer   r~   r    r3   r&   find_kernel_specs   s0   
z#KernelSpecManager.find_kernel_specskernel_namer   r   c                 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|}|s3| j|}tj| j	d
|sAt||S )zaReturns a :class:`KernelSpec` instance for a given kernel_name
        and resource_dir.
        Nr   )r~   get_kernel_dictr   )parentr    )r   r   r~   r   r   kernel_spec_classr'   KPFinstancer   Zis_provisioner_availablerX   )r/   r   r   Zkspecr~   r   Zkdictr    r    r&   _get_kernel_spec_by_name   s   z*KernelSpecManager._get_kernel_spec_by_namerK   c                 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    )rF   rD   rG   )r   kdr    r    r&   
<listcomp>   s    z:KernelSpecManager._find_spec_directory.<locals>.<listcomp>r   r}   N)
rd   rF   rP   r!   rQ   rI   r   r   r~   r   )r/   r   r   filesr%   rD   r~   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!)rC   rl   rm   rT   r   rQ   rX   r   )r/   r   r   r    r    r&   get_kernel_spec  s   z!KernelSpecManager.get_kernel_specr(   c              	   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   r   zError loading kernelspec %rT)exc_info)r   r   rn   r^   r   r   r1   rX   	Exceptionrl   rm   )r/   r0   resr   r   r   r    r    r&   get_all_specs!  s   

zKernelSpecManager.get_all_specsr<   c                 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)
r   r   rl   r   rF   rD   islinkremoveshutilrmtree)r/   r<   Zsave_nativespecsZspec_dirr    r    r&   remove_kernel_specA  s   


z$KernelSpecManager.remove_kernel_specFNuserrE   prefixc                 C  sH   |r
t j| j|S |rt jt j|ddd|S t jtd d|S )NsharejupyterrU   r   )rF   rD   rx   user_kernel_dirabspathr   )r/   r   r   r   r    r    r&   _get_destination_dirT  s
   z&KernelSpecManager._get_destination_dir
source_dirreplacebool | Nonec           	      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   rN   )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)rstriprF   rD   basenamerQ   rC   rT   
ValueErrorrR   rS   DeprecationWarningr   rl   r   dirnamerd   rm   rG   infor   r   copytree)	r/   r   r   r   r   r   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   rN   r   )installr   N)rR   rS   r   r   )r/   r   r   r    r    r&   install_native_kernel_spec  s   z,KernelSpecManager.install_native_kernel_specr6   )rg   r?   r   rY   )r   ru   r   rL   )r   r   r   r   r   r   )r   r   r   rK   r   r   r   r   r5   )r<   r   r   r   )FN)r   r   r   rE   r   rK   r   r   )NFNNr   r   r   rK   r   rE   r   r   r   rK   r   r   Fr   rE   r   rY   )"r7   r8   r9   r:   r   r   r   r   r   r   rb   ra   r   rc   r   re   rf   r
   rd   r;   ri   r   listrt   r{   r   r   r   r   r   r   r   r   r   r    r    r    r&   r^   z   s\   
 









 <r^   c                   C  s
   t   S )r|   )r^   r   r    r    r    r&   r     r[   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   r   r   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   rY   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   )r<   r   r   r?   )rD   r   r   rE   )rJ   rK   r   rL   r   r   )NFFNr   r   r   )0r:   
__future__r   r#   rF   rer   typingtrR   Zjupyter_core.pathsr   r   r   Z	traitletsr   r   r   r	   r
   r   r   r   r   Ztraitlets.configr   Zprovisioningr   r   rD   rx   r!   r   r   compile
IGNORECASEr@   rC   rT   rI   rW   KeyErrorrX   r^   r   r   r   r   r    r    r    r&   <module>   sF    ,-


  
-


