
    f/=                       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e      Z! ejD                  dejF                        Z$ddZ%dZ&ddZ'ddZ( G d de)      Z* G 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/_         y)"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                      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      Z e       Zedd       ZddZdd	Zy
)
KernelSpeczA kernel spec model object.	List[str]argvmessagesignal)default_valuec                    t        |d      }t        |d      5 }t        j                  |      }ddd        | dd|iS # 1 sw Y   xY w)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_dicts        T/var/www/cvtools/html/venv/lib/python3.12/site-packages/jupyter_client/kernelspec.pyfrom_resource_dirzKernelSpec.from_resource_dir%   sQ     L-8+0 	'A))A,K	'<<<<	' 	's   AAc                    | 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ds     r(   to_dictzKernelSpec.to_dict0   s@     II88 --"11
     c                H    t        j                  | j                               S )zOSerialise this kernelspec to a JSON object.

        Returns a string.
        )r"   dumpsr3   r1   s    r(   to_jsonzKernelSpec.to_json=   s    
 zz$,,.))r4   N)r$   ztype[KernelSpec]r   strreturnr   r:   zdict[str, t.Any]r:   r9   )__name__
__module____qualname____doc__r   r   __annotations__r   namemimetyper-   r.   r	   r,   r   r   r/   r0   classmethodr)   r3   r8   r   r4   r(   r   r      so    %fD)9DyH9LyH
&C9L$i%:(SNvH= =*r4   r   z^[a-z0-9._\-]+$c                ,    t         j                  |       S )z"Check that a kernel name is valid.)_kernel_name_patmatchrB   s    r(   _is_valid_kernel_namerI   H   s     !!$''r4   zuKernel names can only contain ASCII letters and numbers and these separators: - . _ (hyphen, period, and underscore).c                    t         j                  j                  |       xr) t         j                  j                  t	        | d            S )zIs ``path`` a kernel directory?r   )ospathisdirisfiler    )rL   s    r(   _is_kernel_dirrO   T   s.    77==M277>>%m2L#MMr4   c                6   | t         j                  j                  |       si S i }t        j                  |       D ][  }t	        | |      }t        |      s|j                         }t        |      s!t        j                  dt         d| d       |||<   ] |S )zReturn a mapping of kernel names to resource directories from dir.

    If dir is None or does not exist, returns an empty dict.
    z#Invalid kernelspec directory name (z):    
stacklevel)rK   rL   rM   listdirr    rO   lowerrI   warningswarn_kernel_name_description)dirkernelsr&   rL   keys        r(   _list_kernels_inr\   Y   s    
 {"''--,	GZZ_ 
S!}d#ggi$S)MM56N5OsSWRXY 
 Nr4   c                       e Zd ZdZddZddZy)NoSuchKernelz7An error raised when there is no kernel of a give name.c                    || _         y)zInitialize the error.NrH   )r1   rB   s     r(   __init__zNoSuchKernel.__init__r   s	    	r4   c                     d| j                    S )NzNo such kernel named rH   r7   s    r(   __str__zNoSuchKernel.__str__v   s    &tyyk22r4   N)rB   r9   r:   Noner<   )r=   r>   r?   r@   r`   rb   r   r4   r(   r^   r^   o   s    A3r4   r^   c                  ^   e Zd ZU dZ eedd      Z eddd      Z e	       Z
ddZ e	       ZddZ edd      Z edd	      Z ed
      Zded<   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!y)+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                    t               S )N)r   r7   s    r(   _data_dir_defaultz#KernelSpecManager._data_dir_default   s    !!r4   c                .    t        | j                  d      S )NrZ   )r    data_dirr7   s    r(   _user_kernel_dir_defaultz*KernelSpecManager._user_kernel_dir_default   s    T]]I..r4   z@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.)rg   r   kernel_dirs	whitelist)allowed_kernelspecsz7.0c                J   |j                   }| j                  |   \  }}t        | |      }||j                  k7  rj| j                  j                  | j                  j                   d| d| d| j                  j                   d| d
       t        | ||j                         yy)zobserver for deprecated traits.z! is deprecated in jupyter_client z, use z insteadN)	rB   _deprecated_aliasesgetattrnewlogwarning	__class__r=   setattr)r1   changeold_attrnew_attrversion	new_values         r(   _deprecated_traitz#KernelSpecManager._deprecated_trait   s     ;; 44X>'D(+	

" HH>>**+1XJ6W)6$.."9"9!:!H:XO D(FJJ/ #r4   c                    t        d      }	 ddlm} |j                  t        j
                  j                   |       d             |S # t        $ r Y |S w xY w)NrZ   r   )get_ipython_dir)r   IPython.pathsr   appendrK   rL   joinModuleNotFoundError)r1   dirsr   s      r(   _kernel_dirs_defaultz&KernelSpecManager._kernel_dirs_default   sR    I&	5KK_%6	BC  # 		s   :A	 		AAc                0   i }| j                   D ]L  }t        |      }|j                         D ],  \  }}||vs| j                  j	                  d||       |||<   . N | j
                  r9t        |vr1	 ddlm} | j                  j	                  dt        |       ||t        <   | j                  r2|j                         D ci c]  \  }}|| j                  v s|| }}}|S # t        $ r# | j                  j                  dt               Y kw xY wc c}}w )<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 available)rm   r\   itemsru   debugensure_native_kernelNATIVE_KERNEL_NAMEipykernel.kernelspecr   ImportErrorrv   ro   )r1   r2   
kernel_dirrZ   knamespecr   rB   s           r(   find_kernel_specsz#KernelSpecManager.find_kernel_specs   s   ** 	$J&z2G&}} $t>HHNN#:E:N#AeH$	$ $$);1)D
\::&
 )2$% ##./ggi\
d44C[C[;[t\A\  \  !FHZ[\
 ]s   30C# DD#)DDc                <   d}|t         k(  r*	 ddlm}m} ||k(  r |       } | j                  dd|i|}	 |s| j                  j                  |      }t        j                  | j                        j                  |      st        |      |S # t
        $ r Y dw xY w)zaReturns a :class:`KernelSpec` instance for a given kernel_name
        and resource_dir.
        Nr   )r   get_kernel_dictr   )parentr   )r   r   r   r   kernel_spec_classr   r)   KPFinstancer   is_provisioner_availabler^   )r1   kernel_namer   kspecr   r   kdicts          r(   _get_kernel_spec_by_namez*KernelSpecManager._get_kernel_spec_by_name   s     ,,WK
  9,+-E2D22VVPUVE**<<\JE||4;;/HHO{++  s   B 	BBc                h   | j                   D cg c]$  }t        j                  j                  |      s#|& c}D ]O  }t        j                  |      }|D ]3  }t        ||      }|j                         |k(  s#t        |      s/|c c S  Q |t        k(  r		 ddl	m
} |S yc c}w # t        $ r Y yw xY w)z2Find the resource directory of a named kernel specr   r   N)rm   rK   rL   rM   rT   r    rU   rO   r   r   r   r   )r1   r   kdr   filesr&   rL   r   s           r(   _find_spec_directoryz&KernelSpecManager._find_spec_directory   s    (,(8(8N"BGGMM"<M2N 	 JJJz*E  Z+779+t0DK 	  ,,!: !  O   	s   $B B B% %	B10B1c                   t        |      s%| j                  j                  d| dt                | j	                  |j                               }|'| j                  j                  d|       t        |      | j                  ||      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: z#Kernelspec name %s cannot be found!)rI   ru   rv   rX   r   rU   r^   r   )r1   r   r   s      r(   get_kernel_specz!KernelSpecManager.get_kernel_spec  s    
 %[1HH";-}=U<VW 001B1B1DEHHBKP{++,,[,GGr4   c                b   | j                         }i }|j                         D ]R  \  }}	 | j                  t        u r| j	                  ||      }n| j                  |      }||j                         d||<   T |S # t        $ r Y bt        $ r! | j                  j                  d|d       Y w xY w)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   rw   re   r   r   r3   r^   	Exceptionru   rv   )r1   r2   resr   r   r   s         r(   get_all_specszKernelSpecManager.get_all_specs!  s     ""$#$779 	VE<V>>%6688MD
  //6D.:DLLNSE
	V 
	    V  !>PT UVs   AA::	B.&B.-B.c                L   | j                   }	 d| _         | j                         }|| _         ||   }| j                  j                  d|       t        j
                  j                  |      rt	        j                  |       |S t        j                  |       |S # || _         w xY w)z\Remove a kernel spec directory by name.

        Returns the path that was deleted.
        FzRemoving %s)
r   r   ru   r   rK   rL   islinkremoveshutilrmtree)r1   rB   save_nativespecsspec_dirs        r(   remove_kernel_specz$KernelSpecManager.remove_kernel_specA  s    
 //	4(-D%**,E(3D%;}h/77>>(#IIh  MM(# )4D%s   B 	B#Nc                .   |r*t         j                  j                  | j                  |      S |r@t         j                  j                  t         j                  j	                  |      ddd|      S t         j                  j                  t
        d   d|      S )NsharejupyterrZ   r   )rK   rL   r   user_kernel_dirabspathr   )r1   r   userprefixs       r(   _get_destination_dirz&KernelSpecManager._get_destination_dirT  sk     77<< 4 4kBB77<< 7)YXcdd77<< 3A 6	;OOr4   c                :   |j                  d      }|st        j                  j                  |      }|j	                         }t        |      sd|dt         }t        |      |r|rd}t        |      |t        j                  dt        d       | j                  |||      }| j                  j                  d	|       t        j                  j                  |      }|| j                  vr'| j                  j!                  d
|| j                         t        j                  j#                  |      r1| j                  j%                  d|       t'        j(                  |       t'        j*                  ||       | j                  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.zTreplace is ignored. Installing a kernelspec always replaces an existing installation   rR   )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)rstriprK   rL   basenamerU   rI   rX   
ValueErrorrV   rW   DeprecationWarningr   ru   r   dirnamerm   rv   rM   infor   r   copytree)	r1   
source_dirr   r   replacer   msgdestinationr   s	            r(   install_kernel_specz%KernelSpecManager.install_kernel_spec^  sW   *  &&u-
''**:6K!'')$[1(s;S:TUCS/!FWCS/!MM"	 //$v/V4kBWW__[1
T---HHX   77==%HHMM>LMM+&
K05{KPr4   c                R    t        j                  dd       ddlm}  || |       y)z,DEPRECATED: Use ipykernel.kernelspec.installzRinstall_native_kernel_spec is deprecated. Use ipykernel.kernelspec import install.r   rR   r   )installr   N)rV   rW   r   r   )r1   r   r   s      r(   install_native_kernel_specz,KernelSpecManager.install_native_kernel_spec  s#    `	
 	14 r4   r<   )ry   t.Anyr:   rc   )r:   z	list[str]r:   dict[str, str])r   r9   r   r9   r:   r   )r   r9   r:   
str | Noner   r9   r:   r   r;   )rB   r9   r:   r9   )FN)r   r9   r   boolr   r   r:   r9   )NFNNr   r9   r   r   r   r   r   zbool | Noner   r   r:   r9   Fr   r   r:   rc   )"r=   r>   r?   r@   r   r   r   r   r   r   rk   ri   r   rl   r   rn   ro   r   rm   rA   rr   r   listr~   r   r   r   r   r   r   r   r   r   r   r   r4   r(   re   re   z   sf   %   yH" iO/ I
  "[K 
 	3 d&'(0 )0:.$H"@( JNPP&*P<FP	P #'#!::  : 	:
 : : 
:x!r4   re   c                 2    t               j                         S )r   )re   r   r   r4   r(   r   r     s    0022r4   c                4    t               j                  |       S )zReturns a :class:`KernelSpec` instance for the given kernel_name.

    Raises KeyError if the given kernel name is not found.
    )re   r   )r   s    r(   r   r     s    
 ..{;;r4   c                <    t               j                  | ||||      S )z+Install a kernel spec in a given directory.)re   r   )r   r   r   r   r   s        r(   r   r     s"     22:{DRY[abbr4   c                8    t               j                  |        y)zInstall the native kernel spec.r   N)re   r   r   s    r(   r   r     s    222=r4   )rB   r9   r:   r   )rL   r9   r:   r   )rY   r   r:   r   r   r   )NFFNr   r   r   )0r@   
__future__r   r"   rK   rer   typingtrV   jupyter_core.pathsr   r   r   	traitletsr   r   r	   r
   r   r   r   r   r   traitlets.configr   provisioningr   r   rL   r   r    r   r   compile
IGNORECASErF   rI   rX   rO   r\   KeyErrorr^   re   r   r   r   r   r   r4   r(   <module>r      s3   % #  	 	    R R _ _ _ 0 9
 ** **Z 2::0"--@ (/ N
,38 3h!+ h!V	3
< # ccc c 	c
 c 	c 0CCKK  >
 &7%Q%Q%Y%Y  "r4   