Edit File: package_index.cpython-36.pyc
3 U('dӜ������������������@���s���d�Z�ddlZddlZddlZddlZddlZddlZddlZddlZddl m Z �ddlmZ�ddl mZmZmZmZ�ddlZddlmZmZmZmZmZmZmZmZmZmZmZmZm Z �ddlm!Z!�ddl"m#Z#�dd l$m%Z%�dd l&m'Z'�ddl(m)Z)�ddl*m+Z+�dd l,m-Z-�ej.d�Z/ej.dej0�Z1ej.d�Z2ej.dej0�j3Z4dj5��Z6ddddgZ7dZ8dZ9e9j:ej;dd��ed�Z<dd��Z=dd��Z>dd��Z?dEd d�Z@dFd!d"�ZAdGd#d$�ZBdedfd%d�ZCdHd&d'�ZDd(d)��ZEej.d*ej0�ZFeEd+d,���ZGG�d-d.��d.eH�ZIG�d/d0��d0eI�ZJG�d1d��de�ZKej.d2�jLZMd3d4��ZNd5d6��ZOdId7d8�ZPd9d:��ZQG�d;d<��d<eH�ZRG�d=d>��d>ejS�ZTejUjVfd?d@�ZWePe8�eW�ZWdAdB��ZXdCdD��ZYdS�)Jz#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�<a href="([^"#]+)">([^<]+)</a> \s+\(<a (?:title="MD5 hash" \s+)href="[^?]+\?:action=show_md5&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}����)Zpy_major� setuptoolsc�������������C���s2���y t�j|��S��tk r,���td|�f���Y�nX�d�S�)Nz1Not a URL, existing file, or requirement spec: %r)r����parse� ValueErrorr���)�spec��r&����#/usr/lib/python3.6/package_index.py�parse_requirement_arg2���s ���� r(���c�������������C���s����|�j���}d\}}}|jd�r�|jd�r8|�dd��}d}nn|jdd�rb|�dd��}|�dd��}d}nD|jd �r~|�dd��}d}n(|jd d�r�|�dd��}|�dd��}d}|||fS�)z=Return (base,pyversion) or (None,None) for possible .exe nameNz.exez .win32.exe� ���Zwin32z .win32-py������������z.win-amd64.exe����z win-amd64z .win-amd64-py����)NNNi����i�i�������i�i�i��i����r/���i��)�lower�endswith� startswith)�namer0����base�py_verZplatr&���r&���r'���r���;���s$���� c������� ������C���sx���t�jj|��}|\}}}}}}t�jj|jd�d��}|dkrX|dkrXt�jj|jd�d��}d|krp|jdd�\}}||fS�) N�/����zsourceforge.net�download�����#������)r���r#����urlparse�unquote�split) �url�parts�scheme�server�pathZ parameters�query�fragmentr4���r&���r&���r'����egg_info_for_urlS���s����rG���c�������������c���sd���t�|��\}}xt|�||�D�] }|V��qW�|r`tj|�}|r`x$t|�|jd�|td�D�] }|V��qRW�dS�)zEYield egg or source distribution objects that might be found at a URLr7���)� precedenceN)rG����distros_for_location�EGG_FRAGMENT�matchr����groupr���)r@����metadatar4���rF����distrK���r&���r&���r'���r���^���s���� c�������������C���s����|j�d�r|dd ��}|j�d�r8d|kr8tj|�||�gS�|j�d�rxd|krxt|�}|j��s^g�S�t|�|j|jtd�d�gS�|j�d �r�t|�\}}}|dk r�t |�|||t |�S�x4tD�],}|j�|�r�|dt|����}t |�||�S�q�W�g�S�)z:Yield egg or source distribution objects based on basenamez.egg.zipNr,���z.egg�-z.whlr7���)�location�project_name�versionrH���z.exer/���) r1���r ���Z from_locationr���Z is_compatiblerQ���rR���r���r���r���r ���� EXTENSIONS�len)rP����basenamerM���ZwheelZwin_baser5����platformZextr&���r&���r'���rI���l���s.���� rI���c�������������C���s���t�t|��tjj|��|�S�)zEYield possible egg or source distribution objects based on a filename)rI���r����osrD���rU���)�filenamerM���r&���r&���r'����distros_for_filename����s����rY���c���������� ���c���s����|j�d�}|�r.tdd��|dd��D���r.dS�xNtdt|�d��D�]8}t|�|dj|d|���dj||d���|||d�V��qBW�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! rO���c�������������s���s���|�]}t�jd�|�V��qdS�)z py\d\.\d$N)�rerK���)�.0�pr&���r&���r'���� <genexpr>����s����z(interpret_distro_name.<locals>.<genexpr>r9���Nr7���)� py_versionrH���rV���)r?����any�rangerT���r ����join)rP���rU���rM���r^���rH���rV���rA���r\���r&���r&���r'���r�������s���� $c�������������c���sn���t���}|j}|dkr>xTtjj|j|��D�]}||��|V��q&W�n,x*|�D�]"}||�}||krD||��|V��qDW�dS�)zHList unique elements, preserving order. Remember all elements ever seen.N)�set�addr���Zmoves�filterfalse�__contains__)�iterable�key�seenZseen_add�element�kr&���r&���r'����unique_everseen����s���� rk���c����������������s���t������fdd��}|S�)zs Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. c�����������������s���t���|�|��S�)N)rk���)�args�kwargs)�funcr&���r'����wrapper����s����zunique_values.<locals>.wrapper)r���)rn���ro���r&���)rn���r'���� unique_values����s����rp���z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c�������������c���s����xvt�j|�D�]h}|j��\}}tttj|j��jd���}d|ksFd|krx,t j|�D�]}t jj|�t |jd���V��qRW�qW�xHdD�]@}|j|�}|d kr~t j||�}|r~t jj|�t |jd���V��q~W�dS�) zEFind rel="homepage" and rel="download" links in `page`, yielding URLs�,Zhomepager8���r7���� <th>Home Page�<th>Download URLN)rr���rs���r;���)�REL�finditer�groupsrb���r����str�stripr0���r?����HREFr���r#����urljoin� htmldecoderL����find�search)r@����pagerK����tagZrelZrels�posr&���r&���r'����find_external_links����s����" r����c���������������@���s(���e�Zd�ZdZdd��Zdd��Zdd��ZdS�) �ContentCheckerzP A null content checker that defines the interface for checking content c�������������C���s���dS�)z3 Feed a block of data to the hash. Nr&���)�self�blockr&���r&���r'����feed����s����zContentChecker.feedc�������������C���s���dS�)zC Check the hash. Return False if validation fails. Tr&���)r����r&���r&���r'����is_valid����s����zContentChecker.is_validc�������������C���s���dS�)zu Call reporter with information about the checker (hash name) substituted into the template. Nr&���)r�����reporter�templater&���r&���r'����report����s����zContentChecker.reportN)�__name__� __module__�__qualname__�__doc__r����r����r����r&���r&���r&���r'���r��������s���r����c���������������@���sB���e�Zd�Zejd�Zdd��Zedd���Zdd��Z dd ��Z d d��ZdS�) �HashCheckerzK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)c�������������C���s���||�_�tj|�|�_||�_d�S�)N)� hash_name�hashlib�new�hash�expected)r����r����r����r&���r&���r'����__init__ ��s����zHashChecker.__init__c�������������C���s>���t�jj|�d�}|st��S�|�jj|�}|s0t��S�|�f�|j���S�)z5Construct a (possibly null) ContentChecker from a URLr7���r;���)r���r#���r=���r�����patternr}���� groupdict)�clsr@���rF���rK���r&���r&���r'����from_url��s����zHashChecker.from_urlc�������������C���s���|�j�j|��d�S�)N)r�����update)r����r����r&���r&���r'���r������s����zHashChecker.feedc�������������C���s���|�j�j��|�jkS�)N)r����Z hexdigestr����)r����r&���r&���r'���r���� ��s����zHashChecker.is_validc�������������C���s���||�j��}||�S�)N)r����)r����r����r�����msgr&���r&���r'���r����#��s���� zHashChecker.reportN)r����r����r����rZ����compiler����r�����classmethodr����r����r����r����r&���r&���r&���r'���r������s���r����c�������������������s<��e�Zd�ZdZdKdd�ZdLd d �ZdMdd�ZdNd d�Zdd��Zdd��Z dd��Z dd��ZdOdd�Zdd��Z dP��fdd� Zdd��Zdd ��Zd!d"��Zd#d$��Zd%d&��ZdQd'd(�ZdRd)d*�Zd+d,��Zd-Zd.d/��Zd0d1��ZdSd2d3�Zd4d5��Zd6d7��Zd8d9��Zd:d;��Zd<d=��Ze dTd>d?��Z!d@dA��Z"dBdC��Z#dDdE��Z$dFdG��Z%dHdI��Z&���Z'S�)Ur���z;A distribution index that scans web pages for download URLs�https://pypi.org/simple/�*NTc�������������O���s����t�j|�f|�|��|dd�|jd�����|�_i�|�_i�|�_i�|�_tjdj t t|���j|�_ g�|�_|ortjor|prtj��}|r�tj|�|�_n tjj|�_d�S�)Nr6����|)r ���r����r1���� index_url�scanned_urls�fetched_urls� package_pagesrZ���r����ra���r���r���rK����allows�to_scanr���Zis_availableZfind_ca_bundleZ opener_for�openerr����request�urlopen)r����r����ZhostsZ ca_bundleZ verify_sslrl����kwZuse_sslr&���r&���r'���r����+��s����zPackageIndex.__init__Fc�������������C���s���||�j�kr|�rdS�d|�j�|<�t|�s4|�j|��dS�tt|��}|r^|�j|�sRdS�|�jd|��|sr|�sr||�jkr�tt|�j |���dS�|�j|�s�d|�j|<�dS�|�j d|��d|�j|<�d}|�j|||��}|dkr�dS�d|�j|j<�d|j jdd�j��k�r|j���dS�|j}|j��}t|t��sRt|tjj��r4d }n|j jd ��pDd }|j|d�}|j���x6tj|�D�](} tjj|t| jd���} |�j| ���qfW�|j |�j!��r�t"|d d�dk�r�|�j#||�}dS�)z<Evaluate a URL as a possible download, and maybe retrieve itNTzFound link: %sz Reading %sz<Download error on %s: %%s -- Some packages may not be found!�htmlzcontent-type��zlatin-1�charset�ignorer7����codei���)$r����� URL_SCHEME�process_filename�listr����url_ok�debugr����r���rc����info�open_urlr@����headers�getr0����close�read� isinstancerw���r����error� HTTPErrorZ get_param�decodery���ru���r#���rz���r{���rL����process_urlr2���r�����getattr� process_index)r����r@���Zretrieve�dists�tmpl�fr4���r~���r����rK����linkr&���r&���r'���r����@��sP���� zPackageIndex.process_urlc�������������C���s����t�jj|�s|�jd|��d�S�t�jj|�rd|�rdt�jj|�}x(t�j|�D�]}|�jt�jj||�d��qFW�t |�}|r�|�j d|��tt|�j |���d�S�)Nz Not found: %sTz Found: %s)rW���rD����exists�warn�isdir�realpath�listdirr����ra���rY���r����r����r���rc���)r�����fn�nestedrD����itemr����r&���r&���r'���r����s��s����zPackageIndex.process_filenamec�������������C���sb���t�|�}|o|jd�j��dk}|s8|�jtjj|�d��r<dS�d}|rRt||���n|�j||��d�S�)Nr7����fileTzN Note: Bypassing %s (disallowed host; see http://bit.ly/2hrImnY for details). ) r����rL���r0���r����r���r#���r=���r���r����)r����r@���Zfatal�s�is_filer����r&���r&���r'���r�������s����zPackageIndex.url_okc�������������C���s2���t�tjj|�}dd��|D��}ttj|�j|���d�S�)Nc�������������s���s0���|�](}t�j|�D�]}|jd��r||fV��qqdS�)z .egg-linkN)rW���r����r1���)r[���rD����entryr&���r&���r'���r]������s���z.PackageIndex.scan_egg_links.<locals>.<genexpr>)�filterrW���rD���r����r����� itertools�starmap� scan_egg_link)r����Zsearch_path�dirsZ egg_linksr&���r&���r'����scan_egg_links���s����zPackageIndex.scan_egg_linksc���������� ���C���s����t�tjj||���}ttd�ttj|���}W�d�Q�R�X�t |�dkrDd�S�|\}}x>t tjj||��D�](}tjj|f|���|_t|_ |�j|��q`W�d�S�)Nr9���)�openrW���rD���ra���r����r����r���rw���rx���rT���r���rP���r���rH���rc���)r����rD���r����Z raw_lines�linesZegg_pathZ setup_pathrN���r&���r&���r'���r�������s���� zPackageIndex.scan_egg_linkc������� ��� ������s������fdd�}xHt�j|�D�]:}y |tjj|t|jd�����W�q�tk rP���Y�qX�qW�||�\}}|r�xXt||�D�]J}t |�\}} |j d�r�| �r�|r�|d||f�7�}n ��j|����j|��qrW�t jdd��|�S�dS�d S�) z#Process the contents of a PyPI pagec����������������s����|�j���j�r�tttjj|�t��j�d���jd���}t|�dkr�d|d�kr�t |d��}t |d��}d��jj|j ��i��|�<�t|�t|�fS�dS�)Nr6���r9���r:���r7���r���T)NN)r2���r����r����r���r���r#���r>���rT���r?���r���r���r����� setdefaultr0���r���)r����rA����pkg�ver)r����r&���r'����scan���s����"z(PackageIndex.process_index.<locals>.scanr7���z.pyz #egg=%s-%sc�������������S���s���d|�j�ddd��S�)Nz<a href="%s#md5=%s">%s</a>r7���r!���r9���)rL���)�mr&���r&���r'����<lambda>���s����z,PackageIndex.process_index.<locals>.<lambda>r����N)ry���ru���r���r#���rz���r{���rL���r$���r����rG���r1����need_version_info�scan_url�PYPI_MD5�sub) r����r@���r~���r����rK���r����r�����new_urlr4����fragr&���)r����r'���r�������s$���� zPackageIndex.process_indexc�������������C���s���|�j�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����zPackageIndex.need_version_infoc�������������G���s:���|�j�|�jkr*|r |�j|f|����|�jd��|�j|�j���d�S�)Nz6Scanning index of all packages (this may take a while))r����r����r����r����r����)r����r����rl���r&���r&���r'���r�������s����zPackageIndex.scan_allc�������������C���s~���|�j�|�j|j�d���|�jj|j�s:|�j�|�j|j�d���|�jj|j�sR|�j|��x&t|�jj|jf���D�]}|�j�|��qhW�d�S�)Nr6���) r����r�����unsafe_namer����r����rg���rQ����not_found_in_indexr����)r�����requirementr@���r&���r&���r'���� find_packages���s���� zPackageIndex.find_packagesc����������������sR���|�j����|�j|��x,|�|j�D�]}||kr.|S�|�jd||��qW�tt|��j||�S�)Nz%s does not match %s)�prescanr����rg���r�����superr����obtain)r����r����Z installerrN���)� __class__r&���r'���r�������s���� zPackageIndex.obtainc�������������C���sL���|j�|�jd|���|j��sH|j���tj|��td|jjtj j |�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����rW����unlinkr���r����r3���rD���rU���)r�����checkerrX����tfpr&���r&���r'���� check_hash���s���� zPackageIndex.check_hashc�������������C���sT���xN|D�]F}|�j�dks4t|��s4|jd�s4tt|��r@|�j|��q|�j�j|��qW�dS�)z;Add `urls` to the list that will be prescanned for searchesNzfile:)r����r����r2���r����r���r�����append)r����Zurlsr@���r&���r&���r'����add_find_links��s���� zPackageIndex.add_find_linksc�������������C���s"���|�j�rtt|�j|�j����d|�_�dS�)z7Scan urls scheduled for prescanning (e.g. --find-links)N)r����r����r���r����)r����r&���r&���r'���r������s����zPackageIndex.prescanc�������������C���s<���|�|j��r|�jd�}}n|�jd�}}|||j��|�j���d�S�)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))rg���r����r����r����r����)r����r�����methr����r&���r&���r'���r����!��s���� zPackageIndex.not_found_in_indexc�������������C���s~���t�|t�sjt|�}|rR|�j|jd�||�}t|�\}}|jd�rN|�j|||�}|S�tj j |�rb|S�t|�}t|�j ||�dd�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. r7���z.pyrP���N)r����r���r����� _download_urlrL���rG���r1���� gen_setuprW���rD���r����r(���r�����fetch_distribution)r����r%����tmpdirrB����foundr4���rF���r&���r&���r'���r8���+��s���� zPackageIndex.downloadc������� ���������s�����j�d|��i��d}d ������fdd� }|rH�j����j|��||�}|�r`|dk r`|||�}|dkr��jdk rz�j���||�}|dkr�|�r��j|��||�}|dkrjd�r�dp�d|��n�j�d|��|j|jd �S�dS�)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 %sNc����������������s����|d�kr�}x�||�j��D�]t}|jtkrJ���rJ|�kr�jd|��d�|<�q||�ko`|jtkp`��}|r�j|j��}||_tj j |j�r|S�qW�d�S�)Nz&Skipping development or system egg: %sr7���)rg���rH���r���r����r���r8���rP����download_locationrW���rD���r����)Zreq�envrN���Ztest�loc)� develop_okr�����skipped�sourcer����r&���r'���r|���e��s ����z-PackageIndex.fetch_distribution.<locals>.findz:No local packages or working download links found for %s%sza source distribution of r����zBest match: %s)rP���)N)r����r����r����r����r����Zcloner����) r����r����r����� force_scanr����r����Zlocal_indexrN���r|���r&���)r����r����r����r����r����r'���r����M��s0���� zPackageIndex.fetch_distributionc�������������C���s"���|�j�||||�}|dk r|jS�dS�)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����rP���)r����r����r����r���r����rN���r&���r&���r'����fetch���s����zPackageIndex.fetchc������� ��� ���C���s����t�j|�}|r*dd��t||jd�d��D��p,g�}t|�dkr�tjj|�}tjj|�|kr�tjj ||�}ddl m}�|||�s�tj ||��|}ttjj |d�d��2} | jd|d�j|d�jtjj|�d�f���W�d�Q�R�X�|S�|r�td ||f���ntd ��d�S�)Nc�������������S���s���g�|�]}|j�r|�qS�r&���)rR���)r[����dr&���r&���r'���� <listcomp>���s����z*PackageIndex.gen_setup.<locals>.<listcomp>r7���r���)�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.)rJ���rK���r���rL���rT���rW���rD���rU����dirnamera���Zsetuptools.command.easy_installr���shutilZcopy2r�����writerQ���rR����splitextr���) r����rX���rF���r����rK���r����rU����dstr��r����r&���r&���r'���r�������s2���� zPackageIndex.gen_setupi� ��c�������������C���s��|�j�d|��d�}z�tj|�}|�j|�}t|tjj�rJtd||j |j f���|j���}d}|�j}d}d|kr�t|d�} t tt| ��}|�j|||||��t|d��Z} xD|j|�}|r�|j|��| j|��|d7�}|�j|||||��q�P�q�W�|�j||| ��W�d�Q�R�X�|S�|�r|j���X�d�S�) NzDownloading %szCan't download %s: %s %sr���r7���zcontent-lengthzContent-Length�wbr;���)r����r����r����r����r����r���r����r����r���r����r�����dl_blocksizer����maxr����int� reporthookr����r����r����r��r����r����)r����r@���rX����fpr����r�����blocknumZbs�sizeZsizesr����r����r&���r&���r'����_download_to���s:���� zPackageIndex._download_toc�������������C���s���d�S�)Nr&���)r����r@���rX���r��Zblksizer��r&���r&���r'���r�����s����zPackageIndex.reporthookc�������������C���s���|j�d�rt|�S�yt||�j�S��ttjfk r��}�z>djdd��|jD���}|r^|�j ||��nt d||f���W�Y�d�d�}~X��n�tjj k r��}�z|S�d�}~X�n��tjjk r��}�z,|r�|�j ||j��nt d||jf���W�Y�d�d�}~X�n��tjk �r8�}�z.|�r|�j ||j��nt d||jf���W�Y�d�d�}~X�nP�tjtjfk �r��}�z*|�rf|�j ||��nt d||f���W�Y�d�d�}~X�nX�d�S�)Nzfile:� c�������������S���s���g�|�]}t�|��qS�r&���)rw���)r[����argr&���r&���r'���r�����s����z)PackageIndex.open_url.<locals>.<listcomp>z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r2���� local_open�open_with_authr����r$���r���� InvalidURLra���rl���r����r���r���r����r����ZURLError�reasonZ BadStatusLine�lineZ HTTPException�socket)r����r@���Zwarning�vr����r&���r&���r'���r�������s6���� "zPackageIndex.open_urlc�������������C���s����t�|�\}}|r4x&d|kr0|jdd�jdd�}qW�nd}|jd�rN|d�d��}tjj||�}|dksn|jd �rz|�j||�S�|d ks�|jd�r�|�j||�S�|jd�r�|�j ||�S�|d kr�t jjt j j|�d��S�|�j|d��|�j||�S�d�S�)Nz..�.�\�_Z__downloaded__z.egg.zipr,���Zsvnzsvn+Zgitzgit+zhg+r����r9���Tr/���)rG����replacer1���rW���rD���ra���r2���� _download_svn� _download_git�_download_hgr���r�����url2pathnamer#���r=���r�����_attempt_download)r����rB���r@���r����r3���rF���rX���r&���r&���r'���r������s$���� zPackageIndex._download_urlc�������������C���s���|�j�|d��d�S�)NT)r����)r����r@���r&���r&���r'���r����8��s����zPackageIndex.scan_urlc�������������C���s6���|�j�||�}d|jdd�j��kr.|�j|||�S�|S�d�S�)Nr����zcontent-typer����)r��r����r0����_download_html)r����r@���rX���r����r&���r&���r'���r%��;��s����zPackageIndex._attempt_downloadc�������������C���sl���t�|�}x@|D�]8}|j��rtjd|�rD|j���tj|��|�j||�S�P�qW�|j���tj|��td|���d�S�)Nz <title>([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) r����rx���rZ���r}���r����rW���r����r!��r���)r����r@���r����rX���r����r��r&���r&���r'���r&��B��s���� zPackageIndex._download_htmlc�������������C���s��|j�dd�d�}d}|j��jd�r�d|kr�tjj|�\}}}}}} |�r�|jd�r�d|d d���kr�|d d���j�dd�\}}tjj|�\} }| r�d | kr�| j�d d�\}} d|| f�}nd| �}|}|||||| f}tjj|�}|�jd ||��t j d|||f���|S�)Nr:���r7���r���r����zsvn:�@z//r6���r9����:z --username=%s --password=%sz --username=z'Doing subversion checkout from %s to %szsvn checkout%s -q %s %s)r?���r0���r2���r���r#���r=���� splituser� urlunparser����rW����system)r����r@���rX���ZcredsrB����netlocrD���r\����qr�����auth�host�userZpwrA���r&���r&���r'���r!��Q��s$���� zPackageIndex._download_svnc�������������C���sp���t�jj|��\}}}}}|jdd�d�}|jdd�d�}d�}d|krR|jdd�\}}t�jj||||df�}�|�|fS�)N�+r7���r:���r���r'��r����r;���)r���r#���Zurlsplitr?����rsplitZ urlunsplit)r@���� pop_prefixrB���r,��rD���rE���r�����revr&���r&���r'����_vcs_split_rev_from_urlf��s����z$PackageIndex._vcs_split_rev_from_urlc�������������C���sl���|j�dd�d�}|�j|dd�\}}|�jd||��tjd||f���|d�k rh|�jd|��tjd ||f���|S�) Nr:���r7���r���T)r3��zDoing git clone from %s to %szgit clone --quiet %s %szChecking out %sz"(cd %s && git checkout --quiet %s))r?���r5��r����rW���r+��)r����r@���rX���r4��r&���r&���r'���r"��x��s���� zPackageIndex._download_gitc�������������C���sl���|j�dd�d�}|�j|dd�\}}|�jd||��tjd||f���|d�k rh|�jd|��tjd ||f���|S�) Nr:���r7���r���T)r3��zDoing hg clone from %s to %szhg clone --quiet %s %szUpdating to %sz(cd %s && hg up -C -r %s -q))r?���r5��r����rW���r+��)r����r@���rX���r4��r&���r&���r'���r#�����s���� zPackageIndex._download_hgc�������������G���s���t�j|f|����d�S�)N)r���r����)r����r����rl���r&���r&���r'���r�������s����zPackageIndex.debugc�������������G���s���t�j|f|����d�S�)N)r���r����)r����r����rl���r&���r&���r'���r�������s����zPackageIndex.infoc�������������G���s���t�j|f|����d�S�)N)r���r����)r����r����rl���r&���r&���r'���r�������s����zPackageIndex.warn�r����)r����r6��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����r8���r����r��r����r��r��r��r����r����r����r%��r&��r!���staticmethodr5��r"��r#��r����r����r����� __classcell__r&���r&���)r����r'���r���(��sL���� 3 + #� J )$ #z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c�������������C���s���|�j�d�}t|�S�)Nr7���)rL���r���)rK���Zwhatr&���r&���r'���� decode_entity���s���� r9��c�������������C���s ���t�t|��S�)z'Decode HTML entities in the given text.)� entity_subr9��)�textr&���r&���r'���r{������s����r{���c����������������s�����fdd�}|S�)Nc����������������s������fdd�}|S�)Nc�����������������s.���t�j��}t�j���z ��|�|�S�t�j|��X�d�S�)N)r��ZgetdefaulttimeoutZsetdefaulttimeout)rl���rm���Zold_timeout)rn����timeoutr&���r'����_socket_timeout���s ���� z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr&���)rn���r=��)r<��)rn���r'���r=�����s����z'socket_timeout.<locals>._socket_timeoutr&���)r<��r=��r&���)r<��r'����socket_timeout���s����r>��c�������������C���s2���t�jj|��}|j��}tj|�}|j��}|jdd�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�base64Zencodestringr����r ��)r.��Zauth_sZ auth_bytesZ encoded_bytesZencodedr&���r&���r'����_encode_auth���s ���� rB��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)r����rD��rE��r&���r&���r'���r�������s����zCredential.__init__c�������������c���s���|�j�V��|�jV��d�S�)N)rD��rE��)r����r&���r&���r'����__iter__���s����zCredential.__iter__c�������������C���s���dt�|���S�)Nz%(username)s:%(password)s)�vars)r����r&���r&���r'����__str__���s����zCredential.__str__N)r����r����r����r����r����rF��rH��r&���r&���r&���r'���rC�����s���rC��c���������������@���s0���e�Zd�Zdd��Zedd���Zdd��Zdd��Zd S�) � PyPIConfigc�������������C���sP���t�jdddgd�}tjj|�|��tjjtjjd�d�}tjj |�rL|�j |��dS�)z% Load from ~/.pypirc rD��rE��� repositoryr�����~z.pypircN)�dict�fromkeysr����RawConfigParserr����rW���rD���ra���� expanduserr����r����)r����ZdefaultsZrcr&���r&���r'���r�������s ����zPyPIConfig.__init__c����������������s&�����fdd���j���D��}tt��j|��S�)Nc����������������s ���g�|�]}��j�|d��j��r|�qS�)rJ��)r����rx���)r[����section)r����r&���r'���r�����s����z2PyPIConfig.creds_by_repository.<locals>.<listcomp>)ZsectionsrL��r����_get_repo_cred)r����Zsections_with_repositoriesr&���)r����r'����creds_by_repository���s����zPyPIConfig.creds_by_repositoryc�������������C���s6���|�j�|d�j��}|t|�j�|d�j��|�j�|d�j���fS�)NrJ��rD��rE��)r����rx���rC��)r����rP��Zrepor&���r&���r'���rQ�����s����zPyPIConfig._get_repo_credc�������������C���s*���x$|�j�j��D�]\}}|j|�r|S�qW�dS�)z� If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)rR���itemsr2���)r����r@���rJ���credr&���r&���r'����find_credential��s���� zPyPIConfig.find_credentialN)r����r����r����r�����propertyrR��rQ��rU��r&���r&���r&���r'���rI�����s��� rI��c�������������C���s:��t�jj|��\}}}}}}|jd�r,tjd��|d krFt�jj|�\}} nd}|s~t��j|��} | r~t | �}| j |�f}tjd|����|r�dt |��}|| ||||f}t�jj|�} t�jj| �}|jd|��nt�jj|��}|jd t��||�}|�r6t�jj|j�\}}}}}}||k�r6|| k�r6||||||f}t�jj|�|_|S�)z4Open a urllib2 request, handling HTTP authenticationr(��znonnumeric port: ''�http�httpsN�*Authenticating as %s for %s (from .pypirc)zBasic Z Authorizationz User-Agent)rW��rX��)rY��)r���r#���r=���r1���r���r��r)��rI��rU��rw���rD��r���r����rB��r*��r����ZRequestZ add_header� user_agentr@���)r@���r����rB���r,��rD���ZparamsrE���r����r.��r/��rT��r����rA���r����r����r���s2Zh2Zpath2Zparam2Zquery2Zfrag2r&���r&���r'���r����s6���� r��c�������������C���s���|�S�)Nr&���)r@���r&���r&���r'���� fix_sf_url?��s����r\��c�������������C���s��t�jj|��\}}}}}}t�jj|�}tjj|�r<t�jj|��S�|j d�r�tjj |�r�g�}x�tj|�D�]b} tjj|| �} | dkr�t | d��}|j��}W�dQ�R�X�P�ntjj | �r�| d7�} |jdj| d���qbW�d} | j|�dj|�d �}d\}}n d\}}}ddi}tj|�}t�jj|�||||�S�)z7Read a local path, with special support for directoriesr6���z index.html�rNz<a href="{name}">{name}</a>)r3���zB<html><head><title>{url}</title></head><body>{files}</body></html>r?��)r@����files������OK����Path not found� Not foundzcontent-typez text/html)r_��r`��)ra��rb��rc��)r���r#���r=���r����r$��rW���rD����isfiler����r1���r����r����ra���r����r����r�����formatr����StringIOr����r����)r@���rB���rC���rD���ZparamrE���r����rX���r^��r�����filepathr��Zbodyr����Zstatus�messager����Zbody_streamr&���r&���r'���r��C��s,���� r��)N)N)N)N)r ���)Zr�����sysrW���rZ���r��r��rA��r����r����� functoolsr���Zsetuptools.externr���Zsetuptools.extern.six.movesr���r���r���r���r"���Z pkg_resourcesr���r ���r ���r���r���r ���r���r���r���r���r���r���r���r���Z distutilsr���Zdistutils.errorsr���Zfnmatchr���Zsetuptools.py27compatr���Zsetuptools.py33compatr���Zsetuptools.wheelr���r����rJ����Iry���r����rK���r����r?���rS����__all__Z_SOCKET_TIMEOUTZ_tmplre��rR���rZ��r(���r���rG���r���rI���rY���r���rk���rp���rt���r�����objectr����r����r���r����r:��r9��r{���r>��rB��rC��rN��rI��r����r����r��r\��r��r&���r&���r&���r'����<module>���s|���< ! " !����� &.