î
½1kd¶�  ã               @   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 m Z d d l m	 Z	 m
 Z
 m Z m Z d d l m Z m Z m Z m Z m Z d d l m Z m Z d d l m Z m Z m Z d d l m Z m Z d d	 l m Z m Z m  Z  d d l! Z! d d l" Z" d d l# Z# d d
 l$ m% Z% d g Z& d Z' i d g d 6Z( Gd d „  d e) ƒ Z* Gd d „  d e) ƒ Z+ Gd d „  d e) ƒ Z, Gd d „  d e) ƒ Z- e- e	 ƒ Z. d d „  Z/ d d „  Z0 d S)z!Routines related to PyPI, indexesé    N)Úlogger)ÚInfÚnormalize_nameÚsplitextÚis_prerelease)ÚDistributionNotFoundÚBestVersionAlreadyInstalledÚInstallationErrorÚInvalidWheelFilenameÚUnsupportedWheel)ÚurlparseÚurl2pathname)Ú
PipSessionÚurl_to_pathÚpath_to_url)ÚWheelÚ	wheel_ext)Úsupported_tagsÚsupported_tags_noarchÚget_platform)ÚSSLErrorÚPackageFinderzlast.pypi.python.orgÚhttpsÚhttpc            	   @   s  e  Z d  Z d Z d g  g  d d d d d d „ Z d d „  Z d	 d
 „  Z d d „  Z d d „  Z d d „  Z	 d d „  Z
 d d „  Z e j d ƒ Z e j d e j ƒ Z e j d ƒ Z d d „  Z d d „  Z d d „  Z d d „  Z d  d! „  Z d" d# „  Z d S)$r   zŸThis finds packages.

    This is meant to match easy_install's technique for looking for
    packages, by reading pages and looking for appropriate links
    TFNc
       
      C   sÒ   | |  _  | |  _ g  |  _ t ƒ  |  _ t ƒ  |  _ | |  _ t d d „  | Dƒ ƒ |  _ t d d „  | Dƒ ƒ |  _	 |  j |  j	 O_ | |  _
 d |  _ d |  _ | |  _ | |  _ d |  _ |	 pÈ t ƒ  |  _ d  S)Nc             s   s   |  ] } t  | ƒ Vq d  S)N)r   )Ú.0Ún© r   ú8/var/www/pythonscrapper/code/venv/build/pip/pip/index.pyú	<genexpr>4   s    z)PackageFinder.__init__.<locals>.<genexpr>c             s   s   |  ] } t  | ƒ Vq d  S)N)r   )r   r   r   r   r   r   8   s    F)Ú
find_linksÚ
index_urlsÚdependency_linksÚ	PageCacheÚcacheÚsetÚlogged_linksÚ	use_wheelÚallow_externalÚallow_unverifiedÚallow_all_externalÚneed_warn_externalÚneed_warn_unverifiedÚallow_all_prereleasesÚprocess_dependency_linksÚ_have_warned_dependency_linksr   Úsession)
Úselfr   r    r&   r'   r(   r)   r,   r-   r/   r   r   r   Ú__init__&   s"    										zPackageFinder.__init__c             C   sE   |  j  rA |  j s. t j d d ƒ d |  _ n  |  j j | ƒ n  d  S)Nz1.6zpDependency Links processing has been deprecated with an accelerated time schedule and will be removed in pip 1.6T)r-   r.   r   Ú
deprecatedr!   Úextend)r0   Úlinksr   r   r   Úadd_dependency_linksS   s    		z"PackageFinder.add_dependency_linksc       	         sJ  g  ‰  g  ‰ ‡  ‡ f d d †  } x| D]} t  j j | ƒ } | j d ƒ } | |  j k } | sj | r/| ry | } n t | ƒ } | rå t  j j | ƒ rå t  j j | ƒ } xz t  j | ƒ D] } | t  j j	 | | ƒ ƒ q¿ Wq<| rt  j j | ƒ rˆ j
 | ƒ q<t  j j | ƒ r<| | ƒ q<q( ˆ j
 | ƒ q( Wˆ  ˆ f S)zt
        Sort locations into "files" (archives) and "urls", and return
        a pair of lists (files,urls)
        c                sL   t  |  ƒ } t j | d d ƒd d k r; ˆ j | ƒ n ˆ  j | ƒ d  S)NÚstrictFr   z	text/html)r   Ú	mimetypesÚ
guess_typeÚappend)ÚpathÚurl)ÚfilesÚurlsr   r   Ú	sort_pathk   s    z0PackageFinder._sort_locations.<locals>.sort_pathzfile:)Úosr:   ÚexistsÚ
startswithr   r   ÚisdirÚrealpathÚlistdirÚjoinr9   Úisfile)	r0   Ú	locationsr>   r;   Úis_local_pathÚis_file_urlÚis_find_linkr:   Úitemr   )r<   r=   r   Ú_sort_locationsb   s*    	 zPackageFinder._sort_locationsc             C   s¢   | \ } } } |  j  rš t t ƒ } | t k r9 d } nW | j t k r‰ t | j ƒ } | j ƒ  sy t	 d | j ƒ ‚ n  | j
 ƒ  } n | } | | f S| Sd S)aL  
        Function used to generate link sort key for link tuples.
        The greater the return value, the more preferred it is.
        If not finding wheels, then sorted by version only.
        If finding wheels, then the sort order is by version, then:
          1. existing installs
          2. wheels ordered via Wheel.support_index_min()
          3. source archives
        Note: it was considered to embed this logic into the Link
              comparison operators, but then different sdist links
              with the same version, would have to be considered equal
        é   zB%s is not a supported wheel for this platform. It can't be sorted.N)r&   Úlenr   ÚINSTALLED_VERSIONÚextr   r   ÚfilenameÚ	supportedr   Úsupport_index_min)r0   Ú
link_tupleÚparsed_versionÚlinkÚ_Úsupport_numÚpriÚwheelr   r   r   Ú_link_sort_keyŠ   s    		
zPackageFinder._link_sort_keyc             C   s   t  | d |  j d d ƒS)zí
        Bring the latest version (and wheels) to the front, but maintain the existing ordering as secondary.
        See the docstring for `_link_sort_key` for details.
        This function is isolated for easier unit testing.
        ÚkeyÚreverseT)Úsortedr[   )r0   Úapplicable_versionsr   r   r   Ú_sort_versions§   s    zPackageFinder._sort_versionsc                s  ‡ f d d †  ‰  | j  ‰ d  } |  j rž t ˆ  |  j d ƒ d d ƒ} |  j | | ƒ } | d  k rž |  j t |  j d d d ƒˆ | ƒ p• | j  ‰ qž n  ˆ d  k	 rÐ ‡  f d d †  |  j Dƒ |  j } n t |  j ƒ } xH | j D]= } ˆ d  k	 ré | d  k	 ré t j	 | j
 | ƒ g | } qé qé W|  j | ƒ \ } } |  j |  j ƒ \ }	 }
 | j |	 ƒ d d „  | Dƒ } | j d	 d „  |
 Dƒ ƒ t j d
 | ƒ xü | D]ô } t j d | ƒ t j t | ƒ ƒ } | j t k r©t | j } t | ƒ d k r3| | j | d | j f } t j d | ƒ q�t | ƒ d k rz| | j d j	 | ƒ | j f } t j d | ƒ q�| | j f } t j d | ƒ q©q©Wg  } | j |  j d d „  |  j Dƒ | j j ƒ  ƒ ƒ g  } xy |  j | | ƒ D]e } t j d | j
 ƒ t j d 7_ z) | j |  j | j | j j ƒ  ƒ ƒ Wd  t j d 8_ XqòWt |  j d d „  |  j Dƒ | j j ƒ  ƒ ƒ } | r¼t j d d j	 d d „  | Dƒ ƒ ƒ n  t |  j d d „  | Dƒ | j j ƒ  ƒ ƒ } | rj| rj| rj| rjt j d | ƒ |  j r7t j d | j ƒ n  |  j  rWt j d | j ƒ n  t! d | ƒ ‚ n  g  } | j" d  k	 r | j" j# t$ | j" j% f g } n  | rà| j& d d ƒ t j d d j	 d d „  | Dƒ ƒ ƒ n  | | | | | } g  } xÃ | D]» \ } } } | | j' k r]t j d | | d  j	 d! d „  | j' j( Dƒ ƒ f ƒ qnK t) | ƒ r¨|  j* px| j+ r¨| t$ k	 r¨t j d" | | f ƒ qq¨n  | j, | | | f ƒ qW|  j- | ƒ } t. d# d „  | Dƒ ƒ } | rN| rN| d d t$ k r%t j d$ | j" j% ƒ n% t j d% | j" j% | d d f ƒ d  S| sÍt j d& | d j	 d' d „  | Dƒ ƒ f ƒ |  j ršt j d( ƒ n  |  j  rºt j d | j ƒ n  t! d) | ƒ ‚ n  | d d t$ k r-t j d* | j" j% d j	 d+ d „  | d d  … Dƒ ƒ pd, f ƒ t/ ‚ n  t | ƒ d k rwt j d- | d d d j	 d. d „  | Dƒ ƒ f ƒ n  | d d } | j0 d  k	 rµ| j0 rµt j d/ | j ƒ n  | j1 d  k	 rå| j1 råt j d0 | j ƒ n  | j2 rt j3 d1 d2 | j ƒ n  | S)3Nc                s2   t  j |  ˆ  ƒ } | j d ƒ s. | d } n  | S)Nú/)Ú	posixpathrE   Úendswith)r;   Úloc)Úurl_namer   r   Úmkurl_pypi_url±   s    z6PackageFinder.find_requirement.<locals>.mkurl_pypi_urlr   ÚtrustedTc                s   g  |  ] } ˆ  | ƒ ‘ q Sr   r   )r   r;   )rf   r   r   ú
<listcomp>È   s   	z2PackageFinder.find_requirement.<locals>.<listcomp>c             S   s"   g  |  ] } t  | d  d ƒ‘ q S)rg   T)ÚLink)r   r;   r   r   r   rh   ×   s   	 c             S   s   g  |  ] } t  | ƒ ‘ q Sr   )ri   )r   r;   r   r   r   rh   Ú   s   	 z#URLs to search for versions for %s:z* %srM   zS%s uses an insecure transport scheme (%s). Consider using %s if %s has it availablez, zc%s uses an insecure transport scheme (%s). Consider using one of %s if %s has any of them availablez*%s uses an insecure transport scheme (%s).c             S   s%   g  |  ] } t  | d  d d ƒ‘ q S)z-frg   T)ri   )r   r;   r   r   r   rh   ú   s   	 zAnalyzing links from page %sé   c             S   s   g  |  ] } t  | ƒ ‘ q Sr   )ri   )r   r;   r   r   r   rh     s   	 zdependency_links found: %sc             S   s"   g  |  ] \ } } } | j  ‘ q Sr   )r;   )r   ÚparsedrV   Úversionr   r   r   rh     s   	 c             S   s   g  |  ] } t  | ƒ ‘ q Sr   )ri   )r   r;   r   r   r   rh     s   	 z<Could not find any downloads that satisfy the requirement %szMSome externally hosted files were ignored (use --allow-external %s to allow).zWSome insecure and unverifiable files were ignored (use --allow-unverified %s to allow).z$No distributions at all found for %sr]   zLocal files found: %sc             S   s(   g  |  ] \ } } } t  | j ƒ ‘ q Sr   )r   r;   )r   rk   rV   rl   r   r   r   rh     s   	 z-Ignoring link %s, version %s doesn't match %sú,c             S   s   g  |  ] } d  j  | ƒ ‘ q S)Ú )rE   )r   Úsr   r   r   rh   "  s   	 zCIgnoring link %s, version %s is a pre-release (use --pre to allow).c             S   s+   g  |  ]! \ } } } | t  k r | ‘ q Sr   )rO   )r   rU   rV   rl   r   r   r   rh   ,  s   	 zLExisting installed version (%s) is most up-to-date and satisfies requirementzUExisting installed version (%s) satisfies requirement (most up-to-date version is %s)zNCould not find a version that satisfies the requirement %s (from versions: %s)c             S   s   g  |  ] \ } } } | ‘ q Sr   r   )r   rU   rV   rl   r   r   r   rh   7  s   	 zJSome externally hosted files were ignored (use --allow-external to allow).z,No distributions matching the version for %sz=Installed version (%s) is most up-to-date (past versions: %s)c             S   s   g  |  ] \ } } } | ‘ q Sr   r   )r   rU   rV   rl   r   r   r   rh   F  s   	 Únonez)Using version %s (newest of versions: %s)c             S   s   g  |  ] \ } } } | ‘ q Sr   r   )r   rU   rV   rl   r   r   r   rh   J  s   	 z2%s an externally hosted file and may be unreliablez,%s is potentially insecure and unverifiable.z1.7za%s discovered using a deprecated method of parsing, in the future it will no longer be discovered)4re   r    ri   Ú	_get_pageÚ_find_url_namer   ÚlistÚabsolute_versionsrb   rE   r;   rL   r!   r3   r   Údebugr   ÚstrÚschemeÚINSECURE_SCHEMESrN   ÚnetlocÚwarnÚ_package_versionsÚnameÚlowerÚ
_get_pagesÚindentr4   ÚinfoÚfatalr*   r+   r   Úsatisfied_byrU   rO   rl   ÚsortÚreqÚspecsr   r,   Úprereleasesr9   r`   Úboolr   ÚinternalÚ
verifiableÚ_deprecated_regexr2   )r0   r„   ÚupgradeÚmain_index_urlÚpagerG   rl   Úfile_locationsÚurl_locationsÚ_flocationsÚ_ulocationsÚlocationrk   Úsecure_schemesÚctxÚfound_versionsÚpage_versionsÚdependency_versionsÚfile_versionsÚinstalled_versionÚall_versionsr_   rU   rV   Úexisting_applicableÚselected_versionr   )rf   re   r   Úfind_requirement¯   sö    
		7#			&)	(*	%				!*	-				$				:		/
	
		zPackageFinder.find_requirementc             C   sÆ   | j  j d ƒ s$ | j  d 7_  n  |  j | | ƒ } | d k rW t j d | ƒ d St | j ƒ } xY | j D]N } t j	 | j
 j d ƒ ƒ } | t | ƒ k rp t j d | | f ƒ | Sqp Wd S)zŒFinds the true URL name of a package, when the given name isn't quite correct.
        This is usually used to implement case-insensitivity.ra   NzCannot fetch index base URL %sz!Real name of requirement %s is %s)r;   rc   rq   r   r�   r   re   r4   rb   Úbasenamer:   ÚrstripÚnotify)r0   Ú	index_urlre   r„   r�   Ú	norm_namerV   Úbaser   r   r   rr   b  s    zPackageFinder._find_url_namec       	      c   s7  t  | ƒ } t ƒ  } x| r2| j d ƒ } | | k r? q n  | j | ƒ |  j | | ƒ } | d k rp q n  | Vx· | j ƒ  D]© } t | j ƒ j ƒ  } | |  j	 k rÖ |  j
 rÖ d |  _ t j d | ƒ q‚ n  | j d k	 r| j r| |  j k rt j d | ƒ d |  _ q‚ n  | j | ƒ q‚ Wq Wd S)z“
        Yields (page, page_url) from the given locations, skipping
        locations that have errors, and adding download/homepage links
        r   NTz@Not searching %s for files because external urls are disallowed.z_Not searching %s for urls, it is an untrusted link and cannot produce safe or verifiable files.)rs   r$   ÚpopÚaddrq   Ú	rel_linksr   r|   r}   r'   r)   r*   r   ru   rg   r(   r+   r9   )	r0   rG   r„   Úall_locationsÚseenr’   r�   rV   Ú
normalizedr   r   r   r~   u  s6    		
		
		zPackageFinder._get_pagesz#egg=([^&]*)z([a-z0-9_.]+)-([a-z0-9_.-]+)z-py([123]\.?[0-9]?)$c             C   sq   g  g  } } t  ƒ  } xP | D]H } | | k r | j | ƒ | j rU | j | ƒ qe | j | ƒ q q W| | S)zgReturns elements of links in order, non-egg links first, egg links second, while eliminating duplicates)r$   r¥   Úegg_fragmentr9   )r0   r4   ÚeggsÚno_eggsr¨   rV   r   r   r   Ú_sort_links¢  s    		zPackageFinder._sort_linksc             c   s@   x9 |  j  | ƒ D]( } x |  j | | ƒ D] } | Vq) Wq Wd  S)N)r­   Ú_link_package_versions)r0   r4   Úsearch_namerV   Úvr   r   r   r{   ¯  s    zPackageFinder._package_versionsc             C   s   d } |  j  r | t f S| S)Nú.tar.gzú.tar.bz2ú.tarú.tgzú.zip)r±   r²   r³   r´   rµ   )r&   r   )r0   Ú
extensionsr   r   r   Ú_known_extensions´  s    	zPackageFinder._known_extensionsc             C   s  t  ƒ  } d } | j r$ | j } nN| j ƒ  \ } } | ss | |  j k ro t j d | ƒ |  j j | ƒ n  g  S| j d ƒ rŸ | d d … } d | } n  | |  j ƒ  k rî | |  j k rê t j d | | f ƒ |  j j | ƒ n  g  Sd | j	 k r@| d k r@| |  j k r<t j d | ƒ |  j j | ƒ n  g  S| t
 k rry t | j ƒ } Wn' t k
 rˆt j d	 | ƒ g  SYn X| j j ƒ  | j ƒ  k r¿t j d
 | | f ƒ g  S| j ƒ  sàt j d | ƒ g  St | d d ƒ } | j d ƒ rf| j d ƒ rf| d k	 rft j | j ƒ j j d ƒ rf| j d t ƒ sft j d | ƒ g  Sn  | j } n  | s�|  j | | | ƒ } n  | d k r·t j d
 | | f ƒ g  S| j d k	 r| j rt | ƒ j ƒ  |  j k r|  j rt j d | ƒ d |  _ g  S| j d k	 re| j ret | ƒ j ƒ  |  j k ret j d | ƒ d |  _  g  S|  j! j" | ƒ }	 |	 rÓ| d |	 j# ƒ  … } |	 j$ d ƒ }
 |
 t% j d d … k rÓt j d | ƒ g  Sn  t j d | | f ƒ t& j' | ƒ | | f g S)zâ
        Return an iterable of triples (pkg_resources_version_key,
        link, python_version) that can be extracted from the given
        link.

        Meant to be overridden by subclasses, not called by clients.
        NzSkipping link %s; not a filez.taré   z,Skipping link %s; unknown archive format: %sÚmacosx10z.zipzSkipping link %s; macosx10 onez1Skipping %s because the wheel filename is invalidz-Skipping link %s; wrong project name (not %s)z9Skipping %s because it is not compatible with this PythonÚ
comes_fromÚwinÚmacosxzpypi.python.orgÚtagszOSkipping %s because it is a pypi-hosted binary Wheel on an unsupported platformz,Skipping %s because it is externally hosted.Tz<Skipping %s because it is an insecure and unverifiable file.rM   é   z/Skipping %s because Python version is incorrectzFound link %s, version: %séüÿÿÿ)(r   rª   r   r%   r   ru   r¥   rc   r·   r:   r   r   rQ   r
   r|   r}   rR   ÚgetattrrA   r   r;   ry   r   rl   Ú_egg_info_matchesrˆ   r   r'   r)   r*   r‰   r(   r+   Ú_py_version_reÚsearchÚstartÚgroupÚsysÚpkg_resourcesÚparse_version)r0   rV   r¯   Úplatformrl   Úegg_inforP   rZ   rº   ÚmatchÚ
py_versionr   r   r   r®   º  sœ    				

	
		z$PackageFinder._link_package_versionsc             C   s˜   |  j  j | ƒ } | s- t j d | ƒ d  S| j d ƒ j ƒ  } | j d d ƒ } | j ƒ  d } | j | ƒ r� | j d ƒ t | ƒ d  … Sd  Sd  S)Nz%Could not parse version from link: %sr   rW   ú-)	Ú_egg_info_rerÃ   r   ru   rÅ   r}   ÚreplacerA   rN   )r0   rÊ   r¯   rV   rË   r|   Úlook_forr   r   r   rÁ   &  s    zPackageFinder._egg_info_matchesc             C   s"   t  j | | d |  j d |  j ƒS)Nr#   r/   )ÚHTMLPageÚget_pager#   r/   )r0   rV   r„   r   r   r   rq   5  s    	zPackageFinder._get_page)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   r5   rL   r[   r`   r�   rr   r~   ÚreÚcompileÚ_egg_fragment_reÚIrÎ   rÂ   r­   r{   r·   r®   rÁ   rq   r   r   r   r   r      s(   	*(³)lc               @   ss   e  Z d  Z d Z d Z d d „  Z d d „  Z d d „  Z d	 d
 „  Z d d d „ Z	 d d „  Z
 d d „  Z d S)r"   zCache of HTML pagesr¾   c             C   s   i  |  _  i  |  _ i  |  _ d  S)N)Ú	_failuresÚ_pagesÚ	_archives)r0   r   r   r   r1   A  s    		zPageCache.__init__c             C   s   |  j  j | d ƒ |  j k S)Nr   )rÛ   ÚgetÚfailure_limit)r0   r;   r   r   r   Útoo_many_failuresF  s    zPageCache.too_many_failuresc             C   s   |  j  j | ƒ S)N)rÜ   rÞ   )r0   r;   r   r   r   rÒ   I  s    zPageCache.get_pagec             C   s   |  j  j | d ƒ S)NF)rÝ   rÞ   )r0   r;   r   r   r   Ú
is_archiveL  s    zPageCache.is_archiveTc             C   s   | |  j  | <d  S)N)rÝ   )r0   r;   Úvaluer   r   r   Úset_is_archiveO  s    zPageCache.set_is_archivec             C   s$   |  j  j | d ƒ | |  j  | <d  S)Nr   )rÛ   rÞ   )r0   r;   Úlevelr   r   r   Úadd_page_failureR  s    zPageCache.add_page_failurec             C   s"   x | D] } | |  j  | <q Wd  S)N)rÜ   )r0   r=   r�   r;   r   r   r   Úadd_pageU  s    zPageCache.add_pageN)rÓ   rÔ   rÕ   rÖ   rß   r1   rà   rÒ   rá   rã   rå   ræ   r   r   r   r   r"   <  s   r"   c               @   sC  e  Z d  Z d Z e j d e j ƒ Z e j d e j ƒ Z e j d e j e j	 Bƒ Z
 d d d d „ Z d d	 „  Z e d d
 d d d „ ƒ Z e d d d d d „ ƒ Z e d d d „ ƒ Z e d d „  ƒ Z e d d „  ƒ Z e d d „  ƒ Z d d „  Z d# d d „ Z d d „  Z e j d  e j ƒ Z d! d" „  Z d S)$rÑ   z'Represents one page, along with its URLz<th>\s*home\s*pagez<th>\s*download\s+urlz(href=(?:"([^"]*)"|'([^']*)'|([^>\s\n]*))Nc             C   sC   | |  _  t j |  j  d d ƒ|  _ | |  _ | |  _ | |  _ d  S)NÚnamespaceHTMLElementsF)ÚcontentÚhtml5libÚparserk   r;   Úheadersrg   )r0   rè   r;   rë   rg   r   r   r   r1   b  s
    			zHTMLPage.__init__c             C   s   |  j  S)N)r;   )r0   r   r   r   Ú__str__i  s    zHTMLPage.__str__Tc             C   s\  | d  k r t  ƒ  } n  | j } | j d d ƒ d } | j | ƒ rJ d  Sd d l m } xT | j D]I } | j ƒ  j | ƒ rd | t	 | ƒ d k rd t
 j d t ƒ  ƒ d  Sqd W| d  k	 rß | j | ƒ }	 |	 d  k	 rß |	 Sn  y| r­| d  k	 r
| j | ƒ r
d  Sn  | j }
 x— d d d	 d
 d g D]} } |
 j | ƒ r)|  j | d | ƒ} | j ƒ  j d ƒ rlPq¦t
 j d | | f ƒ | d  k	 rŸ| j | ƒ n  d  Sq)q)Wn  t
 j d | ƒ t j | ƒ \ } } } } } } | d k rEt j j t | ƒ ƒ rE| j d ƒ s| d 7} n  t j | d ƒ } t
 j d | ƒ n  | j | d i d d 6ƒ} | j ƒ  | j j d d ƒ } | j ƒ  j d ƒ sÌt
 j d | | f ƒ | d  k	 rÈ| j | ƒ n  d  S|  | j | j | j d | j ƒ}	 Wn8t j k
 r[} zE | j  j! d k r!d n d } |  j" | | | | d | d | ƒWYd  d  } ~ Xný t j# k
 r¢} z% |  j" | | d | | d | ƒWYd  d  } ~ Xn¶ t j$ k
 rÒ|  j" | | d | d | ƒYn† t% k
 r+} z: d | } |  j" | | | | d | d d d  t
 j& ƒWYd  d  } ~ Xn- X| d  k	 rT| j' | | j g |	 ƒ n  |	 Sd  S)!Nú#rM   r   )Ú
VcsSupportz+:z&Cannot look at %(scheme)s URL %(link)sz.tarz.tar.gzz.tar.bz2z.tgzz.zipr/   z	text/htmlz,Skipping page %s because of Content-Type: %szGetting page %sÚfilera   z
index.htmlz# file: URL is directory, getting %srë   ÚAcceptzContent-TypeÚunknownrg   i”  rj   r#   rä   zconnection error: %sz	timed outz6There was a problem confirming the ssl certificate: %sÚmeth)(r   r;   Úsplitrà   Úpip.vcsrî   Úschemesr}   rA   rN   r   ru   ÚlocalsrÒ   rá   rQ   rc   Ú_get_content_typerã   r   r?   r:   rB   r   ÚurljoinrÞ   Úraise_for_statusrë   Útextrg   ÚrequestsÚ	HTTPErrorÚresponseÚstatus_codeÚ_handle_failÚConnectionErrorÚTimeoutr   r    ræ   )ÚclsrV   r„   r#   Úskip_archivesr/   r;   rî   rw   ÚinstrQ   Úbad_extÚcontent_typery   r:   ÚparamsÚqueryÚfragmentÚrespÚexcrä   Úreasonr   r   r   rÒ   l  s†    	+		!$
		(4 zHTMLPage.get_pagerM   c             C   sb   | d  k r t  j } n  | d | | ƒ | d | j |  f ƒ | d  k	 r^ | j | | ƒ n  d  S)NzCould not fetch URL %s: %sz7Will skip URL %s when looking for download links for %s)r   r€   r;   rå   )r„   rV   r  r;   r#   rä   rò   r   r   r   rÿ   È  s    zHTMLPage._handle_failc             C   sx   | d k r t  ƒ  } n  t j |  ƒ \ } } } } } | d
 k rF d S| j |  d d ƒ} | j ƒ  | j j d	 d ƒ S)z;Get the Content-Type of the given url, using a HEAD requestNr   r   ÚftpÚftpsrn   Úallow_redirectsTzContent-Type)zhttpzhttpszftpzftps)r   r   ÚurlsplitÚheadrù   rë   rÞ   )r;   r/   rw   ry   r:   r  r	  r
  r   r   r   r÷   Ô  s    
zHTMLPage._get_content_typec             C   s‘   t  |  d ƒ sŠ d  } d d „  |  j j d ƒ Dƒ } | r~ y  t | d j d d  ƒ ƒ } Wq~ t t f k
 rz d  } Yq~ Xn  | |  _ n  |  j S)NÚ_api_versionc             S   s4   g  |  ]* } | j  d  d ƒ j ƒ  d k r | ‘ q S)r|   rn   zapi-version)rÞ   r}   )r   Úxr   r   r   rh   ê  s   	 z(HTMLPage.api_version.<locals>.<listcomp>z.//metar   râ   )Úhasattrrk   ÚfindallÚintrÞ   Ú	TypeErrorÚ
ValueErrorr  )r0   r  Úmetasr   r   r   Úapi_versionå  s     zHTMLPage.api_versionc             C   sg   t  |  d ƒ s` |  j j d ƒ } | d  k	 rQ | j d ƒ rQ | j d ƒ |  _ q` |  j |  _ n  |  j S)NÚ	_base_urlz.//baseÚhref)r  rk   ÚfindrÞ   r  r;   )r0   r£   r   r   r   Úbase_urlô  s    zHTMLPage.base_urlc             c   sÅ   x¾ |  j  j d ƒ D]ª } | j d ƒ r | j d ƒ } |  j t j |  j | ƒ ƒ } d } |  j r¦ |  j d k r¦ t | j d ƒ o� d | j d ƒ j	 ƒ  k ƒ } n  t
 | |  d | ƒVq q Wd S)zYields all links in the pagez.//ar  Nrj   Úrelrˆ   )rk   r  rÞ   Ú
clean_linkr   rø   r  r  r‡   ró   ri   )r0   Úanchorr  r;   rˆ   r   r   r   r4   þ  s    !zHTMLPage.linksc             c   s<   x |  j  ƒ  D] } | Vq Wx |  j ƒ  D] } | Vq) Wd  S)N)Úexplicit_rel_linksÚscraped_rel_links)r0   r;   r   r   r   r¦     s    	zHTMLPage.rel_linksÚhomepageÚdownloadc             c   s·   t  | ƒ } x¤ |  j j d ƒ D]� } | j d ƒ r | j d ƒ r t  | j d ƒ j ƒ  ƒ } | | @r¯ | j d ƒ } |  j t j |  j | ƒ ƒ } t	 | |  d d ƒVq¯ q q Wd S)z)Yields all links with the given relationsz.//ar  r  rg   FN)
r$   rk   r  rÞ   ró   r   r   rø   r  ri   )r0   Úrelsr!  Ú
found_relsr  r;   r   r   r   r"    s    
zHTMLPage.explicit_rel_linksc             c   sÝ   xÖ |  j  |  j f D]Â } | j |  j ƒ } | s7 q n  |  j j |  j d | j ƒ  ƒ} | sd q n  | j d ƒ pŽ | j d ƒ pŽ | j d ƒ } | s� q n  |  j t j	 |  j
 | ƒ ƒ } t | |  d d d d ƒVq Wd  S)	NÚposrM   rj   r¾   rg   FrŠ   T)Ú_homepage_reÚ_download_rerÃ   rè   Ú_href_reÚendrÅ   r   r   rø   r  ri   )r0   ÚregexrË   Ú
href_matchr;   r   r   r   r#  &  s    !-zHTMLPage.scraped_rel_linksz[^a-z0-9$&+,/:;=?@.#%_\\|-]c             C   s   |  j  j d d „  | ƒ S)z¨Makes sure a link is fully encoded.  That is, if a ' ' shows up in
        the link, it will be rewritten to %20 (while not over-quoting
        % or other characters).c             S   s   d t  |  j d ƒ ƒ S)Nz%%%2xr   )ÚordrÅ   )rË   r   r   r   Ú<lambda><  s    z%HTMLPage.clean_link.<locals>.<lambda>)Ú	_clean_reÚsub)r0   r;   r   r   r   r   7  s    	zHTMLPage.clean_link)zhomepagezdownload)rÓ   rÔ   rÕ   rÖ   r×   rØ   rÚ   r)  r*  ÚSr+  r1   rì   ÚclassmethodrÒ   Ústaticmethodrÿ   r÷   Úpropertyr  r  r4   r¦   r"  r#  r1  r   r   r   r   r   rÑ   Z  s(   [
rÑ   c               @   sr  e  Z d  Z d d d d d d „ Z d d „  Z d d „  Z d	 d
 „  Z d d „  Z d d „  Z d d „  Z	 d d „  Z
 d d „  Z d d „  Z e d d „  ƒ Z e d d „  ƒ Z e d d „  ƒ Z d d „  Z e d d  „  ƒ Z e d! d" „  ƒ Z e j d# ƒ Z e d$ d% „  ƒ Z e j d& ƒ Z e d' d( „  ƒ Z e d) d* „  ƒ Z e d+ d, „  ƒ Z e d- d. „  ƒ Z d S)/ri   NFc             C   s1   | |  _  | |  _ | |  _ | |  _ | |  _ d  S)N)r;   rº   rˆ   rg   rŠ   )r0   r;   rº   rˆ   rg   rŠ   r   r   r   r1   A  s
    				zLink.__init__c             C   s.   |  j  r d |  j |  j  f St |  j ƒ Sd  S)Nz%s (from %s))rº   r;   rv   )r0   r   r   r   rì   I  s    	zLink.__str__c             C   s   d |  S)Nz	<Link %s>r   )r0   r   r   r   Ú__repr__O  s    zLink.__repr__c             C   s   |  j  | j  k S)N)r;   )r0   Úotherr   r   r   Ú__eq__R  s    zLink.__eq__c             C   s   |  j  | j  k S)N)r;   )r0   r8  r   r   r   Ú__ne__U  s    zLink.__ne__c             C   s   |  j  | j  k  S)N)r;   )r0   r8  r   r   r   Ú__lt__X  s    zLink.__lt__c             C   s   |  j  | j  k S)N)r;   )r0   r8  r   r   r   Ú__le__[  s    zLink.__le__c             C   s   |  j  | j  k S)N)r;   )r0   r8  r   r   r   Ú__gt__^  s    zLink.__gt__c             C   s   |  j  | j  k S)N)r;   )r0   r8  r   r   r   Ú__ge__a  s    zLink.__ge__c             C   s   t  |  j ƒ S)N)Úhashr;   )r0   r   r   r   Ú__hash__d  s    zLink.__hash__c             C   s\   t  j |  j ƒ \ } } } } } t j | j d ƒ ƒ p< | } | sX t d |  j ƒ ‚ | S)Nra   zURL %r produced no filename)r   r  r;   rb   rž   rŸ   ÚAssertionError)r0   rW   ry   r:   r|   r   r   r   rQ   g  s    !zLink.filenamec             C   s   t  j |  j ƒ d S)Nr   )r   r  r;   )r0   r   r   r   rw   n  s    zLink.schemec             C   s   t  j |  j ƒ d S)Nrj   )r   r  r;   )r0   r   r   r   r:   r  s    z	Link.pathc             C   s   t  t j |  j j d ƒ ƒ ƒ S)Nra   )r   rb   rž   r:   rŸ   )r0   r   r   r   r   v  s    zLink.splitextc             C   s   |  j  ƒ  d S)NrM   )r   )r0   r   r   r   rP   y  s    zLink.extc             C   s=   t  j |  j ƒ \ } } } } } t  j | | | | d  f ƒ S)N)r   r  r;   Ú
urlunsplit)r0   rw   ry   r:   r  r	  r   r   r   Úurl_without_fragment}  s    !zLink.url_without_fragmentz#egg=([^&]*)c             C   s,   |  j  j |  j ƒ } | s d  S| j d ƒ S)NrM   )rÙ   rÃ   r;   rÅ   )r0   rË   r   r   r   rª   „  s    zLink.egg_fragmentz2(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)c             C   s,   |  j  j |  j ƒ } | r( | j d ƒ Sd  S)Nrj   )Ú_hash_rerÃ   r;   rÅ   )r0   rË   r   r   r   r?  �  s    z	Link.hashc             C   s,   |  j  j |  j ƒ } | r( | j d ƒ Sd  S)NrM   )rD  rÃ   r;   rÅ   )r0   rË   r   r   r   Ú	hash_name”  s    zLink.hash_namec             C   s0   t  j |  j j d d ƒ d j d d ƒ d ƒ S)Nrí   rM   r   ú?)rb   rž   r;   ró   )r0   r   r   r   Úshow_url›  s    zLink.show_urlc             C   sº   |  j  p t |  j d d ƒ } | d k	 r¦ | r¦ y% t |  j d d ƒ } t | ƒ } Wn t t f k
 ru d } Yn X| d k sŽ | d k r’ d S|  j rŸ d Sd Sn | d k	 r¶ d Sd S)zˆ
        Returns True if this link can be verified after download, False if it
        cannot, and None if we cannot determine.
        rg   Nr  rM   TF)rg   rÀ   rº   r  r  r  r?  )r0   rg   r  r   r   r   r‰   Ÿ  s    	zLink.verifiable)rÓ   rÔ   rÕ   r1   rì   r7  r9  r:  r;  r<  r=  r>  r@  r6  rQ   rw   r:   r   rP   rC  r×   rØ   rÙ   rª   rD  r?  rE  rG  r‰   r   r   r   r   ri   ?  s0   	ri   c             C   s;   t  |  ƒ } | j } | s1 t | j ƒ d } n  t | ƒ S)zPGet a requirement from the URL, if possible.  This looks for #egg
    in the URLr   )ri   rª   r   rQ   Úpackage_to_requirement)r;   rV   rÊ   r   r   r   Úget_requirement_from_urlÈ  s
    	rI  c             C   sa   t  j d |  ƒ } | r9 | j d ƒ } | j d ƒ } n |  } d } | rY d | | f S| Sd S)z)Translate a name like Foo-1.2 to Foo==1.3z^(.*?)-(dev|\d.*)rM   rj   rn   z%s==%sN)r×   rÃ   rÅ   )Úpackage_namerË   r|   rl   r   r   r   rH  Ò  s    rH  )1rÖ   rÆ   r?   r×   r7   rb   Úpip.logr   Úpip.utilr   r   r   r   Úpip.exceptionsr   r   r	   r
   r   Zpip.backwardcompatr   r   Úpip.downloadr   r   r   Ú	pip.wheelr   r   Zpip.pep425tagsr   r   r   ré   rû   rÇ   Zrequests.exceptionsr   Ú__all__ÚDEFAULT_MIRROR_HOSTNAMErx   Úobjectr   r"   rÑ   ri   rO   rI  rH  r   r   r   r   Ú<module>   s6   "($	ÿ ÿ å†
