a
    iŽ5hä¢  ã                   @   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$ 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 .d
¡Z/e .dej0¡Z1e .d¡Z2e .dej0¡j3Z4d 5¡ Z6g d¢Z7dZ8dZ9e9j:dj:ej;Ž edZ<dd„ Z=dd„ Z>dd„ Z?dDdd„Z@dEdd„ZAdFdd„ZBdedfd d!„ZCdGd"d#„ZDd$d%„ ZEe .d&ej0¡ZFeEd'd(„ ƒZGG d)d*„ d*ƒZHG d+d,„ d,eHƒZIG d-d.„ d.eƒZJe .d/¡jKZLd0d1„ ZMd2d3„ ZNdHd4d5„ZOd6d7„ ZPG d8d9„ d9ƒZQG d:d;„ d;ejRƒZSejTjUfd<d=„ZVd>d?„ ZWeOe8ƒeVƒZVd@dA„ ZXdBdC„ ZYdS )Iz#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)Ússl_support)Úlog)ÚDistutilsError)Ú	translate)ÚWheelz^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{}.{})Zpy_majorÚ
setuptoolsc              
   C   sF   zt  | ¡W S  ty@ } ztd| f ƒ|‚W Y d }~n
d }~0 0 d S )Nz1Not a URL, existing file, or requirement spec: %r)r   ÚparseÚ
ValueErrorr   )ÚspecÚe© r    ú:/usr/lib/python3/dist-packages/setuptools/package_index.pyÚparse_requirement_arg6   s    ÿþr"   c                 C   s°   |   ¡ }d\}}}| d¡r¦| d¡r8| dd… }d}nn| dd¡rb| d	d
… }| dd… }d}nD| d¡r~| dd… }d}n(| dd¡r¦| d	d
… }| dd… }d}|||fS )z=Return (base,pyversion) or (None,None) for possible .exe name)NNNú.exez
.win32.exeNiöÿÿÿZwin32z	.win32-pyiðÿÿÿiùÿÿÿéüÿÿÿz.win-amd64.exeiòÿÿÿz	win-amd64z.win-amd64-pyiìÿÿÿ)ÚlowerÚendswithÚ
startswith)Únamer%   ÚbaseÚpy_verZplatr    r    r!   r   ?   s$    



r   c           	      C   sx   t j | ¡}|\}}}}}}t j | d¡d ¡}|dkrX|dkrXt j | d¡d ¡}d|v rp| 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_urlW   s    r=   c                 c   s\   t | ƒ\}}t| ||ƒD ]
}|V  q|rXt |¡}|rXt| | d¡|tdD ]
}|V  qLdS )zEYield egg or source distribution objects that might be found at a URLr0   )Ú
precedenceN)r=   Údistros_for_locationÚEGG_FRAGMENTÚmatchr   Úgroupr   )r5   Úmetadatar)   r<   ÚdistrA   r    r    r!   r   b   s    
ÿ
r   c                 C   sä   |  d¡r|dd… }|  d¡r8d|v r8t | ||¡gS |  d¡rxd|v rxt|ƒ}| ¡ s^g S t| |j|jtd dgS |  d	¡rªt|ƒ\}}}|durªt	| |||t
|ƒS tD ]0}|  |¡r®|dt|ƒ … }t	| ||ƒ  S q®g S )
z:Yield egg or source distribution objects based on basenameú.egg.zipNr$   z.eggú-z.whlr0   )ÚlocationÚproject_nameÚversionr>   r#   )r&   r   Zfrom_locationr   Zis_compatiblerH   rI   r   r   r   r   Ú
EXTENSIONSÚlen)rG   ÚbasenamerC   ZwheelZwin_baser*   ÚplatformZextr    r    r!   r?   p   s2    
û
ÿ
r?   c                 C   s   t t| ƒtj | ¡|ƒS )zEYield possible egg or source distribution objects based on a filename)r?   r   Úosr9   rL   )ÚfilenamerC   r    r    r!   Údistros_for_filename‘   s    ÿrP   c              
   c   s|   |  d¡}|s,tdd„ |dd… D ƒƒr,dS tdt|ƒd ƒD ]8}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!
    rF   c                 s   s   | ]}t  d |¡V  qdS )z	py\d\.\d$N)ÚrerA   )Ú.0Úpr    r    r!   Ú	<genexpr>¯   ó    z(interpret_distro_name.<locals>.<genexpr>é   Nr0   )Ú
py_versionr>   rM   )r4   ÚanyÚrangerK   r   Újoin)rG   rL   rC   rW   r>   rM   r6   rS   r    r    r!   r   ˜   s    
$ýr   c                 c   sd   t ƒ }|j}|du r8t |j| ¡D ]}||ƒ |V  q"n(| D ]"}||ƒ}||vr<||ƒ |V  q<dS )zHList unique elements, preserving order. Remember all elements ever seen.N)ÚsetÚaddÚ	itertoolsÚfilterfalseÚ__contains__)ÚiterableÚkeyÚseenZseen_addÚelementÚkr    r    r!   Úunique_everseen¼   s    
re   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 ©N)re   )ÚargsÚkwargs©Úfuncr    r!   ÚwrapperÔ   s    zunique_values.<locals>.wrapperr   )rj   rk   r    ri   r!   Úunique_valuesÎ   s    rl   z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c              	   c   sº   t  |¡D ]d}| ¡ \}}tttj| ¡  d¡ƒƒ}d|v sDd|v r
t	 |¡D ]}t
j | t| d¡ƒ¡V  qNq
dD ]@}| |¡}|dkrtt	 ||¡}|rtt
j | t| d¡ƒ¡V  qtdS )zEFind rel="homepage" and rel="download" links in `page`, yielding URLsú,Zhomepager-   r0   )z<th>Home Pagez<th>Download URLr,   N)ÚRELÚfinditerÚgroupsr[   ÚmapÚstrÚstripr%   r4   ÚHREFr1   r   ÚurljoinÚ
htmldecoderB   ÚfindÚsearch)r5   ÚpagerA   ÚtagZrelZrelsÚposr    r    r!   Úfind_external_linksß   s    
r|   c                   @   s(   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   s   dS )z3
        Feed a block of data to the hash.
        Nr    ©ÚselfÚblockr    r    r!   Úfeed÷   s    zContentChecker.feedc                 C   s   dS )zC
        Check the hash. Return False if validation fails.
        Tr    ©r   r    r    r!   Úis_validý   s    zContentChecker.is_validc                 C   s   dS )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 rf   )Ú	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 |¡}|s0tƒ S | f i | ¡ ¤ŽS )z5Construct a (possibly null) ContentChecker from a URLr,   )r1   r   r2   r}   Úpatternrx   Ú	groupdict)Úclsr5   r<   rA   r    r    r!   Úfrom_url  s    zHashChecker.from_urlc                 C   s   | j  |¡ d S rf   )r   Úupdater~   r    r    r!   r   !  s    zHashChecker.feedc                 C   s   | j  ¡ | jkS rf   )r   Z	hexdigestr   r‚   r    r    r!   rƒ   $  s    zHashChecker.is_validc                 C   s   || j  }||ƒS rf   )rŒ   )r   r„   r…   Úmsgr    r    r!   r†   '  s    
zHashChecker.reportN)r‡   rˆ   r‰   rQ   Úcompiler’   r‘   Úclassmethodr•   r   rƒ   r†   r    r    r    r!   r‹     s   ÿ

r‹   c                       sN  e Zd ZdZdNdd„ZdOd	d
„ZdPdd„ZdQdd„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdRdd„Zdd„ ZdS‡ fdd„	Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ ZdTd)d*„ZdUd+d,„Zd-d.„ Zd/Zd0d1„ Zd2d3„ ZdVd4d5„Zd6d7„ Zed8d9„ ƒZd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$edFdG„ ƒZ%dHdI„ Z&dJdK„ Z'dLdM„ Z(‡  Z)S )Wr   z;A distribution index that scans web pages for download URLsúhttps://pypi.org/simple/©Ú*NTc                 O   sš   t j| g|¢R i |¤Ž |dd | d¡ …  | _i | _i | _i | _t d 	t
t|ƒ¡¡j| _g | _|oxtjox|pxt ¡ }|rŒt |¡| _n
tjj| _d S )Nr+   ú|)r	   r‘   r&   Ú	index_urlÚscanned_urlsÚfetched_urlsÚpackage_pagesrQ   r˜   rZ   rq   r   rA   ÚallowsÚto_scanr   Zis_availableZfind_ca_bundleZ
opener_forÚopenerr1   ÚrequestÚurlopen)r   rž   ZhostsZ	ca_bundleZ
verify_sslrg   ÚkwZuse_sslr    r    r!   r‘   /  s    ÿ
ýzPackageIndex.__init__Fc                 C   sâ  || j v r|sdS d| j |< t|ƒs2|  |¡ dS tt|ƒƒ}|r\|  |¡sPdS |  d|¡ |sn|rn|| jv r‚tt| j	|ƒƒ dS |  |¡sšd| j|< dS |  
d|¡ d| j|< d}|  ||| ¡}|du rÐd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ƒsvt|tjjƒrXd}n|j d¡phd}| |d¡}| ¡  t |¡D ](}	tj |t|	  d¡ƒ¡}
|  !|
¡ qˆ| "| j#¡rÞt$|ddƒdkrÞ|  %||¡}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Úignorer0   Úcodeé”  )&rŸ   Ú
URL_SCHEMEÚprocess_filenameÚlistr   Úurl_okÚdebugr    rq   r\   ÚinfoÚopen_urlÚ
isinstancer1   ÚerrorÚ	HTTPErrorr­   r—   r5   ÚheadersÚgetr%   ÚcloseÚreadrr   Z	get_paramÚdecodert   ro   r   ru   rv   rB   Úprocess_urlr'   rž   ÚgetattrÚprocess_index)r   r5   ZretrieveÚdistsÚtmplÚfr)   ry   r«   rA   Úlinkr    r    r!   r¾   E  sT    





 zPackageIndex.process_urlc                 C   sŠ   t j |¡s|  d|¡ d S t j |¡r^|s^t j |¡}t  |¡D ]}|  t j ||¡d¡ qBt	|ƒ}|r†|  
d|¡ tt| j|ƒƒ d S )NzNot found: %sTz	Found: %s)rN   r9   ÚexistsÚwarnÚisdirÚrealpathÚlistdirr°   rZ   rP   r³   r±   rq   r\   )r   ÚfnÚnestedr9   ÚitemrÁ   r    r    r!   r°   z  s    zPackageIndex.process_filenamec                 C   sb   t |ƒ}|o| d¡ ¡ dk}|s8|  tj |¡d ¡r<dS d}|rRt|| ƒ‚n|  ||¡ d S )Nr0   ÚfileTzN
Note: Bypassing %s (disallowed host; see http://bit.ly/2hrImnY for details).
)	r¯   rB   r%   r¢   r1   r   r2   r   rÆ   )r   r5   ZfatalÚsÚis_filer—   r    r    r!   r²   Š  s    ÿzPackageIndex.url_okc                 C   s2   t tjj|ƒ}dd„ |D ƒ}tt | j|¡ƒ d S )Nc                 s   s0   | ](}t  |¡D ]}| d ¡r||fV  qqdS )z	.egg-linkN)rN   rÉ   r&   )rR   r9   Úentryr    r    r!   rT   ™  s   
ýz.PackageIndex.scan_egg_links.<locals>.<genexpr>)ÚfilterrN   r9   rÇ   r±   r]   ÚstarmapÚscan_egg_link)r   Úsearch_pathÚdirsZ	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>0    Y  t	|ƒdkrXd S |\}}t
tj ||¡ƒD ]*}tjj|g|¢R Ž |_t|_|  |¡ qrd S )NrV   )ÚopenrN   r9   rZ   r±   rÑ   rq   rr   rs   rK   r
   rG   r   r>   r\   )r   r9   rÐ   Z	raw_linesÚlinesZegg_pathZ
setup_pathrD   r    r    r!   rÓ   ¡  s    4zPackageIndex.scan_egg_linkc                 C   s”   d}|  | j¡s|S tttjj|t| jƒd …  d¡ƒƒ}t|ƒdksRd|d v rV|S t	|d ƒ}t
|d ƒ}d| j | ¡ i ¡|< t|ƒt|ƒfS )N)NNr+   rV   r/   r0   r   T)r'   rž   r±   rq   r1   r   r3   rK   r4   r   r   r¡   Ú
setdefaultr%   r   )r   rÄ   ZNO_MATCH_SENTINELr6   ÚpkgÚverr    r    r!   Ú_scan±  s    ÿzPackageIndex._scanc           	   
   C   sÀ   t  |¡D ]:}z"|  tj |t| d¡ƒ¡¡ W q
 tyB   Y q
0 q
|  |¡\}}|s\dS t	||ƒD ]H}t
|ƒ\}}| d¡r¤|s¤|rš|d||f 7 }n
|  |¡ |  |¡ qft dd„ |¡S )z#Process the contents of a PyPI pager0   rª   ú.pyz
#egg=%s-%sc                 S   s   d|   ddd¡ S )Nz<a href="%s#md5=%s">%s</a>r0   é   rV   )rB   )Úmr    r    r!   Ú<lambda>Ý  rU   z,PackageIndex.process_index.<locals>.<lambda>)rt   ro   rÜ   r1   r   ru   rv   rB   r   r|   r=   r&   Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub)	r   r5   ry   rA   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   r5   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—   rg   r    r    r!   rç   æ  s    ÿzPackageIndex.scan_allc                 C   sz   |   | j|j d ¡ | j |j¡s:|   | j|j d ¡ | j |j¡sR|  |¡ t| j |jd¡ƒD ]}|   |¡ qfd S )Nr+   r    )	râ   rž   Úunsafe_namer¡   rº   ra   rH   Únot_found_in_indexr±   )r   Úrequirementr5   r    r    r!   Úfind_packagesï  s    
zPackageIndex.find_packagesc                    sR   |   ¡  |  |¡ | |j D ]"}||v r0|  S |  d||¡ qtt| ƒ ||¡S )Nz%s does not match %s)Úprescanrí   ra   r³   Úsuperr   Úobtain)r   rì   Z	installerrD   ©Ú	__class__r    r!   rð   þ  s    
zPackageIndex.obtainc                 C   sL   |  | jd| ¡ | ¡ sH| ¡  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»   rN   Úunlinkr   r   r(   r9   rL   )r   ÚcheckerrO   Útfpr    r    r!   Ú
check_hash  s    þ
þÿzPackageIndex.check_hashc                 C   sN   |D ]D}| j du s0t|ƒr0| d¡s0t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   Zurlsr5   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?))ra   r´   rÆ   rê   rç   )r   rì   Úmethr—   r    r    r!   rë   ,  s    
þzPackageIndex.not_found_in_indexc                 C   sv   t |tƒsbt|ƒ}|rJ|  ||¡}t|ƒ\}}| d¡rF|  |||¡}|S tj 	|¡rZ|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Ý   rG   N)r¶   r   r¯   Ú_download_urlr=   r&   Ú	gen_setuprN   r9   rÅ   r"   r¿   Úfetch_distribution)r   r   Útmpdirr7   Úfoundr)   r<   r    r    r!   r-   6  s    

zPackageIndex.downloadc           	         sÜ   ˆ  d|¡ i ‰d}d
‡ ‡‡‡‡fdd„	}|rHˆ ¡  ˆ |¡ ||ƒ}|s^|dur^|||ƒ}|du r€ˆjdurxˆ ¡  ||ƒ}|du rž|sžˆ |¡ ||ƒ}|du r¾ˆ dˆr´dp¶d|¡ nˆ  d|¡ |j|jd	S 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 ]v}|jtkrFˆ sF|ˆvrˆ d|¡ dˆ|< q|| v o\|jtkp\ˆ }|rˆ |jˆ¡}||_tj	 
|j¡r|  S qd S )Nz&Skipping development or system egg: %sr0   )ra   r>   r   rÆ   r   r-   rG   Údownload_locationrN   r9   rÅ   )ZreqÚenvrD   ÚtestZloc©Ú
develop_okr   ZskippedÚsourcerþ   r    r!   rw   p  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)rG   )N)r´   rî   rí   r£   rÆ   Úcloner   )	r   rì   rþ   Ú
force_scanr  r  Zlocal_indexrD   rw   r    r  r!   rý   X  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ý   rG   )r   rì   rþ   r  r  rD   r    r    r!   Úfetch¤  s    zPackageIndex.fetchc           
   	   C   s  t  |¡}|r*dd„ t|| d¡d ƒD ƒp,g }t|ƒdkrîtj |¡}tj |¡|krŠtj 	||¡}ddl
m} |||ƒsŠt ||¡ |}ttj 	|d¡dƒ<}	|	 d|d j|d jtj |¡d f ¡ W d   ƒ n1 sà0    Y  |S |rtd	||f ƒ‚ntd
ƒ‚d S )Nc                 S   s   g | ]}|j r|‘qS r    )rI   )rR   Údr    r    r!   Ú
<listcomp>³  s   ÿz*PackageIndex.gen_setup.<locals>.<listcomp>r0   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.)r@   rA   r   rB   rK   rN   r9   rL   ÚdirnamerZ   Zsetuptools.command.easy_installr  ÚshutilZcopy2r×   ÚwriterH   rI   Úsplitextr   )
r   rO   r<   rþ   rA   rÁ   rL   Zdstr  rÍ   r    r    r!   rü   ±  s@    

þý
þþÿ"þÿÿzPackageIndex.gen_setupi    c                 C   s:  |   d|¡ d }zt |¡}|  |¡}t|tjjƒrLtd||j	|j
f ƒ‚|  ¡ }d}| j}d}d|v r”| d¡}	ttt|	ƒƒ}|  |||||¡ t|dƒ`}
| |¡}|râ| |¡ |
 |¡ |d7 }|  |||||¡ q qâq |  |||
¡ W d   ƒ n1 s0    Y  |W |r"| ¡  S n|r4| ¡  0 d S )	NzDownloading %szCan't download %s: %s %sr   r,   zcontent-lengthzContent-LengthÚwbr0   )r´   r‹   r•   rµ   r¶   r1   r·   r¸   r   r­   r—   Údl_blocksizeZget_allÚmaxrq   ÚintÚ
reporthookr×   r¼   r   r  rö   r»   )r   r5   rO   Úfprô   r¹   ÚblocknumZbsÚsizeZsizesrõ   r€   r    r    r!   Ú_download_toÜ  sD    

ÿ



.ý ÿzPackageIndex._download_toc                 C   s   d S rf   r    )r   r5   rO   r  Zblksizer  r    r    r!   r     s    zPackageIndex.reporthookc              
   C   s®  |  d¡rt|ƒS zt|| jƒW S  ttjjfyˆ } zHd dd„ |j	D ƒ¡}|r`|  
||¡ ntd||f ƒ|‚W Y d }~n*d }~0  tjjy² } z|W  Y d }~S d }~0  tjjy } z4|rÚ|  
||j¡ ntd||jf ƒ|‚W Y d }~n°d }~0  tjjyT } z6|r,|  
||j¡ ntd||jf ƒ|‚W Y d }~n^d }~0  tjjtjfy¨ } z2|r‚|  
||¡ ntd||f ƒ|‚W Y d }~n
d }~0 0 d S )Nr÷   ú c                 S   s   g | ]}t |ƒ‘qS r    )rr   )rR   Úargr    r    r!   r
  
  rU   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Ú
InvalidURLrZ   rg   rÆ   r   r1   r·   r¸   ZURLErrorÚreasonZBadStatusLineÚlineZHTTPExceptionÚsocket)r   r5   ZwarningÚvr—   r    r    r!   rµ     sJ    
(ÿÿþÿüÿÿzPackageIndex.open_urlc                 C   sŒ   t |ƒ\}}|r0d|v r4| dd¡ dd¡}qnd}| d¡rJ|d d… }tj ||¡}| t|ƒ¡sttd|› ƒ‚|  	||¡pŠ|  
||¡S )	Nz..Ú.ú\Ú_Z__downloaded__rE   r$   zInvalid filename )r=   Úreplacer&   rN   r9   rZ   r'   rr   r   Ú_download_vcsÚ_download_other)r   r5   rþ   r(   r<   rO   r    r    r!   rû   '  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)	r1   r   Úurlsplitr7   Ú	partitionr[   ÚboolÚnextÚiter)r5   r7   ÚpreÚsepÚpostZ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rÂ|  d|› ¡ t || ¡ |S )Nr,  r/   zDoing z clone from ú to r  z--quietz-CÚcheckoutz--cwdZupz-rú-q)r-  r.  zChecking out )r7  Ú_download_svnr0  Ú_vcs_split_rev_from_urlr´   Ú
subprocessÚ
check_callÚdict)r   r5   Zspec_filenameZvcsrO   r'  ÚrevZco_commandsr    r    r!   r)  P  s"    
þzPackageIndex._download_vcsc                 C   sD   t j |¡j}|dkr,t j t j |¡j¡S |  |d¡ |  	||¡S )NrÍ   T)
r1   r   r/  r7   r¥   Úurl2pathnamer2   r9   r²   Ú_attempt_download)r   r5   rO   r7   r    r    r!   r*  g  s
    zPackageIndex._download_otherc                 C   s   |   |d¡ d S )NT)r¾   rè   r    r    r!   râ   o  s    zPackageIndex.scan_urlc                 C   s6   |   ||¡}d| dd¡ ¡ v r.|  |||¡S |S d S )Nr¨   r©   rª   )r  rº   r%   Ú_download_html)r   r5   rO   r¹   r    r    r!   rB  r  s    zPackageIndex._attempt_downloadc                 C   sn   t |ƒ}|D ]>}| ¡ rt d|¡rF| ¡  t |¡ |  ||¡  S  qLq| ¡  t |¡ td| ƒ‚d S )Nz <title>([^- ]+ - )?Revision \d+:zUnexpected HTML page found at )	r×   rs   rQ   rx   r»   rN   ró   r;  r   )r   r5   r¹   rO   rÍ   r"  r    r    r!   rC  y  s    

zPackageIndex._download_htmlc                 C   s  t  dt¡ | dd¡d }d}| ¡  d¡râd|v râtj |¡\}}}}}}	|sâ| d¡râd	|d
d … v râ|d
d …  d	d¡\}}t	|ƒ\}
}|
râd|
v rº|
 dd¡\}}d||f }nd|
 }|}||||||	f}tj 
|¡}|  d|› d|› ¡ t dd|d||g¡ |S )Nz"SVN download support is deprecatedr/   r0   r   rª   zsvn:ú@z//r+   rV   ú:z --username=%s --password=%sz --username=zDoing subversion checkout from r8  r,  r9  r:  )ÚwarningsrÆ   ÚUserWarningr4   r%   r'   r1   r   r2   Ú
_splituserÚ
urlunparser´   r=  r>  )r   r5   rO   Zcredsr7   Únetlocr9   rS   ÚqrÃ   ÚauthÚhostÚuserZpwr6   r    r    r!   r;  ˆ  s&    zPackageIndex._download_svnc                 C   st   t j | ¡}|j dd¡d }|j d¡\}}}| d¡\}}}|rL||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)
        r+  r0   r,   r/   rD  Nrª   )r7   r9   r<   )
r1   r   r/  r7   r4   r9   r0  Ú
rpartitionÚ_replaceZgeturl)r5   r6   Zclean_schemeZno_fragment_pathr'  r4  r5  r6  Z
clean_pathr@  Zresolvedr    r    r!   r<  ž  s    ü
z$PackageIndex._vcs_split_rev_from_urlc                 G   s   t j|g|¢R Ž  d S rf   )r   r³   ré   r    r    r!   r³   ½  s    zPackageIndex.debugc                 G   s   t j|g|¢R Ž  d S rf   )r   r´   ré   r    r    r!   r´   À  s    zPackageIndex.infoc                 G   s   t j|g|¢R Ž  d S rf   )r   rÆ   ré   r    r    r!   rÆ   Ã  s    zPackageIndex.warn)rš   r›   NT)F)F)F)N)N)FFFN)FF)N)*r‡   rˆ   r‰   rŠ   r‘   r¾   r°   r²   rÖ   rÓ   rÜ   rÀ   rá   rç   rí   rð   rö   rù   rî   rë   r-   rý   r  rü   r  r  r  rµ   rû   Ústaticmethodr7  r)  r*  râ   rB  rC  r;  r<  r³   r´   rÆ   Ú__classcell__r    r    rñ   r!   r   ,  sV     þ

5



		
#  þ
L
)$
#

r   z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c                 C   s   |   d¡}t |¡S )Nr   )rB   r¨   Zunescape)rA   Zwhatr    r    r!   Údecode_entityÌ  s    
rS  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_subrS  )Ú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  |¡ 0 d S rf   )r#  ZgetdefaulttimeoutZsetdefaulttimeout)rg   rh   Zold_timeout)rj   Útimeoutr    r!   Ú_socket_timeoutß  s    

þz@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr    )rj   rW  ©rV  ri   r!   rW  Þ  s    z'socket_timeout.<locals>._socket_timeoutr    )rV  rW  r    rX  r!   Úsocket_timeoutÝ  s    rY  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ª   )r1   r   r3   ÚencodeÚbase64Z	b64encoder½   r(  )rL  Zauth_sZ
auth_bytesZencoded_bytesZencodedr    r    r!   Ú_encode_authì  s
    
r]  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú
Credentialz:
    A username/password pair. Use like a namedtuple.
    c                 C   s   || _ || _d S rf   ©ÚusernameÚpassword)r   r`  ra  r    r    r!   r‘     s    zCredential.__init__c                 c   s   | j V  | jV  d S rf   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‘   rb  rd  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   sN   t  g d¢d¡}tj | |¡ tj tj d¡d¡}tj 	|¡rJ|  
|¡ dS )z%
        Load from ~/.pypirc
        )r`  ra  Ú
repositoryrª   ú~z.pypircN)r?  ÚfromkeysÚconfigparserÚRawConfigParserr‘   rN   r9   rZ   Ú
expanduserrÅ   r¼   )r   ÚdefaultsZ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 )rf  )rº   rs   )rR   Úsectionr‚   r    r!   r
     s   ÿz2PyPIConfig.creds_by_repository.<locals>.<listcomp>)Zsectionsr?  rq   Ú_get_repo_cred)r   Zsections_with_repositoriesr    r‚   r!   Úcreds_by_repository  s    
ÿzPyPIConfig.creds_by_repositoryc                 C   s6   |   |d¡ ¡ }|t|   |d¡ ¡ |   |d¡ ¡ ƒfS )Nrf  r`  ra  )rº   rs   r^  )r   rm  Zrepor    r    r!   rn  '  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)ro  Úitemsr'   )r   r5   rf  Úcredr    r    r!   Úfind_credential.  s    
zPyPIConfig.find_credentialN)r‡   rˆ   r‰   r‘   Úpropertyro  rn  rr  r    r    r    r!   re    s
   
re  c                 C   s@  t j | ¡}|\}}}}}}| d¡r2tj d¡‚|dv rHt|ƒ\}	}
nd}	|	s„tƒ  	| ¡}|r„t
|ƒ}	|j| f}tjdg|¢R Ž  |	rÊd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 authenticationrE  znonnumeric port: '')r  ZhttpsNz*Authenticating as %s for %s (from .pypirc)zBasic ZAuthorizationz
User-Agent)r1   r   r2   r&   r  r  r   rH  re  rr  rr   r`  r   r´   r]  rI  r¥   ZRequestZ
add_headerÚ
user_agentr5   )r5   r¤   Zparsedr7   rJ  r9   Úparamsr;   ræ   rL  Zaddressrq  r´   r6   rå   r¥   r  Ús2Zh2Zpath2Zparam2Zquery2Zfrag2r    r    r!   r  8  s8    

r  c                 C   s    |   d¡\}}} |r|nd| fS )zNsplituser('user[:passwd]@host[:port]')
    --> 'user[:passwd]', 'host[:port]'.rD  N)rO  )rM  rN  Zdelimr    r    r!   rH  g  s    rH  c                 C   s   | S rf   r    )r5   r    r    r!   Ú
fix_sf_urlr  s    rw  c              	   C   s,  t j | ¡\}}}}}}t j |¡}tj |¡r<t j | ¡S | 	d¡rütj 
|¡rüg }t |¡D ]x}	tj ||	¡}
|	dkr²t|
dƒ}| ¡ }W d  ƒ n1 s¢0    Y   qòntj 
|
¡rÆ|	d7 }	| dj|	d¡ q`d}|j| d |¡d	}d
\}}n
d\}}}ddi}t |¡}t j | ||||¡S )z7Read a local path, with special support for directoriesr+   z
index.htmlÚrNz<a href="{name}">{name}</a>)r(   zB<html><head><title>{url}</title></head><body>{files}</body></html>rZ  )r5   Úfiles)éÈ   ZOK)r®   zPath not foundz	Not foundr©   z	text/html)r1   r   r2   r¥   rA  rN   r9   Úisfiler¦   r&   rÇ   rÉ   rZ   r×   r¼   rø   ÚformatÚioÚStringIOr·   r¸   )r5   r7   r8   r9   Zparamr;   ræ   rO   ry  rÃ   Úfilepathr  ÚbodyrÂ   ZstatusÚmessager¹   Zbody_streamr    r    r!   r  v  s.    &ÿ


r  )N)N)N)N)r   )ZrŠ   Úsysr=  rN   rQ   r}  r  r#  r\  r   r]   rF  ri  r¨   Zhttp.clientr  Zurllib.parser1   Zurllib.requestZurllib.errorÚ	functoolsr   r   Zpkg_resourcesr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Z	distutilsr   Zdistutils.errorsr   Zfnmatchr   Zsetuptools.wheelr   r˜   r@   ÚIrt   rã   rA   r¯   r4   rJ   Ú__all__Z_SOCKET_TIMEOUTZ_tmplr|  Úversion_infort  r"   r   r=   r   r?   rP   r   re   rl   rn   r|   r}   r‹   r   rä   rT  rS  rv   rY  r]  r^  rj  re  r¥   r¦   r  rH  rw  r  r    r    r    r!   Ú<module>   s   <
ÿÿ	

!
þ
$

!     "
&/