B
    3\e+                 @   s  d Z ddlm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mZmZmZmZmZ dd	lmZ dd
lmZ d+ddZd,ddZi Zeej edd edd edddiidfddddidfdddiidfdddiidfd ed ed< 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%ZG d&d' d'eZ e j!Z"d(d) Z#e$d*kr|e"  dS )-z;Utilities for installing server extensions for the notebook    )print_functionN)jupyter_config_path   )__version__)BaseJSONConfigManager)BaseExtensionApp_get_config_dirGREEN_ENABLEDRED_DISABLEDGREEN_OKRED_X)Bool)import_itemTFc             C   s   |rdn|}t ||d}t||d}|d}|di di }	|	| d}
|dk	rZ|n|
 }|r|rx|d|   n|d	|   ||	| < |r|d
| |d| |rt| | dS )av  Toggle a server extension.

    By default, toggles the extension in the system-wide Jupyter configuration
    location (e.g. /usr/local/etc/jupyter).

    Parameters
    ----------

    import_name : str
        Importable Python module (dotted-notation) exposing the magic-named
        `load_jupyter_server_extension` function
    enabled : bool [default: None]
        Toggle state for the extension.  Set to None to toggle, True to enable,
        and False to disable the extension.
    parent : Configurable [default: None]
    user : bool [default: True]
        Toggle in the user's configuration location (e.g. ~/.jupyter).
    sys_prefix : bool [default: False]
        Toggle in the current Python environment's configuration location
        (e.g. ~/.envs/my-env/etc/jupyter). Will override `user`.
    logger : Jupyter logger [optional]
        Logger instance to use
    F)user
sys_prefix)parent
config_dirjupyter_notebook_configNotebookAppnbserver_extensionsNzEnabling: %szDisabling: %sz- Writing config: {})r   r   get
setdefaultinfoformatupdatevalidate_serverextension)import_nameenabledr   r   r   loggerr   cmZcfgserver_extensionsZold_enabledZnew_enabled r!   8lib/python3.7/site-packages/notebook/serverextensions.pytoggle_serverextension_python   s$    
r#   c       	         s   g }g }d} r  d y&t| }t|dd}t|dd}W n  tk
r`    d|  Y nX d}|dk	r||t|  n||t	|  d} r|rƇ fd	d
|D   fdd
|D  n  || |t |S )a\  Assess the health of an installed server extension

    Returns a list of validation warnings.

    Parameters
    ----------

    import_name : str
        Importable Python module (dotted-notation) exposing the magic-named
        `load_jupyter_server_extension` function
    logger : Jupyter logger [optional]
        Logger instance to use
    Nz    - Validating...Zload_jupyter_server_extensionr    z!Error loading server extension %sz     {} is {} importable?z      {} {} {}c                s   g | ]}  |qS r!   )r   ).0r   )r   r!   r"   
<listcomp>w   s    z,validate_serverextension.<locals>.<listcomp>c                s   g | ]}  |qS r!   )warn)r%   warning)r   r!   r"   r&   x   s    )
r   	importlibimport_modulegetattr	Exceptionr(   appendr   r   r   )	r   r   warningsZinfosfuncmodversionZ
import_msgZpost_mortemr!   )r   r"   r   P   s,    

r   yzgenerate-configToggleServerExtensionAppr   z*Perform the operation for the current user)r   r   z!Perform the operation system-wider   z=Use sys.prefix as the prefix for installing server extensionspythonzInstall from a Python package)r   systemz
sys-prefixpyr6   c               @   s^   e Zd ZdZdZdZeZeddddZeddddZ	eddd	dZ
d
d Zdd Zdd ZdS )r3   z.A base class for enabling/disabling extensionsz&jupyter serverextension enable/disablezEEnable/disable a server extension using frontend configuration files.TzWhether to do a user install)ZconfighelpFz Use the sys.prefix as the prefixzInstall from a Python packagec             C   s    t || j| | j| j| jd dS )a.  Change the status of a named server extension.

        Uses the value of `self._toggle_value`.

        Parameters
        ---------

        import_name : str
            Importable Python module (dotted-notation) exposing the magic-named
            `load_jupyter_server_extension` function
        )r   r   r   r   N)r#   _toggle_valuer   r   log)selfr   r!   r!   r"   toggle_server_extension   s    z0ToggleServerExtensionApp.toggle_server_extensionc             C   s0   t |\}}x|D ]}|d }| | qW dS )a,  Change the status of some server extensions in a Python package.

        Uses the value of `self._toggle_value`.

        Parameters
        ---------

        package : str
            Importable Python module exposing the
            magic-named `_jupyter_server_extension_paths` function
        moduleN)_get_server_extension_metadatar;   )r:   packagemZserver_extsZ
server_extr<   r!   r!   r"   toggle_server_extension_python   s    
z7ToggleServerExtensionApp.toggle_server_extension_pythonc             C   s@   | j std x*| j D ] }| jr.| | q| | qW dS )z'Perform the App's actions as configuredz>Please specify a server extension/package to enable or disableN)Z
extra_argssysexitr4   r@   r;   )r:   argr!   r!   r"   start   s    
zToggleServerExtensionApp.startN)__name__
__module____qualname____doc__namedescriptionflagsr   r   r   r4   r;   r@   rD   r!   r!   r!   r"   r3      s   c               @   s   e Zd ZdZdZdZdZdS )EnableServerExtensionAppz5An App that enables (and validates) Server Extensionszjupyter serverextension enablez
    Enable a serverextension in configuration.
    
    Usage
        jupyter serverextension enable [--system|--sys-prefix]
    TN)rE   rF   rG   rH   rI   rJ   r8   r!   r!   r!   r"   rL      s   rL   c               @   s   e Zd ZdZdZdZdZdS )DisableServerExtensionAppz&An App that disables Server Extensionszjupyter serverextension disablez
    Disable a serverextension in configuration.
    
    Usage
        jupyter serverextension disable [--system|--sys-prefix]
    FN)rE   rF   rG   rH   rI   rJ   r8   r!   r!   r!   r"   rM      s   rM   c               @   s,   e Zd ZdZdZeZdZdd Zdd Z	dS )	ListServerExtensionsAppz3An App that lists (and validates) Server Extensionszjupyter serverextension listz<List all server extensions known by the configuration systemc             C   s   t  }x|D ]z}t| |d}|d}|di di }|rLtd| x8| D ],\}}td||rntnt t	|| j
 qVW qW dS )zList all enabled and disabled server extensions, by config path

        Enabled extensions are validated, potentially generating warnings.
        )r   r   r   r   r   zconfig dir: {}z	    {} {}N)r   r   r   r   printr   itemsr	   r
   r   r9   )r:   Zconfig_dirsr   r   datar    r   r   r!   r!   r"   list_server_extensions   s    

z.ListServerExtensionsApp.list_server_extensionsc             C   s   |    dS )z'Perform the App's actions as configuredN)rR   )r:   r!   r!   r"   rD     s    zListServerExtensionsApp.startN)
rE   rF   rG   rH   rI   r   r1   rJ   rR   rD   r!   r!   r!   r"   rN      s   rN   a,  
jupyter serverextension list                        # list all configured server extensions
jupyter serverextension enable --py <packagename>   # enable all server extensions in a Python package
jupyter serverextension disable --py <packagename>  # disable all server extensions in a Python package
c                   sJ   e Zd ZdZdZeZdZeZ	e
edfedfedfdZ fdd	Z  ZS )
ServerExtensionAppzRoot level server extension appzjupyter serverextensionz#Work with Jupyter server extensionszEnable a server extensionzDisable a server extensionzList server extensions)enabledisablelistc                s0   t t|   dt| j}td|  dS )z'Perform the App's actions as configuredz, z)Please supply at least one subcommand: %sN)superrS   rD   joinsortedsubcommandsrA   rB   )r:   Zsubcmds)	__class__r!   r"   rD   $  s    zServerExtensionApp.start)rE   rF   rG   rH   rI   r   r1   rJ   	_examplesZexamplesdictrL   rM   rN   rZ   rD   __classcell__r!   r!   )r[   r"   rS     s   rS   c             C   s,   t | }t|ds td| || fS )a  Load server extension metadata from a module.

    Returns a tuple of (
        the package as loaded
        a list of server extension specs: [
            {
                "module": "mockextension"
            }
        ]
    )

    Parameters
    ----------

    module : str
        Importable Python module exposing the
        magic-named `_jupyter_server_extension_paths` function
    _jupyter_server_extension_pathszAThe Python module {} does not include any valid server extensions)r   hasattrKeyErrorr   r_   )r<   r?   r!   r!   r"   r=   5  s    
r=   __main__)NNTFN)N)%rH   Z
__future__r   r)   rA   Zjupyter_core.pathsr   Z_versionr   Zconfig_managerr   
extensionsr   r   r	   r
   r   r   Z	traitletsr   Ztraitlets.utils.importstringr   r#   r   rK   r   popr3   rL   rM   rN   r\   rS   Zlaunch_instancemainr=   rE   r!   r!   r!   r"   <module>   sR     
5
37$
