o
    iW                     @   s>  d Z ddlZddlZddlmZmZmZ ddlmZ ddl	m
Z
mZmZmZmZ ddl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G dd dZ eddG dd dZ!eG dd dZ"G d d! d!eZ#dS )"z'Base classes for the extension manager.    N)	dataclassfieldreplace)Path)DictListOptionalSetTuple)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/var/www/edux/Edux_v2/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   5   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   r   rL   f   s
   
 
rL   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   setrS   r	   rH   rI   rT   rU   intrK   rV   r   r   r   r   rR   w   s   
 	rR   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   rZ   rJ   r[   r   r   r   r   r   rY      s
   
 rY   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   r]   r   rX   r   rH   r0   rI   r_   r   r   r   r   r\      s   
 &r\   c                       s  e Zd ZdZ			d7d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d8dedee defddZdedefddZd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	#d9d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d:d(d)Z	*d;deeef fd+d,Zd-edee fd.d/Z dee fd0d1Z!d2edefd3d4Z"	#d9dee dededdfd5d6Z#  Z$S )<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   ext_optionsparentreturnc                    s   t  j|d t|}|j| _t|j| _|j| _|| _t	di |p"i | _
i | _d | _d| _d | _t| j
js>t| j
jrnt| j
jdk| _| jsXt| j
jdkrX| jd tjj| j| j
jd dd| _| j  d S d S )	N)rb   Tr   zqYou have define simultaneously blocked and allowed extensions listings. The allowed listing will take precedence.i  g?)callback_timejitterr   )super__init__r   loggerlogr   app_dircore_configr   rR   options_extensions_cache_listings_cache_listings_block_mode_listing_fetchlenrS   rT   warningtornadoioloopPeriodicCallback_fetch_listingsrU   start)selfr   ra   rb   	__class__r   r   rg      s0   
zExtensionManager.__init__c                 C   s   | j d ur| j   d S d S N)rp   stoprx   r   r   r   __del__   s   
zExtensionManager.__del__c                 C   s   t  )zExtension manager metadata.NotImplementedErrorr}   r   r   r   metadata   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   rx   r   r   r   r   get_latest_version   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   rx   r   r   r   r   r   r   list_packages      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   )rx   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              
      V   zt || jd tddgdW S  ty* } ztdt|dW  Y d}~S d}~ww )zDisable an extension.

        Args:
            extension: The extension name
        Returns:
            The action result
        r   r=   frontendr*   rP   errorr*   rM   N)r   r   rL   	Exceptionreprrx   r   errr   r   r   disable!     zExtensionManager.disablec              
      r   )zEnable an extension.

        Args:
            extension: The extension name
        Returns:
            The action result
        r   r=   r   r   r   r   N)r   r   rL   r   r   r   r   r   r   enable/  r   zExtensionManager.enablec              	   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 )Nr^      )PYTHON_TO_SEMVERr(   )mr   r   r   <lambda>M  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
        r"   r   r   r   r   get_normalized_nameQ  s   z$ExtensionManager.get_normalized_namer^      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 ')rm   r]   refreshrn   rp   callbackrQ   valuesro   r%   r'   r   r;   ri   rr   r_   )	rx   r   r   r   r]   
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)rm   r]   _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 r   r   ).0rr   r   r   
<dictcomp>  s    z4ExtensionManager._fetch_listings.<locals>.<dictcomp>)rs   
httpclientAsyncHTTPClientro   rq   rl   rT   ri   r   fetchrV   jsonloadsbodyextendgetrS   rn   )rx   rulesclientblocked_extensions_urir   jallowed_extensions_urir   r   r   rv     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_extsrr   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"   r   _get_scheduled_uninstall_info)rx   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	discovery
jupyterlabserverkernelr   )rx   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)rj   existsopenr   load)rx   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   )rx   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 extensionsNr^   )r   r   rm   r]   r_   r\   )rx   r   r   r   r_   r   r   r   r   r   8  s   
z(ExtensionManager._update_extensions_list)NNNr{   )Nr^   r   )rc   N)T)%rD   rE   rF   rG   r   rK   r   rg   r~   propertyrY   r   rH   r   rX   r
   r   r0   r   rL   r   r   r   r   staticmethodr   r   r   r   r   rv   r   r   r   r   r   __classcell__r   r   ry   r   r`      s~     


.


j		r`   )$rG   r   r   dataclassesr   r   r   pathlibr   typingr   r   r   r	   r
   rs   traitlets.configr   r   jupyterlab.commandsr   r   r   r   r   r   r   compiler$   r.   r0   rL   rR   rY   r\   r`   r   r   r   r   <module>   s6    0