
    @eW                     ,   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 Z ej        d           ej        d           ej        d          dZd Z ed           G d d                      Z ed           G d d                      Ze G d d                      Z  ed           G d d                      Z!e G d d                      Z" G 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                 R    t          |          }|                                | d<   dS )z0Ensure that the app info has compat_errors fieldcompat_errorsN)r   _get_extension_compat)infoapp_optionshandlers      =lib/python3.11/site-packages/jupyterlab/extensions/manager.py_ensure_compat_errorsr      s+    +&&G#99;;D    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                 .   t          |           }|                    d          }g g g d}|D ]f}t                                          D ]J\  }}|                    |          }|r.||                             |                    d                     Kg|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)   s           r   _build_check_infor1   '   s    +&&G"""--H";;F 8 8(..00 	8 	8LCMM#&&E 8s""5;;v#6#6777	8 Mr   T)frozenc                      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__r8   boolr9   r:   r	   r;   r<   r    dictr=   r?   r@   r-   rB   rC   rD   rE   rF   rG    r   r   r4   r4   5   so         2 IIIMMMGTHd#Ix}###D$GT"GXd^""" $Ix~$$$sNCFC FHSM   !GXc]!!!%)OXc])))'+x}+++)-#---$(NHSM(((((r   r4   c                   f    e Zd ZU dZeed<   dZee         ed<    ee	          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)rH   rI   rJ   rK   rL   rM   rS   r	   r   listrV   r   rP   r   r   rR   rR   f   s\           KKK!GXc]!!!$uT:::M49:::::r   rR   c                       e Zd ZU dZ ee          Zee         e	d<    ee          Z
ee         e	d<   dZee	d<    ee          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
    rT   allowed_extensions_urisblocked_extensions_urisi  listings_refresh_secondslistings_tornado_optionsN)rH   rI   rJ   rK   r   setrZ   r
   rL   rM   r[   r\   intrO   r]   rP   r   r   rY   rY   w   s           ).c(B(B(BSXBBB(-c(B(B(BSXBBB$+c+++%*U4%@%@%@d@@@@@r   rY   c                   F    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)
rH   rI   rJ   rK   rL   rM   rb   rN   rc   r	   rP   r   r   ra   ra      sK           IIIK"&L(3-&&&&&r   ra   c                   p    e Zd ZU dZ ee          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
    rT   cache   	last_pageN)rH   rI   rJ   rK   r   rO   rf   r   r_   r	   rL   r4   rM   rh   rP   r   r   re   re      sg           ?DeTX>Y>Y>YE4Xd3(8#89::;YYYIsr   re   c                   l    e Zd ZdZ	 	 	 d$dee         dee         dee         ddf fdZd Ze	de
fd	            Zd
edee         fdZdedededeeeef         ee         f         fdZd%d
edee         defdZd
edefdZd
edefdZd
edefdZededefd            Zd
edefdZ	 d&dee         dededeee         ee         f         fdZdee         dededdfdZd'dZ	 d(deeef         fdZdedee         fdZ dee         fd Z!d!edefd"Z"	 d&dee         dededdfd#Z# x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                    t                                          |           t          |          }|j        | _        t          |j                  | _        |j        | _        || _        t          di |pi | _
        i | _        d | _        d| _        d | _        t          | j
        j                  st          | j
        j                  rt          | j
        j                  dk    | _        | j        s7t          | j
        j                  dk    r| j                            d           t&          j                            | j        | j
        j        dz  d          | _        | j                                         d S d S )	N)rl   Tr   zqYou have define simultaneously blocked and allowed extensions listings. The allowed listing will take precedence.i  g?)callback_timejitterrP   )super__init__r   loggerlogr   app_dircore_configr   rY   options_extensions_cache_listings_cache_listings_block_mode_listing_fetchlenrZ   r[   warningtornadoioloopPeriodicCallback_fetch_listingsr\   start)selfr   rk   rl   	__class__s       r   rr   zExtensionManager.__init__   s|    	'''%k22%K/00&2&.EE+2CEEGI/3$(!IMt|344 	(DL<`8a8a 	((+DL,P(Q(QUV(VD%, T\5Y1Z1Z]^1^1^   H   #*."A"A$"lCdJ #B # #D
 %%'''''	( 	(r   c                 J    | j         | j                                          d S d S N)r{   stopr   s    r   __del__zExtensionManager.__del__   s.    *$$&&&&& +*r   c                     t                      )zExtension manager metadata.NotImplementedErrorr   s    r   metadatazExtensionManager.metadata   s     "###r   	extensionc                 "   K   t                      )zReturn the latest available version for a given extension.

        Args:
            pkg: The extension name
        Returns:
            The latest available version
        r   r   r   s     r   get_latest_versionz#ExtensionManager.get_latest_version   s       "###r   querypageper_pagec                 "   K   t                      )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   s       r   list_packageszExtensionManager.list_packages          "###r   versionc                 "   K   t                      )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   s      r   r    zExtensionManager.install  s       "###r   c                 "   K   t                      )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   s     r   r!   zExtensionManager.uninstall  r   r   c                    K   	 t          || j                   t          ddg          S # t          $ r(}t          dt	          |                    cY d}~S d}~ww xY w)zDisable an extension.

        Args:
            extension: The extension name
        Returns:
            The action result
        r   rA   frontendr-   rV   errorr-   rS   N)r   r   rR   	Exceptionreprr   r   errs      r   disablezExtensionManager.disable!  s      	CiT5EFFFFtJ<HHHH 	C 	C 	CwS		BBBBBBBBB	C   ', 
AAAAc                    K   	 t          || j                   t          ddg          S # t          $ r(}t          dt	          |                    cY d}~S d}~ww xY w)zEnable an extension.

        Args:
            extension: The extension name
        Returns:
            The action result
        r   rA   r   r   r   r   N)r   r   rR   r   r   r   s      r   enablezExtensionManager.enable/  s      	CYD4DEEEEtJ<HHHH 	C 	C 	CwS		BBBBBBBBB	Cr   c           	      d    t          j        dd t          j        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                 p    t           |                     d                    |                     d           S )Nrg      )PYTHON_TO_SEMVERr+   )ms    r   <lambda>z5ExtensionManager.get_semver_version.<locals>.<lambda>M  s+    )!''!**5CqwwqzzCC r   z\.(dev|post)\d+r>   r   )resubsubn)r   s    r   get_semver_versionz#ExtensionManager.get_semver_version=  s8     vCCG&G44Q7
 
 	
r   c                     |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   s     r   get_normalized_namez$ExtensionManager.get_normalized_nameQ  s     ~r   rg      c                   K   || j         vs|| j         |         j        vr|                     |||           d{V  | j        &| j        | j                                         d{V  | j         |         j        |         }|i }t          |                                          }|>| j        6t          | j                  }g }| j        r|	                                D ]w\  }}||vr%|
                    t          |d                     .|j        rB| j                            d| d           |
                    t          |d                     xn|	                                D ]w\  }}||v r%|
                    t          |d                     .|j        rB| j                            d| d           |
                    t          |d                     x|| 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)r8   zBlocked extension 'z' is installed.FzNot allowed extension ')rx   rf   refreshry   r{   callbackrW   valuesrz   r(   r*   r   r?   rt   r}   rh   )	r   r   r   r   rf   
extensionslistingr%   exts	            r   list_extensionsz ExtensionManager.list_extensions`  sE      ...$d>TUZ>[>a2a2a,,udH555555555 'D,?,K%..000000000&u-3D9=E%,,..))
!5!A4/00GJ( G!& G GID#7**"))'#t*D*D*DEEEE. G(()Tt)T)T)TUUU"))'#u*E*E*EFFFG "' G GID#w"))'#t*D*D*DEEEE. G(()X4)X)X)XYYY"))'#u*E*E*EFFF41%8BBBr   c                    K   || j         v rd| j         |         j        |<   |                     |||           d{V  dS )zRefresh the list of extensions.N)rx   rf   _update_extensions_listr   s       r   r   zExtensionManager.refresh  sY      D***8<D"5)/5**5$AAAAAAAAAAAr   c                 8  K   g }t           j                                        }| j        rt	          | j        j                  r| j                            d| j        j                    | j        j        D ]b} |j	        |fi | j        j
         d{V }t          j        |j                  }|                    |                    dg                      cnt	          | j        j                  r| j                            d| j        j                    | j        j        D ]b} |j	        |fi | j        j
         d{V }t          j        |j                  }|                    |                    dg                      cd |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                      i | ]}|d          |S r   rP   ).0rs     r   
<dictcomp>z4ExtensionManager._fetch_listings.<locals>.<dictcomp>  s    <<<&	1<<<r   )r~   
httpclientAsyncHTTPClientrz   r|   rw   r[   rt   r   fetchr]   jsonloadsbodyextendgetrZ   ry   )r   rulesclientblocked_extensions_urir   jallowed_extensions_uris          r   r   z ExtensionManager._fetch_listings  s     #3355$ 	>4<788 
B^8\^^   /3l.R B B**fl. ,?       A 
16**ALL';R!@!@AAAA566 
	>HMM[T\5Y[[   +/,*N > >&&&,* l;        Jqv&&QUU#7<<====<<e<<<r   Tc                 \  K   | j         }t          |          }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                    }|r/t          ||                     |j                   d{V            }|||
<   |d!                                         D ]\  }}||d"         v rd}|d                             |d          rd}n|                                D ]}||v rd#}	|                     |          }
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                    %          }|r/t          ||                     |j                   d{V            }|||
<   |d&         D ]f}|                     |          }|K|                     |          }
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                    (          }|||
<   h|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_extensionsrA   r   Nr   r%   r5   r>   r6   urlr<   disabledr;   Fr@   r   r=   Tr?   r-   r    r7   prebuiltr:   rB   rC   rD   bugsrG   
repository)r@   r   shadowed_extsr}   source)r%   r5   r6   r<   r;   r@   r=   r?   r-   r7   r:   rB   rC   rD   rG   r!   homepage)r%   r5   r6   r=   r<   r;   r@   r?   r-   r7   rB   rC   rD   rG   rP   )r   r   r1   r   r(   r   _normalize_namer4   rj   r   _get_companionr   r   r%   r   _get_scheduled_uninstall_info)r   r   r   r   build_check_infor   r%   datar-   pkg_infonormalized_namepkgpackagess                r   _get_installed_extensionsz*ExtensionManager._get_installed_extensions  s      &444,[99dK000
 56<<>> 	. 	.JD$FHO$((t44 ! "22488O"   $_$LL;;; "XXeR000 T*%555	
 U  0BB4	?SSS $ #3"E"Ed9o"V"V"V v B/// $ --d333 xx"--11&$((8:L:LMMM +++ !% 4 4 8 8 ? ? ?   $xxb99==eTXXlE[E[\\\!C& " [c8O8OPSPX8Y8Y2Y2Y2Y2Y2Y2YZZZ*-J''|,2244  	.  	.JD$tO,,,FO$((t44 +  0 7 7 9 9 + +Hx''!*"22488O"$ HH]B77!%[T*%55/BB4	?SS"2"E"Ed9o"V"V!--d33xx"--11&$((8:L:LMM++ $ 4 4 8 8 ? ?#xxb99==eTXXlE[E[\\  C" " [c8O8OPSPX8Y8Y2Y2Y2Y2Y2Y2YZZZ*-J''$[1 	2 	2D55d;;D"&"6"6t"<"<&( $ ; ;!%*b!9!9#!#3#F#FtI#W#W&6&I&I$y/&Z&Z$'88Hb1155fdhhx>P>PQQ HHY//$(HHVR$8$8$<$<U$C$C#'88L"#=#=#A#A%R^I_I_#`#`    /2
?+r   r   c                 h    d }d|d         v r%d|d         d         v rd}nd|d         d         v rd}|S )N	discovery
jupyterlabserverkernelrP   )r   r   r:   s      r   r   zExtensionManager._get_companion  sS    	$|,,,4-k:::$		T,/<<<$	r   c                     | j         dz  dz  |z  dz  }|                                rB|                                5 }t          j        |          cddd           S # 1 swxY w Y   dS dS )zDGet information about a package that is scheduled for uninstallationstagingnode_moduleszpackage.jsonN)ru   existsopenr   load)r   r%   targetfids       r   r   z.ExtensionManager._get_scheduled_uninstall_info%  s    	)N:TANR==?? 	 &#y~~& & & & & & & & & & & & & & & & & & 4s   AA!$A!r%   c                     |S )zNormalize extension name; by default does nothing.

        Args:
            name: Extension name
        Returns:
            Normalized name
        rP   )r   r%   s     r   r   z ExtensionManager._normalize_name.  s	     r   c                 (  K   d}|!|                      |||           d{V \  }}n|                                  d{V }|| j        v r+|| j        |         j        |<   |pd| j        |         _        dS t          ||i|pd          | j        |<   dS )zUpdate the list of extensionsNrg   )r   r   rx   rf   rh   re   )r   r   r   r   rh   r   s         r   r   z(ExtensionManager._update_extensions_list8  s       	*.*<*<UD(*S*S$S$S$S$S$S$S!J		  $==????????JD***8BD"5)/56?n1D"5)333,;T:<NPYP^]^,_,_D"5)))r   )NNNr   )Nrg   r   )rm   N)T)%rH   rI   rJ   rK   r	   rO   r   rr   r   propertyra   r   rL   r   r_   r   r   r4   r   rR   r    r!   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   rj   rj      s        : '+&*)-	( (d^( d^( &	(
 
( ( ( ( ( (@' ' ' $2 $ $ $ X$$# $(3- $ $ $ $$$ #$/2$	tC))*HSM9	:$ $ $ $$ $s $Xc] $l $ $ $ $ $ $ $ $ $ $Cs C| C C C CCc Cl C C C C 
C 
C 
 
 
 \
&-= #      KM,C ,Cc],C14,CDG,C	t$%x}4	5,C ,C ,C ,C\B8C= B Bs Bt B B B B= = = => "&h h	c##	$h h h hT4 HSM    Xd^    C C     KM` `c]`14`DG`	` ` ` ` ` ` ` `r   rj   )$rK   r   r   dataclassesr   r   r   pathlibr   typingr   r   r	   r
   r   r~   traitlets.configr   r   jupyterlab.commandsr   r   r   r   r   r   r   compiler'   r1   r4   rR   rY   ra   re   rj   rP   r   r   <module>r     s   - -
  				 1 1 1 1 1 1 1 1 1 1       3 3 3 3 3 3 3 3 3 3 3 3 3 3  > > > > > > > >              #@@ < < < rzGHHJKKbjVWW    $-) -) -) -) -) -) -) -)` $; ; ; ; ; ; ; ;  A A A A A A A A  $' ' ' ' ' ' ' ' 	 	 	 	 	 	 	 	d` d` d` d` d`* d` d` d` d` d`r   