o
    ^i	h                     @   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 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)Optional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   _get_extension_compat)infoapp_optionshandler r   X/home/ubuntu/hpml_nyu/venv/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   build_check_message_mapitemsmatchappendgroup)r   r   messagesstatusmsgkeypatternr&   r   r   r   _build_check_info)   s   
r.   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__r4   boolr5   r6   r   r7   r8   r   dictr9   r;   r<   r*   r>   r?   r@   rA   rB   rC   r   r   r   r   r0   7   s,   
 r0   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)rD   rE   rF   rG   rH   rI   rM   r   r   listrP   r   r   r   r   rL   h   s
   
 
rL   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`.
    rN   
lock_rulesFlock_allN)rD   rE   rF   rG   r   	frozensetrS   rH   rI   rT   rJ   r   r   r   r   rR   y   s   
 	rR   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
    rN   allowed_extensions_urisblocked_extensions_urisi  listings_refresh_secondslistings_tornado_optionsN)rD   rE   rF   rG   r   setrW   rH   rI   rX   rY   intrK   rZ   r   r   r   r   rV      s   
 	rV   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)
rD   rE   rF   rG   rH   rI   r^   rJ   r_   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
    rN   cache   	last_pageN)rD   rE   rF   rG   r   rK   ra   r\   r   rH   r0   rI   rc   r   r   r   r   r`      s   
 &r`   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systemre   z:Level at which to manage plugins: sys_prefix, user, system)valuesdefault_valuehelpT)configNr   ext_optionsparentreturnc                    sx   t  j|d | jd| jj d| j d t|| _dd t	t
D   fdd|p-i  D }t
d	i || _d S )
N)rm   zPlugins in z will managed on the z 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   )rp   optionvalueplugin_options_fieldr   r   
<dictcomp>   s
    z*PluginManager.__init__.<locals>.<dictcomp>r   )super__init__logdebug	__class__rD   levelr   r   r   rR   r%   options)selfr   rl   rm   plugin_optionsr|   ru   r   ry      s   


zPluginManager.__init__c                    s   t | jj| jjdS )z8Get information about locks on plugin enabling/disabling)	lockRules	allLocked)rQ   r~   rS   rT   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)rp   pluginr   r   r   rr      s    z-PluginManager._find_locked.<locals>.<setcomp>r   )r~   rT   r[   rS   add)r   r   locked_subset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*   rM   r   r}   r=   frontendr*   rP   N)
isinstancerQ   r   r	   loadrL   gettextjoinr   r   r}   	Exceptionreprr   r   locked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   rQ   r   r	   r   rL   r   r   r   r   r}   r   r   r   r   r   r   enable  r   zPluginManager.enableNNN)rD   rE   rF   rG   r
   tagr}   r   rK   r   ry   r   rQ   rH   rU   r   r   rL   r   r   __classcell__r   r   r   r   rd      s2    &rd   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   rl   rm   rn   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   rl   rm   Tr   zqYou have define simultaneously blocked and allowed extensions listings. The allowed listing will take precedence.i  g?)callback_timejitterr   )rx   ry   r   loggerrz   r   app_dircore_configrV   r~   _extensions_cache_listings_cache_listings_block_mode_listing_fetchlenrW   rX   warningtornadoioloopPeriodicCallback_fetch_listingsrY   start)r   r   rl   rm   r   r   r   ry   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 )Nrb      )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
        ro   r   r   r   r   get_normalized_name  s   z$ExtensionManager.get_normalized_namerb      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)r4   zBlocked extension 'z' is installed.FzNot allowed extension ')r   ra   refreshr   r   callbackrQ   rh   r   r%   r'   r   r;   rz   r   rc   )	r   r   r   r   ra   
extensions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   ra   _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 Nblocked_extensionsz!Fetching allowed extensions from allowed_extensionsc                 S   s   i | ]}|d  |qS ro   r   )rp   rr   r   r   rw     s    z4ExtensionManager._fetch_listings.<locals>.<dictcomp>)r   
httpclientAsyncHTTPClientr   r   r~   rX   rz   r   fetchrZ   jsonloadsbodyextendgetrW   r   )r   rulesclientblocked_extensions_urir   j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   federated_extensionsr=   r   Nr   r"   r1   r:   r2   urlr8   disabledr7   Fr<   r   r9   Tr;   r*   r   r3   prebuiltr6   r>   r?   r@   bugsrC   
repository)r<   r   shadowed_extsr   source)r"   r1   r2   r8   r7   r<   r9   r;   r*   r3   r6   r>   r?   r@   rC   r   homepage)r"   r1   r2   r9   r8   r7   r<   r;   r*   r3   r>   r?   r@   rC   r   )r   r   r.   r   r%   r   _normalize_namer0   r   r   _get_companionr   r   r"   rh   _get_scheduled_uninstall_info)r   r   r   r   build_check_infor   r"   datar*   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 )N	discoveryr   serverkernelr   )r   r   r6   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 uninstallationstaging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 extensionsNrb   )r   r   r   ra   rc   r`   )r   r   r   r   rc   r   r   r   r   r     s   
z(ExtensionManager._update_extensions_listr   r   )Nrb   r   )rn   N)T)"rD   rE   rF   rG   r   rK   r   ry   r   propertyr]   r   rH   r   r\   tupler0   r   rL   r   r   staticmethodr   r   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ,  sz    


.


j		r   )(rG   r   r   dataclassesr   r   r   r   pathlibr   typingr   r   r   #jupyterlab_server.translation_utilsr	   	traitletsr
   traitlets.configr   r   jupyterlab.commandsr   r   r   r   r   r   r   compiler$   r.   r0   rL   rR   rV   r]   r`   rd   r   r   r   r   r   <module>   s@    0w