o
    tf0h                     @   s  d Z ddlZddlZddlmZmZmZmZ ddlm	Z	 ddl
mZmZmZmZmZmZmZ ddlZddlmZ ddlmZ ddlmZmZ dd	lmZmZmZmZmZ d
dddZ dd Z!e"de"de"ddZ#dd Z$eddG dd dZ%eddG dd dZ&eddG dd dZ'eddG dd de'Z(eddG d d! d!Z)eG d"d# d#Z*G d$d% d%eZ+G d&d' d'e+Z,dS )(z'Base classes for the extension manager.    N)	dataclassfieldfieldsreplace)Path)Dict	FrozenSetListOptionalSetTupleUnion)
translator)Enum)ConfigurableLoggingConfigurable)_AppHandler_ensure_optionsdisable_extensionenable_extensionget_app_infoz-alpha.z-beta.z-rc.)abrcc                 C   s   t |}| | d< dS )z0Ensure that the app info has compat_errors fieldcompat_errorsN)r   Z_get_extension_compat)infoapp_optionshandler r   f/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/jupyterlab/extensions/manager.py_ensure_compat_errors   s   r    z*(?P<name>.*) needs to be included in buildz+(?P<name>.*) needs to be removed from buildz:(?P<name>.*) changed from (?P<oldver>.*) to (?P<newver>.*)install	uninstallupdatec                 C   sb   t | }|jdd}g g g d}|D ]}t D ]\}}||}|r-|| |d qq|S )z8Get info about packages scheduled for (un)install/updateT)fastr!   name)r   Zbuild_check_message_mapitemsmatchappendgroup)r   r   messagesstatusmsgkeypatternr)   r   r   r   _build_check_info)   s   
r1   T)frozenc                   @   s  e Zd ZU dZeed< eed< eed< eed< dZeed< dZeed	< d
Z	e
e ed< dZeed< dZeed< d
Ze
e ed< d
Ze
e ed< dZeed< dZeed< dZeed< d
Ze
e ed< d
Ze
e ed< d
Ze
e ed< d
Ze
e ed< d
Ze
e ed< d
Ze
e ed< d
S )ExtensionPackagea  Extension package entry.

    Attributes:
        name: Package name
        description: Package description
        homepage_url: Package home page
        pkg_type: Type of package - ["prebuilt", "source"]
        allowed: [optional] Whether this extension is allowed or not - default True
        approved: [optional] Whether the package is approved by your administrators - default False
        companion: [optional] Type of companion for the frontend extension - [None, "kernel", "server"]; default None
        core: [optional] Whether the package is a core package or not - default False
        enabled: [optional] Whether the package is enabled or not - default False
        install: [optional] Extension package installation instructions - default None
        installed: [optional] Whether the extension is currently installed - default None
        installed_version: [optional] Installed version - default ""
        latest_version: [optional] Latest available version - default ""
        status: [optional] Package status - ["ok", "warning", "error"]; default "ok"
        author: [optional] Package author - default None
        license: [optional] Package license - default None
        bug_tracker_url: [optional] Package bug tracker URL - default None
        documentation_url: [optional] Package documentation URL - default None
        package_manager_url: Package home page in the package manager - default None
        repository_url: [optional] Package code repository URL - default None
    r&   descriptionhomepage_urlpkg_typeTallowedFapprovedN	companioncoreenabledr"   	installed installed_versionlatest_versionokr-   authorlicensebug_tracker_urldocumentation_urlpackage_manager_urlrepository_url)__name__
__module____qualname____doc__str__annotations__r7   boolr8   r9   r
   r:   r;   r"   dictr<   r>   r?   r-   rA   rB   rC   rD   rE   rF   r   r   r   r   r3   7   s,   
 r3   c                   @   s@   e Zd ZU dZeed< dZee ed< ee	dZ
ee ed< dS )ActionResultzAction result

    Attributes:
        status: Action status - ["ok", "warning", "error"]
        message: Action status explanation
        needs_restart: Required action follow-up - Valid follow-up are "frontend", "kernel" and "server"
    r-   Nmessagedefault_factoryneeds_restart)rG   rH   rI   rJ   rK   rL   rP   r
   r   listrS   r	   r   r   r   r   rO   h   s
   
 
rO   c                   @   s4   e Zd ZU dZeedZee e	d< dZ
ee	d< dS )PluginManagerOptionsal  Plugin manager options.

    Attributes:
        lock_all: Whether to lock (prevent enabling/disabling) all plugins.
        lock_rules: A list of plugins or extensions that cannot be toggled.
            If extension name is provided, all its plugins will be disabled.
            The plugin names need to follow colon-separated format of `extension:plugin`.
    rQ   
lock_rulesFlock_allN)rG   rH   rI   rJ   r   	frozensetrV   r   rK   rL   rW   rM   r   r   r   r   rU   y   s   
 	rU   c                   @   s\   e Zd ZU dZeedZee e	d< eedZ
ee e	d< dZee	d< eedZee	d< dS )	ExtensionManagerOptionsa  Extension manager options.

    Attributes:
        allowed_extensions_uris: A list of comma-separated URIs to get the allowed extensions list
        blocked_extensions_uris: A list of comma-separated URIs to get the blocked extensions list
        listings_refresh_seconds: The interval delay in seconds to refresh the lists
        listings_tornado_options: The optional kwargs to use for the listings HTTP requests as described on https://www.tornadoweb.org/en/stable/httpclient.html#tornado.httpclient.HTTPRequest
    rQ   allowed_extensions_urisblocked_extensions_urisi  listings_refresh_secondslistings_tornado_optionsN)rG   rH   rI   rJ   r   setrZ   r   rK   rL   r[   r\   intrN   r]   r   r   r   r   rY      s   
 	rY   c                   @   s6   e Zd ZU dZeed< dZeed< dZe	e ed< dS )ExtensionManagerMetadataa#  Extension manager metadata.

    Attributes:
        name: Extension manager name to be displayed
        can_install: Whether the extension manager can un-/install packages (default False)
        install_path: Installation path for the extensions (default None); e.g. environment path
    r&   Fcan_installNinstall_path)
rG   rH   rI   rJ   rK   rL   ra   rM   rb   r
   r   r   r   r   r`      s
   
 r`   c                   @   sD   e Zd ZU dZeedZeee	ee
ef  f ed< dZeed< dS )ExtensionsCachez{Extensions cache

    Attributes:
        cache: Extension list per page
        last_page: Last available page result
    rQ   cache   	last_pageN)rG   rH   rI   rJ   r   rN   rd   r   r_   r
   rK   r3   rL   rf   r   r   r   r   rc      s   
 &rc   c                	       s   e Zd ZdZeg ddddjddZ			dd	ee d
ee dee	 ddf fddZ
defddZdee dee fddZdeeee f defddZdeeee f defddZ  ZS )PluginManagera  Plugin manager enables or disables plugins unless locked.

    It can also disable/enable all plugins in an extension.

    Args:
        app_options: Application options
        ext_options: Plugin manager (subset of extension manager) options
        parent: Configurable parent

    Attributes:
        app_options: Application options
        options: Plugin manager options
    )
sys_prefixusersystemrh   z:Level at which to manage plugins: sys_prefix, user, system)valuesdefault_valuehelpT)configNr   ext_optionsparentreturnc                    sn   t  j|d | jd| jj| j t|| _dd t	t
D   fdd|p(i  D }t
di || _d S )N)rp   z*Plugins in %s will managed on the %s levelc                 S   s   h | ]}|j qS r   r&   ).0fr   r   r   	<setcomp>   s    z)PluginManager.__init__.<locals>.<setcomp>c                    s   i | ]\}}| v r||qS r   r   )rs   optionvalueZplugin_options_fieldr   r   
<dictcomp>   s
    z*PluginManager.__init__.<locals>.<dictcomp>r   )super__init__logdebug	__class__rG   levelr   r   r   rU   r(   options)selfr   ro   rp   Zplugin_optionsr~   rx   r   r{      s   


zPluginManager.__init__c                    s   t | jj| jjdS )z8Get information about locks on plugin enabling/disabling)Z	lockRulesZ	allLocked)rT   r   rV   rW   r   r   r   r   plugin_locks   s   
zPluginManager.plugin_locksplugins_or_extensionsc                 C   sh   | j jrt|S t }dd | j jD }|D ]}d|v r(|| j jv r'|| q||v r1|| q|S )z9Find a subset of plugins (or extensions) which are lockedc                 S   s   h | ]	}| d d qS ):r   )split)rs   pluginr   r   r   ru      s    z-PluginManager._find_locked.<locals>.<setcomp>r   )r   rW   r^   rV   add)r   r   Zlocked_subsetZextensions_with_locked_pluginsr   r   r   r   _find_locked   s   

zPluginManager._find_lockedpluginsc              
         t |tr|n|g}| |}td}|r%td|dd| dS z|D ]}t|| j	| j
d q(tddgd	W S  tyU } ztdt|dW  Y d
}~S d
}~ww )zDisable a set of plugins (or an extension).

        Args:
            plugins: The list of plugins to disable
        Returns:
            The action result
        
jupyterlaberrorz=The following plugins cannot be disabled as they are locked: , r-   rP   r   r   r@   frontendr-   rS   N)
isinstancerT   r   r   loadrO   gettextjoinr   r   r   	Exceptionreprr   r   lockedZtransr   errr   r   r   disable   *   

zPluginManager.disablec              
      r   )zEnable a set of plugins (or an extension).

        Args:
            plugins: The list of plugins to enable
        Returns:
            The action result
        r   r   z<The following plugins cannot be enabled as they are locked: r   r   r   r@   r   r   N)r   rT   r   r   r   rO   r   r   r   r   r   r   r   r   r   r   r   enable  r   zPluginManager.enableNNN)rG   rH   rI   rJ   r   tagr   r
   rN   r   r{   r   r	   rK   r   r   r   rO   r   r   __classcell__r   r   r   r   rg      s2    &rg   c                       s  e Zd ZdZ			d3dee dee dee ddf fddZd	d
 Ze	de
fddZdedee fddZdedededeeeef ee f fddZd4dedee defddZdedefddZededefddZdedefddZ	d5dee dededeee ee f fd d!Zdee dededdfd"d#Zd6d$d%Z	&d7deeef fd'd(Zd)edee fd*d+Zdee fd,d-Zd.edefd/d0Z 	d5dee dededdfd1d2Z!  Z"S )8ExtensionManagera  Base abstract extension manager.

    Note:
        Any concrete implementation will need to implement the five
        following abstract methods:
        - :ref:`metadata`
        - :ref:`get_latest_version`
        - :ref:`list_packages`
        - :ref:`install`
        - :ref:`uninstall`

        It could be interesting to override the :ref:`get_normalized_name`
        method too.

    Args:
        app_options: Application options
        ext_options: Extension manager options
        parent: Configurable parent

    Attributes:
        log: Logger
        app_dir: Application directory
        core_config: Core configuration
        app_options: Application options
        options: Extension manager options
    Nr   ro   rp   rq   c                    s   t  j|||d | jj| _t| jj| _| jj| _tdi |p i | _	i | _
d | _d| _d | _t| j	js<t| j	jrlt| j	jdk| _| jsVt| j	jdkrV| jd tjj| j| j	jd dd| _| j  d S d S )	N)r   ro   rp   Tr   zqYou have define simultaneously blocked and allowed extensions listings. The allowed listing will take precedence.i  g?)Zcallback_timejitterr   )rz   r{   r   loggerr|   r   app_dirZcore_configrY   r   _extensions_cache_listings_cache_listings_block_mode_listing_fetchlenrZ   r[   warningtornadoZioloopZPeriodicCallback_fetch_listingsr\   start)r   r   ro   rp   r   r   r   r{   H  s,   


zExtensionManager.__init__c                 C   s   | j d ur| j   d S d S N)r   stopr   r   r   r   __del__f  s   
zExtensionManager.__del__c                 C   s   t  )zExtension manager metadata.NotImplementedErrorr   r   r   r   metadataj  s   zExtensionManager.metadata	extensionc                       t  )zReturn the latest available version for a given extension.

        Args:
            pkg: The extension name
        Returns:
            The latest available version
        r   r   r   r   r   r   get_latest_versiono  s   z#ExtensionManager.get_latest_versionquerypageper_pagec                    r   )ab  List the available extensions.

        Args:
            query: The search extension query
            page: The result page
            per_page: The number of results per page
        Returns:
            The available extensions in a mapping {name: metadata}
            The results last page; None if the manager does not support pagination
        r   r   r   r   r   r   r   r   list_packagesy     zExtensionManager.list_packagesversionc                    r   )a  Install the required extension.

        Note:
            If the user must be notified with a message (like asking to restart the
            server), the result should be
            {"status": "warning", "message": "<explanation for the user>"}

        Args:
            extension: The extension name
            version: The version to install; default None (i.e. the latest possible)
        Returns:
            The action result
        r   )r   r   r   r   r   r   r"     s   zExtensionManager.installc                    r   )aj  Uninstall the required extension.

        Note:
            If the user must be notified with a message (like asking to restart the
            server), the result should be
            {"status": "warning", "message": "<explanation for the user>"}

        Args:
            extension: The extension name
        Returns:
            The action result
        r   r   r   r   r   r#     r   zExtensionManager.uninstallc              	   C   s    t ddd t dd| d S )a;  Convert a Python version to Semver version.

        It:

        - drops ``.devN`` and ``.postN``
        - converts ``aN``, ``bN`` and ``rcN`` to ``-alpha.N``, ``-beta.N``, ``-rc.N`` respectively

        Args:
            version: Version to convert
        Returns
            Semver compatible version
        z(a|b|rc)(\d+)$c                 S   s   t | d  | d S )Nre      )PYTHON_TO_SEMVERr+   )mr   r   r   <lambda>  s    z5ExtensionManager.get_semver_version.<locals>.<lambda>z\.(dev|post)\d+r=   r   )resubsubn)r   r   r   r   get_semver_version  s
   z#ExtensionManager.get_semver_versionc                 C   s   |j S )a  Normalize extension name.

        Extension have multiple parts, npm package, Python package,...
        Sub-classes may override this method to ensure the name of
        an extension from the service provider and the local installed
        listing is matching.

        Args:
            extension: The extension metadata
        Returns:
            The normalized name
        rr   r   r   r   r   get_normalized_name  s   z$ExtensionManager.get_normalized_namere      c           	         sh  || j vs|| j | jvr| |||I dH  | jdu r*| jdur*| j I dH  | j | j| }|du r8i }t| }|dur| jdurt| j}g }| jr|	 D ](\}}||vrg|
t|dd qU|jr}| jd| d |
t|dd qUn-|	 D ](\}}||v r|
t|dd q|jr| jd| d |
t|dd q|| j | jfS )aL  List extensions for a given ``query`` search term.

        This will return the extensions installed (if ``query`` is None) or
        available if allowed by the listing settings.

        Args:
            query: [optional] Query search term.

        Returns:
            The extensions
            Last page of results
        NT)r7   zBlocked extension 'z' is installed.FzNot allowed extension ')r   rd   refreshr   r   callbackrT   rk   r   r(   r*   r   r>   r|   r   rf   )	r   r   r   r   rd   
extensionsZlistingr&   extr   r   r   list_extensions  s:   
z ExtensionManager.list_extensionsc                    s4   || j v rd| j | j|< | |||I dH  dS )zRefresh the list of extensions.N)r   rd   _update_extensions_listr   r   r   r   r     s   
zExtensionManager.refreshc                    s   g }t j }| jrAt| jjr@| jd| jj  | jjD ]}|j	|fi | jj
I dH }t|j}||dg  q n5t| jjrv| jd| jj  | jjD ]}|j	|fi | jj
I dH }t|j}||dg  qVdd |D | _dS )z-Fetch the listings for the extension manager.z!Fetching blocked extensions from NZblocked_extensionsz!Fetching allowed extensions from Zallowed_extensionsc                 S   s   i | ]}|d  |qS rr   r   )rs   rr   r   r   ry     s    z4ExtensionManager._fetch_listings.<locals>.<dictcomp>)r   Z
httpclientZAsyncHTTPClientr   r   r   r[   r|   r   fetchr]   jsonloadsbodyextendgetrZ   r   )r   rulesclientZblocked_extensions_urir   jZallowed_extensions_urir   r   r   r     s<   
z ExtensionManager._fetch_listingsTc                    sN  | j }t|d}t|}t|| i }|d  D ]\}}d}|}	|d |dr,d}| |}
td)i d|
d|	dd	d
|dd	d||d vdddt	|d dddt	|d d|d|di ddd| 
|d|di d|dd|dd|di dd|di d|d}|rt|| |jI dH d }|||
< q|d!  D ]\}}||d" v rqd}|d |drd}n| D ]}||v rd#}q| |}
t|
|dd	|d ||d vdt	|d dt	|d |d$| 
||di d|d|d|di d|di d|dd%}|rAt|| |jI dH d }|||
< q|d& D ]Z}| |}|dur| |}
t|
|dd	|d'd	dddt	|d t	|d d#d|di d|d|d|di d|di d|dd(}|||
< qJ|S )*zGet the installed extensions.

        Args:
            get_latest_version: Whether to fetch the latest extension version or not.
        Returns:
            The installed extensions as a mapping {name: metadata}
        )r   Zfederated_extensionsr@   r   Nr   r&   r4   r=   r5   urlr;   disabledr:   Fr?   r   r<   Tr>   r-   r"   r6   Zprebuiltr9   rA   rB   rC   bugsrF   
repository)r?   r   Zshadowed_extsr   source)r&   r4   r5   r;   r:   r?   r<   r>   r-   r6   r9   rA   rB   rC   rF   r#   Zhomepage)r&   r4   r5   r<   r;   r:   r?   r>   r-   r6   rA   rB   rC   rF   r   )r   r   r1   r    r(   r   _normalize_namer3   r   r   _get_companionr   r   r&   rk   _get_scheduled_uninstall_info)r   r   r   r   Zbuild_check_infor   r&   datar-   Zpkg_infonormalized_namepkgpackagesr   r   r   _get_installed_extensions  s   



	












z*ExtensionManager._get_installed_extensionsr   c                 C   s@   d }d|d v rd|d d v rd}|S d|d d v rd}|S )NZ	discoveryr   serverZkernelr   )r   r   r9   r   r   r   r     s   zExtensionManager._get_companionc                 C   sX   | j d d | d }| r*| }t|W  d   S 1 s#w   Y  dS dS )zDGet information about a package that is scheduled for uninstallationZstagingZnode_moduleszpackage.jsonN)r   existsopenr   r   )r   r&   targetfidr   r   r   r     s   
$z.ExtensionManager._get_scheduled_uninstall_infor&   c                 C   s   |S )zNormalize extension name; by default does nothing.

        Args:
            name: Extension name
        Returns:
            Normalized name
        r   )r   r&   r   r   r   r     s   z ExtensionManager._normalize_namec                    s   d}|dur|  |||I dH \}}n|  I dH }|| jv r2|| j| j|< |p+d| j| _dS t||i|p9d| j|< dS )zUpdate the list of extensionsNre   )r   r   r   rd   rf   rc   )r   r   r   r   rf   r   r   r   r   r     s   
z(ExtensionManager._update_extensions_listr   r   )Nre   r   )rq   N)T)#rG   rH   rI   rJ   r
   rN   r   r{   r   propertyr`   r   rK   r   r_   r   r   r3   r   rO   r"   r#   staticmethodr   r   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ,  sz    


.


j		r   )-rJ   r   r   dataclassesr   r   r   r   pathlibr   typingr   r   r	   r
   r   r   r   r   Z#jupyterlab_server.translation_utilsr   Z	traitletsr   Ztraitlets.configr   r   Zjupyterlab.commandsr   r   r   r   r   r   r    compiler'   r1   r3   rO   rU   rY   r`   rc   rg   r   r   r   r   r   <module>   s@    $0w