a
    ŽCéaIŸ  ã                   @   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
mZ ddlmZ ddlmZmZmZ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* ddl+m,Z, ddl-m.Z. e/Z0e 1d¡Z2e 1dej3¡Z4e 1d¡Z5e 1dej3¡j6Z7d 8¡ Z9g d¢Z:dZ;dZ<e<j=dj=ej>Ž edZ?dd„ Z@dd„ ZAdd„ ZBdHdd„ZCdId d!„ZDdJd"d#„ZEdedfd$d%„ZFdKd&d'„ZGd(d)„ ZHe 1d*ej3¡ZIeHd+d,„ ƒZJG d-d.„ d.ƒZKG d/d0„ d0eKƒZLG d1d2„ d2eƒZMe 1d3¡jNZOd4d5„ ZPd6d7„ ZQdLd8d9„ZRd:d;„ ZSG d<d=„ d=ƒZTG d>d?„ d?ejUƒZVejWjXfd@dA„ZYdBdC„ ZZeRe;ƒeYƒZYdDdE„ Z[dFdG„ Z\dS )Mz#PyPI and direct package downloadingé    N©Úwraps)Úsix)ÚurllibÚhttp_clientÚconfigparserÚmap)Ú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)Úget_all_headers)Úunescape)Ú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'   úh/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/setuptools/package_index.pyÚparse_requirement_arg5   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öÿÿÿÚ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rX|dkrXt j | d¡d ¡}d|v rp| dd¡\}}||fS )Nú/éÿÿÿÿzsourceforge.netÚdownloadéþÿÿÿú#é   )r   r#   ÚurlparseÚunquoteÚsplit)	ÚurlÚpartsÚschemeÚserverÚpathÚ
parametersÚqueryÚfragmentr1   r'   r'   r(   Úegg_info_for_urlV   s    rE   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 URLr9   )Ú
precedenceN)rE   Údistros_for_locationÚEGG_FRAGMENTÚmatchr    Úgroupr	   )r=   Úmetadatar1   rD   ÚdistrI   r'   r'   r(   r   a   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.whlr9   )ÚlocationÚproject_nameÚversionrF   r*   )r.   r
   Úfrom_locationr   Úis_compatiblerP   rQ   r   r   r    r   Ú
EXTENSIONSÚlen)rO   ÚbasenamerK   ÚwheelZwin_baser2   ÚplatformÚextr'   r'   r(   rG   o   s2    
û
ÿ
rG   c                 C   s   t t| ƒtj | ¡|ƒS )zEYield possible egg or source distribution objects based on a filename)rG   r   ÚosrA   rV   )ÚfilenamerK   r'   r'   r(   Údistros_for_filename   s    ÿr\   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!
    rN   c                 s   s   | ]}t  d |¡V  qdS )z	py\d\.\d$N)ÚrerI   )Ú.0Úpr'   r'   r(   Ú	<genexpr>®   ó    z(interpret_distro_name.<locals>.<genexpr>é   Nr9   )Ú
py_versionrF   rX   )r<   ÚanyÚrangerU   r
   Újoin)rO   rV   rK   rc   rF   rX   r>   r_   r'   r'   r(   r    —   s    
$ýr    c                 c   sf   t ƒ }|j}|du r:tj |j| ¡D ]}||ƒ |V  q$n(| D ]"}||ƒ}||vr>||ƒ |V  q>dS )zHList unique elements, preserving order. Remember all elements ever seen.N)ÚsetÚaddr   ÚmovesÚfilterfalseÚ__contains__)ÚiterableÚkeyÚseenZseen_addÚelementÚkr'   r'   r(   Úunique_everseen»   s    
rq   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)rq   )ÚargsÚkwargs©Úfuncr'   r(   ÚwrapperÓ   s    zunique_values.<locals>.wrapperr   )rv   rw   r'   ru   r(   Úunique_valuesÍ   s    rx   z(<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>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homepager6   r9   )z<th>Home Pagez<th>Download URLr5   N)ÚRELÚfinditerÚgroupsrg   r   ÚstrÚstripr-   r<   ÚHREFr   r#   ÚurljoinÚ
htmldecoderJ   ÚfindÚsearch)r=   ÚpagerI   ÚtagÚ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 rr   )Ú	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 URLr5   )r   r#   r:   r‰   Úpatternrƒ   Ú	groupdict)Úclsr=   rD   rI   r'   r'   r(   Úfrom_url  s    zHashChecker.from_urlc                 C   s   | j  |¡ d S rr   )r›   ÚupdaterŠ   r'   r'   r(   r      s    zHashChecker.feedc                 C   s   | j  ¡ | jkS rr   )r›   Ú	hexdigestrœ   rŽ   r'   r'   r(   r   #  s    zHashChecker.is_validc                 C   s   || j  }||ƒS rr   )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                       s<  e Zd ZdZdJdd„ZdKd	d
„ZdLdd„ZdMdd„Zdd„ Zdd„ Z	dd„ Z
dd„ ZdNdd„Zdd„ ZdO‡ fdd„	Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ ZdPd'd(„ZdQd)d*„Zd+d,„ Zd-Zd.d/„ Zd0d1„ ZdRd2d3„Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Ze dSd>d?„ƒZ!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&‡  Z'S )Tr   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 )Nr4   ú|)r   r   r.   Ú	index_urlÚscanned_urlsÚfetched_urlsÚpackage_pagesr]   r¥   rf   r   r   rI   ÚallowsÚto_scanr   Zis_availableZfind_ca_bundleZ
opener_forÚopenerr   ÚrequestÚurlopen)r‹   r«   ÚhostsZ	ca_bundleZ
verify_sslrs   Ú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Úignorer9   Úcodeé”  )&r¬   Ú
URL_SCHEMEÚprocess_filenameÚlistr   Úurl_okÚdebugr­   r   rh   ÚinfoÚopen_urlÚ
isinstancer   ÚerrorÚ	HTTPErrorr»   r¤   r=   ÚheadersÚgetr-   ÚcloseÚreadr}   Ú	get_paramÚdecoder   r{   r#   r€   r   rJ   Úprocess_urlr/   r«   ÚgetattrÚprocess_index)r‹   r=   ÚretrieveÚdistsÚtmplÚfr1   r„   r¹   rI   Úlinkr'   r'   r(   rÍ   C  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)rZ   rA   ÚexistsÚwarnÚisdirÚrealpathÚlistdirr¾   rf   r\   rÁ   r¿   r   rh   )r‹   ÚfnÚnestedrA   ÚitemrÑ   r'   r'   r(   r¾   x  s    zPackageIndex.process_filenamec                 C   sb   t |ƒ}|o| d¡ ¡ dk}|s8|  tj |¡d ¡r<dS d}|rRt|| ƒ‚n|  ||¡ d S )Nr9   ÚfileTzN
Note: Bypassing %s (disallowed host; see http://bit.ly/2hrImnY for details).
)	r½   rJ   r-   r¯   r   r#   r:   r   rÖ   )r‹   r=   Ú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)rZ   rÙ   r.   )r^   rA   Úentryr'   r'   r(   r`   —  s   
ýz.PackageIndex.scan_egg_links.<locals>.<genexpr>)ÚfilterrZ   rA   r×   r¿   Ú	itertoolsÚ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 )Nrb   )ÚopenrZ   rA   rf   r¿   râ   r   r}   r~   rU   r   rO   r   rF   rh   )r‹   rA   rá   Z	raw_linesÚlinesZegg_pathZ
setup_pathrL   r'   r'   r(   rå   Ÿ  s    4zPackageIndex.scan_egg_linkc           
   	      sÌ   ‡ fdd„}t  |¡D ]8}z |tj |t| d¡ƒ¡ƒ W q tyL   Y q0 q||ƒ\}}|rÄt||ƒD ]H}t	|ƒ\}}	| 
d¡r¨|	s¨|rž|d||f 7 }n
ˆ  |¡ ˆ  |¡ qjt dd„ |¡S dS d	S )
z#Process the contents of a PyPI pagec                    sŒ   |   ˆ j¡rˆtttjj| tˆ jƒd …  d¡ƒƒ}t|ƒdkrˆd|d vrˆt	|d ƒ}t
|d ƒ}dˆ j | ¡ i ¡| < t|ƒt|ƒfS dS )Nr4   rb   r8   r9   r   T)NN)r/   r«   r¿   r   r   r#   r;   rU   r<   r   r   r®   Ú
setdefaultr-   r   )rÔ   r>   ÚpkgÚverrŽ   r'   r(   Úscan²  s    ÿz(PackageIndex.process_index.<locals>.scanr9   ú.pyz
#egg=%s-%sc                 S   s   d|   ddd¡ S )Nz<a href="%s#md5=%s">%s</a>r9   é   rb   )rJ   )Úmr'   r'   r(   Ú<lambda>Õ  ra   z,PackageIndex.process_index.<locals>.<lambda>r¸   N)r   r{   r   r#   r€   r   rJ   r$   rˆ   rE   r.   Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub)
r‹   r=   r„   rî   rI   rì   rí   Únew_urlr1   Ú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¤   rs   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 )Nr4   r'   )	rô   r«   Úunsafe_namer®   rÈ   rm   rP   Únot_found_in_indexr¿   )r‹   Úrequirementr=   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ÿ   rm   rÁ   Úsuperr   Úobtain)r‹   rþ   Ú	installerrL   ©Ú	__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É   rZ   Úunlinkr   r›   r0   rA   rV   )r‹   Úcheckerr[   Ú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‹   Ú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¿   r   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?))rm   rÂ   rÖ   rü   rù   )r‹   rþ   Úmethr¤   r'   r'   r(   rý   &  s    
þzPackageIndex.not_found_in_indexc                 C   s~   t |tƒsjt|ƒ}|rR|  | d¡||¡}t|ƒ\}}| d¡rN|  |||¡}|S tj	 
|¡rb|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.
        r9   rï   rO   N)rÄ   r   r½   Ú_download_urlrJ   rE   r.   Ú	gen_setuprZ   rA   rÕ   r)   rÎ   Úfetch_distribution)r‹   r%   Útmpdirr?   Úfoundr1   rD   r'   r'   r(   r6   0  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: %sr9   )rm   rF   r   rÖ   r   r6   rO   Údownload_locationrZ   rA   rÕ   )ÚreqÚenvrL   ÚtestÚloc©Ú
develop_okr‹   ÚskippedÚsourcer  r'   r(   r‚   j  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)rO   )N)rÂ   r   rÿ   r°   rÖ   Úcloner  )	r‹   rþ   r  Ú
force_scanr  r  Zlocal_indexrL   r‚   r'   r  r(   r  R  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  rO   )r‹   rþ   r  r  r  rL   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'   )rQ   )r^   Údr'   r'   r(   Ú
<listcomp>­  s   ÿz*PackageIndex.gen_setup.<locals>.<listcomp>r9   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.)rH   rI   r    rJ   rU   rZ   rA   rV   Údirnamerf   Zsetuptools.command.easy_installr"  ÚshutilÚcopy2ré   ÚwriterP   rQ   Úsplitextr   )
r‹   r[   rD   r  rI   rÑ   rV   Ú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”t|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   r5   zcontent-lengthzContent-LengthÚwbr9   )rÂ   r—   r¡   rÃ   rÄ   r   rÅ   rÆ   r   r»   r¤   Údl_blocksizer   Úmaxr   ÚintÚ
reporthookré   rÊ   r   r'  r	  rÉ   )r‹   r=   r[   Úfpr  rÇ   ÚblocknumÚbsÚsizeÚsizesr  rŒ   r'   r'   r(   Ú_download_toÖ  sD    

ÿ



.ý ÿzPackageIndex._download_toc                 C   s   d S rr   r'   )r‹   r=   r[   r0  Zblksizer2  r'   r'   r(   r.  ú  s    zPackageIndex.reporthookc              
   C   s¨  |  d¡rt|ƒS zt|| jƒW S  tt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yP } z6|r(|  	||j¡ nt
d||jf ƒ|‚W Y d }~n\d }~0  t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'   )r}   )r^   Úargr'   r'   r(   r!    ra   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$   r   Ú
InvalidURLrf   rs   rÖ   r   r   rÅ   rÆ   ÚURLErrorÚreasonÚBadStatusLineÚlineÚHTTPExceptionÚsocket)r‹   r=   Ú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 ||¡}|dksj| d	¡rv|  ||¡S |d
ksˆ| d¡r”|  ||¡S | d¡rª|  	||¡S |dkrÊt
j t
j |¡d ¡S |  |d¡ |  ||¡S d S )Nz..Ú.ú\Ú_Z__downloaded__rM   r,   Úsvnzsvn+Úgitzgit+zhg+rÝ   rb   T)rE   Úreplacer.   rZ   rA   rf   r/   Ú_download_svnÚ_download_gitÚ_download_hgr   r²   Úurl2pathnamer#   r:   rÀ   Ú_attempt_download)r‹   r?   r=   r  r0   rD   r[   r'   r'   r(   r     s$    

zPackageIndex._download_urlc                 C   s   |   |d¡ d S )NT)rÍ   rú   r'   r'   r(   rô   =  s    zPackageIndex.scan_urlc                 C   s6   |   ||¡}d| dd¡ ¡ v r.|  |||¡S |S d S )Nr¶   r·   r¸   )r4  rÈ   r-   Ú_download_html)r‹   r=   r[   rÇ   r'   r'   r(   rL  @  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é   r~   r]   rƒ   rÉ   rZ   r  rH  r   )r‹   r=   rÇ   r[   rÝ   r=  r'   r'   r(   rM  G  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||¡ t d|||f ¡ |S )Nz"SVN download support is deprecatedr8   r9   r   r¸   zsvn:ú@z//r4   rb   ú:z --username=%s --password=%sz --username=z'Doing subversion checkout from %s to %szsvn checkout%s -q %s %s)ÚwarningsrÖ   ÚUserWarningr<   r-   r/   r   r#   r:   Ú
_splituserÚ
urlunparserÂ   rZ   Úsystem)r‹   r=   r[   Úcredsr?   ÚnetlocrA   r_   ÚqrÓ   ÚauthÚhostÚuserÚpwr>   r'   r'   r(   rH  V  s&    zPackageIndex._download_svnc                 C   sp   t j | ¡\}}}}}| dd¡d }| dd¡d }d }d|v rR| dd¡\}}t j ||||df¡} | |fS )Nú+r9   r5   r8   r   rN  r¸   )r   r#   Úurlsplitr<   ÚrsplitÚ
urlunsplit)r=   Ú
pop_prefixr?   rV  rA   rC   rø   Úrevr'   r'   r(   Ú_vcs_split_rev_from_urll  s    z$PackageIndex._vcs_split_rev_from_urlc                 C   sl   |  dd¡d }| j|dd\}}|  d||¡ t d||f ¡ |d urh|  d|¡ t d	||f ¡ |S )
Nr8   r9   r   T©r`  zDoing git clone from %s to %szgit clone --quiet %s %szChecking out %szgit -C %s checkout --quiet %s©r<   rb  rÂ   rZ   rT  ©r‹   r=   r[   ra  r'   r'   r(   rI  ~  s    þzPackageIndex._download_gitc                 C   sl   |  dd¡d }| j|dd\}}|  d||¡ t d||f ¡ |d urh|  d|¡ t d	||f ¡ |S )
Nr8   r9   r   Trc  zDoing hg clone from %s to %szhg clone --quiet %s %szUpdating to %szhg --cwd %s up -C -r %s -qrd  re  r'   r'   r(   rJ  Ž  s    þzPackageIndex._download_hgc                 G   s   t j|g|¢R Ž  d S rr   )r   rÁ   rû   r'   r'   r(   rÁ   ž  s    zPackageIndex.debugc                 G   s   t j|g|¢R Ž  d S rr   )r   rÂ   rû   r'   r'   r(   rÂ   ¡  s    zPackageIndex.infoc                 G   s   t j|g|¢R Ž  d S rr   )r   rÖ   rû   r'   r'   r(   rÖ   ¤  s    zPackageIndex.warn)r§   r¨   NT)F)F)F)N)N)FFFN)FF)N)F)(r“   r”   r•   r–   r   rÍ   r¾   rÀ   rè   rå   rÏ   ró   rù   rÿ   r  r	  r  r   rý   r6   r  r  r  r+  r4  r.  rÃ   r  rô   rL  rM  rH  Ústaticmethodrb  rI  rJ  rÁ   rÂ   rÖ   Ú__classcell__r'   r'   r  r(   r   +  sP     þ

5


+
		
#  þ
L
)$
#r   z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c                 C   s   |   d¡}t|ƒS )Nr   )rJ   r   )rI   Úwhatr'   r'   r(   Údecode_entity­  s    
ri  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_subri  )Útextr'   r'   r(   r   ²  s    	r   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 rr   )r?  ÚgetdefaulttimeoutÚsetdefaulttimeout)rs   rt   Zold_timeout)rv   Útimeoutr'   r(   Ú_socket_timeoutÀ  s    

þz@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr'   )rv   ro  ©rn  ru   r(   ro  ¿  s    z'socket_timeout.<locals>._socket_timeoutr'   )rn  ro  r'   rp  r(   Úsocket_timeout¾  s    rq  c                 C   s2   t j | ¡}| ¡ }t |¡}| ¡ }| dd¡S )aq  
    A function compatible with Python 2.3-3.3 that will 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¸   )r   r#   r;   ÚencodeÚbase64Ú	b64encoderÌ   rG  )rX  Zauth_sZ
auth_bytesZencoded_bytesÚencodedr'   r'   r(   Ú_encode_authÍ  s
    
rw  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 rr   ©ÚusernameÚpassword)r‹   rz  r{  r'   r'   r(   r   è  s    zCredential.__init__c                 c   s   | j V  | jV  d S rr   ry  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(   rx  ã  s   rx  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
        )rz  r{  Ú
repositoryr¸   ú~z.pypircN)ÚdictÚfromkeysr   ÚRawConfigParserr   rZ   rA   rf   Ú
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È   r~   )r^   ÚsectionrŽ   r'   r(   r!    s   ÿz2PyPIConfig.creds_by_repository.<locals>.<listcomp>)Úsectionsr‚  r   Ú_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 )Nr€  rz  r{  )rÈ   r~   rx  )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_credential  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¡r0t d¡‚|dv rFt|ƒ\}	}
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 authenticationrO  znonnumeric port: '')ÚhttpÚhttpsNz*Authenticating as %s for %s (from .pypirc)zBasic ÚAuthorizationz
User-Agent)r   r#   r:   r.   r   r9  rR  r  r  r}   rz  r   rÂ   rw  rS  r²   ÚRequestÚ
add_headerÚ
user_agentr=   )r=   r±   Úparsedr?   rV  rA   ÚparamsrC   rø   rX  ÚaddressrŽ  rÂ   r>   r÷   r²   r/  Ús2Úh2Úpath2Zparam2Zquery2Zfrag2r'   r'   r(   r8    s8    


r8  c                 C   s    |   d¡\}}} |r|nd| fS )zNsplituser('user[:passwd]@host[:port]')
    --> 'user[:passwd]', 'host[:port]'.rN  N)Ú
rpartition)rY  rZ  Údelimr'   r'   r(   rR  I  s    rR  c                 C   s   | S rr   r'   )r=   r'   r'   r(   Ú
fix_sf_urlT  s    rŸ  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 directoriesr4   z
index.htmlÚrNz<a href="{name}">{name}</a>)r0   zB<html><head><title>{url}</title></head><body>{files}</body></html>rr  )r=   Úfiles)éÈ   ÚOK)r¼   zPath not foundz	Not foundr·   z	text/html)r   r#   r:   r²   rK  rZ   rA   Úisfiler³   r.   r×   rÙ   rf   ré   rÊ   r  Úformatr   ÚStringIOrÅ   rÆ   )r=   r?   r@   rA   ÚparamrC   rø   r[   r¡  rÓ   Úfilepathr/  ÚbodyrÒ   ÚstatusÚmessagerÇ   Zbody_streamr'   r'   r(   r7  X  s.    &ÿ


r7  )N)N)N)N)r!   )]r–   ÚsysrZ   r]   r%  r?  rt  r™   rã   rP  Ú	functoolsr   Zsetuptools.externr   Zsetuptools.extern.six.movesr   r   r   r   r"   Úpkg_resourcesr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Ú	distutilsr   Údistutils.errorsr   Úfnmatchr   Zsetuptools.py27compatr   Zsetuptools.py33compatr   Zsetuptools.wheelr   ÚtypeÚ__metaclass__r¥   rH   ÚIr   rõ   rI   r½   r<   rT   Ú__all__Z_SOCKET_TIMEOUTZ_tmplr¥  Úversion_infor–  r)   r   rE   r   rG   r\   r    rq   rx   rz   rˆ   r‰   r—   r   rö   rj  ri  r   rq  rw  rx  r„  r  r²   r³   r8  rR  rŸ  r7  r'   r'   r'   r(   Ú<module>   sŠ   <
ÿÿ	

!
þ
$

!     
&/