U âQab�žã@s¢dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddlmZmZmZmZddlZddlmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!ddlm"Z"ddl#m$Z$dd l%m&Z&dd l'm(Z(dd l)m*Z*dd l+m,Z,dd l-m.Z.e/Z0e 1d¡Z2e 1dej3¡Z4e 1d¡Z5e 1dej3¡j6Z7d 8¡Z9ddddgZ:dZ;dZŽed�Z?dd„Z@dd„ZAdd„ZBdGd d„ZCdHd!d"„ZDdId#d$„ZEdedfd%d„ZFdJd&d'„ZGd(d)„ZHe 1d*ej3¡ZIeHd+d,„ƒZJGd-d.„d.ƒZKGd/d0„d0eKƒZLGd1d„deƒZMe 1d2¡jNZOd3d4„ZPd5d6„ZQdKd7d8„ZRd9d:„ZSGd;d<„d<ƒZTGd=d>„d>ejUƒZVejWjXfd?d@„ZYdAdB„ZZeRe;ƒeYƒZYdCdD„Z[dEdF„Z\dS)Lz#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_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)zƒ([^<]+)\n\s+\(md5\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgzÚ PackageIndexÚdistros_for_urlÚparse_bdist_wininstÚinterpret_distro_nameézrP)ÚfilenamerGr&r&r'Údistros_for_filename�s  ÿrTc cs|| d¡}|s,tdd„|dd…Dƒƒr,dStdt|ƒdƒD]8}t||d |d|…¡d ||d…¡|||d�Vq>dS)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! rJcss|]}t d|¡VqdS)z py\d\.\d$N)ÚrerE)Ú.0Úpr&r&r'Ú ­sz(interpret_distro_name..éNr6)Ú py_versionrBrQ)r9ÚanyÚrangerOr Újoin)rKrPrGrZrBrQr;rWr&r&r'r –s ýccsftƒ}|j}|dkr:tj |j|¡D]}||ƒ|Vq$n(|D]"}||ƒ}||kr>||ƒ|Vq>dS)zHList unique elements, preserving order. Remember all elements ever seen.N)ÚsetÚaddrZmovesÚ filterfalseÚ __contains__)ÚiterableÚkeyÚseenZseen_addZelementÚkr&r&r'Úunique_everseenºs rfcstˆƒ‡fdd„ƒ}|S)zs Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. cstˆ||ŽƒS©N)rf)ÚargsÚkwargs©Úfuncr&r'ÚwrapperÒszunique_values..wrapperr)rkrlr&rjr'Ú unique_valuesÌsrmz(<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>c csºt |¡D]d}| ¡\}}tttj| ¡ d¡ƒƒ}d|ksDd|kr t  |¡D]}t j   |t | d¡ƒ¡VqNq dD]@}| |¡}|dkrtt  ||¡}|rtt j   |t | d¡ƒ¡VqtdS)zEFind rel="homepage" and rel="download" links in `page`, yielding URLsú,Zhomepager3r6)z Home PagezDownload URLr2N)ÚRELÚfinditerÚgroupsr^rÚstrÚstripr+r9ÚHREFrr#ÚurljoinÚ htmldecoderFÚfindÚsearch)r:ÚpagerEÚtagZrelZrelsÚposr&r&r'Úfind_external_linksÝs   r|c@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚContentCheckerzP A null content checker that defines the interface for checking content cCsdS)z3 Feed a block of data to the hash. Nr&©ÚselfÚblockr&r&r'ÚfeedõszContentChecker.feedcCsdS)zC Check the hash. Return False if validation fails. Tr&©rr&r&r'Úis_validûszContentChecker.is_validcCsdS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr&)rÚreporterÚtemplater&r&r'ÚreportszContentChecker.reportN)Ú__name__Ú __module__Ú __qualname__Ú__doc__r�rƒr†r&r&r&r'r}ðsr}c@sBeZdZe d¡Zdd„Zedd„ƒZdd„Z dd „Z d d „Z d S) Ú HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cCs||_t |¡|_||_dSrg)Ú hash_nameÚhashlibÚnewÚhashÚexpected)rrŒr�r&r&r'Ú__init__s zHashChecker.__init__cCs>tj |¡d}|stƒS|j |¡}|s0tƒS|f| ¡ŽS)z5Construct a (possibly null) ContentChecker from a URLr2)rr#r7r}ÚpatternrxÚ groupdict)Úclsr:r@rEr&r&r'Úfrom_urls zHashChecker.from_urlcCs|j |¡dSrg)r�Úupdater~r&r&r'r�szHashChecker.feedcCs|j ¡|jkSrg)r�Z hexdigestr�r‚r&r&r'rƒ"szHashChecker.is_validcCs||j}||ƒSrg)rŒ)rr„r…Úmsgr&r&r'r†%s zHashChecker.reportN) r‡rˆr‰rUÚcompiler’r‘Ú classmethodr•r�rƒr†r&r&r&r'r‹ sÿ r‹cs<eZdZdZdJdd„ZdKd d „ZdLd d „ZdMd d„Zdd„Zdd„Z dd„Z dd„Z dNdd„Z dd„Z dO‡fdd„ Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„ZdPd'd(„ZdQd)d*„Zd+d,„Zd-Zd.d/„Zd0d1„ZdRd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„Zdd?„ƒZ!d@dA„Z"dBdC„Z#dDdE„Z$dFdG„Z%dHdI„Z&‡Z'S)Trz;A distribution index that scans web pages for download URLsúhttps://pypi.org/simple/©Ú*NTcOs”tj|f|ž|Ž|dd| d¡ …|_i|_i|_i|_t d  t t |ƒ¡¡j |_ g|_|ortjor|prt ¡}|r†t |¡|_n tjj|_dS)Nr1ú|)rr‘r,Ú index_urlÚ scanned_urlsÚ fetched_urlsÚ package_pagesrUr˜r]rrrEÚallowsÚto_scanrZ is_availableZfind_ca_bundleZ opener_forÚopenerrÚrequestÚurlopen)rržZhostsZ ca_bundleZ verify_sslrhÚkwZuse_sslr&r&r'r‘-sÿ ýzPackageIndex.__init__Fc Csº||jkr|sdSd|j|<t|ƒs2| |¡dStt|ƒƒ}|r\| |¡sPdS| d|¡|sn|rn||jkr‚tt|j |ƒƒdS| |¡sšd|j|<dS|  d|¡d|j|<d}|  |||¡}|dkrÐdSd|j|j <d|j  dd¡ ¡k�r| ¡dS|j }| ¡}t|tƒ�sNt|tjjƒ�r0d }n|j  d ¡�p@d }| |d ¡}| ¡t |¡D](} tj |t|  d ¡ƒ¡} | | ¡�q`|  |j!¡�r¶t"|d dƒdk�r¶| #||¡}dS)zÚexistsÚwarnÚisdirÚrealpathÚlistdirr°r]rTr³r±rr_)rÚfnÚnestedr>ÚitemrÁr&r&r'r°us    zPackageIndex.process_filenamecCsbt|ƒ}|o| d¡ ¡dk}|s8| tj |¡d¡rÚentryr&r&r'rX”s   ýz.PackageIndex.scan_egg_links..)ÚfilterrRr>rÇr±Ú itertoolsÚstarmapÚ scan_egg_link)rZ search_pathÚdirsZ egg_linksr&r&r'Úscan_egg_links’s þzPackageIndex.scan_egg_linksc CsŒttj ||¡ƒ�}ttdttj|ƒƒƒ}W5QRXt |ƒdkrDdS|\}}t tj ||¡ƒD](}tjj|f|žŽ|_ t |_ | |¡q^dS)NrY)ÚopenrRr>r]r±rÑrrrrsrOrrKr rBr_)rr>rÐZ raw_linesÚlinesZegg_pathZ setup_pathrHr&r&r'rÔœs  zPackageIndex.scan_egg_linkc s·fdd„}t |¡D]:}z |tj |t| d¡ƒ¡ƒWqtk rNYqXq||ƒ\}}|rÆt||ƒD]H}t |ƒ\}} |  d¡rª| sª|r |d||f7}n ˆ  |¡ˆ  |¡qlt  dd„|¡SdSd S) z#Process the contents of a PyPI pagecsŒ| ˆj¡rˆtttjj|tˆjƒd… d¡ƒƒ}t|ƒdkrˆd|dkrˆt |dƒ}t |dƒ}dˆj   |  ¡i¡|<t|ƒt|ƒfSdS)Nr1rYr5r6rT)NN)r-ržr±rrr#r8rOr9rrr¡Ú setdefaultr+r)rÄr;ÚpkgÚverr‚r&r'Úscan¯s ÿ  z(PackageIndex.process_index..scanr6ú.pyz #egg=%s-%scSsd| ddd¡S)Nz%sr6érY)rF)Úmr&r&r'ÚÒóz,PackageIndex.process_index..rªN)rtrprr#rurvrFr$r|rAr,Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub) rr:ryrÜrErÚrÛÚnew_urlr/Úfragr&r‚r'rÀ¬s(      ÿzPackageIndex.process_indexcCs| d|¡dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)Úscan_all©rr:r&r&r'râ×sþzPackageIndex.need_version_infocGs:|j|jkr*|r |j|f|žŽ| d¡| |j¡dS)Nz6Scanning index of all packages (this may take a while))ržr rÆr´rã©rr—rhr&r&r'rèÝs ÿzPackageIndex.scan_allcCsz| |j|jd¡|j |j¡s:| |j|jd¡|j |j¡sR| |¡t|j |jd¡ƒD]}| |¡qfdS)Nr1r&) rãržÚ unsafe_namer¡r·rcrLÚnot_found_in_indexr±)rÚ requirementr:r&r&r'Ú find_packagesæs zPackageIndex.find_packagescsR| ¡| |¡||jD]"}||kr0|S| d||¡qtt|ƒ ||¡S)Nz%s does not match %s)Úprescanrîrcr³ÚsuperrÚobtain)rríZ installerrH©Ú __class__r&r'rñõs zPackageIndex.obtaincCsL| |jd|¡| ¡sH| ¡t |¡td|jjtj   |¡fƒ‚dS)z- checker is a ContentChecker zValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?N) r†r³rƒr¸rRÚunlinkrr�r.r>rP)rÚcheckerrSÚtfpr&r&r'Ú check_hashþsþ þÿzPackageIndex.check_hashcCsN|D]D}|jdks0t|ƒr0| d¡s0tt|ƒƒr<| |¡q|j |¡qdS)z;Add `urls` to the list that will be prescanned for searchesNúfile:)r£r¯r-r±rrãÚappend)rZurlsr:r&r&r'Úadd_find_linkssÿþý ü zPackageIndex.add_find_linkscCs"|jrtt|j|jƒƒd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)r£r±rrãr‚r&r&r'rïszPackageIndex.prescancCs<||jr|jd}}n |jd}}|||jƒ| ¡dS)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))rcr´rÆrërè)rríZmethr—r&r&r'rì#s þ zPackageIndex.not_found_in_indexcCs~t|tƒsjt|ƒ}|rR| | d¡||¡}t|ƒ\}}| d¡rN| |||¡}|Stj   |¡rb|St |ƒ}t |  ||¡ddƒS)aLocate 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. r6rÝrKN)rºrr¯Ú _download_urlrFrAr,Ú gen_setuprRr>rÅr(r¿Úfetch_distribution)rr%Útmpdirr<Úfoundr/r@r&r&r'r3-s    zPackageIndex.downloadc s܈ d|¡i‰d}d ‡‡‡‡‡fdd„ }|rHˆ ¡ˆ |¡||ƒ}|s^|dk r^|||ƒ}|dkr€ˆjdk rxˆ ¡||ƒ}|dkrž|sžˆ |¡||ƒ}|dkr¾ˆ dˆr´dp¶d|¡nˆ d|¡|j|jd �SdS) 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. zSearching for %sNcs’|dkr ˆ}||jD]v}|jtkrFˆsF|ˆkrˆ d|¡dˆ|<q||ko\|jtkp\ˆ }|rˆ |jˆ¡}||_tj   |j¡r|SqdS)Nz&Skipping development or system egg: %sr6) rcrBrrÆr r3rKÚdownload_locationrRr>rÅ)ZreqÚenvrHZtestZloc©Ú develop_okrZskippedÚsourcerþr&r'rwgs&ÿþz-PackageIndex.fetch_distribution..findz:No local packages or working download links found for %s%sza source distribution of rªzBest match: %s)rK)N)r´rïrîr£rÆZcloner) rrírþÚ force_scanrrZ local_indexrHrwr&rr'rýOs2        ý zPackageIndex.fetch_distributioncCs"| ||||¡}|dk r|jSdS)a3Obtain 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ýrK)rrírþrrrHr&r&r'Úfetch›szPackageIndex.fetchc Csüt |¡}|r*dd„t|| d¡dƒDƒp,g}t|ƒdkrÚtj |¡}tj |¡|krŠtj  ||¡}ddl m }|||ƒsŠt   ||¡|}ttj  |d¡dƒ�2} |  d|dj|djtj |¡df¡W5QRX|S|rðtd ||fƒ‚ntd ƒ‚dS) NcSsg|]}|jr|‘qSr&)rM)rVÚdr&r&r'Ú ªsÿz*PackageIndex.gen_setup..r6r)Úsamefilezsetup.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.)rDrEr rFrOrRr>rPÚdirnamer]Zsetuptools.command.easy_installr ÚshutilZcopy2r×ÚwriterLrMÚsplitextr) rrSr@rþrErÁrPZdstr rÍr&r&r'rü¨sB  þý     þþÿþÿÿzPackageIndex.gen_setupi c Cs| d|¡d}zît |¡}| |¡}t|tjjƒrJt d||j |j fƒ‚| ¡}d}|j }d}d|kr’t |dƒ} ttt| ƒƒ}| |||||¡t|dƒ�V} | |¡} | rà| | ¡|  | ¡|d7}| |||||¡qžqàqž| ||| ¡W5QRX|W¢S|�r| ¡XdS) NzDownloading %szCan't download %s: %s %srr2zcontent-lengthzContent-LengthÚwbr6)r´r¸r‹r•rµrºrr»r¼rr­r—Ú dl_blocksizerÚmaxrÚintÚ reporthookr×r¹r�r r÷) rr:rSÚfprõr¶ÚblocknumZbsÚsizeZsizesrör€r&r&r'Ú _download_toÓs:   ÿ     zPackageIndex._download_tocCsdSrgr&)rr:rSrZblksizerr&r&r'r÷szPackageIndex.reporthookc Csš| d¡rt|ƒSzt||jƒWSttjfk r‚}z.z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r-Ú local_openÚopen_with_authr¤r$rÚ InvalidURLr]rhrÆrrr»r¼ZURLErrorÚreasonZ BadStatusLineÚlineZ HTTPExceptionÚsocket)rr:ZwarningÚvr—r&r&r'rµús> "ÿþÿÿzPackageIndex.open_urlcCsæt|ƒ\}}|r0d|kr4| dd¡ dd¡}qnd}| d¡rJ|dd…}tj ||¡}|dksj| d ¡rv| ||¡S|d ksˆ| d ¡r”| ||¡S| d ¡rª|  ||¡S|d krÊt j   t j  |¡d¡S| |d¡| ||¡SdS)Nz..Ú.ú\Ú_Z__downloaded__rIr*Zsvnzsvn+Zgitzgit+zhg+rÍrYT)rAÚreplacer,rRr>r]r-Ú _download_svnÚ _download_gitÚ _download_hgrr¥Ú url2pathnamer#r7r²Ú_attempt_download)rr<r:rþr.r@rSr&r&r'rûs$        zPackageIndex._download_urlcCs| |d¡dS)NT)r¾rér&r&r'rã:szPackageIndex.scan_urlcCs6| ||¡}d| dd¡ ¡kr.| |||¡S|SdS)Nr¨r©rª)rr·r+Ú_download_html)rr:rSr¶r&r&r'r)=s zPackageIndex._attempt_downloadcCsnt|ƒ}|D]>}| ¡r t d|¡rF| ¡t |¡| ||¡SqLq | ¡t |¡td|ƒ‚dS)Nz ([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) r×���rs���rU���rx���r¸���rR���rô���r%��r���)r���r:���r¶���rS���rÍ���r��r&���r&���r'���r*��D��s����   zPackageIndex._download_htmlc�����������������C���s��t� dt¡�| dd¡d�}d}| ¡� d¡râd|krâtj |¡\}}}}}} |sâ| d¡râd |d d�…�krâ|d d�…� d d¡\}}t |ƒ\} } | râd | krº|  d d¡\} } d | | f�}nd | �}| }|||||| f}tj  |¡}|�  d||¡�t   d|||f�¡�|S�)Nz"SVN download support is deprecatedr5���r6���r���rª���zsvn:ú@z//r1���rY���ú:z --username=%s --password=%sz --username=z'Doing subversion checkout from %s to %szsvn checkout%s -q %s %s)ÚwarningsrÆ���Ú UserWarningr9���r+���r-���r���r#���r7���Ú _splituserÚ urlunparser´���rR���Úsystem)r���r:���rS���Zcredsr<���Únetlocr>���rW���ÚqrÃ���ÚauthÚhostÚuserZpwr;���r&���r&���r'���r%��S��s&����   zPackageIndex._download_svnc�����������������C���sp���t�j |�¡\}}}}}| dd¡d�}| dd¡d�}d�}d|krR| dd¡\}}t�j ||||df¡}�|�|fS�)Nú+r6���r2���r5���r���r+��rª���)r���r#���Zurlsplitr9���ÚrsplitZ urlunsplit)r:���Ú pop_prefixr<���r2��r>���r?���rç���Úrevr&���r&���r'���Ú_vcs_split_rev_from_urli��s����z$PackageIndex._vcs_split_rev_from_urlc�����������������C���sl���| �dd¡d�}|�j|dd�\}}|� d||¡�t d||f�¡�|d�k rh|� d|¡�t d ||f�¡�|S�) Nr5���r6���r���T©r9��zDoing git clone from %s to %szgit clone --quiet %s %szChecking out %szgit -C %s checkout --quiet %s©r9���r;��r´���rR���r1��©r���r:���rS���r:��r&���r&���r'���r&��{��s���� þzPackageIndex._download_gitc�����������������C���sl���| �dd¡d�}|�j|dd�\}}|� d||¡�t d||f�¡�|d�k rh|� d|¡�t d ||f�¡�|S�) Nr5���r6���r���Tr<��zDoing hg clone from %s to %szhg clone --quiet %s %szUpdating to %szhg --cwd %s up -C -r %s -qr=��r>��r&���r&���r'���r'��‹��s���� þzPackageIndex._download_hgc�����������������G���s���t�j|f|žŽ��d�S�rg���)r���r³���rê���r&���r&���r'���r³���›��s����zPackageIndex.debugc�����������������G���s���t�j|f|žŽ��d�S�rg���)r���r´���rê���r&���r&���r'���r´���ž��s����zPackageIndex.infoc�����������������G���s���t�j|f|žŽ��d�S�rg���)r���rÆ���rê���r&���r&���r'���rÆ���¡��s����zPackageIndex.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ì���r3���rý���r��rü���r��r��r��rµ���rû���rã���r)��r*��r%��Ú staticmethodr;��r&��r'��r³���r´���rÆ���Ú __classcell__r&���r&���rò���r'���r���*��sX���������þ  3   +   #������þ L )$ # z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c�����������������C���s���|� �d¡}t|ƒS�)Nr���)rF���r���)rE���Zwhatr&���r&���r'���Ú decode_entityª��s���� rA��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&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_subrA��)Útextr&���r&���r'���rv���¯��s���� rv���c��������������������s���‡�fdd„}|S�)Nc��������������������s���‡�‡fdd„}|S�)Nc��������������� ������s2���t� ¡�}t� ˆ¡�zˆ�|�|ŽW�¢S�t� |¡�X�d�S�rg���)r��ZgetdefaulttimeoutZsetdefaulttimeout)rh���ri���Z old_timeout)rk���Útimeoutr&���r'���Ú_socket_timeout½��s ���� z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr&���)rk���rE��©rD��rj���r'���rE��¼��s����z'socket_timeout.<locals>._socket_timeoutr&���)rD��rE��r&���rF��r'���Úsocket_timeout»��s���� rG��c�����������������C���s2���t�j |�¡}| ¡�}t |¡}| ¡�}| dd¡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#���r8���ÚencodeÚbase64Z b64encoder½���r$��)r4��Zauth_sZ auth_bytesZ encoded_bytesZencodedr&���r&���r'���Ú _encode_authÊ��s ����  rK��c�������������������@���s(���e�Zd�ZdZdd„�Zdd„�Zdd„�ZdS�) Ú Credentialz: A username/password pair. Use like a namedtuple. c�����������������C���s���||�_�||�_d�S�rg���©ÚusernameÚpassword)r���rN��rO��r&���r&���r'���r‘���å��s����zCredential.__init__c�����������������c���s���|�j�V��|�jV��d�S�rg���rM��r‚���r&���r&���r'���Ú__iter__é��s����zCredential.__iter__c�����������������C���s ���dt�|�ƒ�S�)Nz%(username)s:%(password)s)Úvarsr‚���r&���r&���r'���Ú__str__í��s����zCredential.__str__N)r‡���rˆ���r‰���rŠ���r‘���rP��rR��r&���r&���r&���r'���rL��à��s���rL��c�������������������@���s0���e�Zd�Zdd„�Zedd„�ƒZdd„�Zdd„�Zd S�) Ú PyPIConfigc�����������������C���sP���t� dddgd¡}tj |�|¡�tj tj d¡d¡}tj  |¡rL|�  |¡�dS�)z% Load from ~/.pypirc rN��rO��Ú repositoryrª���ú~z.pypircN) ÚdictÚfromkeysr���ÚRawConfigParserr‘���rR���r>���r]���Ú expanduserrÅ���r¹���)r���ÚdefaultsZrcr&���r&���r'���r‘���ò��s ���� zPyPIConfig.__init__c��������������������s&���‡�fdd„ˆ� �¡�D�ƒ}ttˆ�j|ƒƒS�)Nc��������������������s ���g�|�]}ˆ� �|d�¡ ¡�r|‘qS�)rT��)r·���rs���)rV���Úsectionr‚���r&���r'���r��ÿ��s���ÿz2PyPIConfig.creds_by_repository.<locals>.<listcomp>)ZsectionsrV��r���Ú_get_repo_cred)r���Zsections_with_repositoriesr&���r‚���r'���Úcreds_by_repositoryý��s���� ÿzPyPIConfig.creds_by_repositoryc�����������������C���s6���|� �|d¡ ¡�}|t|� �|d¡ ¡�|� �|d¡ ¡�ƒfS�)NrT��rN��rO��)r·���rs���rL��)r���r[��Zrepor&���r&���r'���r\����s ����þzPyPIConfig._get_repo_credc�����������������C���s*���|�j� ¡�D�]\}}| |¡r |��S�q dS�)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:���rT��Úcredr&���r&���r'���Úfind_credential ��s���� zPyPIConfig.find_credentialN)r‡���rˆ���r‰���r‘���Úpropertyr]��r\��r`��r&���r&���r&���r'���rS��ñ��s ���  rS��c�����������������C���s:��t�j |�¡}|\}}}}}}| d¡r0t d¡‚|dkrFt|ƒ\} } nd} | s~tƒ� |�¡} | r~t | ƒ} | j |�f} t j d | žŽ��| rÄdt | ƒ�} || ||||f} t�j | ¡}t�j |¡}| d| ¡�n t�j |�¡}| dt¡�||ƒ}| �r6t�j |j¡\}}}}}}||k�r6|| k�r6||||||f} t�j | ¡|_|S�) z4Open a urllib2 request, handling HTTP authenticationr,��znonnumeric port: '')ZhttpZhttpsNú*Authenticating as %s for %s (from .pypirc)zBasic Z Authorizationz User-Agent)rb��)r���r#���r7���r,���r���r��r/��rS��r`��rr���rN��r���r´���rK��r0��r¥���ZRequestZ add_headerÚ user_agentr:���)r:���r¤���Zparsedr<���r2��r>���Zparamsr?���rç���r4��Zaddressr_��r´���r;���ræ���r¥���r��Ús2Zh2Zpath2Zparam2Zquery2Zfrag2r&���r&���r'���r����s8����          r��c�����������������C���s ���|� �d¡\}}}�|r|nd|�fS�)zJsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.r+��N)Ú rpartition)r5��r6��Zdelimr&���r&���r'���r/��F��s����r/��c�����������������C���s���|�S�rg���r&���)r:���r&���r&���r'���Ú fix_sf_urlP��s����rf��c�������������� ���C���s��t�j |�¡\}}}}}}t�j |¡}tj |¡r<t�j |�¡S�|  d¡rètj  |¡règ�}t  |¡D�]d} tj  || ¡} | dkržt | dƒ�} |  ¡�} W�5�Q�R�X��qÞntj  | ¡r²| d7�} | dj| d�¡�q`d} | j|�d  |¡d�} d \}}n d \}}} d d i}t | ¡}t�j |�||||¡S�) z7Read a local path, with special support for directoriesr1���z index.htmlÚrz<a href="{name}">{name}</a>)r.���zB<html><head><title>{url}{files}rH)r:Úfiles)éÈZOK)r®zPath not foundz Not foundr©z text/html)rr#r7r¥r(rRr>Úisfiler¦r,rÇrÉr]r×r¹rùÚformatrÚStringIOr»r¼)r:r<r=r>Zparamr?rçrSrhrÃÚfilepathrZbodyrÂZstatusÚmessager¶Z body_streamr&r&r'rTs.     ÿ   r)N)N)N)N)r!)]rŠÚsysrRrUr rrJr�rÒr-Ú functoolsrZsetuptools.externrZsetuptools.extern.six.movesrrrrr"Z pkg_resourcesr r r r r rrrrrrrrrZ distutilsrZdistutils.errorsrZfnmatchrZsetuptools.py27compatrZsetuptools.py33compatrZsetuptools.wheelrÚtypeZ __metaclass__r˜rDÚIrträrEr¯r9rNÚ__all__Z_SOCKET_TIMEOUTZ_tmplrkÚ version_inforcr(rrArrCrTr rfrmror|r}r‹rrårBrArvrGrKrLrXrSr¥r¦rr/rfrr&r&r&r'Ús�  <        ÿþ   ! þ $   !  &/