o
    Ëý°j�£  ã                   @   s˜  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
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 ddlZddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"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/ e 0d
¡Z1e 0dej2¡Z3e 0d¡Z4e 0dej2¡j5Z6d 7¡ Z8g d¢Z9dZ:dZ;e;j<dj<ej=Ž ed�Z>dd„ Z?dd„ Z@dd„ ZAdBdd„ZBdBdd„ZCdBdd„ZDdedfd d!„ZEd"d#„ ZFe 0d$ej2¡ZGeFd%d&„ ƒZHG d'd(„ d(ƒZIG d)d*„ d*eIƒZJG d+d,„ d,eƒZKe 0d-¡jLZMd.d/„ ZNd0d1„ ZOdCd2d3„ZPd4d5„ ZQG d6d7„ d7ƒZRG d8d9„ d9ejSƒZTejUjVfd:d;„ZWd<d=„ ZXePe:ƒeWƒZWd>d?„ ZYd@dA„ ZZdS )Dz#PyPI and direct package downloadingé    N©Úwraps)ÚCHECKOUT_DISTÚDistributionÚBINARY_DISTÚnormalize_pathÚSOURCE_DISTÚEnvironmentÚfind_distributionsÚ	safe_nameÚsafe_versionÚto_filenameÚRequirementÚDEVELOP_DISTÚEGG_DISTÚparse_version)Úlog)ÚDistutilsError)Ú	translate)ÚWheel©Úunique_everseenz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)zƒ<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz)ÚPackageIndexÚdistros_for_urlÚparse_bdist_wininstÚinterpret_distro_nameé   z<setuptools/{setuptools.__version__} Python-urllib/{py_major}z{}.{})Úpy_majorÚ
setuptoolsc              
   C   s6   zt  | ¡W S  ty } ztd| f ƒ|‚d }~ww )Nz1Not a URL, existing file, or requirement spec: %r)r   ÚparseÚ
ValueErrorr   )ÚspecÚe© r#   ú‹/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/setuptools/package_index.pyÚparse_requirement_arg7   s   ÿþ€ÿr%   c                 C   s°   |   ¡ }d\}}}| d¡rS| d¡r| dd… }d}n7| dd¡r1| d	d
… }| dd… }d}n"| d¡r?| dd… }d}n| dd¡rS| d	d
… }| dd… }d}|||fS )z=Return (base,pyversion) or (None,None) for possible .exe name)NNNú.exez
.win32.exeNiöÿÿÿÚwin32z	.win32-pyiðÿÿÿiùÿÿÿéüÿÿÿz.win-amd64.exeiòÿÿÿz	win-amd64z.win-amd64-pyiìÿÿÿ)ÚlowerÚendswithÚ
startswith)Únamer)   ÚbaseÚpy_verÚplatr#   r#   r$   r   @   s$   




r   c           	      C   sx   t j | ¡}|\}}}}}}t j | d¡d ¡}|dkr,|dkr,t j | d¡d ¡}d|v r8| dd¡\}}||fS )Nú/éÿÿÿÿzsourceforge.netÚdownloadéþÿÿÿú#é   )Úurllibr   ÚurlparseÚunquoteÚsplit)	ÚurlÚpartsÚschemeÚserverÚpathÚ
parametersÚqueryÚfragmentr-   r#   r#   r$   Úegg_info_for_urlX   s   rB   c                 c   sf   � t | ƒ\}}t| ||ƒD ]}|V  q|r-t |¡}|r/t| | d¡|td�D ]	}|V  q'dS dS dS )zEYield egg or source distribution objects that might be found at a URLr5   )Ú
precedenceN)rB   Údistros_for_locationÚEGG_FRAGMENTÚmatchr   Úgroupr   )r:   Úmetadatar-   rA   ÚdistrF   r#   r#   r$   r   c   s   €

ÿúr   c                 C   sä   |  d¡r|dd… }|  d¡rd|v rt | ||¡gS |  d¡r<d|v r<t|ƒ}| ¡ s/g S t| |j|jtd d�gS |  d	¡rUt|ƒ\}}}|durUt	| |||t
|ƒS tD ]}|  |¡ro|dt|ƒ … }t	| ||ƒ  S qWg S )
z:Yield egg or source distribution objects based on basenameú.egg.zipNr(   z.eggú-z.whlr5   )ÚlocationÚproject_nameÚversionrC   r&   )r*   r   Úfrom_locationr   Úis_compatiblerM   rN   r   r   r   r   Ú
EXTENSIONSÚlen)rL   ÚbasenamerH   ÚwheelÚwin_baser.   ÚplatformÚextr#   r#   r$   rD   q   s4   
û
ÿ
þrD   c                 C   s   t t| ƒtj | ¡|ƒS )zEYield possible egg or source distribution objects based on a filename)rD   r   Úosr>   rS   )ÚfilenamerH   r#   r#   r$   Údistros_for_filename’   s   ÿrZ   c              
   c   s~   � |  d¡}|stdd„ |dd… D ƒƒrdS tdt|ƒd ƒD ]}t| |d |d|… ¡d ||d… ¡|||d�V  q dS )zØGenerate alternative interpretations of a source distro name

    Note: if `location` is a filesystem filename, you should call
    ``pkg_resources.normalize_path()`` on it before passing it to this
    routine!
    rK   c                 s   s   � | ]	}t  d |¡V  qdS )z	py\d\.\d$N)ÚrerF   )Ú.0Úpr#   r#   r$   Ú	<genexpr>°   s   € z(interpret_distro_name.<locals>.<genexpr>é   Nr5   )Ú
py_versionrC   rV   )r9   ÚanyÚrangerR   r   Újoin)rL   rS   rH   r`   rC   rV   r;   r]   r#   r#   r$   r   ™   s   €
$
ýÿr   c                    s   t ˆ ƒ‡ fdd„ƒ}|S )zs
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    c                     s   t ˆ | i |¤ŽƒS ©Nr   )ÚargsÚkwargs©Úfuncr#   r$   ÚwrapperÂ   s   zunique_values.<locals>.wrapperr   )rh   ri   r#   rg   r$   Úunique_values¼   s   rj   z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c              	   c   s¼   � t  |¡D ]2}| ¡ \}}tttj| ¡  d¡ƒƒ}d|v s#d|v r8t	 |¡D ]}t
j | t| d¡ƒ¡V  q(qdD ] }| |¡}|dkr[t	 ||¡}|r[t
j | t| d¡ƒ¡V  q;dS )zEFind rel="homepage" and rel="download" links in `page`, yielding URLsú,Úhomepager2   r5   )z<th>Home Pagez<th>Download URLr1   N)ÚRELÚfinditerÚgroupsÚsetÚmapÚstrÚstripr)   r9   ÚHREFr6   r   ÚurljoinÚ
htmldecoderG   ÚfindÚsearch)r:   ÚpagerF   ÚtagÚrelÚrelsÚposr#   r#   r$   Úfind_external_linksÍ   s    €€
€ûr~   c                   @   ó(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚContentCheckerzP
    A null content checker that defines the interface for checking content
    c                 C   ó   dS )z3
        Feed a block of data to the hash.
        Nr#   ©ÚselfÚblockr#   r#   r$   Úfeedå   ó   zContentChecker.feedc                 C   r�   )zC
        Check the hash. Return False if validation fails.
        Tr#   ©rƒ   r#   r#   r$   Úis_validë   r†   zContentChecker.is_validc                 C   r�   )zu
        Call reporter with information about the checker (hash name)
        substituted into the template.
        Nr#   )rƒ   ÚreporterÚtemplater#   r#   r$   Úreportñ   s   zContentChecker.reportN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r…   rˆ   r‹   r#   r#   r#   r$   r€   à   s
    r€   c                   @   sB   e Zd Ze d¡Zdd„ Zedd„ ƒZdd„ Z	dd	„ Z
d
d„ ZdS )ÚHashCheckerzK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)c                 C   s   || _ t |¡| _|| _d S rd   )Ú	hash_nameÚhashlibÚnewÚhashÚexpected)rƒ   r‘   r•   r#   r#   r$   Ú__init__ÿ   s   
zHashChecker.__init__c                 C   sB   t j |¡d }|stƒ S | j |¡}|stƒ S | di | ¡ ¤ŽS )z5Construct a (possibly null) ContentChecker from a URLr1   Nr#   )r6   r   r7   r€   Úpatternrx   Ú	groupdict)Úclsr:   rA   rF   r#   r#   r$   Úfrom_url  s   zHashChecker.from_urlc                 C   s   | j  |¡ d S rd   )r”   Úupdater‚   r#   r#   r$   r…     ó   zHashChecker.feedc                 C   s   | j  ¡ | jkS rd   )r”   Ú	hexdigestr•   r‡   r#   r#   r$   rˆ     rœ   zHashChecker.is_validc                 C   s   || j  }||ƒS rd   )r‘   )rƒ   r‰   rŠ   Úmsgr#   r#   r$   r‹     s   
zHashChecker.reportN)rŒ   r�   rŽ   r[   Úcompiler—   r–   Úclassmethodrš   r…   rˆ   r‹   r#   r#   r#   r$   r�   ù   s    ÿ

r�   c                       sn  e Zd ZdZ		dRdd„Z‡ fdd	„ZdSdd„ZdSdd„ZdSdd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdTdd„Zdd„ ZdT‡ fdd „	Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Z	
	dUd+d,„ZdVd-d.„Zd/d0„ Zd1Zd2d3„ Zd4d5„ ZdTd6d7„Zed8d9„ ƒZd:d;„ Zed<d=„ ƒZ d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&edJdK„ ƒZ'dLdM„ Z(dNdO„ Z)dPdQ„ Z*‡  Z+S )Wr   z;A distribution index that scans web pages for download URLsúhttps://pypi.org/simple/©Ú*NTc                 O   sr   t j| g|¢R i |¤Ž |dd | d¡ …  | _i | _i | _i | _t d 	t
t|ƒ¡¡j| _g | _tjj| _d S )Nr0   ú|)r	   r–   r*   Ú	index_urlÚscanned_urlsÚfetched_urlsÚpackage_pagesr[   rŸ   rc   rq   r   rF   ÚallowsÚto_scanr6   ÚrequestÚurlopenÚopener)rƒ   r¥   ÚhostsÚ	ca_bundleÚ
verify_sslre   Úkwr#   r#   r$   r–     s   zPackageIndex.__init__c                    s0   zt |jƒ W n
 ty   Y d S w tƒ  |¡S rd   )r   rN   Ú	ExceptionÚsuperÚadd)rƒ   rI   ©Ú	__class__r#   r$   r´   *  s   ÿzPackageIndex.addFc                 C   sÜ  || j v r	|s	dS d| j |< t|ƒs|  |¡ dS tt|ƒƒ}|r.|  |¡s(dS |  d|¡ |s7|r7|| jv rAtt| j	|ƒƒ dS |  |¡sMd| j|< dS |  
d|¡ d| j|< d}|  ||| ¡}|du rhdS t|tjjƒr||jdkr||  
d|j ¡ d| j|j< d|j d	d
¡ ¡ vr“| ¡  dS |j}| ¡ }t|tƒs·t|tjjƒr©d}n|j d¡p°d}| |d¡}| ¡  t |¡D ]}	tj |t|	  d¡ƒ¡}
|  !|
¡ qÀ| "| j#¡rêt$|ddƒdkrì|  %||¡}dS dS dS )z<Evaluate a URL as a possible download, and maybe retrieve itNTzFound link: %sz
Reading %sz<Download error on %s: %%s -- Some packages may not be found!i‘  zAuthentication error: %sÚhtmlúcontent-typeÚ zlatin-1ÚcharsetÚignorer5   Úcodeé”  )&r¦   Ú
URL_SCHEMEÚprocess_filenameÚlistr   Úurl_okÚdebugr§   rq   r´   ÚinfoÚopen_urlÚ
isinstancer6   ÚerrorÚ	HTTPErrorr¼   rž   r:   ÚheadersÚgetr)   ÚcloseÚreadrr   Ú	get_paramÚdecodert   rn   r   ru   rv   rG   Úprocess_urlr+   r¥   ÚgetattrÚprocess_index)rƒ   r:   ÚretrieveÚdistsÚtmplÚfr-   ry   rº   rF   Úlinkr#   r#   r$   rÎ   3  sV   






ÿzPackageIndex.process_urlc                 C   sŽ   t j |¡s|  d|¡ d S t j |¡r/|s/t j |¡}t  |¡D ]}|  t j ||¡d¡ q!t	|ƒ}|rE|  
d|¡ tt| j|ƒƒ d S d S )NzNot found: %sTz	Found: %s)rX   r>   ÚexistsÚwarnÚisdirÚrealpathÚlistdirr¿   rc   rZ   rÂ   rÀ   rq   r´   )rƒ   ÚfnÚnestedr>   ÚitemrÒ   r#   r#   r$   r¿   h  s   þzPackageIndex.process_filenamec                 C   s`   t |ƒ}|o| d¡ ¡ dk}|s|  tj |¡d ¡rdS d}|r(t|| ƒ‚|  ||¡ d S )Nr5   ÚfileTzN
Note: Bypassing %s (disallowed host; see http://bit.ly/2hrImnY for details).
)	r¾   rG   r)   r©   r6   r   r7   r   r×   )rƒ   r:   ÚfatalÚsÚis_filerž   r#   r#   r$   rÁ   x  s   ÿzPackageIndex.url_okc                 C   s2   t tjj|ƒ}dd„ |D ƒ}tt | j|¡ƒ d S )Nc                 s   s2   � | ]}t  |¡D ]}| d ¡r	||fV  q	qdS )z	.egg-linkN)rX   rÚ   r*   )r\   r>   Úentryr#   r#   r$   r^   ‡  s   € ýüÿz.PackageIndex.scan_egg_links.<locals>.<genexpr>)ÚfilterrX   r>   rØ   rÀ   Ú	itertoolsÚstarmapÚscan_egg_link)rƒ   Úsearch_pathÚdirsÚ	egg_linksr#   r#   r$   Úscan_egg_links…  s
   þzPackageIndex.scan_egg_linksc                 C   s¢   t tj ||¡ƒ�}ttd ttj|ƒƒƒ}W d   ƒ n1 sw   Y  t	|ƒdkr,d S |\}}t
tj ||¡ƒD ]}tjj|g|¢R Ž |_t|_|  |¡ q9d S )Nr_   )ÚopenrX   r>   rc   rÀ   rã   rq   rr   rs   rR   r
   rL   r   rC   r´   )rƒ   r>   râ   Ú	raw_linesÚlinesÚegg_pathÚ
setup_pathrI   r#   r#   r$   ræ   �  s   þýzPackageIndex.scan_egg_linkc                 C   s”   d}|  | j¡s
|S tttjj|t| jƒd …  d¡ƒƒ}t|ƒdks)d|d v r+|S t	|d ƒ}t
|d ƒ}d| j | ¡ i ¡|< t|ƒt|ƒfS )N)NNr0   r_   r4   r5   r   T)r+   r¥   rÀ   rq   r6   r   r8   rR   r9   r   r   r¨   Ú
setdefaultr)   r   )rƒ   rÕ   ÚNO_MATCH_SENTINELr;   ÚpkgÚverr#   r#   r$   Ú_scanŸ  s   ÿzPackageIndex._scanc           	   
   C   s¾   t  |¡D ]}z|  tj |t| d¡ƒ¡¡ W q ty!   Y qw |  |¡\}}|s-dS t	||ƒD ]$}t
|ƒ\}}| d¡rQ|sQ|rL|d||f 7 }n|  |¡ |  |¡ q2t dd„ |¡S )z#Process the contents of a PyPI pager5   r¹   ú.pyz
#egg=%s-%sc                 S   s   d|   ddd¡ S )Nz<a href="%s#md5=%s">%s</a>r5   é   r_   )rG   )Úmr#   r#   r$   Ú<lambda>Ë  s    z,PackageIndex.process_index.<locals>.<lambda>)rt   rn   rô   r6   r   ru   rv   rG   r    r~   rB   r*   Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub)	rƒ   r:   ry   rF   rò   ró   Únew_urlr-   Úfragr#   r#   r$   rÐ   ±  s&   "ÿ
ÿzPackageIndex.process_indexc                 C   s   |   d|¡ d S )NzPPage at %s links to .py file(s) without version info; an index scan is required.)Úscan_all©rƒ   r:   r#   r#   r$   rù   Î  s   þzPackageIndex.need_version_infoc                 G   s<   | j | jvr|r| j|g|¢R Ž  |  d¡ |  | j ¡ d S )Nz6Scanning index of all packages (this may take a while))r¥   r§   r×   rÃ   rú   ©rƒ   rž   re   r#   r#   r$   rÿ   Ô  s   ÿzPackageIndex.scan_allc                 C   sz   |   | j|j d ¡ | j |j¡s|   | j|j d ¡ | j |j¡s)|  |¡ t| j |jd¡ƒD ]}|   |¡ q3d S )Nr0   r#   )	rú   r¥   Úunsafe_namer¨   rÉ   ÚkeyrM   Únot_found_in_indexrÀ   )rƒ   Úrequirementr:   r#   r#   r$   Úfind_packagesÝ  s   
þzPackageIndex.find_packagesc                    sR   |   ¡  |  |¡ | |j D ]}||v r|  S |  d||¡ qtt| ƒ ||¡S )Nz%s does not match %s)Úprescanr  r  rÂ   r³   r   Úobtain)rƒ   r  Ú	installerrI   rµ   r#   r$   r  ì  s   
zPackageIndex.obtainc                 C   sL   |  | jd| ¡ | ¡ s$| ¡  t |¡ td|jjtj	 
|¡f ƒ‚dS )z-
        checker is a ContentChecker
        zValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?N)r‹   rÂ   rˆ   rÊ   rX   Úunlinkr   r”   r,   r>   rS   )rƒ   ÚcheckerrY   Útfpr#   r#   r$   Ú
check_hashõ  s   þ
þÿýzPackageIndex.check_hashc                 C   sN   |D ]"}| j du st|ƒr| d¡stt|ƒƒr|  |¡ q| j  |¡ qdS )z;Add `urls` to the list that will be prescanned for searchesNúfile:)rª   r¾   r+   rÀ   r   rú   Úappend)rƒ   Úurlsr:   r#   r#   r$   Úadd_find_links  s   
ÿþ
ýõzPackageIndex.add_find_linksc                 C   s"   | j rtt| j| j ƒƒ d| _ dS )z7Scan urls scheduled for prescanning (e.g. --find-links)N)rª   rÀ   rq   rú   r‡   r#   r#   r$   r    s   
zPackageIndex.prescanc                 C   s<   | |j  r| jd}}n| jd}}|||jƒ |  ¡  d S )Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))r  rÃ   r×   r  rÿ   )rƒ   r  Úmethrž   r#   r#   r$   r    s   
þzPackageIndex.not_found_in_indexc                 C   sv   t |tƒs1t|ƒ}|r%|  ||¡}t|ƒ\}}| d¡r#|  |||¡}|S tj 	|¡r-|S t
|ƒ}t|  ||¡ddƒS )a  Locate and/or download `spec` to `tmpdir`, returning a local path

        `spec` may be a ``Requirement`` object, or a string containing a URL,
        an existing local filename, or a project/version requirement spec
        (i.e. the string form of a ``Requirement`` object).  If it is the URL
        of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one
        that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is
        automatically created alongside the downloaded file.

        If `spec` is a ``Requirement`` object or a string containing a
        project/version requirement spec, this method returns the location of
        a matching distribution (possibly after downloading it to `tmpdir`).
        If `spec` is a locally existing file or directory name, it is simply
        returned unchanged.  If `spec` is a URL, it is downloaded to a subpath
        of `tmpdir`, and the local filename is returned.  Various errors may be
        raised if a problem occurs during downloading.
        rõ   rL   N)rÅ   r   r¾   Ú_download_urlrB   r*   Ú	gen_setuprX   r>   rÖ   r%   rÏ   Úfetch_distribution)rƒ   r!   Útmpdirr<   Úfoundr-   rA   r#   r#   r$   r2   $  s   

zPackageIndex.downloadc           	         sÚ   ˆ  d|¡ i ‰d}d
‡ ‡‡‡‡fdd„	}|r$ˆ ¡  ˆ |¡ ||ƒ}|s/|dur/|||ƒ}|du r@ˆjdur<ˆ ¡  ||ƒ}|du rO|sOˆ |¡ ||ƒ}|du r`ˆ dˆrZdp[d|¡ dS ˆ  d|¡ |j|jd	�S )a|  Obtain a distribution suitable for fulfilling `requirement`

        `requirement` must be a ``pkg_resources.Requirement`` instance.
        If necessary, or if the `force_scan` flag is set, the requirement is
        searched for in the (online) package index as well as the locally
        installed packages.  If a distribution matching `requirement` is found,
        the returned distribution's ``location`` is the value you would have
        gotten from calling the ``download()`` method with the matching
        distribution's URL or filename.  If no matching distribution is found,
        ``None`` is returned.

        If the `source` flag is set, only source distributions and source
        checkout links will be considered.  Unless the `develop_ok` flag is
        set, development and system eggs (i.e., those using the ``.egg-info``
        format) will be ignored.
        zSearching for %sNc                    s’   |d u rˆ}|| j  D ];}|jtkr#ˆ s#|ˆvr"ˆ d|¡ dˆ|< q|| v o.|jtkp.ˆ }|rFˆ |jˆ¡}||_tj	 
|j¡rF|  S qd S )Nz&Skipping development or system egg: %sr5   )r  rC   r   r×   r   r2   rL   Údownload_locationrX   r>   rÖ   )ÚreqÚenvrI   ÚtestÚloc©Ú
develop_okrƒ   ÚskippedÚsourcer  r#   r$   rw   ^  s(   ÿþ€îz-PackageIndex.fetch_distribution.<locals>.findz:No local packages or working download links found for %s%sza source distribution of r¹   zBest match: %s)rL   rd   )rÃ   r  r  rª   r×   Úcloner  )	rƒ   r  r  Ú
force_scanr   r  Úlocal_indexrI   rw   r#   r  r$   r  F  s2   




ýzPackageIndex.fetch_distributionc                 C   s"   |   ||||¡}|dur|jS dS )a3  Obtain a file suitable for fulfilling `requirement`

        DEPRECATED; use the ``fetch_distribution()`` method now instead.  For
        backward compatibility, this routine is identical but returns the
        ``location`` of the downloaded distribution instead of a distribution
        object.
        N)r  rL   )rƒ   r  r  r"  r   rI   r#   r#   r$   Úfetch’  s   zPackageIndex.fetchc           
   	   C   s  t  |¡}|rdd„ t|| d¡d ƒD ƒpg }t|ƒdkrxtj |¡}tj |¡|krEtj 	||¡}ddl
m} |||ƒsEt ||¡ |}ttj 	|d¡dƒ�}	|	 d|d j|d jtj |¡d f ¡ W d   ƒ |S 1 sqw   Y  |S |r‚td	||f ƒ‚td
ƒ‚)Nc                 S   s   g | ]}|j r|‘qS r#   )rN   )r\   Údr#   r#   r$   Ú
<listcomp>¡  s    þÿz*PackageIndex.gen_setup.<locals>.<listcomp>r5   r   )Úsamefilezsetup.pyÚwzIfrom setuptools import setup
setup(name=%r, version=%r, py_modules=[%r])
z†Can't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rzpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rE   rF   r   rG   rR   rX   r>   rS   Údirnamerc   Úsetuptools.command.easy_installr'  ÚshutilÚcopy2rë   ÚwriterM   rN   Úsplitextr   )
rƒ   rY   rA   r  rF   rÒ   rS   Údstr'  rÞ   r#   r#   r$   r  Ÿ  sF   

þý
þþÿ
ÿ	÷	þÿÿzPackageIndex.gen_setupi    c                 C   s2  |   d|¡ d }zˆt |¡}|  |¡}t|tjjƒr%td||j	|j
f ƒ‚|  ¡ }d}| j}d}d|v rI| d¡}	ttt|	ƒƒ}|  |||||¡ t|dƒ�1}
	 | |¡}|ro| |¡ |
 |¡ |d	7 }|  |||||¡ nnqP|  |||
¡ W d   ƒ n1 s‚w   Y  |W |r�| ¡  S S |r˜| ¡  w w )
NzDownloading %szCan't download %s: %s %sr   r1   zcontent-lengthzContent-LengthÚwbTr5   )rÃ   r�   rš   rÄ   rÅ   r6   rÆ   rÇ   r   r¼   rž   Údl_blocksizeÚget_allÚmaxrq   ÚintÚ
reporthookrë   rË   r…   r-  r  rÊ   )rƒ   r:   rY   Úfpr  rÈ   ÚblocknumÚbsÚsizeÚsizesr  r„   r#   r#   r$   Ú_download_toÊ  sF   

ÿ



ø	ö
ÿ
ÿzPackageIndex._download_toc                 C   s   d S rd   r#   )rƒ   r:   rY   r7  Úblksizer9  r#   r#   r$   r5  î  ó   zPackageIndex.reporthookc              
   C   s¦  |  d¡r	t|ƒS zt|| jƒW S  ttjjfyD } z$d dd„ |j	D ƒ¡}|r0|  
||¡ n	td||f ƒ|‚W Y d }~d S d }~w tjjyY } z|W  Y d }~S d }~w tjjy� } z|rl|  
||j¡ n
td||jf ƒ|‚W Y d }~d S d }~w tjjy© } z|r”|  
||j¡ n
td||jf ƒ|‚W Y d }~d S d }~w tjjtjfyÒ } z|r¾|  
||¡ n	td||f ƒ|‚W Y d }~d S d }~ww )Nr  ú c                 S   s   g | ]}t |ƒ‘qS r#   )rr   )r\   Úargr#   r#   r$   r&  ø  s    z)PackageIndex.open_url.<locals>.<listcomp>z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r+   Ú
local_openÚopen_with_authr­   r    ÚhttpÚclientÚ
InvalidURLrc   re   r×   r   r6   rÆ   rÇ   ÚURLErrorÚreasonÚBadStatusLineÚlineÚHTTPExceptionÚsocket)rƒ   r:   ÚwarningÚvrž   r#   r#   r$   rÄ   ò  s^   
þ€€ÿÿþ€þÿüþ€ÿÿþ€þzPackageIndex.open_urlc                 C   s~   t | ƒ\}}|rd|v r| dd¡ dd¡}d|v snd}| d¡r(|dd… }tj ||¡}| t|ƒ¡s=td	|› �ƒ‚|S )
aB  
        >>> import pathlib
        >>> du = PackageIndex._resolve_download_filename
        >>> root = getfixture('tmp_path')
        >>> url = 'https://files.pythonhosted.org/packages/a9/5a/0db.../setuptools-78.1.0.tar.gz'
        >>> str(pathlib.Path(du(url, root)).relative_to(root))
        'setuptools-78.1.0.tar.gz'

        Ensures the target is always in tmpdir.

        >>> url = 'https://anyhost/%2fhome%2fuser%2f.ssh%2fauthorized_keys'
        >>> du(url, root)
        Traceback (most recent call last):
        ...
        ValueError: Invalid filename...
        z..Ú.ú\Ú_Ú__downloaded__rJ   Nr(   zInvalid filename )	rB   Úreplacer*   rX   r>   rc   r+   rr   r    )r:   r  r,   rA   rY   r#   r#   r$   Ú_resolve_download_filename  s   ÿ€
z'PackageIndex._resolve_download_filenamec                 C   s$   |   ||¡}|  ||¡p|  ||¡S )z2
        Determine the download filename.
        )rR  Ú_download_vcsÚ_download_other)rƒ   r:   r  rY   r#   r#   r$   r  9  s   zPackageIndex._download_urlc                 C   sL   t j | ¡j}| d¡\}}}tddgdgt|ƒ  ƒ}tt|h|@ ƒdƒS )a  
        >>> rvcs = PackageIndex._resolve_vcs
        >>> rvcs('git+http://foo/bar')
        'git'
        >>> rvcs('hg+https://foo/bar')
        'hg'
        >>> rvcs('git:myhost')
        'git'
        >>> rvcs('hg:myhost')
        >>> rvcs('http://foo/bar')
        ú+ÚsvnÚgitÚhgN)	r6   r   Úurlsplitr<   Ú	partitionrp   ÚboolÚnextÚiter)r:   r<   ÚpreÚsepÚpostÚallowedr#   r#   r$   Ú_resolve_vcs@  s   zPackageIndex._resolve_vcsc              
   C   sÆ   |   |¡}|s	d S |dkr|  ||¡S | d¡\}}}|  |¡\}}|  d|› d|› d|› �¡ t |dd||g¡ t|d|d	d|g|d
|ddd|dgd�}|d ura|  d|› �¡ t || ¡ |S )NrV  r4   zDoing z clone from z to r!  z--quietz-CÚcheckoutz--cwdÚupz-rú-q)rW  rX  zChecking out )rb  Ú_download_svnrZ  Ú_vcs_split_rev_from_urlrÃ   Ú
subprocessÚ
check_callÚdict)rƒ   r:   Úspec_filenameÚvcsrY   rO  ÚrevÚco_commandsr#   r#   r$   rS  S  s"   
þzPackageIndex._download_vcsc                 C   sD   t j |¡j}|dkrt j t j |¡j¡S |  |d¡ |  	||¡S )NrÞ   T)
r6   r   rY  r<   r«   Úurl2pathnamer7   r>   rÁ   Ú_attempt_download)rƒ   r:   rY   r<   r#   r#   r$   rT  j  s
   zPackageIndex._download_otherc                 C   s   |   |d¡ d S )NT)rÎ   r   r#   r#   r$   rú   r  rœ   zPackageIndex.scan_urlc                 C   s2   |   ||¡}d| dd¡ ¡ v r|  |||¡S |S )Nr·   r¸   r¹   )r;  rÉ   r)   Ú_download_html)rƒ   r:   rY   rÈ   r#   r#   r$   rp  u  s   zPackageIndex._attempt_downloadc                 C   sj   t |ƒ}|D ]}| ¡ r%t d|¡r#| ¡  t |¡ |  ||¡  S  nq| ¡  t |¡ td| ƒ‚)Nz <title>([^- ]+ - )?Revision \d+:zUnexpected HTML page found at )	rë   rs   r[   rx   rÊ   rX   r
  rf  r   )rƒ   r:   rÈ   rY   rÞ   rH  r#   r#   r$   rq  |  s   
ù
zPackageIndex._download_htmlc                 C   s  t  dt¡ | dd¡d }g }| ¡  d¡rwd|v rwtj |¡\}}}}}}	|sw| d¡rwd|d	d … v rw|d	d …  dd¡\}}t	|ƒ\}
}|
rwd
|
v r`|
 d
d¡\}}| 
d|d|g¡ n| 
d|
g¡ |}||||||	f}tj |¡}|  d||¡ g d¢| ||g }t |¡ |S )Nz"SVN download support is deprecatedr4   r5   r   zsvn:ú@z//r0   r_   ú:z
--usernamez
--passwordz'Doing subversion checkout from %s to %s)rV  rc  re  )Úwarningsr×   ÚUserWarningr9   r)   r+   r6   r   r7   Ú
_splituserÚextendÚ
urlunparserÃ   rh  ri  )rƒ   r:   rY   Úcredsr<   Únetlocr>   r]   ÚqrÔ   ÚauthÚhostÚuserÚpwr;   Úcmdr#   r#   r$   rf  ‹  s(   
zPackageIndex._download_svnc                 C   st   t j | ¡}|j dd¡d }|j d¡\}}}| d¡\}}}|r&||fn|df\}}	|j||dd� 	¡ }
|
|	fS )	aò  
        Given a possible VCS URL, return a clean URL and resolved revision if any.

        >>> vsrfu = PackageIndex._vcs_split_rev_from_url
        >>> vsrfu('git+https://github.com/pypa/setuptools@v69.0.0#egg-info=setuptools')
        ('https://github.com/pypa/setuptools', 'v69.0.0')
        >>> vsrfu('git+https://github.com/pypa/setuptools#egg-info=setuptools')
        ('https://github.com/pypa/setuptools', None)
        >>> vsrfu('http://foo/bar')
        ('http://foo/bar', None)
        rU  r5   r1   r4   rr  Nr¹   )r<   r>   rA   )
r6   r   rY  r<   r9   r>   rZ  Ú
rpartitionÚ_replaceÚgeturl)r:   r;   Úclean_schemeÚno_fragment_pathrO  r^  r_  r`  Ú
clean_pathrm  Úresolvedr#   r#   r$   rg  £  s   üûz$PackageIndex._vcs_split_rev_from_urlc                 G   ó   t j|g|¢R Ž  d S rd   )r   rÂ   r  r#   r#   r$   rÂ   Ã  ó   zPackageIndex.debugc                 G   rˆ  rd   )r   rÃ   r  r#   r#   r$   rÃ   Æ  r‰  zPackageIndex.infoc                 G   rˆ  rd   )r   r×   r  r#   r#   r$   r×   É  r‰  zPackageIndex.warn)r¡   r¢   NT)Frd   )FFFN)FF),rŒ   r�   rŽ   r�   r–   r´   rÎ   r¿   rÁ   rê   ræ   rô   rÐ   rù   rÿ   r  r  r  r  r  r  r2   r  r$  r  r1  r;  r5  rÄ   ÚstaticmethodrR  r  rb  rS  rT  rú   rp  rq  rf  rg  rÂ   rÃ   r×   Ú__classcell__r#   r#   rµ   r$   r     s^    
þ
	
5


		
#
þ
L)$
#
#

r   z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c                 C   s   |   d¡}t |¡S )Nr   )rG   r·   Úunescape)rF   Úwhatr#   r#   r$   Údecode_entityÒ  s   

rŽ  c                 C   s
   t t| ƒS )a  
    Decode HTML entities in the given text.

    >>> htmldecode(
    ...     'https://../package_name-0.1.2.tar.gz'
    ...     '?tokena=A&amp;tokenb=B">package_name-0.1.2.tar.gz')
    'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz'
    )Ú
entity_subrŽ  )Útextr#   r#   r$   rv   ×  s   
	rv   c                    s   ‡ fdd„}|S )Nc                    s   ‡ ‡fdd„}|S )Nc               	      s:   t  ¡ }t  ˆ¡ zˆ | i |¤ŽW t  |¡ S t  |¡ w rd   )rJ  ÚgetdefaulttimeoutÚsetdefaulttimeout)re   rf   Úold_timeout)rh   Útimeoutr#   r$   Ú_socket_timeoutå  s
   
z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr#   )rh   r•  ©r”  rg   r$   r•  ä  s   z'socket_timeout.<locals>._socket_timeoutr#   )r”  r•  r#   r–  r$   Úsocket_timeoutã  s   r—  c                 C   s2   t j | ¡}| ¡ }t |¡}| ¡ }| dd¡S )a9  
    Encode auth from a URL suitable for an HTTP header.
    >>> str(_encode_auth('username%3Apassword'))
    'dXNlcm5hbWU6cGFzc3dvcmQ='

    Long auth strings should not cause a newline to be inserted.
    >>> long_auth = 'username:' + 'password'*10
    >>> chr(10) in str(_encode_auth(long_auth))
    False
    Ú
r¹   )r6   r   r8   ÚencodeÚbase64Ú	b64encoderÍ   rQ  )r|  Úauth_sÚ
auth_bytesÚencoded_bytesÚencodedr#   r#   r$   Ú_encode_authò  s
   
r   c                   @   r   )	Ú
Credentialz:
    A username/password pair. Use like a namedtuple.
    c                 C   s   || _ || _d S rd   ©ÚusernameÚpassword)rƒ   r£  r¤  r#   r#   r$   r–     s   
zCredential.__init__c                 c   s   � | j V  | jV  d S rd   r¢  r‡   r#   r#   r$   Ú__iter__  s   €zCredential.__iter__c                 C   s   dt | ƒ S )Nz%(username)s:%(password)s)Úvarsr‡   r#   r#   r$   Ú__str__  s   zCredential.__str__N)rŒ   r�   rŽ   r�   r–   r¥  r§  r#   r#   r#   r$   r¡    s
    r¡  c                   @   s0   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	S )
Ú
PyPIConfigc                 C   sR   t  g d¢d¡}tj | |¡ tj tj d¡d¡}tj 	|¡r'|  
|¡ dS dS )z%
        Load from ~/.pypirc
        )r£  r¤  Ú
repositoryr¹   ú~z.pypircN)rj  ÚfromkeysÚconfigparserÚRawConfigParserr–   rX   r>   rc   Ú
expanduserrÖ   rË   )rƒ   ÚdefaultsÚrcr#   r#   r$   r–     s   ÿzPyPIConfig.__init__c                    s&   ‡ fdd„ˆ   ¡ D ƒ}ttˆ j|ƒƒS )Nc                    s    g | ]}ˆ   |d ¡ ¡ r|‘qS )r©  )rÉ   rs   )r\   Úsectionr‡   r#   r$   r&  &  s    þÿz2PyPIConfig.creds_by_repository.<locals>.<listcomp>)Úsectionsrj  rq   Ú_get_repo_cred)rƒ   Úsections_with_repositoriesr#   r‡   r$   Úcreds_by_repository$  s   
ÿzPyPIConfig.creds_by_repositoryc                 C   s6   |   |d¡ ¡ }|t|   |d¡ ¡ |   |d¡ ¡ ƒfS )Nr©  r£  r¤  )rÉ   rs   r¡  )rƒ   r±  Úrepor#   r#   r$   r³  -  s
   þzPyPIConfig._get_repo_credc                 C   s*   | j  ¡ D ]\}}| |¡r|  S qdS )zŒ
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        N)rµ  Úitemsr+   )rƒ   r:   r©  Úcredr#   r#   r$   Úfind_credential4  s
   
ÿÿzPyPIConfig.find_credentialN)rŒ   r�   rŽ   r–   Úpropertyrµ  r³  r¹  r#   r#   r#   r$   r¨    s    
r¨  c                 C   s:  t j | ¡}|\}}}}}}| d¡rtj d¡‚|dv r$t|ƒ\}	}
nd}	|	sBtƒ  	| ¡}|rBt
|ƒ}	|j| f}tjdg|¢R Ž  |	redt|	ƒ }	||
||||f}t j |¡}t j |¡}| d|	¡ nt j | ¡}| dt¡ ||ƒ}|	r›t j |j¡\}}}}}}||kr›||
kr›||||||f}t j |¡|_|S )	z4Open a urllib2 request, handling HTTP authenticationrs  znonnumeric port: '')rB  ÚhttpsNz*Authenticating as %s for %s (from .pypirc)zBasic ÚAuthorizationz
User-Agent)r6   r   r7   r*   rB  rC  rD  rv  r¨  r¹  rr   r£  r   rÃ   r   rx  r«   ÚRequestÚ
add_headerÚ
user_agentr:   )r:   r­   Úparsedr<   rz  r>   Úparamsr@   rþ   r|  Úaddressr¸  rÃ   r;   rý   r«   r6  Ús2Úh2Úpath2Úparam2Úquery2Úfrag2r#   r#   r$   rA  >  s8   

rA  c                 C   s$   |   d¡\}}} |r|| fS d| fS )zNsplituser('user[:passwd]@host[:port]')
    --> 'user[:passwd]', 'host[:port]'.rr  N)r�  )r}  r~  Údelimr#   r#   r$   rv  m  s   rv  c                 C   s   | S rd   r#   )r:   r#   r#   r$   Ú
fix_sf_urlx  r=  rÊ  c              	   C   s*  t j | ¡\}}}}}}t j |¡}tj |¡rt j | ¡S | 	d¡r}tj 
|¡r}g }t |¡D ];}	tj ||	¡}
|	dkrXt|
dƒ�}| ¡ }W d  ƒ n1 sQw   Y   n tj 
|
¡rb|	d7 }	| dj|	d�¡ q0d}|j| d |¡d	�}d
\}}nd\}}}ddi}t |¡}t j | ||||¡S )z7Read a local path, with special support for directoriesr0   z
index.htmlÚrNz<a href="{name}">{name}</a>)r,   zB<html><head><title>{url}</title></head><body>{files}</body></html>r˜  )r:   Úfiles)éÈ   ÚOK)r½   zPath not foundz	Not foundr¸   z	text/html)r6   r   r7   r«   ro  rX   r>   Úisfiler¬   r*   rØ   rÚ   rc   rë   rË   r  ÚformatÚioÚStringIOrÆ   rÇ   )r:   r<   r=   r>   Úparamr@   rþ   rY   rÌ  rÔ   Úfilepathr6  ÚbodyrÓ   ÚstatusÚmessagerÈ   Úbody_streamr#   r#   r$   r@  |  s0   
ÿÿ


r@  rd   )r   )[r�   Úsysrh  rX   r[   rÑ  r+  rJ  rš  r’   rä   rt  r¬  r·   Úhttp.clientrB  Úurllib.parser6   Úurllib.requestÚurllib.errorÚ	functoolsr   r   Úpkg_resourcesr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Ú	distutilsr   Údistutils.errorsr   Úfnmatchr   Úsetuptools.wheelr   Ú setuptools.extern.more_itertoolsr   rŸ   rE   ÚIrt   rû   rF   r¾   r9   rQ   Ú__all__Ú_SOCKET_TIMEOUTÚ_tmplrÐ  Úversion_infor¿  r%   r   rB   r   rD   rZ   r   rj   rm   r~   r€   r�   r   rü   r�  rŽ  rv   r—  r   r¡  r­  r¨  r«   r¬   rA  rv  rÊ  r@  r#   r#   r#   r$   Ú<module>   s�    @
ÿÿ	


!
þ#
!     :
&/