
    MhV              
          d Z ddlZddlZddlZddlZddlZddlZddl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 ddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZmZmZ ddl m!Z! ddl"m#Z# ddl$Z$ddl%Z%ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6  G d dej7        j8                  Z9 ej:        d          Z; ej:        d          p ej:        d          pe;Z< ej:        d          p ej:        d          pe<pe;Z= e)e$j1                  Z>i Z?dZ@e<r e!e<          ZAeAjB        C                    d          \  ZDZEZFe> e)d          k    r&d e$jG        e<           e$jG        e=          diZ?nde<e=diZ? e9            Z@e@H                    eDeF           de$jI        d eJd!eJd"eJd#eKf
d$ZL G d% d&e4          ZMdS )'OExtension manager using pip as package manager and PyPi.org as packages source.    N)datetime	timedeltatimezone)partial)groupby)environ)Path)CalledProcessErrorrun)TarFile)AnyCallableOptional)urlparse)ZipFile)
alru_cache)Version)CFloatCIntUnicodeconfigobserve)__version__)ActionResultExtensionManagerExtensionManagerMetadataExtensionPackagec                       e Zd ZddZd ZdS )ProxiedTransportNc                 &    ||f| _         || _        d S N)proxyproxy_headers)selfhostportheaderss       Z/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jupyterlab/extensions/pypi.py	set_proxyzProxiedTransport.set_proxy*   s    4Z
$    c                     t          j        j        | j         }|                    || j                   ||f| _        |S )Nr(   )httpclientHTTPConnectionr#   
set_tunnelr$   _connection)r%   r&   
connections      r)   make_connectionz ProxiedTransport.make_connection.   sB    [/<
dD,>???+r+   )NN)__name__
__module____qualname__r*   r4    r+   r)   r    r    )   s7        % % % %    r+   r    	ALL_PROXY
http_proxy
HTTP_PROXYhttps_proxyHTTPS_PROXY:z0.28.0mounts)r#   )zhttp://zhttps://proxiesr/   namelatest_versionbase_urlreturnc                    K   |                      |d| d| dz   ddi           d {V }|j        dk     r:t          j        |j                                       d          fdd	D             S i S )
N//jsonContent-Typeapplication/jsonr-     infoc                 <    i | ]}|                     |          S r8   )get).0kdatas     r)   
<dictcomp>z+_fetch_package_metadata.<locals>.<dictcomp>h   s5     
 
 
 txx{{
 
 
r+   )	authorbugtrack_urldocs_url	home_pagelicensepackage_urlproject_urlproject_urlssummary)rM   status_codejsonloadstext)r/   rA   rB   rC   responserP   s        @r)   _fetch_package_metadatar`   Z   s       ZZ3t33n3333!34          H c!!z(-((,,V44
 
 
 


 
 
 	
 	r+   c                       e Zd ZdZ eddd          Z eddd          Z eddd	          Z	 ed
dd          Z
	 	 	 d&dee         dee         deej                 ddf fdZedefd            Zdedee         fdZdedefdZdededefdZ ed          d             Zdedededeeeef         ee         f         fdZde e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% xZ&S )(PyPIExtensionManagerr   zhttps://pypi.org/pypiTzThe base URL of PyPI index.)r   helpg     r@z.PyPI extensions list cache timeout in seconds.i  z$The cache size for package metadata.g      ?zGThrottling time in seconds between PyPI requests using the XML-RPC API.Napp_optionsext_optionsparentrD   c                    t                                          |||           t          j        d	i t          | _        t          t          | j                  | _        |                     d| j	        i           t          j                            | j        t                    | _        t!          j        t$          j                  t)          | j        dz            z
  | _        d | _        | j                            d| j         d           t          r)| j                            dt          j                    d S d S )
Nnew)	transporttz)\(?secondsz%Extensions list will be fetched from .z=Extensions will be fetched using proxy, proxy host and port: r8   )super__init__httpxAsyncClient_httpx_client_args_httpx_clientr   r`   $_observe_package_metadata_cache_sizepackage_metadata_cache_sizexmlrpcr/   ServerProxyrC   xmlrpc_transport_override_rpc_clientr   nowr   utcr   cache_timeout5_PyPIExtensionManager__last_all_packages_request_time)_PyPIExtensionManager__all_packages_cachelogdebugrK   r#   )r%   rd   re   rf   	__class__s       r)   rq   zPyPIExtensionManager.__init__   sA    	k6:::".DD1CDD'./FHZ'['[$115$:Z2[\\\!=44M%> 5 
 
 190M0M0MPY&-Q
 Q
 Q
 1
- %)!Ot}OOOPPP$ 	HMMqPiPoqq    	 	r+   c                 8    t          ddt          j                  S )zExtension manager metadata.PyPIT)r   sysprefixr%   s    r)   metadatazPyPIExtensionManager.metadata   s     (cjAAAr+   pkgc                   K   	 | j                             | j        d| dz   ddi           d{V }|j        dk     r.t	          j        |j                                      di           }n| j                            d	|           dS 	 t          j
        |                    d
d                    pdS # t          $ r Y dS w xY w)zReturn the latest available version for a given extension.

        Args:
            pkg: The extension to search for
        Returns:
            The latest available version
        rF   rG   rH   rI   r-   NrJ   rK   z+Failed to get package information on PyPI; version )ru   rM   rC   r[   r\   r]   contentr   r   r   get_semver_version	Exception)r%   r   r_   rP   s       r)   get_latest_versionz'PyPIExtensionManager.get_latest_version   s     	X!/33C.I[8\ 4        H #c))z("23377CCYXYYZZZt  $6txx	27N7NOOWSWW  	 	 	44	s   BB7 7
CC	extensionc                     |j         .|j         }|d         dk    r|                     |d                   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
        NpackageManagerpythonpackageName)install_normalize_namerA   )r%   r   install_metadatas      r)   get_normalized_namez(PyPIExtensionManager.get_normalized_name   sW     ((0 01X==++,<],KLLL##IN333r+   	recursivefnc                 n  K   t           j        j                                        }	  |j        d|g|R   d{V }n# t
          j        j        $ r}|j        dk    r|j	        
                    d          rd}t          j        d|j	                  }|$t          |                    d          pd          }| j                            d| d	           t#          j        || j        z  d
z              d{V  |r | j        d|g|R   d{V }n |j        d|g|R   d{V }Y d}~nd}~ww xY w|S )a/  Throttle XMLRPC API request

        Args:
            recursive: Whether to call the throttling recursively once or not.
            fn: API method to call
            *args: API method arguments
        Returns:
            Result of the method
        Raises:
            xmlrpc.client.Fault
        NizHTTPTooManyRequests:rl   z!Limit may reset in (\d+) seconds.   1z>HTTPTooManyRequests - Perform next call to PyPI XMLRPC API in zs.g{Gz?F)tornadoioloopIOLoopcurrentrun_in_executorrx   r/   Fault	faultCodefaultString
startswithresearchintgroupr   rK   asynciosleeprpc_request_throttling&_PyPIExtensionManager__throttleRequest)	r%   r   r   argscurrent_looprP   errdelaymatchs	            r)   __throttleRequestz&PyPIExtensionManager.__throttleRequest   s      ~,4466	O55dBFFFFFFFFFFDD}" 	O 	O 	O}&&3?+E+E&, ,& 	"FXX$A 5#66E^UZ^^^   mED,G$G$$NOOOOOOOOO O!7!7r!ID!I!I!IIIIIIIDD!=!=dB!N!N!N!NNNNNNND	O" s   = D2CD--D2rw   c                 ~     t          |d                   t          t          | j                            | _        d S )Nrh   )maxsize)r   r   r`   ru   )r%   changes     r)   rv   z9PyPIExtensionManager._observe_package_metadata_cache_size   s<    'Hz&-'H'H'H+T-?@@(
 (
$$$r+   querypageper_pagec                 f  K   |                                   d{V }i }g }t          t          fd|          d           D ]	\  }}t          |          d         \  }	}
|                     ||
| j                   d{V }|                     |          }|                    d          pi }|                    d          }|                    d          p|                    d          }|                    d	          p|                    d
          }|                    d          p|                    d          }|p/|                    d          p|                    d          p|p|p|}t          ||                    d          ||                    d          |                    d          t          j
        |
          d|||                    d          |          }d}d |||fD             }ddg}|D ]1|v rd} n(t          fddD                       rd} n	dv rd} n2|                    ||f           t          |d           }|dz
  |z  }||z   }|||         }|D ]\  }	}|||j        <   t          j        t#          |          |z            }||fS ) a  List the available extensions.

        Note:
            This will list the packages based on the classifier
                Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt

            Then it filters it with the query and sorts by organization priority:
            1. Project Jupyter (@jupyter)
            2. JupyterLab Community (@jupyterlab-contrib)
            3. Others

        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
        Nc                     | d         v S Nr   r8   )mr   s    r)   <lambda>z4PyPIExtensionManager.list_packages.<locals>.<lambda>  s    EQqTM r+   c                     | d         S r   r8   )es    r)   r   z4PyPIExtensionManager.list_packages.<locals>.<lambda>  s    WXYZW[ r+   rY   zSource CoderU   HomepagerT   DocumentationrS   zBug TrackerrX   rW   rZ   rR   rV   prebuilt)rA   descriptionhomepage_urlrR   rV   rB   pkg_typebug_tracker_urldocumentation_urlpackage_manager_urlrepository_url   c                 T    g | ]%}|t          |                                          &S r8   )strlower)rN   urls     r)   
<listcomp>z6PyPIExtensionManager.list_packages.<locals>.<listcomp>>  s>       %(_bC    r+   z-https://github.com/jupyterlab/jupyterlab_apodz0https://github.com/jupyterlab/extension-examples   c              3       K   | ]}|v V  	d S r"   r8   )rN   orgr   s     r)   	<genexpr>z5PyPIExtensionManager.list_packages.<locals>.<genexpr>J  s;         3J     r+   )zgithub.com/jupyter/zjupyter.orgzgithub.com/jupyterlab/r   zgithub.com/jupyterlab-contrib/   c                 ,    | d         | d         j         fS )Nr   r   rA   )xs    r)   r   z4PyPIExtensionManager.list_packages.<locals>.<lambda>V  s    AaD!A$);L r+   )key))_PyPIExtensionManager__get_all_extensionsr   filterlistr`   rC   r   rM   r   r   r   anyappendsortedrA   mathceillen)r%   r   r   r   matches
extensionsall_matchesrA   r   _rB   rP   normalized_namepackage_urls
source_urlr   r   r   best_guess_home_urlr   priorityurls_to_checkexcludesorted_matches	start_idxend_idxpage_matchestotal_pagesr   s    `                          @r)   list_packagesz"PyPIExtensionManager.list_packages   sy     , 1133333333
"6*A*A*A*A7#K#K^^\\ ;	6 ;	6KD% $UBA~55dNDMZZZZZZZZD"22488O88N339rL%))-88J88K00PL4D4DZ4P4PL $ 4 4 Y8H8H8Y8Y"hh~66Y,:J:J=:Y:YO  #88M**#88M**# %# 	#
 #   )$ HHY//0xx))++/B>RR# /"3$(HH]$;$;)  I H -7GZ,[  M @BG
 %  '>> HE    _       !HE5<< HE = )455551L1LMMM AX)	h&%i&78( 	3 	3LAy)2Jy~&&iN 3 3h >??;&&r+   c                 t  K   | j         >t          j        t          j                  | j        t          | j                  z   k    rk| j        	                    d           | 
                    d| j        j        dg           d {V | _         t          j        t          j                  | _        | j         S )Nrj   rm   z?Requesting PyPI.org RPC API for prebuilt JupyterLab extensions.Tz<Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt)r   r   r|   r   r}   r   r   r~   r   r   r   r{   browser   s    r)   __get_all_extensionsz)PyPIExtensionManager.__get_all_extensionsd  s      $,|1
 1
 1
1IdFX4Y4Y4YY1Z 1Z HNN\]]].2.D.D 'OP/ / ) ) ) ) ) )D%
 5=LHL4Q4Q4QD1((r+   rA   r   c                   K   t           j        j                                        }t	          j                    5 }t	          j        d|d          5 }|                    dt                      |	                                 t          j        ddddd	d
dd|j        g
}||                     d|            n|                               i }	 |                                }|                    dd           |                    dd           |                    dd           |                    dt#          t$          |dd                     d{V }	t'          j        |	j                            d                    }
t/          t1          fd|
                    dg                               }| j                            dt'          j        |
           d           ni# t:          $ r.}| j                            d|j         |           Y d}~n6d}~wt>          $ r&}| j                            d|           Y d}~nd}~ww xY w| j                            dd                     |           d           |                    dt#          t$          |d                     d{V }	| j                            d |	j!                    | j                            d!|	j                            d                      |	j                            d          }|	j!        d"k    r| j                            d#|            d}	 |                    d$i                               d%          }|| j"                            |           d{V }|j#        d&k     r|$                    d'          rtK          tM          j'        |j(                            5 }t1          d( |)                                          D ]B}t'          j        |*                    |                    }|                    d)          }| nCddd           n# 1 swxY w Y   n|$                    d*          rtW          tM          j'        |j(                            5 }t1          d+ |,                                          D ]U}t'          j-        |.                    |/                    |                              }|                    d)          }| nVddd           n# 1 swxY w Y   n | j                            d,| d-|           n3# t>          $ r&}| j                            d.|           Y d}~nd}~ww xY wd/g}|H|                    d0i           }d1|v r|                    d1           d2|v r|                    d2           ta          d3|4          cddd           cddd           S | j        1                    d5 d6|	j!         d7|            ta          d8|9          cddd           cddd           S # 1 swxY w Y   ddd           dS # 1 swxY w Y   dS ):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:
            name: The extension name
            version: The version to install; default None (i.e. the latest possible)
        Returns:
            The action result
        zw+F)modedirdeletezjupyterlab==-mpipr   
--no-inputz--quietz--progress-baroffz--constraintNz==r   z	--dry-runz--report-T)capture_outputcheckutf-8c                     |                      di                                d                              dd          k    S )Nr   rA   r   r  )rM   replace)prA   s    r)   r   z.PyPIExtensionManager.install.<locals>.<lambda>  s8    !%%
B"7"7";";F"C"Ct||TWY\G]G]"] r+   zActions to be executed by pip ro   z!Fail to get installation report: exc_infoz Fail to get installation report.Executing ' 'r  return code: stdout: r   stderr: download_infor   rJ   z.whlc                 2    t          |           j        dk    S Nzpackage.jsonr
   rA   fs    r)   r   z.PyPIExtensionManager.install.<locals>.<lambda>      $q'',.2P r+   
jupyterlabztar.gzc                 2    t          |           j        dk    S r  r  r  s    r)   r   z.PyPIExtensionManager.install.<locals>.<lambda>  r  r+   zFailed to get 'z'; zFail to get package.json.frontend	discoverykernelserverokstatusneeds_restartzFailed to install : code 
errorr"  message)2r   r   r   r   tempfileTemporaryDirectoryNamedTemporaryFilewriter   flushr   
executablerA   r   copyinsertr   r   r   r\   r]   stdoutdecodenextr   rM   r   r   dumpsr   stderrr   join
returncoderu   r[   endswithr   ioBytesIOr   namelistreadr   getnamesloadextractfile	getmemberr   r&  )r%   rA   r   r   ve_dirfconstraintcmdline
pkg_actiontmp_cmdresultaction_infor   r   r&  jlab_metadatadownload_urlr_   wheelfilenamerP   sdist
follow_upsr  s    `                     r)   r   zPyPIExtensionManager.installr  s      ~,4466'))j	C-3'TveLLLj	CP[:[::;;;   G "$33'334444t$$$J\!,,..r;///r:...r3'''+;;'#wt4PPP          #j)=)=g)F)FGG!]]]]#	266  
 Z
;@W@WZZZ[[[[ & [ [ [M18MMXYZZZZZZZZ Q Q QACPPPPPPPPQ
 HNN='):):===>>>'77gc74@@@       F HNN>6+<>>???HNNEfm&:&:7&C&CEEFFFM((11E A%%1%11222 $L(2(K(K(O(OPU(V(VL#/)-);)?)?)M)M#M#M#M#M#M#M#/#55+44V<< 2%,RZ8H-I-I%J%J !2e4:(P(P(-(8(85& 5& %2 %2 04z%**X:N:N/O/O8<8N8N+8+D,1E ,E!2 !2 !2 !2 !2 !2 !2 !2 !2 !2 !2 !2 !2 !2 !2 ".!6!6x!@!@ 2%,RZ8H-I-I%J%J 
!2e4:(P(P(-(8(85& 5& 	%2 	%2 04y,1,=,=eooh>W>W,X,X0* 0* 9=8N8N+8+D,1E ,E
!2 
!2 
!2 
!2 
!2 
!2 
!2 
!2 
!2 
!2 
!2 
!2 
!2 
!2 
!2 !HNN+Z\+Z+Zh+Z+Z[[[  L L LHNN#>NKKKKKKKKL 
 !, - 1 1+r B BI9,,"))(3339,,"))(333#4zJJJOj	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	CR ]D]]AR]]V[]]^^^#7EBBBUj	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	C j	Cs   Y'BYC(G-<1Y-
I7$H Y I-I	YIDYBU(A'QUQU"Q#?U"A:T(U(T,,U/T,0$UY
VV ;Y VA Y%Y'>8Y6Y'Y	Y'Y	Y''Y+.Y+c           	        K   t           j        j                                        }t          j        ddddd|g}d}	 |                                }|                    d           |                    dt          t          |d                     d{V }t          d	 t          d
 |j                            d                                                              }t          d t          t           |                    D ]A}t#          j        |                                          }	|	                    d          }| nBn3# t*          $ r&}
| j                            d|
           Y d}
~
nd}
~
ww xY w| j                            dd                    |           d           |                    dt          t          |d                     d{V }| j                            d|j                    | j                            d|j                            d                      |j                            d          }|j        dk    r{| j                            d|            dg}|H|                    di           }d|v r|                    d           d|v r|                    d           t9          d|          S | j                            d| d|j         d|            t9          d |!          S )"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   	uninstallz--yesr  NTr  c                 ,    |                      d          S r  )r8  lines    r)   r   z0PyPIExtensionManager.uninstall.<locals>.<lambda>  s    T]]>:: r+   c                 *    |                                  S r"   )striprQ  s    r)   r   z0PyPIExtensionManager.uninstall.<locals>.<lambda>  s     r+   r  c                     | j         dk    S r  r   r  s    r)   r   z0PyPIExtensionManager.uninstall.<locals>.<lambda>  s    !&N2 r+   r  z%Fail to list files to be uninstalled.r
  r  r  r  r  r  r   r  r  r  r  r  r   r!  zFailed to installed r$  r%  r&  r'  )r   r   r   r   r   r.  r/  remover   r   r   r   mapr1  r2  
splitlinesr
   r\   r]   
read_bytesrM   r   r   r   r6  r7  r5  r   r   r&  )r%   r   r   rC  rH  rE  rF  linesfilepathrP   r   r&  rM  r  s                 r)   rO  zPyPIExtensionManager.uninstall  sk      ~,4466N
 	PllnnGNN7###'77gc74@@@       F ::--v}/C/CG/L/L/W/W/Y/YZZ E #22D%      z("5"5"7"788 $ 6 6 ,E - 	P 	P 	PHNNBQNOOOOOOOO	P 	9SXXg%6%6999:::#33'#wt<<<
 
 
 
 
 
 
 
 	:v'8::;;;A&-"6"6w"?"?AABBB$$W--!!HNN-e--...J ()--k2>>	y((%%h///y((%%h///t:FFFFHNN`)``FDU``Y^``aaaw>>>>s   D
E 
E7E22E7c                 ~    |                     dd                               dd                               dd          S )zNormalize extension name.

        Remove `@` from npm scope and replace `/` and `_` by `-`.

        Args:
            name: Extension name
        Returns:
            Normalized name
        @r   rF   r  r   )r  )r%   rA   s     r)   r   z$PyPIExtensionManager._normalize_name6  s8     ||C$$,,S#66>>sCHHHr+   )NNNr"   )'r5   r6   r7   __doc__r   rC   r   r~   r   rw   r   r   dictr   Configurablerq   propertyr   r   r   r   r   r   boolr   r   r   r   rv   r   tupler   r   r   r   r   rO  r   __classcell__)r   s   @r)   rb   rb   z   s       YYw.tB_```HF$T  M #'$T F# # # $VV   '+&*04	 d^ d^ ,-	
 
     4 B2 B B B XBXC XHSM X X X X.4-= 4# 4 4 4 4&   8  s        D W*++
 
 ,+

d'd' #d'/2d'	tC))*HSM9	:d' d' d' d'L)DsCx,A ) ) ) )yC yC# yC yC yC yC yC yCvG? G? G? G? G? G?R
IC 
IC 
I 
I 
I 
I 
I 
I 
I 
Ir+   rb   )Nr^  r   http.clientr.   r9  r\   r   r   r   r)  xmlrpc.clientrx   r   r   r   	functoolsr   	itertoolsr   osr	   pathlibr
   
subprocessr   r   tarfiler   typingr   r   r   urllib.parser   zipfiler   rr   r   	async_lrur   packaging.versionr   	traitletsr   r   r   r   r   jupyterlab._versionr   jupyterlab.extensions.managerr   r   r   r   r/   	Transportr    rM   all_proxy_urlhttp_proxy_urlhttps_proxy_url_httpx_versionrt   rz   r:   netloc	partition
proxy_hostr   
proxy_portAsyncHTTPTransportr*   rs   r   r_  r`   rb   r8   r+   r)   <module>r     s   V U      				   				 



      2 2 2 2 2 2 2 2 2 2                         . . . . . . . .       * * * * * * * * * * ! ! ! ! ! !                     % % % % % % < < < < < < < < < < < < < < + + + + + +           	 	 	 	 	v}. 	 	 	 K(( \**Xkgk,.G.GX=GK_+'+m"<"<__R_ 
 *++    @.))J * 1 ; ;C @ @J:****353.III4E4?KKK 
 )+ 
 !1 0 2 2''
J???
  	
 
   @FI FI FI FI FI+ FI FI FI FI FIr+   