U
    luf/                     @  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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!e"dkr
e!#  dS )zApps for managing kernel specs.    )annotationsN)
JupyterAppbase_aliases
base_flags)BoolDictInstanceListUnicode)Application   )__version__)KernelSpecManager)KernelProvisionerFactoryc                   @  sd   e Zd ZdZeZdZeeZ	e
ddddZd ddiidfed d	Zd
dddZd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configjson_outputdebug)jsonr   r   returnc                 C  s   t | | jdS )N)parentdata_dirr   r   self r   @/tmp/pip-unpacked-wheel-naub1w99/jupyter_client/kernelspecapp.py_kernel_spec_manager_default)   s    z,ListKernelSpecs._kernel_spec_manager_defaultzdict[str, t.Any] | Nonec                   s    j  } j  } js|s*td dS tt|dd dd }ddd fd	d
}td t| |dD ]"\}}td|| d|  qnntt	j
d|idd |S )Start the application.zNo kernels availableNc                 S  s   t | S Nlennamer   r   r   <lambda>5       z'ListKernelSpecs.start.<locals>.<lambda>keyzt.Any)itemr   c                   s:   | d }t  jD ]\}}||r||f  S qd|fS )z+sort key function for Jupyter path priorityr   r*   )	enumerateZjupyter_path
startswith)r+   pathidxprefixr   r   r   path_key7   s
    
z'ListKernelSpecs.start.<locals>.path_keyzAvailable kernels:      Zkernelspecs   )indent)kernel_spec_managerfind_kernel_specsZget_all_specsr   printr#   sorteditemsljustr   dumps)r   pathsspecsname_lenr1   Z
kernelnamer.   r   r   r   start,   s    

	zListKernelSpecs.startN)__name__
__module____qualname____doc__r   versiondescriptionr   r   r6   r   r   r   flagsr   r@   r   r   r   r   r      s    
r   c                      s   e Zd ZdZeZdZdZdZe	e
ZddddZe Zed	d
ddZd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dd  fd!d"Zd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  s   t | jdS N)r   r   r   r   r   r   r   Y   s    z.InstallKernelSpec._kernel_spec_manager_default Tz&Install the kernel spec with this namer   r   strc                 C  s   t j| jS r!   )osr.   basename	sourcedirr   r   r   r   _kernel_name_default_   s    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%   r0   user'Install to the per-user kernel registryreplacer0   zEInstall to Python's sys.prefix. Useful in conda/virtual environments.r   )rR   rT   z
sys-prefixr   zNone | list[str]Noneargvr   c                   s<   t  | | jr | jd | _n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_argsrO   r8   sysstderrexitr   rW   	__class__r   r   r\      s
    z$InstallKernelSpec.parse_command_linec              
   C  s   | j r| jr| d z$| jj| j| j| j | j| jd W n tk
r } zl|j	t	j
krt|tjd | j sztdtjd | d n,|j	t	jkrtd|j tjd | d  W 5 d}~X Y nX dS )r    zCCan't specify both user and prefix. Please choose one or the other.)kernel_namerR   r0   rT   rY   4Perhaps you want to install with `sudo` or `--user`?r   z$A kernel spec is already present at N)rR   r0   r`   r6   Zinstall_kernel_specrO   rd   rT   OSErrorerrnoEACCESr8   r^   r_   EEXISTfilename)r   er   r   r   r@      s(    


zInstallKernelSpec.start)rA   rB   rC   rD   r   rE   rF   examplesusager   r   r6   r   r
   rO   rd   rP   r   rR   r0   rT   aliasesupdater   r^   r   rG   r\   r@   __classcell__r   r   rb   r   rH   H   sL   



rH   c                      s   e Zd ZdZeZdZdZeddddZ	e
e ZeeZdd	d
dZdd ddiie	jfiZeej ddd fddZd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.rK   r   r   c                 C  s   t | j| dS )N)r   r   r   r   r   r   r   r      s    z-RemoveKernelSpec._kernel_spec_manager_defaultfforcezlist[str] | NonerU   rV   c                   s2   t  | | jr$tt| j| _n
| d dS )rX   zNo kernelspec specified.N)r[   r\   r]   r9   set
spec_namesr`   ra   rb   r   r   r\      s    z#RemoveKernelSpec.parse_command_linec                 C  s:  d| j _| j  }t| jt|}|r>| dd|  | js| j	st
d | jD ]0}|||}t
d|d d|d  qXtdt| j }| d	sd
S | jD ]}z| j |}W n\ tk
r$ } z<|jtjkrt
|tjd t
dtjd | d n W 5 d
}~X Y nX t
d|  qd
S )r    Fz Couldn't find kernel spec(s): %sz, zKernel specs to remove:r2      	zRemove %i kernel specs [y/N]: yNrY   zPerhaps you want sudo?r   zRemoved )r6   Zensure_native_kernelr7   rt   ru   
differencer`   joinrs   Z
answer_yesr8   getr;   inputr#   lowerr-   Zremove_kernel_specrf   rg   rh   r^   r_   )r   Z
spec_pathsmissingr%   r.   Zanswerrd   rk   r   r   r   r@      s.    

"
zRemoveKernelSpec.start)rA   rB   rC   rD   r   rE   rF   rl   r   rs   r	   r
   ru   r   r   r6   r   r   rG   ro   r   r\   r@   rp   r   r   rb   r   rq      s   
 	rq   c                   @  sd   e Zd ZdZeZdZeeZ	ddddZ
eddd	d
Zd ddiidfed dZd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  s   t | jdS rI   r   r   r   r   r   r      s    z4InstallNativeKernelSpec._kernel_spec_manager_defaultFTrQ   rK   rR   rS   r   )rR   r   rU   c              
   C  s   | j d zddlm} W n, tk
rH   tdtjd | d Y nX z|j	| j
| jd W nd tk
r } zF|jtjkrt|tjd | jstdtjd | d | | W 5 d	}~X Y nX d	S )
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.rY   r   )rR   re   N)logwarningZ	ipykernelr   ModuleNotFoundErrorr8   r^   r_   r`   installr6   rR   rf   rg   rh   )r   r   rk   r   r   r   r@     s(    
zInstallNativeKernelSpec.startN)rA   rB   rC   rD   r   rE   rF   r   r   r6   r   r   rR   r   rG   r@   r   r   r   r   r      s    
r   c                   @  s&   e Zd ZdZeZdZddddZdS )ListProvisionerszAn app to list provisioners.z=List available provisioners for use in kernel specifications.rU   r   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  s   t | S r!   r"   r$   r   r   r   r&   '  r'   z(ListProvisioners.start.<locals>.<lambda>r(   r*   r2   r3   N)r   instancer8   Zget_provisioner_entriesr#   r9   r;   )r   Zkfpprovisionersr?   r%   r   r   r   r@      s    zListProvisioners.startN)rA   rB   rC   rD   r   rE   rF   r@   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	d
ZdS )KernelSpecAppzAn app to manage kernel specs.zjupyter kernelspecz%Manage Jupyter kernel specifications.r   zAlias for remove)listr   	uninstallremovezinstall-selfr   rU   r   c                 C  sL   | j dkr>tdt| j  t  |   |   | d n
| j  S dS )r    Nz0No subcommand specified. Must specify one of: %sr   )Zsubappr8   r   subcommandsZprint_descriptionZprint_subcommandsr`   r@   r   r   r   r   r@   H  s    
zKernelSpecApp.startN)rA   rB   rC   rD   r   rE   r%   rF   r   r   
splitlinesrH   rq   r   r   r   rn   rG   r@   r   r   r   r   r   -  s(   r   __main__)$rD   
__future__r   rg   r   os.pathrM   r^   typingtZjupyter_core.applicationr   r   r   Z	traitletsr   r   r   r	   r
   Ztraitlets.config.applicationr   rJ   r   r   r   Zprovisioning.factoryr   r   rH   rq   r   r   r   rA   Zlaunch_instancer   r   r   r   <module>   s(   3c;4'
