B
    7d*                 @   st  d 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rpe   dS ),z;Utilities for installing server extensions for the notebook    N)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|rz|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: zDisabling: z- Writing config: )r   r   get
setdefaultinfoupdatevalidate_serverextension)import_nameenabledr   r   r   loggerr   cmcfgserver_extensionsZold_enabledZnew_enabled r    g/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/nbclassic/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>t   s    z,validate_serverextension.<locals>.<listcomp>c                s   g | ]}  |qS r    )warn)r$   warning)r   r    r!   r%   u   s    )
r   	importlibimport_modulegetattr	Exceptionr'   appendformatr
   r   )	r   r   warningsinfosfuncmodversionZ
import_msgZpost_mortemr    )r   r!   r   M   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pyr7   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 )r4   z.A base class for enabling/disabling extensionsz0jupyter nbclassic-serverextension enable/disablezEEnable/disable a server extension using frontend configuration files.TzWhether to do a user install)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)
extra_argssysexitr5   rB   r=   )r<   argr    r    r!   start   s    
zToggleServerExtensionApp.startN)__name__
__module____qualname____doc__namedescriptionflagsr   r   r   r5   r=   rB   rG   r    r    r    r!   r4      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 nbclassic-serverextension enablez
    Enable a serverextension in configuration.

    Usage
        jupyter nbclassic-serverextension enable [--system|--sys-prefix]
    TN)rH   rI   rJ   rK   rL   rM   r:   r    r    r    r!   rO      s   rO   c               @   s   e Zd ZdZdZdZdZdS )DisableServerExtensionAppz&An App that disables Server Extensionsz)jupyter nbclassic-serverextension disablez
    Disable a serverextension in configuration.

    Usage
        jupyter nbclassic-serverextension disable [--system|--sys-prefix]
    FN)rH   rI   rJ   rK   rL   rM   r:   r    r    r    r!   rP      s   rP   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 nbclassic-serverextension listz<List all server extensions known by the configuration systemc             C   s   t  }x|D ]~}t| |d}|d}|di di }|rLtd|  x<| D ]0\}}td| d|rpt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   printitemsr   r	   r   r;   )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)rV   )r<   r    r    r!   rG     s    zListServerExtensionsApp.startN)
rH   rI   rJ   rK   rL   r   r2   rM   rV   rG   r    r    r    r!   rQ      s   rQ   aJ  
jupyter nbclassic-serverextension list                        # list all configured server extensions
jupyter nbclassic-serverextension enable --py <packagename>   # enable all server extensions in a Python package
jupyter nbclassic-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 nbclassic-serverextensionz#Work with Jupyter server extensionszEnable a server extensionzDisable a server extensionzList server extensions)enabledisablelistc                s.   t    dt| j}td|  dS )z'Perform the App's actions as configuredz, z'Please supply at least one subcommand: N)superrG   joinsortedsubcommandsrD   rE   )r<   Zsubcmds)	__class__r    r!   rG     s    
zServerExtensionApp.start)rH   rI   rJ   rK   rL   r   r2   rM   	_examplesZexamplesdictrO   rP   rQ   r^   rG   __classcell__r    r    )r_   r!   rW     s   rW   c             C   s.   t | }t|ds"td|  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_pathszThe Python module z- does not include any valid server extensions)r   hasattrKeyErrorrc   )r>   rA   r    r    r!   r?   0  s    
r?   __main__)NNTFN)N)#rK   r(   rD   Zjupyter_core.pathsr   _versionr   Zconfig_managerr   
extensionsr   r   r   r	   r
   r   Z	traitletsr   Ztraitlets.utils.importstringr   r"   r   rN   r   popr4   rO   rP   rQ   r`   rW   Zlaunch_instancemainr?   rH   r    r    r    r!   <module>   sP     
5
37"
