U
    c*                     @   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   cmZcfgserver_extensionsZold_enabledZnew_enabled r!   9lib/python3.8/site-packages/nbclassic/serverextensions.pytoggle_serverextension_python   s*    
 r#   c           	         s   g }g }d} r  d z&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%   warningr&   r!   r"   r'   u   s     )
r   	importlibimport_modulegetattr	Exceptionr)   appendformatr
   r   )	r   r   warningsZ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 userr   z!Perform the operation system-wider   z=Use sys.prefix as the prefix for installing server extensionspythonInstall from a Python package)r   systemz
sys-prefixpyr9   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 )r5   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)ZconfighelpFz Use the sys.prefix as the prefixr7   c                 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   s,   t |\}}|D ]}|d }| | q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 | j D ] }| jr,| | q| | qdS )'Perform the App's actions as configuredz>Please specify a server extension/package to enable or disableN)
extra_argssysexitr6   rC   r>   )r=   argr!   r!   r"   start   s    

zToggleServerExtensionApp.startN)__name__
__module____qualname____doc__namedescriptionflagsr   r   r   r6   r>   rC   rI   r!   r!   r!   r"   r5      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rJ   rK   rL   rM   rN   rO   r;   r!   r!   r!   r"   rQ      s   rQ   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]
    FNrR   r!   r!   r!   r"   rS      s   rS   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  }|D ]z}t| |d}|d}|di di }|rJtd|  | D ]0\}}td| d|rltnt  t|| j	 qRq
dS )	zList all enabled and disabled server extensions, by config path

        Enabled extensions are validated, potentially generating warnings.
        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 )rD   N)rY   )r=   r!   r!   r"   rI     s    zListServerExtensionsApp.startN)
rJ   rK   rL   rM   rN   r   r3   rO   rY   rI   r!   r!   r!   r"   rT      s   rT   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 )rD   z, z'Please supply at least one subcommand: N)superrI   joinsortedsubcommandsrF   rG   )r=   Zsubcmds	__class__r!   r"   rI     s    
zServerExtensionApp.start)rJ   rK   rL   rM   rN   r   r3   rO   	_examplesZexamplesdictrQ   rS   rT   ra   rI   __classcell__r!   r!   rb   r"   rZ     s   rZ   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KeyErrorrg   )r?   rB   r!   r!   r"   r@   0  s    
r@   __main__)NNTFN)N)#rM   r*   rF   Zjupyter_core.pathsr   Z_versionr   Zconfig_managerr   
extensionsr   r   r   r	   r
   r   Z	traitletsr   Ztraitlets.utils.importstringr   r#   r   rP   r   popr5   rQ   rS   rT   rd   rZ   Zlaunch_instancemainr@   rJ   r!   r!   r!   r"   <module>   sv          
6
3   7
