o
    ^iL=                     @  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 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   kernel_filefkernel_dictr    r    T/home/ubuntu/hpml_nyu/venv/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| jd}|S )z"Convert the kernel spec to a dict.r   envdisplay_namelanguageinterrupt_modemetadatakernel_protocol_versionr+   )selfdr    r    r(   to_dict2   s   
zKernelSpec.to_dictc                 C  s   t |  S )zOSerialise this kernelspec to a JSON object.

        Returns a string.
        )r#   dumpsr4   r2   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.   r1   r   r,   r   r   r/   r0   classmethodr)   r4   r7   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_nameK   s   
rF   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   )osrG   isdirisfiler!   )rG   r    r    r(   _is_kernel_dirW   s   rL   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)rI   rG   rJ   listdirr!   rL   lowerrF   warningswarn_kernel_name_description)rM   kernelsr&   rG   keyr    r    r(   _list_kernels_in\   s   

rZ   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.NrE   )r2   r?   r    r    r(   __init__u      
zNoSuchKernel.__init__c                 C  s   d| j  S )NzNo such kernel named rE   r6   r    r    r(   __str__y      zNoSuchKernel.__str__N)r?   r   r   r\   r9   )r:   r;   r<   r=   r]   r_   r    r    r    r(   r[   r   s    
r[   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   r6   r    r    r(   _data_dir_default   s   z#KernelSpecManager._data_dir_defaultc                 C  s   t | jdS )NrX   )r!   data_dirr6   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.)rc   r   kernel_dirs	whitelist)allowed_kernelspecsz7.0changerB   r\   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__r:   setattr)r2   rj   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 )NrX   r   )get_ipython_dir)r   IPython.pathsry   appendrI   rG   joinModuleNotFoundError)r2   dirsry   r    r    r(   _kernel_dirs_default   s   z&KernelSpecManager._kernel_dirs_defaultrO   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    )ri   ).0r?   specr6   r    r(   
<dictcomp>   s     z7KernelSpecManager.find_kernel_specs.<locals>.<dictcomp>)rg   rZ   itemsro   debugensure_native_kernelNATIVE_KERNEL_NAMEipykernel.kernelspecr   ImportErrorrp   ri   )r2   r3   
kernel_dirrX   knamer   r   r    r6   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   is_provisioner_availabler[   )r2   r   r   kspecr   r   kdictr    r    r(   _get_kernel_spec_by_name   s   z*KernelSpecManager._get_kernel_spec_by_namerN   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    )rI   rG   rJ   )r   kdr    r    r(   
<listcomp>  s    z:KernelSpecManager._find_spec_directory.<locals>.<listcomp>r   r   N)
rg   rI   rS   r!   rT   rL   r   r   r   r   )r2   r   r   filesr&   rG   r   r    r    r(   _find_spec_directory  s"   

z&KernelSpecManager._find_spec_directoryc                 C  sJ   t |s| jd| dt  | | }|du r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: N)rF   ro   rp   rW   r   rT   r[   r   )r2   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   rq   ra   r   r   r4   r[   	Exceptionro   rp   )r2   r3   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   ro   r   rI   rG   islinkremoveshutilrmtree)r2   r?   save_nativespecsspec_dirr    r    r(   remove_kernel_specC  s   


z$KernelSpecManager.remove_kernel_specFNuserrH   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jupyterrX   r   )rI   rG   r|   user_kernel_dirabspathr   )r2   r   r   r   r    r    r(   _get_destination_dirV  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   rQ   )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)rstriprI   rG   basenamerT   rF   rW   
ValueErrorrU   rV   DeprecationWarningr   ro   r   dirnamerg   rp   rJ   infor   r   copytree)	r2   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   rQ   r   )installr   N)rU   rV   r   r   )r2   r   r   r    r    r(   install_native_kernel_spec  s   z,KernelSpecManager.install_native_kernel_specr9   )rj   rB   r   r\   )r   rx   r   rO   )r   r   r   r   r   r   )r   r   r   rN   r   r   r   r   r8   )r?   r   r   r   )FN)r   r   r   rH   r   rN   r   r   )NFNNr   r   r   rN   r   rH   r   r   r   rN   r   r   Fr   rH   r   r\   )"r:   r;   r<   r=   r   r   r   r   r   r   re   rd   r   rf   r   rh   ri   r
   rg   r>   rl   r   listrw   r   r   r   r   r   r   r   r   r   r   r    r    r    r(   ra   }   s\   
 









 <ra   c                   C  s
   t   S )r   )ra   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.
    )ra   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.)ra   r   )r   r   r   r   r   r    r    r(   r     s   r   r\   c                 C  s   t  j| d dS )zInstall the native kernel spec.r   N)ra   r   r   r    r    r(   r     s   r   )r?   r   r   rB   )rG   r   r   rH   )rM   rN   r   rO   r   r   )NFFNr   r   r   )0r=   
__future__r   r#   rI   rer   typingtrU   jupyter_core.pathsr   r   r   	traitletsr   r   r   r	   r
   r   r   r   r   traitlets.configr   provisioningr   r   rG   r|   r!   r   r   compile
IGNORECASErC   rF   rW   rL   rZ   KeyErrorr[   ra   r   r   r   r   r    r    r    r(   <module>   sF    ,/


  
,


