B ‘–ReΛã@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl ZddlZddlZddlZddlmZddlZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#ddl$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+dd l,m-Z-e .d ¡Z/e .d ej0¡Z1e .d ¡Z2e .d ej0¡j3Z4d 5¡Z6ddddgZ7dZ8dZ9e9j:dj:ej;ŽedZdd„Z?dAdd„Z@dBdd„ZAdCdd „ZBdedfd!d„ZCd"d#„ZDe .d$ej0¡ZEeDd%d&„ƒZFGd'd(„d(ƒZGGd)d*„d*eGƒZHGd+d„deƒZIe .d,¡jJZKd-d.„ZLd/d0„ZMdDd1d2„ZNd3d4„ZOGd5d6„d6ƒZPGd7d8„d8e jQƒZRejSjTfd9d:„ZUd;d<„ZVeNe8ƒeUƒZUd=d>„ZWd?d@„ZXdS)Ez#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)Úlog)ÚDistutilsError)Ú translate)ÚWheel)Úunique_everseenz^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ézz.exe) r%rÚ from_locationrÚ is_compatiblerGrHrrrrÚ EXTENSIONSÚlen)rFÚbasenamerCÚwheelZwin_baser)ÚplatformÚextrrr r?ps.     r?cCstt|ƒtj |¡|ƒS)zEYield possible egg or source distribution objects based on a filename)r?rÚosr9rM)ÚfilenamerCrrr Údistros_for_filename‘srSc cs€| d¡}|s,tdd„|dd…Dƒƒr,dSxNtdt|ƒdƒD]8}t||d |d|…¡d ||d…¡|||dVq@WdS)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! rEcss|]}t d|¡VqdS)z py\d\.\d$N)ÚrerA)Ú.0Úprrr ú ¯sz(interpret_distro_name..éNr0)Ú py_versionr>rO)r4ÚanyÚrangerLrÚjoin)rFrMrCrYr>rOr6rVrrr r˜s $cstˆƒ‡fdd„ƒ}|S)zs Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. cstˆ||ŽƒS)N)r)ÚargsÚkwargs)Úfuncrr ÚwrapperÁszunique_values..wrapper)r)r_r`r)r_r Ú unique_values»sraz(<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>c csÆxvt |¡D]h}| ¡\}}tttj| ¡ d¡ƒƒ}d|ksFd|kr x,t  |¡D]}t j   |t | d¡ƒ¡VqRWq WxHdD]@}| |¡}|dkr~t  ||¡}|r~t j   |t | d¡ƒ¡Vq~WdS)zEFind rel="homepage" and rel="download" links in `page`, yielding URLsú,Zhomepager-r0)z Home PagezDownload URLr,N)ÚRELÚfinditerÚgroupsÚsetÚmapÚstrÚstripr$r4ÚHREFr1rÚurljoinÚ htmldecoderBÚfindÚsearch)r5ÚpagerAÚtagÚrelZrelsÚposrrr Úfind_external_linksÌs "   rsc@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Úblockrrr ÚfeedäszContentChecker.feedcCsdS)zC Check the hash. Return False if validation fails. Tr)rurrr Úis_validêszContentChecker.is_validcCsdS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr)ruÚreporterÚtemplaterrr ÚreportðszContentChecker.reportN)Ú__name__Ú __module__Ú __qualname__Ú__doc__rwrxr{rrrr rtßsrtc@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 |¡|_||_dS)N)Ú hash_nameÚhashlibÚnewÚhashÚexpected)rurr…rrr Ú__init__þs zHashChecker.__init__cCs>tj |¡d}|stƒS|j |¡}|s0tƒS|f| ¡ŽS)z5Construct a (possibly null) ContentChecker from a URLr,)r1rr2rtÚpatternrnÚ groupdict)Úclsr5r<rArrr Úfrom_urls zHashChecker.from_urlcCs|j |¡dS)N)r„Úupdate)rurvrrr rwszHashChecker.feedcCs|j ¡|jkS)N)r„Ú hexdigestr…)rurrr rxszHashChecker.is_validcCs||j}||ƒS)N)r)ruryrzÚmsgrrr r{s zHashChecker.reportN) r|r}r~rTÚcompiler‡r†Ú classmethodrŠrwrxr{rrrr r€øs r€csDeZdZdZdLdd„ZdMd d „ZdNd d „ZdOd d„Zdd„Zdd„Z dd„Z dd„Z dd„Z dPdd„Z dd„ZdQ‡fdd„ Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„ZdRd)d*„ZdSd+d,„Zd-d.„Zd/Zd0d1„Zd2d3„ZdTd4d5„Zd6d7„Zd8d9„Zd:d;„Zdd?„Z e!dUd@dA„ƒZ"dBdC„Z#dDdE„Z$dFdG„Z%dHdI„Z&dJdK„Z'‡Z(S)Vrz;A distribution index that scans web pages for download URLsúhttps://pypi.org/simple/©Ú*NTcOsltj|f|ž|Ž|dd| d¡ …|_i|_i|_i|_t d  t t |ƒ¡¡j |_ g|_tjj|_dS)Nr+ú|)rr†r%Ú index_urlÚ scanned_urlsÚ fetched_urlsÚ package_pagesrTrŽr\rgrrAÚallowsÚto_scanr1ÚrequestÚurlopenÚopener)rur”ÚhostsZ ca_bundleZ verify_sslr]Úkwrrr r†szPackageIndex.__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ÐdSt |t jjƒrø|jdkrø|  d|j¡d|j|j<d|j d d ¡ ¡kr(| ¡dS|j}| ¡}t |tƒsvt |t jjƒrXd }n|j d ¡phd }| |d ¡}| ¡x6t |¡D](} t j |t|   d¡ƒ¡} | !| ¡qŠW| "|j#¡rât$|ddƒdkrâ| %||¡}dS)z.)ÚfilterrQr9r¿r¦Ú itertoolsÚstarmapÚ scan_egg_link)ruÚ search_pathÚdirsZ egg_linksrrr Úscan_egg_links|szPackageIndex.scan_egg_linksc Csttj ||¡ƒ}ttdttj|ƒƒƒ}WdQRXt |ƒdkrDdS|\}}x>t tj ||¡ƒD](}tjj|f|žŽ|_ t |_ | |¡q`WdS)NrX)ÚopenrQr9r\r¦rÊrgrhrirLr rFrr>r©)rur9rÉZ raw_linesÚlinesZegg_pathZ setup_pathrDrrr r͆s  zPackageIndex.scan_egg_linkcCs”d}| |j¡s|Stttjj|t|jƒd… d¡ƒƒ}t|ƒdksRd|dkrV|St |dƒ}t |dƒ}d|j   |  ¡i¡|<t|ƒt|ƒfS)N)NNr+rXr/r0rT)r&r”r¦rgr1rr3rLr4r r r—Ú setdefaultr$r )rur¼ZNO_MATCH_SENTINELr6ÚpkgÚverrrr Ú_scan–s "  zPackageIndex._scanc CsÊxJt |¡D]<}y"| tj |t| d¡ƒ¡¡Wq tk rFYq Xq W| |¡\}}|sbdSxVt ||ƒD]H}t |ƒ\}}|  d¡r¬|s¬|r¢|d||f7}n |  |¡|  |¡qnWt dd„|¡S)z#Process the contents of a PyPI pager0r z.pyz #egg=%s-%scSsd| ddd¡S)Nz%sr0érX)rB)Úmrrr ÚÂóz,PackageIndex.process_index..)rjrdrÖr1rrkrlrBrrsr=r%Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub) rur5rorArÔrÕÚnew_urlr(Úfragrrr 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)rur5rrr rÛÅszPackageIndex.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Ü)rurr]rrr ráËs  zPackageIndex.scan_allcCs~| |j|jd¡|j |j¡s:| |j|jd¡|j |j¡sR| |¡x&t|j |jd¡ƒD]}| |¡qhWdS)Nr+r) rÜr”Ú unsafe_namer—r°ÚkeyrGÚnot_found_in_indexr¦)ruÚ requirementr5rrr Ú find_packagesÔs zPackageIndex.find_packagescsR| ¡| |¡x,||jD]}||kr.|S| d||¡qWtt|ƒ ||¡S)Nz%s does not match %s)Úprescanrærãr¨ÚsuperrÚobtain)ruråÚ installerrD)Ú __class__rr 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¨rxr±rQÚunlinkrr„r'r9rM)ruÚcheckerrRÚtfprrr Ú check_hashìs  zPackageIndex.check_hashcCsRxL|D]D}|jdks2t|ƒr2| d¡s2tt|ƒƒr>| |¡q|j |¡qWdS)z;Add `urls` to the list that will be prescanned for searchesNzfile:)r™r¤r&r¦rrÜÚappend)ruÚurlsr5rrr Úadd_find_linksüs     zPackageIndex.add_find_linkscCs"|jrtt|j|jƒƒd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)r™r¦rgrÜ)rurrr 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?))rãrªr¾rârá)ruråÚmethrrrr 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. r0z.pyrFN)r¬r r¤Ú _download_urlrBr=r%Ú gen_setuprQr9r½r!r¶Úfetch_distribution)rurÚtmpdirr7Úfoundr(r<rrr r-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 ˆ}x€||jD]r}|jtkrHˆsH|ˆkrˆ d|¡dˆ|<q||ko^|jtkp^ˆ }|rˆ |jˆ¡}||_tj   |j¡r|SqWdS)Nz&Skipping development or system egg: %sr0) rãr>rr¾rr-rFÚdownload_locationrQr9r½)ÚreqÚenvrDÚtestÚloc)Ú develop_okruÚskippedÚsourcer÷rr rmUs z-PackageIndex.fetch_distribution..findz:No local packages or working download links found for %s%sza source distribution of r zBest match: %s)rF)N)rªrçrær™r¾Úclonerù) rurår÷Ú force_scanrrþZ local_indexrDrmr)rþrurÿrr÷r rö=s0         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örF)rurår÷rrrDrrr Ú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¡WdQRX|S|rðtd ||fƒ‚ntd ƒ‚dS) NcSsg|]}|jr|‘qSr)rH)rUÚdrrr ú ™sz*PackageIndex.gen_setup..r0r)Ú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.)r@rArrBrLrQr9rMÚdirnamer\Zsetuptools.command.easy_installrÚshutilÚcopy2rÑÚwriterGrHÚsplitextr) rurRr<r÷rAr¹rMÚdstrrÅrrr rõ–s2       zPackageIndex.gen_setupi c Cs| d|¡d}zît |¡}| |¡}t|tjjƒrJtd||j |j fƒ‚| ¡}d}|j }d}d|kr’|  d¡} t tt| ƒƒ}| |||||¡t|dƒZ} xD| |¡} | rÞ| | ¡|  | ¡|d7}| |||||¡q Pq W| ||| ¡WdQRX|S|r| ¡XdS) NzDownloading %szCan't download %s: %s %srr,zcontent-lengthzContent-LengthÚwbr0)rªr€rŠr«r¬r1r­r®rr£rÚ dl_blocksizeÚget_allÚmaxrgÚintÚ reporthookrÑr²rwr rïr±) rur5rRÚfprír¯ÚblocknumÚbsÚsizeÚsizesrîrvrrr Ú _download_toÁs:        zPackageIndex._download_tocCsdS)Nr)rur5rRrZblksizerrrr råszPackageIndex.reporthookc Csœ| d¡rt|ƒSy t||jƒSttjjfk r„}z>d dd„|j Dƒ¡}|r`|  ||¡nt d||fƒ|‚Wdd}~XYnt j jk r¨}z|Sd}~XYnðt j jk rô}z,|rÐ|  ||j¡nt d||jfƒ|‚Wdd}~XYn¤tjjk rD}z.|r |  ||j¡nt d||jfƒ|‚Wdd}~XYnTtjjtj fk r–}z*|rt|  ||¡nt d||fƒ|‚Wdd}~XYnXdS)Nzfile:ú cSsg|] }t|ƒ‘qSr)rh)rUÚargrrr rïsz)PackageIndex.open_url..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ÚhttpÚclientÚ InvalidURLr\r]r¾rr1r­r®ÚURLErrorÚreasonÚ BadStatusLineÚlineÚ HTTPExceptionÚsocket)rur5ÚwarningÚvrrrr r«és8  $  zPackageIndex.open_urlcCsêt|ƒ\}}|r4x&d|kr0| dd¡ dd¡}qWnd}| d¡rN|dd…}tj ||¡}|dksn| d ¡rz| ||¡S|d ksŒ| d ¡r˜| ||¡S| d ¡r®|  ||¡S|d krÎt j   t j  |¡d¡S| |d¡| ||¡SdS)Nz..Ú.ú\Ú_Z__downloaded__z.egg.zipr#Úsvnzsvn+Úgitzgit+zhg+rÅrXT)r=Úreplacer%rQr9r\r&Ú _download_svnÚ _download_gitÚ _download_hgr1ršÚ url2pathnamerr2r§Ú_attempt_download)rur7r5r÷r'r<rRrrr rô s$         zPackageIndex._download_urlcCs| |d¡dS)NT)rµ)rur5rrr rÜ)szPackageIndex.scan_urlcCs6| ||¡}d| dd¡ ¡kr.| |||¡S|SdS)NrŸz content-typer )rr°r$Ú_download_html)rur5rRr¯rrr r3,s zPackageIndex._attempt_downloadcCslt|ƒ}x@|D]8}| ¡rt d|¡rD| ¡t |¡| ||¡SPqW| ¡t |¡td|ƒ‚dS)Nz ([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) rÑ���ri���rT���rn���r±���rQ���rì���r/��r���)ru���r5���r¯���rR���rÅ���r$��r���r���r ���r4��3��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 deprecatedr/���r0���r���r ���zsvn:ú@z//r+���rX���ú:z --username=%s --password=%sz --username=z'Doing subversion checkout from %s to %szsvn checkout%s -q %s %s)Úwarningsr¾���Ú UserWarningr4���r$���r&���r1���r���r2���Ú _splituserÚ urlunparserª���rQ���Úsystem)ru���r5���rR���Úcredsr7���Únetlocr9���rV���Úqr»���ÚauthÚhostÚuserÚpwr6���r���r���r ���r/��B��s&����   zPackageIndex._download_svnc�������������C���sp���t�j |�¡\}}}}}| dd¡d�}| dd¡d�}d�}d|krR| dd¡\}}t�j ||||df¡}�|�|fS�)Nú+r0���r,���r/���r���r5��r ���)r1���r���Úurlsplitr4���ÚrsplitÚ urlunsplit)r5���Ú pop_prefixr7���r=��r9���r;���rà���Úrevr���r���r ���Ú_vcs_split_rev_from_urlX��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�) Nr/���r0���r���T)rG��zDoing git clone from %s to %szgit clone --quiet %s %szChecking out %szgit -C %s checkout --quiet %s)r4���rI��rª���rQ���r;��)ru���r5���rR���rH��r���r���r ���r0��j��s����  zPackageIndex._download_gitc�������������C���sl���| �dd¡d�}|�j|dd\}}|� d||¡�t d||f�¡�|d�k rh|� d|¡�t d ||f�¡�|S�) Nr/���r0���r���T)rG��zDoing hg clone from %s to %szhg clone --quiet %s %szUpdating to %szhg --cwd %s up -C -r %s -q)r4���rI��rª���rQ���r;��)ru���r5���rR���rH��r���r���r ���r1��z��s����  zPackageIndex._download_hgc�������������G���s���t�j|f|žŽ��d�S�)N)r���r¨���)ru���r���r]���r���r���r ���r¨���Š��s����zPackageIndex.debugc�������������G���s���t�j|f|žŽ��d�S�)N)r���rª���)ru���r���r]���r���r���r ���rª�����s����zPackageIndex.infoc�������������G���s���t�j|f|žŽ��d�S�)N)r���r¾���)ru���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ç���rä���r-���rö���r��rõ���r��r��r��r«���rô���rÜ���r3��r4��r/��Ú staticmethodrI��r0��r1��r¨���rª���r¾���Ú __classcell__r���r���)rë���r ���r�����sN���� 5      #� J )$ # z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c�������������C���s���|� �d¡}t |¡S�)Nr���)rB���rŸ���Úunescape)rA���Úwhatr���r���r ���Ú decode_entity™��s���� rN��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_subrN��)Útextr���r���r ���rl���ž��s���� rl���c����������������s���‡�fdd„}|S�)Nc����������������s���‡�‡fdd„}|S�)Nc����������� ������s.���t� ¡�}t� ˆ¡�z ˆ�|�|ŽS�t� |¡�X�d�S�)N)r&��ÚgetdefaulttimeoutÚsetdefaulttimeout)r]���r^���Z old_timeout)r_���Útimeoutr���r ���Ú_socket_timeout¬��s ����  z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr���)r_���rT��)rS��)r_���r ���rT��«��s����z'socket_timeout.<locals>._socket_timeoutr���)rS��rT��r���)rS��r ���Úsocket_timeoutª��s���� rU��c�������������C���s2���t�j |�¡}| ¡�}t |¡}| ¡�}| dd¡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Úbase64Ú b64encoder´���r.��)r?��Zauth_sZ auth_bytesZ encoded_bytesÚencodedr���r���r ���Ú _encode_auth¹��s ����  r[��c���������������@���s(���e�Zd�ZdZdd„�Zdd„�Zdd„�ZdS�) Ú Credentialz: A username/password pair. Use like a namedtuple. c�������������C���s���||�_�||�_d�S�)N)ÚusernameÚpassword)ru���r]��r^��r���r���r ���r†���Ó��s����zCredential.__init__c�������������c���s���|�j�V��|�jV��d�S�)N)r]��r^��)ru���r���r���r ���Ú__iter__×��s����zCredential.__iter__c�������������C���s ���dt�|�ƒ�S�)Nz%(username)s:%(password)s)Úvars)ru���r���r���r ���Ú__str__Û��s����zCredential.__str__N)r|���r}���r~���r���r†���r_��ra��r���r���r���r ���r\��Î��s���r\��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 r]��r^��Ú repositoryr ���ú~z.pypircN) ÚdictÚfromkeysÚ configparserÚRawConfigParserr†���rQ���r9���r\���Ú expanduserr½���r²���)ru���ÚdefaultsÚrcr���r���r ���r†���à��s ���� zPyPIConfig.__init__c����������������s&���‡�fdd„ˆ� �¡�D�ƒ}ttˆ�j|ƒƒS�)Nc����������������s ���g�|�]}ˆ� �|d�¡ ¡�r|‘qS�)rc��)r°���ri���)rU���Úsection)ru���r���r ���r��î��s����z2PyPIConfig.creds_by_repository.<locals>.<listcomp>)Úsectionsre��rg���Ú_get_repo_cred)ru���Zsections_with_repositoriesr���)ru���r ���Úcreds_by_repositoryë��s����zPyPIConfig.creds_by_repositoryc�������������C���s6���|� �|d¡ ¡�}|t|� �|d¡ ¡�|� �|d¡ ¡�ƒfS�)Nrc��r]��r^��)r°���ri���r\��)ru���rl��Úrepor���r���r ���rn��ô��s����zPyPIConfig._get_repo_credc�������������C���s*���x$|�j� ¡�D�]\}}| |¡r |S�q W�dS�)zŒ If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)ro��Úitemsr&���)ru���r5���rc��Úcredr���r���r ���Úfind_credentialû��s���� zPyPIConfig.find_credentialN)r|���r}���r~���r†���Úpropertyro��rn��rs��r���r���r���r ���rb��ß��s��� rb��c�������������C���s<��t�j |�¡}|\}}}}}}| d¡r2tj d¡‚|dkrHt|ƒ\} } nd} | s€tƒ�  |�¡} | r€t | ƒ} | j |�f} t j d | žŽ��| rÆdt| ƒ�} || ||||f} t�j | ¡}t�j |¡}| d| ¡�n t�j |�¡}| dt¡�||ƒ}| r8t�j |j¡\}}}}}}||kr8|| kr8||||||f} t�j | ¡|_|S�) z4Open a urllib2 request, handling HTTP authenticationr6��znonnumeric port: '')r��ÚhttpsNú*Authenticating as %s for %s (from .pypirc)zBasic Ú Authorizationz User-Agent)rv��)r1���r���r2���r%���r��r��r ��r9��rb��rs��rh���r]��r���rª���r[��r:��rš���ÚRequestÚ add_headerÚ user_agentr5���)r5���rœ���Úparsedr7���r=��r9���Úparamsr;���rà���r?��Úaddressrr��rª���r6���rß���rš���r��Ús2Úh2Úpath2Zparam2Zquery2Zfrag2r���r���r ���r����s8����          r��c�������������C���s ���|� �d¡\}}}�|r|nd|�fS�)zNsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.r5��N)Ú rpartition)r@��rA��Údelimr���r���r ���r9��4��s����r9��c�������������C���s���|�S�)Nr���)r5���r���r���r ���Ú fix_sf_url?��s����rƒ��c���������� ���C���s��t�j |�¡\}}}}}}t�j |¡}tj |¡r<t�j |�¡S�|  d¡rêtj  |¡rêg�}xˆt  |¡D�]b} tj  || ¡} | dkržt | dƒ} |  ¡�} W�dQ�R�X�P�ntj  | ¡r²| d7�} | dj| d¡�qbW�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}{files}rV)r5Úfiles)éÈÚOK)i”zPath not foundz Not foundz content-typez text/html)r1rr2ršr2rQr9Úisfiler›r%r¿rÁr\rÑr²rðÚformatÚioÚStringIOr­r®)r5r7r8r9Úparamr;ràrRr…r»ÚfilepathrÚbodyrºÚstatusÚmessager¯Z body_streamrrr rCs,        r)N)N)N)r)YrÚsysrQrTrŠr r&rXr‚rËr7rgrŸÚ http.clientrÚ urllib.parser1Úurllib.requestÚ urllib.errorÚ functoolsrrÚ pkg_resourcesrrrrrrr r r r r rrÚ distutilsrÚdistutils.errorsrÚfnmatchrZsetuptools.wheelrZ setuptools.extern.more_itertoolsrrŽr@ÚIrjrÝrAr¤r4rKÚ__all__Z_SOCKET_TIMEOUTZ_tmplr‰Ú version_inforzr!rr=rr?rSrrarcrsrtr€rrÞrOrNrlrUr[r\rhrbršr›rr9rƒrrrrr Ús† <         !  !  !  &/