o
    +wi4                     @  s&  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
mZ ddlmZmZmZ ddlmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ G dd deZG dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#d!ddZ$e%d kre#&  dS dS )"zApps for managing kernel specs.    )annotationsN)Path)
JupyterAppbase_aliases
base_flags)BoolDictInstanceListUnicode)Application   )__version__)KernelSpecManager)KernelProvisionerFactoryc                   @  sx   e Zd ZdZeZdZeeZ	e
ddddZe
ddddZd ddiidfd d	diid
fed dZdddZdddZdS )ListKernelSpecszAn app to list kernel specs.z%List installed kernel specifications.Fz7output spec name and location as machine-readable json.Thelpconfigz*List only specs with missing interpreters.json_outputmissing_kernelszoutput only missing kernelsdebug)jsonmissingr   returnr   c                 C  s   t | | jdS )N)parentdata_dirr   r   self r    Y/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/jupyter_client/kernelspecapp.py_kernel_spec_manager_default3      z,ListKernelSpecs._kernel_spec_manager_defaultdict[str, t.Any] | Nonec                   s    j  } j  } jrt||\}} jsR|std dS tt|dd dd }d fd
d}td t|	 |dD ]\}}td|
| d|  q>|S ttjd|idd |S )Start the application.zNo kernels availableNc                 S     t | S Nlennamer    r    r!   <lambda>C       z'ListKernelSpecs.start.<locals>.<lambda>keyitemt.Anyr   c                   s:   | d }t  jD ]\}}||r||f  S q	d|fS )z+sort key function for Jupyter path priorityr   r0   )	enumeratejupyter_path
startswith)r1   pathidxprefixr   r    r!   path_keyE   s   
z'ListKernelSpecs.start.<locals>.path_keyzAvailable kernels:      kernelspecs   )indent)r1   r2   r   r2   )kernel_spec_managerfind_kernel_specsget_all_specsr   _limit_to_missingr   printr)   sorteditemsljustr   dumps)r   pathsspecsname_lenr9   
kernelnamer6   r    r   r!   start6   s    

	zListKernelSpecs.startNr   r   )r   r$   )__name__
__module____qualname____doc__r   versiondescriptionr	   r   r?   r   r   r   r   flagsr"   rL   r    r    r    r!   r      s2    


r   c                      s   e Zd ZdZeZdZdZdZe	e
Zd%ddZe Zed	d
ddZd&ddZedd
ddZed	d
ddZedd
ddZdddZee d dd
iidfd dd
iidfd dejiidfed dZd' fd!d"Zd(d#d$Z  ZS ))InstallKernelSpecz An app to install a kernel spec.a=  Install a kernel specification directory.

    Given a SOURCE DIRECTORY containing a kernel spec,
    jupyter will copy that directory into one of the Jupyter kernel directories.
    The default is to install kernelspecs for all users.
    `--user` can be specified to install a kernel only for the current user.
    z>
    jupyter kernelspec install /path/to/my_kernel --user
    z1jupyter kernelspec install SOURCE_DIR [--options]r   r   c                 C     t | jdS N)r   r   r   r    r    r!   r"   g      z.InstallKernelSpec._kernel_spec_manager_default Tz&Install the kernel spec with this namer   r   strc                 C  s   t j| jS r'   )osr6   basename	sourcedirr   r    r    r!   _kernel_name_defaultm   r#   z&InstallKernelSpec._kernel_name_defaultF
        Try to install the kernel spec to the per-user directory instead of
        the system or environment directory.
        zSpecify a prefix to install to, e.g. an env.
        The kernelspec will be installed in PREFIX/share/jupyter/kernels/
        z0Replace any existing kernel spec with this name.zInstallKernelSpec.kernel_namezInstallKernelSpec.prefix)r+   r8   user'Install to the per-user kernel registryreplacer8   zEInstall to Python's sys.prefix. Useful in conda/virtual environments.r   )ra   rc   z
sys-prefixr   argvNone | list[str]Nonec                   s>   t  | | jr| jd | _dS tdtjd | d dS )Parse the command line args.r   zNo source directory specified.filer   N)superparse_command_line
extra_argsr^   rC   sysstderrexitr   rd   	__class__r    r!   rk      s
   z$InstallKernelSpec.parse_command_linec              
   C  s   | j r| jr| d z| jj| j| j| j | j| jd W dS  ty^ } z4|j	t	j
krCt|tjd | j s=tdtjd | d  |j	t	jkrYtd|j tjd | d  d}~ww )r%   zCCan't specify both user and prefix. Please choose one or the other.)kernel_namera   r8   rc   rh   4Perhaps you want to install with `sudo` or `--user`?r   z$A kernel spec is already present at N)ra   r8   ro   r?   install_kernel_specr^   rs   rc   OSErrorerrnoEACCESrC   rm   rn   EEXISTfilename)r   er    r    r!   rL      s.   


zInstallKernelSpec.startrM   )r   r[   )rd   re   r   rf   r   rf   )rN   rO   rP   rQ   r   rR   rS   examplesusager	   r   r?   r"   r   r^   rs   r_   r   ra   r8   rc   aliasesupdater   rm   r   rT   rk   rL   __classcell__r    r    rq   r!   rU   V   sN    





rU   c                      s   e Zd ZdZeZdZdZeddddZ	e
e Zedddd	ZeeZdddZd ddiie	jfd ddiidfdZeej d fddZdddZ  ZS )RemoveKernelSpeczAn app to remove a kernel spec.z/Remove one or more Jupyter kernelspecs by name.z1jupyter kernelspec remove python2 [my_kernel ...]FTz-Force removal, don't prompt for confirmation.rZ   zRemove missing specs.r   r   r   c                 C  s   t | j| dS )N)r   r   r   r   r    r    r!   r"      r#   z-RemoveKernelSpec._kernel_spec_manager_defaultforcer   zremove missing kernels)fr   rd   list[str] | Nonerf   c                   s0   t  | | jrtt| j| _dS g | _dS )rg   N)rj   rk   rl   rD   set
spec_namesrp   rq   r    r!   rk      s   
z#RemoveKernelSpec.parse_command_linec           
      C  sj  d| j _| j  }| jr"t|| j  \}}tt| jt	| | _t| j
t|}|r8| dd|  | jsp| jsptd | jD ]}|||}td|d d|d  qEtdt| j }| d	spd
S | jD ]?}z| j |}W n- ty }	 z!|	jtjkrt|	tjd tdtjd | d n W Y d
}	~	nd
}	~	ww td|  qsd
S )r%   Fz Couldn't find kernel spec(s): %sz, zKernel specs to remove:r:      	zRemove %i kernel specs [y/N]: yNrh   zPerhaps you want sudo?r   zRemoved )r?   ensure_native_kernelr@   r   rB   rA   rD   r   r   list
differencero   joinr   
answer_yesrC   getrF   inputr)   lowerr5   remove_kernel_specrv   rw   rx   rm   rn   )
r   
spec_paths_specr   r+   r6   answerrs   r{   r    r    r!   rL      sB   

"
zRemoveKernelSpec.startrM   )rd   r   r   rf   r|   )rN   rO   rP   rQ   r   rR   rS   r}   r   r   r
   r   r   r   r	   r   r?   r"   r   rT   r   r   rk   rL   r   r    r    rq   r!   r      s,    


	r   c                   @  s\   e Zd ZdZeZdZeeZ	dddZ
eddd	d
Zd ddiidfed dZdddZdS )InstallNativeKernelSpecz)An app to install the native kernel spec.zG[DEPRECATED] Install the IPython kernel spec directory for this Python.r   r   c                 C  rV   rW   r   r   r    r    r!   r"     rX   z4InstallNativeKernelSpec._kernel_spec_manager_defaultFTr`   rZ   ra   rb   r   )ra   r   rf   c              
   C  s   | j d zddlm} W n ty#   tdtjd | d Y nw z|j	| j
| jd W d	S  tyd } z(|jtjkrTt|tjd | jsOtdtjd | d | | W Y d	}~d	S d	}~ww )
r%   z`jupyter kernelspec install-self` is DEPRECATED as of 4.0. You probably want `ipython kernel install` to install the IPython kernelspec.r   )
kernelspecz0ipykernel not available, can't install its spec.rh   r   )ra   rt   N)logwarning	ipykernelr   ModuleNotFoundErrorrC   rm   rn   ro   installr?   ra   rv   rw   rx   )r   r   r{   r    r    r!   rL   "  s.   
zInstallNativeKernelSpec.startNrM   r|   )rN   rO   rP   rQ   r   rR   rS   r	   r   r?   r"   r   ra   r   rT   rL   r    r    r    r!   r     s"    

r   c                   @  s"   e Zd ZdZeZdZdddZdS )	ListProvisionerszAn app to list provisioners.z=List available provisioners for use in kernel specifications.r   rf   c                 C  sd   t j| d}td | }tt|dd dd }t|D ]}td|| d||   qd	S )
r%   )r   zAvailable kernel provisioners:c                 S  r&   r'   r(   r*   r    r    r!   r,   H  r-   z(ListProvisioners.start.<locals>.<lambda>r.   r0   r:   r;   N)r   instancerC   get_provisioner_entriesr)   rD   rF   )r   kfpprovisionersrJ   r+   r    r    r!   rL   A  s    zListProvisioners.startNr|   )rN   rO   rP   rQ   r   rR   rS   rL   r    r    r    r!   r   ;  s
    r   c                	   @  s   e Zd ZdZeZdZdZee	e	j
 d feej
 d fedfeej
 d feej
 d feej
 d fdZi Zi Zdd	d
ZdS )KernelSpecAppzAn app to manage kernel specs.zjupyter kernelspecz%Manage Jupyter kernel specifications.r   zAlias for remove)r   r   	uninstallremovezinstall-selfr   r   rf   c                 C  sJ   | j du r tdt| j  t  |   |   | d dS | j  S )r%   Nz0No subcommand specified. Must specify one of: %sr   )subapprC   r   subcommandsprint_descriptionprint_subcommandsro   rL   r   r    r    r!   rL   i  s   

zKernelSpecApp.startNr|   )rN   rO   rP   rQ   r   rR   r+   rS   r   r   
splitlinesrU   r   r   r   r   r   rT   rL   r    r    r    r!   r   N  s*    r   rH   dict[str, str]rI   dict[str, t.Any]r   'tuple[dict[str, str], dict[str, t.Any]]c                   sn   ddl m} i  | D ]\}}|d d d }t| s"||r#q| |< q fdd|  D }| fS )Nr   )whichr   rd   c                   s   i | ]\}}| v r||qS r    r    ).0kvr   r    r!   
<dictcomp>  s    z%_limit_to_missing.<locals>.<dictcomp>)shutilr   rE   r   exists)rH   rI   r   r+   dataexepaths_r    r   r!   rB   u  s   
rB   __main__)rH   r   rI   r   r   r   )'rQ   
__future__r   rw   r   os.pathr\   rm   typingtpathlibr   jupyter_core.applicationr   r   r   	traitletsr   r   r	   r
   r   traitlets.config.applicationr   rY   r   r   r   provisioning.factoryr   r   rU   r   r   r   r   rB   rN   launch_instancer    r    r    r!   <module>   s0    ?cN4
'