
    Nee;                     *   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ZddlmZ ddlm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ej4                  j6                  ZdZ G d de      Z ej>                  dej@                        Z!d Z"dZ#d Z$d Z% G d de&      Z' G d de      Z(d Z)d Z*d"d Z+e(jV                  j                   e+_         d#d!Z,e(jX                  j                   e,_         y)$zTools for managing kernel specs    Njupyter_data_dir)jupyter_path)SYSTEM_JUPYTER_PATH)Bool)CaselessStrEnum)Dict)	HasTraits)List)observe)Set)Type)Unicode)LoggingConfigurable   )KernelProvisionerFactorypython3c                       e Zd Z e       Z e       Z e       Z e       Z e       Z	 e
       Z e       Z eddgd      Z e
       Zed        Zd Zd Zy)
KernelSpecmessagesignal)default_valuec                     t        |d      }t        j                  |d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.jsonrzutf-8)encodingNresource_dir )pjoinioopenjsonload)clsr   kernel_filefkernel_dicts        ;/usr/lib/python3/dist-packages/jupyter_client/kernelspec.pyfrom_resource_dirzKernelSpec.from_resource_dir+   sW     L-8WW[#8 	'A))A,K	'<<<<	' 	's   AAc                     t        | j                  | j                  | j                  | j                  | j
                  | j                        }|S )N)argvenvdisplay_namelanguageinterrupt_modemetadata)dictr+   r,   r-   r.   r/   r0   )selfds     r(   to_dictzKernelSpec.to_dict6   sA    **]]..]]
     c                 H    t        j                  | j                               S )zOSerialise this kernelspec to a JSON object.

        Returns a string.
        )r"   dumpsr4   r2   s    r(   to_jsonzKernelSpec.to_jsonB   s    
 zz$,,.))r5   N)__name__
__module____qualname__r   r+   r   namemimetyper-   r.   r	   r,   r   r   r/   r0   classmethodr)   r4   r9   r   r5   r(   r   r       sg    6D9DyH9LyH
&C9L$i%:(SNvH= =
*r5   r   z^[a-z0-9._\-]+$c                 ,    t         j                  |       S )z"Check that a kernel name is valid.)_kernel_name_patmatchr=   s    r(   _is_valid_kernel_namerD   M   s     !!$''r5   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   )rG   s    r(   _is_kernel_dirrJ   Y   s.    77==M277>>%m2L#MMr5   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)rF   rG   rH   listdirr   rJ   lowerrD   warningswarn_kernel_name_description)dirkernelsr&   rG   keys        r(   _list_kernels_inrW   ^   s    
 {"''--,	GZZ_ 
S!}d#ggi$S)MM@XZ^_ 
 Nr5   c                       e Zd Zd Zd Zy)NoSuchKernelc                     || _         y NrC   )r2   r=   s     r(   __init__zNoSuchKernel.__init__u   s	    	r5   c                 8    dj                  | j                        S )NzNo such kernel named {})formatr=   r8   s    r(   __str__zNoSuchKernel.__str__x   s    (//		::r5   N)r:   r;   r<   r\   r_   r   r5   r(   rY   rY   t   s    ;r5   rY   c                      e Zd Z eedd      Z eddd      Z e       Z	d Z
 e       Zd Z edd      Z edd      Z ed	
      ZddiZ e ee       d        Zd Zd Zd Zd Zd Zd Zd ZddZ	 ddZddZy)KernelSpecManagerTzThe 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 r[   r   r8   s    r(   _data_dir_defaultz#KernelSpecManager._data_dir_default   s    !!r5   c                 .    t        | j                  d      S )NrU   )r   data_dirr8   s    r(   _user_kernel_dir_defaultz*KernelSpecManager._user_kernel_dir_default   s    T]]I..r5   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.)rc   	whitelist)allowed_kernelspecsz7.0c                 *   |j                   }| j                  |   \  }}t        | |      }||j                  k7  rZ| j                  j                  dj                  | j                  j                  |||             t        | ||j                         yy)zobserver for deprecated traitszN{cls}.{old} is deprecated in jupyter_client {version}, use {cls}.{new} instead)r$   oldnewversionN)
r=   _deprecated_aliasesgetattrrm   logwarningr^   	__class__r:   setattr)r2   changeold_attrnew_attrrn   	new_values         r(   _deprecated_traitz#KernelSpecManager._deprecated_trait   s     ;; 44X>'D(+	

" HH9&//  #	  	
 D(FJJ/ #r5   c                     t        d      }	 ddlm} |4|j                  t        j                  j                   |       d             |S # t        $ r 	 ddlm} n# t        $ r d }Y nw xY wY \w xY w)NrU   r   )get_ipython_dir)	r   IPython.pathsr{   ImportErrorIPython.utils.pathappendrF   rG   join)r2   dirsr{   s      r(   _kernel_dirs_defaultz&KernelSpecManager._kernel_dirs_default   sl    I&	'5 &KK_%6	BC  	''> '"&'	's5   A 	A0AA0A*'A0)A**A0/A0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)kernel_dirsrW   itemsrq   debugensure_native_kernelNATIVE_KERNEL_NAMEipykernel.kernelspecr   r}   rr   rj   )r2   r3   
kernel_dirrU   knamespecr   r=   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                 8   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_availablerY   )r2   kernel_namer   kspecr   r   s         r(   _get_kernel_spec_by_namez*KernelSpecManager._get_kernel_spec_by_name   s     ,,cK
  9,2D22bbP_PabE**<<\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)r   rF   rG   rH   rO   r   rP   rJ   r   r   r   r}   )r2   r   kdr   filesr&   rG   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| 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 cannot be found!)rD   rq   rr   rS   r   rP   rY   r   )r2   r   r   s      r(   get_kernel_specz!KernelSpecManager.get_kernel_spec  s    
 %[1HH";-}=U<VW 001B1B1DEHH/}<MNO{++,,[,GGr5   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   rs   ra   r   r   r4   rY   	Exceptionrq   rr   )r2   r3   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   rq   r   rF   rG   islinkremoveshutilrmtree)r2   r=   save_nativespecsspec_dirs        r(   remove_kernel_specz$KernelSpecManager.remove_kernel_specJ  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jupyterrU   r   )rF   rG   r   user_kernel_dirabspathr   )r2   r   userprefixs       r(   _get_destination_dirz&KernelSpecManager._get_destination_dir]  si    77<< 4 4kBB77<< 7)YXcdd77<< 3A 6	;OOr5   c                 2   |j                  d      }|st        j                  j                  |      }|j	                         }t        |      st        d|dt              |r|rt        d      |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   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)rstriprF   rG   basenamerP   rD   
ValueErrorrS   rQ   rR   DeprecationWarningr   rq   r   dirnamer   rr   rH   infor   r   copytree)r2   
source_dirr   r   replacer   destinationr   s           r(   install_kernel_specz%KernelSpecManager.install_kernel_spece  sN      &&u-
''**:6K!'')$[11<>VW  FbccMM"	 //$v/V4kBWW__[1
T---HHX   77==%HHMM>LMM+&
K05{KPr5   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   rM   r   )installr   N)rQ   rR   r   r   )r2   r   r   s      r(   install_native_kernel_specz,KernelSpecManager.install_native_kernel_spec  s#    `	
 	14 r5   )FN)NFNNF) r:   r;   r<   r   r   r   r   r   r   rg   re   r   rh   r   ri   rj   r   r   ro   r   listry   r   r   r   r   r   r   r   r   r   r   r   r5   r(   ra   ra   |   s       yH" iO/ I
  [K
 	3 d&'(0 )0, :,!"H"@&P NR5n!r5   ra   c                  2    t               j                         S )r   )ra   r   r   r5   r(   r   r     s    0022r5   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.
    )ra   r   )r   s    r(   r   r     s    
 ..{;;r5   c                 <    t               j                  | ||||      S r[   )ra   r   )r   r   r   r   r   s        r(   r   r     s     22:{DRY[abbr5   c                 6    t               j                  |       S )Nr   )ra   r   r   s    r(   r   r     s    99t9DDr5   )NFFNr   )-__doc__r    r"   rF   rer   rQ   jupyter_core.pathsr   r   r   	traitletsr   r   r	   r
   r   r   r   r   r   traitlets.configr   provisioningr   r   rG   r   r   r   r   compile
IGNORECASErA   rD   rS   rJ   rW   KeyErrorrY   ra   r   r   r   r   r   r5   r(   <module>r      s    % 
  	 	   / + 2  %        0 9
 '* '*T 2::0"--@ (/ N
,;8 ;h!+ h!V	3
<c 0CCKK  E &7%Q%Q%Y%Y  "r5   