� ,�Re������dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl ZddlZddlZddlZddlmZddlZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,dd l-m.Z.ej/d ��Z0ej/d ej1��Z2ej/d ��Z3ej/d ej1��j4Z5d�6��Z7gd�Z8dZ9dZ:e:�;dj;ej<�e���Z=d�Z>d�Z?d�Z@d1d�ZAd1d�ZBd1d�ZCdedfd�ZDd�ZEej/dej1��ZF eEd���ZGGd�d��ZHGd �d!eH��ZIGd"�d#e��ZJej/d$��jKZLd%�ZMd&�ZNd2d'�ZOd(�ZPGd)�d*��ZQGd+�d,e jR��ZSejTjUfd-�ZVd.�ZWeOe9��eV��ZVd/�ZXd0�ZYdS)3z$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� parse_version)�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�z�>�,� '� '� �����:�D��D�D� � � �k�3� /� /� ��"�R�%�[�F�����:�D��D�D� �^�^�,� -� -� �����:�D��D�D� � � �o�s� 3� 3� ��"�R�%�[�F�����:�D��D� ��� ��c��tj�|��}|\}}}}}}tj�|�d��d��}|dkr>|dkr8tj�|�d��d��}d|vr|�dd��\}}||fS)N�/�����zsourceforge.net�download������#�)�urllibr!�urlparse�unquote�split) �url�parts�scheme�server�path� parameters�query�fragmentr/s r%�egg_info_for_urlrFfs��� �L� !� !�#� &� &�E�8=�5�F�F�D�*�e�X� �<� � �� � �3���� 3� 4� 4�D� �"�"�"�t�z�'9�'9��|�#�#�D�J�J�s�O�O�B�$7�8�8�� �d�{�{����C��+�+���h� ��>�r2c#�K�t|��\}}t|||��D]}|V��|rNt�|��}|r4t ||�d��|t ���D] }|V��dSdSdS)zEYield egg or source distribution objects that might be found at a URLr9)� precedenceN)rF�distros_for_location� EGG_FRAGMENT�matchr�groupr)r>�metadatar/rE�distrKs r%rrqs�����%�c�*�*�N�D�(�$�S�$��9�9����� � � � ����"�"�8�,�,�� � �-��U�[�[��^�^�X�-���� � ��� � � � � �� � � � r2c��|�d��r |dd�}|�d��rd|vrtj|||��gS|�d��rOd|vrKt|��}|���sgSt||j|jtdz���gS|�d ��r.t|��\}}}|�t||||t|��StD]B}|�|��r+|dt|�� �}t|||��cS�CgS) z:Yield egg or source distribution objects based on basename�.egg.zipNr*z.egg�-z.whlr9)�location� project_name�versionrHr() r,r� from_locationr� is_compatiblerSrTrrrr� EXTENSIONS�len)rR�basenamerM�wheel�win_baser0�platform�exts r%rIrIs�������$�$�!��C�R�C�=������ � �J�S�H�_�_��*�8�X�x�H�H�I�I����� � �  �S�H�_�_��h�����"�"�$�$� ��I� �!�"�/�� �#�a�<�  � � � � ����� � ��%8��%B�%B�"��&�(� � �(��(�H�f�k�8��� � �G�G�� � � �S� !� !� G�� �3�s�8�8�)� �,�H�(��8�X�F�F� F� F� F� G� �Ir2c�x�tt|��tj�|��|��S)zEYield possible egg or source distribution objects based on a filename)rIr�osrBrY)�filenamerMs r%�distros_for_filenamera�s3�� ��x� � �"�'�"2�"2�8�"<�"<�h� � �r2c #�`K�|�d��}|s#td�|dd�D����rdStdt|��dz��D]P}t ||d�|d|���d�||d���|||���V��QdS)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! rQc3�@K�|]}tjd|��V��dS)z py\d\.\d$N)�rerK)�.0�ps r%� z(interpret_distro_name..�s.����K�K�A�b�h�|�Q�7�7�K�K�K�K�K�Kr2�Nr9)� py_versionrHr\)r=�any�rangerXr�join)rRrYrMrirHr\r?rfs r%rr�s�����* �N�N�3� � �E� ��#�K�K��q�r�r��K�K�K�K�K���� �1�c�%�j�j�1�n� %� %�  �  ��� � � �H�H�U�2�A�2�Y� � � �H�H�U�1�2�2�Y� � �!�!�� � � � � � � �  �  r2c�<��t����fd���}|S)zs Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. c�.��t�|i|����S�Nr)�args�kwargs�funcs �r%�wrapperzunique_values..wrapper�s ����t�t�T�4�V�4�4�5�5�5r2r)rrrss` r%� unique_valuesrt�s5���  �4�[�[�6�6�6�6��[�6� �Nr2z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c #��K�t�|��D]�}|���\}}tt t j|����d������}d|vsd|vr_t�|��D]D}tj � |t|�d������V��E��dD]|}|�|��}|dkr_t�||��}|rBtj � |t|�d������V��}dS)zEFind rel="homepage" and rel="download" links in `page`, yielding URLs�,�homepager6r9)z Home PagezDownload URLr5N)�REL�finditer�groups�set�map�str�stripr+r=�HREFr:r!�urljoin� htmldecoderL�find�search)r>�pagerK�tag�rel�rels�poss r%�find_external_linksr��sM�������d�#�#�L�L���<�<�>�>���S��3�s�y�#�)�)�+�+�"3�"3�C�"8�"8�9�9�:�:�� �� � ��t�!3�!3����s�+�+� L� L���l�*�*�3� �5�;�;�q�>�>�0J�0J�K�K�K�K�K�K��4�L�L���i�i��n�n�� �"�9�9��K�K��c�*�*�E�� L��l�*�*�3� �5�;�;�q�>�>�0J�0J�K�K�K�K�K�� L�Lr2c�$�eZdZdZd�Zd�Zd�ZdS)�ContentCheckerzP A null content checker that defines the interface for checking content c��dS)z3 Feed a block of data to the hash. N���self�blocks r%�feedzContentChecker.feed�s �� �r2c��dS)zC Check the hash. Return False if validation fails. Tr��r�s r%�is_validzContentChecker.is_valids ���tr2c��dS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr�)r��reporter�templates r%�reportzContentChecker.reports �� �r2N)�__name__� __module__� __qualname__�__doc__r�r�r�r�r2r%r�r��sK����������� ��� ����r2r�c�\�eZdZejd��Zd�Zed���Zd�Z d�Z d�Z dS)� HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)c�T�||_tj|��|_||_dSro)� hash_name�hashlib�new�hash�expected)r�r�r�s r%�__init__zHashChecker.__init__s%��"����K� �*�*�� � �� � � r2c���tj�|��d}|st��S|j�|��}|st��S|di|�����S)z5Construct a (possibly null) ContentChecker from a URLr5r�)r:r!r;r��patternr�� groupdict)�clsr>rErKs r%�from_urlzHashChecker.from_urls{���<�(�(��-�-�b�1��� $�!�#�#� #�� �"�"�8�,�,��� $�!�#�#� #��s�'�'�U�_�_�&�&�'�'�'r2c�:�|j�|��dSro)r��updater�s r%r�zHashChecker.feed$s�� � ��������r2c�F�|j���|jkSro)r�� hexdigestr�r�s r%r�zHashChecker.is_valid's���y�"�"�$�$�� �5�5r2c�,�||jz}||��Sro)r�)r�r�r��msgs r%r�zHashChecker.report*s�����'���x��}�}�r2N) r�r�r�rd�compiler�r�� classmethodr�r�r�r�r�r2r%r�r�s��������b�j� #���G� !�!�!� �(�(��[�(� � � �6�6�6�����r2r�c�.��eZdZdZ d+�fd� Z�fd�Zd,d �Zd,d �Zd,d �Zd �Z d �Z d�Z d�Z d�Z d-d�Zd�Zd-�fd� Zd�Zd�Zd�Zd�Zd�Z d.d�Zd/d�Zd�ZdZd�Zd�Zd-d�Zd �Zd!�Zd"�Zd#�Z d$�Z!e"d,d%���Z#d&�Z$d'�Z%d(�Z&d)�Z'd*�Z(�xZ)S)0rz;A distribution index that scans web pages for download URLs�https://pypi.org/simple/��*NTc�r��t��j|i|��|dd|�d�� �z|_i|_i|_i|_tjd� tt|������j |_ g|_tjj|_dS)Nr4�|)�superr�r,� index_url� scanned_urls� fetched_urls� package_pagesrdr�rlr|rrK�allows�to_scanr:�request�urlopen�opener)r�r��hosts� ca_bundle� verify_sslrp�kw� __class__s �r%r�zPackageIndex.__init__2s���� �����$�%�"�%�%�%�"�S�)F�y�/A�/A�#�/F�/F�+F�)F�%G�G�������������j����#�i��*?�*?�!@�!@�A�A�G�� ��� ��n�,�� � � r2c��� t|j��n#t$rYdSwxYwt���|��Sro)rrT� Exceptionr��add)r�rNr�s �r%r�zPackageIndex.addDsS��� � �$�,� '� '� '� '��� � � � �F�F� �����w�w�{�{�4� � � s �� &�&Fc ��||jvr|sdSd|j|<t|��s|�|��dStt |����}|r-|�|��sdS|�d|��|s |r ||jvr$tt|j |����dS|�|��s d|j|<dS|� d|��d|j|<d}|� |||z��}|�dSt|tjj��r(|jdkr|� d|jz��d|j|j<d|j�d d �����vr|���dS|j}|���}t|t0��sTt|tjj��rd }n|j�d ��pd }|�|d ��}|���t6�|��D]W} tj�|t?| � d������} |�!| ���X|�"|j#��r-tI|dd��dkr|�%||��}dSdSdS)z�headers�getr+�close�readr}� get_param�decoderryr!r�r�rL� process_urlr-r��getattr� process_index) r�r>�retrieve�dists�tmpl�fr/r�r�rK�links r%r�zPackageIndex.process_urlMs��� �$�#� #� #�H� #� �F�!%���#���#��� 2� � !� !�#� &� &� &� �F����-�-�.�.�E�� 2��{�{�3�'�'���F�� � �+�S�1�1�1� � �� �C�4�+<�$<�$<� ��T�X�u�%�%� &� &� &� �F��{�{�3��� �%)�D� �c� "� �F� � � �,��$�$�$�!%���#��M�� �M�M�#�t�c�z� *� *�� �9� �F� �a���/� 0� 0� :�Q�V�s�]�]� �I�I�0�1�5�8� 9� 9� 9�#'���!�%� � �����~�r�:�:�@�@�B�B� B� B� �G�G�I�I�I� �F��u���v�v�x�x���$��$�$� 2��!�V�\�3�4�4� F�#����)�-�-�i�8�8�E�I���;�;�w��1�1�D� ��� � � ��]�]�4�(�(� #� #�E��<�'�'��j����Q���.H�.H�I�I�D� � � �T� "� "� "� "� �>�>�$�.� )� )� 1�g�a���.F�.F�#�.M�.M��%�%�c�4�0�0�D�D�D� 1� 1�.M�.Mr2c� �tj�|��s|�d|��dStj�|��rl|sjtj�|��}tj|��D]6}|�tj�||��d���7t|��}|r:|� d|��tt|j |����dSdS)Nz Not found: %sTz Found: %s)r_rB�exists�warn�isdir�realpath�listdirr�rlrar�r�r|r�)r��fn�nestedrB�itemr�s r%r�zPackageIndex.process_filename�s����w�~�~�b�!�!� � �I�I�o�r� *� *� *� �F� �7�=�=�� � � F�V� F��7�#�#�B�'�'�D�� �4�(�(� F� F���%�%�b�g�l�l�4��&>�&>��E�E�E�E�$�R�(�(�� � '� �J�J�{�B� '� '� '� ��T�X�u�%�%� &� &� &� &� &� '� 'r2c�N�t|��}|o*|�d�����dk}|s8|�tj�|��d��rdSd}|rt||z���|�||��dS)Nr9�fileTzN Note: Bypassing %s (disallowed host; see http://bit.ly/2hrImnY for details). ) r�rLr+r�r:r!r;rr�)r�r>�fatal�s�is_filer�s r%r�zPackageIndex.url_ok�s��� �s�O�O���4����� � �(�(�*�*�f�4�� � �d�k�k�&�,�"7�"7��"<�"<�Q�"?�@�@� ��4� 4� � � � ��s��+�+� +� �I�I�c�3� � � � � r2c��ttjj|��}d�|D��}t t j|j|����dS)Nc3�vK�|]4}tj|��D]}|�d���||fV���5dS)z .egg-linkN)r_r�r,)rerB�entrys r%rgz.PackageIndex.scan_egg_links..�sm���� � ����D�)�)� � ���~�~�k�*�*�  � �5�M� � � � � � � r2)�filterr_rBr�r�� itertools�starmap� scan_egg_link)r�� search_path�dirs� egg_linkss r%�scan_egg_linkszPackageIndex.scan_egg_links�sY���b�g�m�[�1�1�� � �� � � � � �Y� �t�1�9� =� =�>�>�>�>�>r2c ��ttj�||����5}t t dt tj|������}ddd��n #1swxYwYt|��dkrdS|\}}ttj�||����D]?}tjj|g|�R�|_ t|_ |�|���@dS)Nrh)�openr_rBrlr�r�r|r}r~rXr rRr rHr�)r�rBr�� raw_lines�lines�egg_path� setup_pathrNs r%r�zPackageIndex.scan_egg_link�s)�� �"�'�,�,�t�U�+�+� ,� ,� B� ����c�#�)�Y�&?�&?�@�@�A�A�E� B� B� B� B� B� B� B� B� B� B� B���� B� B� B� B� �u�:�:��?�?� �F�$���*�&�r�w�|�|�D�(�'C�'C�D�D� � �D��G�L��6��6�6�6�D�M�)�D�O� �H�H�T�N�N�N�N� � s�6A0�0A4�7A4c ��d}|�|j��s|Stttjj|t|j��d��d������}t|��dks d|dvr|St|d��}t|d��}d|j � |� ��i��|<t|��t|��fS)N)NNr4rhr8r9rT)r-r�r�r|r:r!r<rXr=r r r�� setdefaultr+r)r�r��NO_MATCH_SENTINELr?�pkg�vers r%�_scanzPackageIndex._scan�s���&�����t�~�.�.� %�$� $��S���-�t�C���4G�4G�4I�4I�/J�/P�/P�QT�/U�/U�V�V�W�W�� �u�:�:��?�?�c�U�1�X�o�o�$� $���a��!�!���5��8�$�$��?C���%�%�c�i�i�k�k�2�6�6�t�<��3����S�!1�!1�1�1r2c �\�t�|��D]f} |�tj�|t |�d���������W#t$rY�cwxYw|�|��\}}|sdSt||��D]c}t|��\}}|� d��r%|s#|r |d|�d|��z }n|� |��|� |���dt�d�|��S)z#Process the contents of a PyPI pager9r��.pyz#egg=rQc�6�d|�ddd��zS)Nz%sr9�rh)rL)�ms r%�z,PackageIndex.process_index..�s��2�Q�W�W�Q��1�5E�5E�E�r2)rryrr:r!r�r�rLr"r�rFr,�need_version_info�scan_url�PYPI_MD5�sub) r�r>r�rKr r�new_urlr/�frags r%r�zPackageIndex.process_index�sN���]�]�4�(�(� � �E� �� � �6�<�/�/��Z�� � �A���5O�5O�P�P�Q�Q�Q�Q��� � � ��� �����:�:�c�?�?���S�� ��2�+�3��5�5� #� #�G�)�'�2�2�J�D�$��}�}�U�#�#� 0�D� 0��0��G�s�s�s�C�C�8�8�G�G��*�*�3�/�/�/� �M�M�'� "� "� "� "��|�|� E� E�t� � � s�AA2�2 A?�>A?c�2�|�d|��dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)�scan_all�r�r>s r%rzPackageIndex.need_version_info�s*�� � � � � � � � � � r2c��|j|jvr%|r|j|g|�R�|�d��|�|j��dS)Nz6Scanning index of all packages (this may take a while))r�r�r�r�r�r�r�rps r%rzPackageIndex.scan_all�sa�� �>��!2� 2� 2�� &��� �#�%��%�%�%�%� �I�I�N� O� O� O� � � �d�n�%�%�%�%�%r2c���|�|j|jzdz��|j�|j��s%|�|j|jzdz��|j�|j��s|�|��t|j�|jd����D]}|�|���dS)Nr4r�) rr�� unsafe_namer�r��keyrS�not_found_in_indexr�)r�� requirementr>s r%� find_packageszPackageIndex.find_packages�s��� � � �d�n�{�'>�>��D�E�E�E��!�%�%�k�o�6�6� K� �M�M�$�.�;�+C�C�c�I� J� J� J��!�%�%�k�o�6�6� 1� � #� #�K� 0� 0� 0���*�.�.�{���C�C�D�D� � �C� �M�M�#� � � � � � r2c���|���|�|��||jD]!}||vr|cS|�d||���"t t |���||��S)Nz%s does not match %s)�prescanr&r#r�r�r�obtain)r�r%� installerrNr�s �r%r)zPackageIndex.obtains���� � � ���� ���;�'�'�'����)� B� B�D��{�"�"�� � � � �J�J�-�{�D� A� A� A� A��\�4�(�(�/�/� �Y�G�G�Gr2c�2�|�|jd|z��|���sd|���t j|��t |jj�dtj � |���d����dS)z- checker is a ContentChecker zValidating %%s checksum for %sz validation failed for z; possible download problem?N) r�r�r�r�r_�unlinkrr�r.rBrY)r��checkerr`�tfps r%� check_hashzPackageIndex.check_hash s��� ���t�z�#C�h�#N�O�O�O����!�!� � �I�I�K�K�K� �I�h� � � � ��<�$�$�$�b�g�&6�&6�x�&@�&@�&@�&@�B��� � � r2c���|D]y}|j�@t|��r1|�d��stt |����r|�|���_|j�|���zdS)z;Add `urls` to the list that will be prescanned for searchesN�file:)r�r�r-r�rr�append)r��urlsr>s r%�add_find_linkszPackageIndex.add_find_linkss���� )� )�C�� �$�!�#���%��>�>�'�*�*�%����,�,�-�-�%� � � �c�"�"�"�"�� �#�#�C�(�(�(�(� )� )r2c�p�|jr'tt|j|j����d|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)r�r�r|rr�s r%r(zPackageIndex.prescan*s3�� �<� 3� ��T�]�D�L�1�1� 2� 2� 2��� � � r2c��||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)r�r%�methr�s r%r$zPackageIndex.not_found_in_index0sX�� � �� � �� �#H�#�D�D�� �E��D� ��S�+�)�*�*�*� � � �����r2c���t|t��s�t|��}|rj|�|�d��||��}t |��\}}|�d��r|�|||��}|Stj � |��r|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. r9rrRN)r�rr�� _download_urlrLrFr,� gen_setupr_rBr�r&r��fetch_distribution)r�r#�tmpdirr@�foundr/rEs r%r6zPackageIndex.download;s���$�$� �,�,� 3���%�%�F�� 3��*�*�6�<�<��?�?�D�&�I�I��!1�$�!7�!7���h��=�=��'�'�D� �N�N�5�(�F�C�C�E�� ������%�%� 3�� �,�T�2�2���t�.�.�t�V�<�<�j�$�O�O�Or2c������ ���d|��i� d}d ��� ��fd� }|r4������|��||��}|s|� |||��}|�&�j�����||��}|�"|s ��|��||��}|���d�rdpd|��dS��d|��|�|j���S) a|Obtain a distribution suitable for fulfilling `requirement` `requirement` must be a ``pkg_resources.Requirement`` instance. If necessary, or if the `force_scan` flag is set, the requirement is searched for in the (online) package index as well as the locally installed packages. If a distribution matching `requirement` is found, the returned distribution's ``location`` is the value you would have gotten from calling the ``download()`` method with the matching distribution's URL or filename. If no matching distribution is found, ``None`` is returned. If the `source` flag is set, only source distributions and source checkout links will be considered. Unless the `develop_ok` flag is set, development and system eggs (i.e., those using the ``.egg-info`` format) will be ignored. zSearching for %sNc�Z��|��}||jD]�}|jtkr"�s |�vr��d|��d�|<�4||vo|jtkp� }|rJ��|j� ��}||_tj � |j��r|cS��dS)Nz&Skipping development or system egg: %sr9) r#rHrr�r r6rR�download_locationr_rBr�) �req�envrN�test�loc� develop_okr��skipped�sourcer<s �����r%r�z-PackageIndex.fetch_distribution..find{s�����{����C�G� � $� $���?�l�2�2�:�2��7�*�*�� � �D� ����)*��� ���s�{�U���;�(F�(T�f�*���$��-�-�� �v�>�>�C�-0�D�*��w�~�~�d�&<�=�=�$�#� � � ��! $� $r2z:No local packages or working download links found for %s%sza source distribution of r�zBest match: %s)rRro)r�r(r&r�r��cloner@) r�r%r<� force_scanrGrE� local_indexrNr�rFs ` ` `` @r%r;zPackageIndex.fetch_distribution]sn�������4 � � �$�k�2�2�2����� $� $� $� $� $� $� $� $� $� $�. � %� �L�L�N�N�N� � � �{� +� +� +��4� �$�$�D�� 2� �/��4� �[�1�1�D� �<��|�'�� � �����4� �$�$�D� �<� �<� � � �{� +� +� +��4� �$�$�D� �<� �I�I�L��7�7�=�2�� � � � � � �I�I�&�� -� -� -��:�:�t�'=�:�>�>� >r2c�H�|�||||��}|�|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;rR)r�r%r<rIrGrNs r%�fetchzPackageIndex.fetch�s0���&�&�{�F�J��O�O�� � ��=� ��tr2c ��t�|��}|r.d�t||�d��d��D��pg}t |��dk�rXt j�|��}t j�|��|krvt j� ||��}t j� |��r t j� ||��stj ||��|}tt j� |d��d��5}|�d|dj�d|dj�dt j�|��d�d ���ddd��n #1swxYwY|S|rt'd |�d |�����t'd ���) Nc� �g|] }|j� |�� Sr�)rT)re�ds r%� z*PackageIndex.gen_setup..�s0�������9�����r2r9zsetup.py�wz(from setuptools import setup setup(name=rz , version=z, py_modules=[z]) z9Can't unambiguously interpret project/version identifier zI; any dashes in the name or version should be escaped using underscores. zpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rJrKrrLrXr_rBrY�dirnamerlr��samefile�shutil�copy2r�writerSrT�splitextr) r�r`rEr<rKr�rY�dstr�s r%r:zPackageIndex.gen_setup�s���"�"�8�,�,�� � ���.�x����Q����N�N���� � � � �u�:�:��?�?��w�'�'��1�1�H��w���x�(�(�F�2�2��g�l�l�6�8�4�4������s�+�+�#���0@�0@��3�0O�0O�#��L��3�/�/�/�"�H��b�g�l�l�6�:�6�6��<�<� ��� � � ��a��-�-�-��a��(�(�(���(�(��2�2�1�5�5�5� ���� � � � � � � � � � � ���� � � � ��O� � � �.�&.�X�X�u�u�6��� � !�G��� s�AF,�,F0�3F0i c��|�d|��d} t�|��}|�|��}t |t jj��r"td|�d|j �d|j �����|���}d}|j }d}d|vrP|� d��} ttt| ����}|�|||||��t#|d ��5} |�|��} | rI|�| ��| �| ��|d z }|�|||||��nn�b|�||| ��ddd��n #1swxYwY||r|���SS#|r|���wwxYw) NzDownloading %szCan't download �: � rr5zcontent-lengthzContent-Length�wbTr9)r�r�r�r�r�r:r�r�rr�r�� dl_blocksize�get_all�maxr|�int� reporthookrr�r�rVr/r�) r�r>r`�fpr-r��blocknum�bs�size�sizesr.r�s r%� _download_tozPackageIndex._download_to�s�� � � �"�C�(�(�(� �� �!�*�*�3�/�/�G����s�#�#�B��"�f�l�4�5�5� �$�n�25�#�#�r�w�w�w����G�����g�g�i�i�G��H��"�B��D��7�*�*����(8�9�9���3�s�E�?�?�+�+������X�x��T�B�B�B��h��%�%� 8����G�G�B�K�K�E���� � �U�+�+�+�� � �%�(�(�(� �A� ������X�x��T�J�J�J�J��������3�7�7�7� 8� 8� 8� 8� 8� 8� 8� 8� 8� 8� 8���� 8� 8� 8� 8��� ���� � � � � ��r� ���� � � � � ���s1�C3F8� A;F� F8�F�F8�F�F8�8Gc��dSror�)r�r>r`rc�blksizeres r%razPackageIndex.reporthooks�� �r2c��|�d��rt|��S t||j��S#tt jjf$r]}d�d�|j D����}|r|� ||��nt|�d|����|�Yd}~dSd}~wtj j$r }|cYd}~Sd}~wtj j$rD}|r|� ||j��ntd|�d|j����|�Yd}~dSd}~wt jj$rC}|r|� ||j��nt|�d|j����|�Yd}~dSd}~wt jjt(j f$r:}|r|� ||��ntd|�d|����|�Yd}~dSd}~wwxYw)Nr1r[c�,�g|]}t|����Sr�)r})re�args r%rPz)PackageIndex.open_url..s��7�7�7��C��H�H�7�7�7r2zDownload error for rZz7 returned a bad status line. The server might be down, )r-� local_open�open_with_authr�r"�http�client� InvalidURLrlrpr�rr:r�r��URLError�reason� BadStatusLine�line� HTTPException�socket)r�r>�warning�vr�s r%r�zPackageIndex.open_urlso�� �>�>�'� "� "� #��c�?�?� "� T�!�#�t�{�3�3� 3���D�K�2�3� B� B� B��(�(�7�7���7�7�7�8�8�C�� B�� � �'�3�'�'�'�'�$����S�S�%9�:�:��A�(�'�'�'�'�'������|�%� � � ��H�H�H�H�H�H������|�$� � � �� �� � �'�1�8�,�,�,�,�$�n�36�3�3����A�����-�,�,�,�,�,����� �{�(� � � �� �� � �'�1�6�*�*�*�*�$�"%�#�#�q�v�v�/�����+�*�*�*�*�*����� � �)�6�<�8� T� T� T�� T�� � �'�1�%�%�%�%�$�n�C�C�C���%K�L�L�RS�S�&�%�%�%�%�%����� T���sL�;�G�AB.�.G�C �G� G�#9D"�"G�98E7�7#G�/G�Gc��t|��\}}|r3d|vr.|�dd���dd��}d|v�.nd}|�d��r |dd�}tj�||��}|dks|�d ��r|�||��S|d ks|�d ��r|�||��S|�d ��r|� ||��S|d krBtj � tj �|��d��S|�|d��|�||��S)Nz..�.�\�_�__downloaded__rPr*�svnzsvn+�gitzgit+zhg+r�rhT)rF�replacer,r_rBrlr-� _download_svn� _download_git� _download_hgr:r�� url2pathnamer!r;r��_attempt_download)r�r@r>r<r.rEr`s r%r9zPackageIndex._download_url4s���*�#�.�.���h� � $��$�,�,��|�|�D�#�.�.�6�6�t�S�A�A���$�,�,��$�D� �=�=�� $� $� �����9�D��7�<�<���-�-�� �U�?�?�f�/�/��7�7�?��%�%�c�8�4�4� 4� �u�_�_�� 1� 1�&� 9� 9�_��%�%�c�8�4�4� 4� � � �u� %� %� 9��$�$�S�(�3�3� 3� �v� � ��>�.�.�v�|�/D�/D�S�/I�/I�!�/L�M�M� M� �K�K��T� "� "� "��)�)�#�x�8�8� 8r2c�2�|�|d��dS)NT)r�rs r%rzPackageIndex.scan_urlQs�� ����d�#�#�#�#�#r2c��|�||��}d|�dd�����vr|�|||��S|S)Nr�r�r�)rgr�r+�_download_html)r�r>r`r�s r%r�zPackageIndex._attempt_downloadTsY���#�#�C��2�2�� �W�[�[���4�4�:�:�<�<� <� <��&�&�s�G�X�>�>� >��Or2c�t�t|��}|D]m}|���rWtjd|��r@|���t j|��|�||��cSn�n|���t j|��td|z���)Nz ([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) r��r~���rd���r����r����r_���r,��r���r���)r����r>���r����r`���r����ru��s��� r%���r���zPackageIndex._download_html[��s��������H�~�~���� �� �D��z�z�|�|�� ��9�@�$�G�G��=��J�J�L�L�L��I�h�'�'�'��-�-�c�8�<�<�<�<�<��� �� � � � � � � � �(�����=��C�D�D�Dr2���c�����������������������t����������j��������dt�����������������������|���������������������dd������������d���������}d}|��������������������������������������������������������d������������r�d|v�r�t ����������j�����������������������������|������������\��}}}}}} |s�|���������������������d������������r�d |d d�����������v�r�|d d��������������������������������d d������������\��}}t����������|������������\��} } | rTd | v�r"| ���������������������d d������������\��} } d | �d | ��}nd | z���}| }|||||| f}t ����������j��������� ��������������������|������������}|�� ��������������������d||�������������t����������j ��������d|�d|�d|���������������|S�)Nz"SVN download support is deprecatedr8���r9���r���r����zsvn:�@z//r4���rh����:z --username=z --password=z'Doing subversion checkout from %s to %sz svn checkoutz -q r[��)�warningsr����� UserWarningr=���r+���r-���r:���r!���r;���� _splituser� urlunparser����r_����system)r����r>���r`����credsr@����netlocrB���rf����qr�����auth�host�user�pwr?���s��� r%���r���zPackageIndex._download_svnj��s������� �:�K�H�H�H��i�i��Q����"���� �9�9�;�;� !� !�&� )� )�� 9�c�S�j�j�,2�L�,A�,A�#�,F�,F� )�F�F�D�!�Q���� 9�d�o�o�d�3�3�� 9��t�A�B�B�x���#�A�B�B�x�~�~�c�1�5�5� ���'��/�/� ��d���9��d�{�{�#'�:�:�c�1�#5�#5���b�b�BF�$�$��� K��� .�� 5��!�F�"�F�C��A�q�8�E� �,�1�1�%�8�8�C� � � �;�S�(�K�K�K� � � �u�u�u�c�c�c�8�8�D�E�E�E��r2���c������������������J����t�����������j�����������������������������|�������������\��}}}}}|���������������������dd������������d���������}|���������������������dd������������d���������}d�}d|v�r|���������������������dd������������\��}}t�����������j�����������������������������||||df������������}�|�|fS�)N�+r9���r5���r8���r���r���r����)r:���r!����urlsplitr=����rsplit� urlunsplit)r>���� pop_prefixr@���r���rB���rD���r���revs��� r%����_vcs_split_rev_from_urlz$PackageIndex._vcs_split_rev_from_url���s�������,2�L�,A�,A�#�,F�,F�)����e�T����c�1�%�%�b�)����z�z�#�q�!�!�!�$���� �$�;�;�� � �C��+�+�I�D�#���l�%�%�v�v�t�U�B�&G�H�H���C�x�r2���c������������������8����|����������������������dd������������d���������}|����������������������|d�������������\��}}|����������������������d||�������������t����������j��������d|�d|���������������|�0|����������������������d |�������������t����������j��������d |�d |���������������|S�) Nr8���r9���r���T�r���zDoing git clone from %s to %szgit clone --quiet r[��zChecking out %szgit -C z checkout --quiet �r=���r���r����r_���r����r����r>���r`���r���s��� r%���r���zPackageIndex._download_git���s��������>�>�#�q�)�)�!�,���/�/���/�E�E���S� � � �1�3��A�A�A� � � �s�s�s�H�H�=�>�>�>� �?� �I�I�'�� -� -� -� �I�I���H�H��C�� �� �� ���r2���c������������������:����|����������������������dd������������d���������}|����������������������|d�������������\��}}|����������������������d||�������������t����������j��������d|�d|���������������|�1|����������������������d |�������������t����������j��������d |�d |�d ��������������|S�) Nr8���r9���r���Tr���zDoing hg clone from %s to %szhg clone --quiet r[��zUpdating to %sz hg --cwd z up -C -r z -qr���r���s��� r%���r���zPackageIndex._download_hg���s��������>�>�#�q�)�)�!�,���/�/���/�E�E���S� � � �0�#�x�@�@�@� � � �c�c�c�8�8�<�=�=�=� �?� �I�I�&�� ,� ,� ,� �I�I���H�H��C�C�� �� �� ���r2���c������������������*�����t����������j��������|g|�R����d�S�ro���)r���r����r ��s��� r%���r����zPackageIndex.debug���s ������ � �#��������r2���c������������������*�����t����������j��������|g|�R����d�S�ro���)r���r����r ��s��� r%���r����zPackageIndex.info���� ������ ����t������r2���c������������������*�����t����������j��������|g|�R����d�S�ro���)r���r����r ��s��� r%���r����zPackageIndex.warn���r���r2���)r����r����NT)Fro���)FFFN)FF)*r����r����r����r����r����r����r����r����r����r��r����r��r����r��r��r&��r)��r/��r4��r(��r$��r6���r;��rL��r:��r]��rg��ra��r����r9��r��r���r���r���� staticmethodr���r���r���r����r����r����� __classcell__�r����s���@r%���r���r���/��s���������������E�E��-���� -��-��-��-��-��-�$!��!��!��!��!�31��31��31��31�j'��'��'��'�  ��  ��  ��  �?��?��?������ 2��2��2�  �� �� �: �� �� �&��&��&��&� �� �� �H��H��H��H��H��H� �� �� � )�� )�� )������ �� �� � P�� P�� P�L�����N?��N?��N?��N?�` �� �� �� �,��,��,�\��L�"��"��"�H �� �� � T�� T�� T�� T�D9��9��9�:$��$��$������ E�� E�� E������,���������\��"�����&�����&����������������������r2���r���z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c������������������T�����|�����������������������d������������}t����������j��������|������������S�)Nr���)rL���r�����unescape)rK����whats��� r%���� decode_entityr������s!������ �;�;�q�>�>�D� �=�� � �r2���c������������������,�����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_subr���)�texts��� r%���r����r�������s������� �m�T� *� *�*r2���c���������������������������fd�}|S�)Nc�����������������������������fd�}|S�)Nc�������������������������t����������j����������������������}t����������j���������������������� ���|�i�|��t����������j��������|�������������S�#�t����������j��������|�������������w�xY�wro���)rw���getdefaulttimeout�setdefaulttimeout)rp���rq���� old_timeoutrr����timeouts��� ��r%����_socket_timeoutz@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeout���sd������� �2�4�4�K� � $�W� -� -� -� 6��t�T�,�V�,�,��(��5�5�5�5���(��5�5�5�5���s ����A��Ar����)rr���r���r���s���` �r%���r���z'socket_timeout.<locals>._socket_timeout���s*�������� 6�� 6�� 6�� 6�� 6�� 6���r2���r����)r���r���s���` r%����socket_timeoutr������s$������� �� �� �� �� �� �r2���c������������������������t�����������j�����������������������������|�������������}|�����������������������������������}t ����������j��������|������������}|�����������������������������������}|���������������������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����)r:���r!���r<����encode�base64� b64encoder����r���)r����auth_s� auth_bytes� encoded_bytes�encodeds��� r%���� _encode_authr������s[��������\� !� !�$� '� '�F������J��$�Z�0�0�M��"�"�$�$�G� �?�?�4�� $� $�$r2���c��������������������$�����e�Zd�ZdZd��Zd��Zd��ZdS�)� Credentialz: A username/password pair. Use like a namedtuple. c������������������"�����||�_���������||�_��������d�S�ro�����username�password)r����r���r���s��� r%���r����zCredential.__init__��s������ �� � �� � � r2���c��������������#����.���K����|�j���������V���|�j��������V���d�S�ro���r���r����s��� r%����__iter__zCredential.__iter__��s(�����������m�����m�����r2���c������������������&�����dt����������|�������������z��S�)Nz%(username)s:%(password)s)�varsr����s��� r%����__str__zCredential.__str__ ��s������*�T�$�Z�Z�7�7r2���N)r����r����r����r����r����r���r���r����r2���r%���r���r������sK�����������������!��!��!������8��8��8��8��8r2���r���c��������������������@�������e�Zd�Z��fd�Zed����������������Zd��Zd��Z��xZS�)� PyPIConfigc������������������j�����t��������������������������������g�d�d������������}t���������������������������������������������|�������������t����������j�����������������������������t����������j�����������������������������d������������d������������}t����������j�����������������������������|������������r|�� ��������������������|�������������dS�dS�)z% Load from ~/.pypirc )r���r���� repositoryr�����~z.pypircN) �dict�fromkeysr����r����r_���rB���rl���� expanduserr����r����)r�����defaults�rcr����s��� �r%���r����zPyPIConfig.__init__��s����������=�=�!G�!G�!G��L�L�� ������"�"�"� �W�\�\�"�'�,�,�S�1�1�9� =� =�� �7�>�>�"� � �� � �I�I�b�M�M�M�M�M� �� r2���c���������������������������fd���������������������������������������D���������������}t����������t������������j��������|������������������������S�)Nc������������������d������g�|�],}�����������������������|d�������������������������������������������������*|��-S�)r���)r����r~���)re����sectionr����s��� �r%���rP��z2PyPIConfig.creds_by_repository.<locals>.<listcomp>��sI��������& ��& ��& ���x�x���.�.�4�4�6�6�& � �& ��& ��& r2���)�sectionsr���r|����_get_repo_cred)r�����sections_with_repositoriess���` r%����creds_by_repositoryzPyPIConfig.creds_by_repository��sR�������& ��& ��& ��& ��=�=�?�?�& ��& ��& �"� ��C��+�-G�H�H�I�I�Ir2���c����������������������|�����������������������|d�����������������������������������������������}|t����������|�����������������������|d�����������������������������������������������|�����������������������|d�����������������������������������������������������������fS�)Nr���r���r���)r����r~���r���)r����r����repos��� r%���r���zPyPIConfig._get_repo_cred#��st�������x�x���.�.�4�4�6�6���Z� �H�H�W�j� )� )� /� /� 1� 1� �H�H�W�j� )� )� /� /� 1� 1� �� �� �� r2���c������������������v�����|�j��������������������������������������������D�]\��}}|���������������������|������������r|c�S��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>���r����creds��� r%����find_credentialzPyPIConfig.find_credential*��sS������ �!%� 8� >� >� @� @�� �� � �J���~�~�j�)�)�� �� � � � � �� r2���) r����r����r����r�����propertyr���r���r���r���r���s���@r%���r���r��� ��st��������������� �� �� �� �� ���J��J���X�J� �� �� �������������r2���r���c�����������������������t�����������j�����������������������������|�������������}|\��}}}}}}|���������������������d������������rt����������j�����������������������������d�������������|dv�rt����������|������������\��} } nd} | sMt������������������������� ��������������������|�������������} | r*t����������| ������������} | j ��������|�f} t����������j ��������dg| �R����| rodt����������| ������������z���} || ||||f} t�����������j�����������������������������| ������������}t�����������j�����������������������������|������������}|���������������������d| �������������nt�����������j�����������������������������|�������������}|���������������������dt&������������������������||������������}| rct�����������j�����������������������������|j��������������������\��}}}}}}||k����r2|| k����r,||||||f} t�����������j�����������������������������| ������������|_��������|S�) z4Open a urllib2 request, handling HTTP authenticationr���znonnumeric port: '')ro���httpsNz*Authenticating as %s for %s (from .pypirc)zBasic � Authorizationz User-Agent)r:���r!���r;���r,���ro��rp��rq��r���r���r���r}���r���r���r����r���r���r�����Request� add_header� user_agentr>���)r>���r�����parsedr@���r���rB����paramsrD���r��r����addressr���r����r?���r��r����rb���s2�h2�path2�param2�query2�frag2s��� r%���rn��rn��4��s��������\� "� "�3� '� '�F�06�-�F�F�D�&�%������s����<��k�$�$�%:�;�;�;� �"�"�"�"�6�*�*� ��g�g��� ��J��|�|�+�+�C�0�0�� �� J��t�9�9�D��=�#�%�D� �H�A� I�D� I� I� I� I� ��.��,�t�,�,�,�����v�u�d�:���,�)�)�%�0�0���.�(�(��1�1�����?�D�1�1�1�1��.�(�(��-�-�� ���|�Z�0�0�0� �����B� ��4��06�|�/D�/D�R�V�/L�/L�,��B��v�v�u� ��<�<�B�'�M�M����v�v�u�<�E��\�,�,�U�3�3�B�F� �Ir2���c������������������D�����|�����������������������d������������\��}}}�|r|nd|�fS�)zNsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.r���N)� rpartition)r���r����delims��� r%���r���r���c��s0�����������,�,��D�%��� #�D�D�t�d� *�*r2���c�����������������������|�S�ro���r����)r>���s��� r%���� fix_sf_urlr���n��s������ �Jr2���c�����������������������t�����������j�����������������������������|�������������\��}}}}}}t�����������j�����������������������������|������������}t ����������j�����������������������������|������������rt�����������j�����������������������������|�������������S�|� ��������������������d�������������rt ����������j��������� ��������������������|������������r�g�}t ����������j ��������|������������D�]�} t ����������j��������� ��������������������|| ������������} | dk����r>t����������| d������������5�} | �����������������������������������} ddd�������������n #�1�swxY�w�Y����nzt ����������j��������� ��������������������| ������������r| dz ��} |���������������������d���������������������| ����������������������������d} | ���������������������|�d� ��������������������|������������� ������������} d \��}}nd \��}}} d d i}t#����������j��������| ������������}t�����������j�����������������������������|�||||������������S�)z7Read a local path, with special support for directoriesr4���z index.html�rNz<a href="{name}">{name}</a>)r.���zB<html><head><title>{url}{files}r�)r>�files)���OK)r�zPath not foundz Not foundr�z text/html)r:r!r;r�r�r_rB�isfiler�r,r�r�rlrr�r2�format�io�StringIOr�r�)r>r@rArB�paramrDrr`rr��filepathrb�bodyr��status�messager�� body_streams r%rmrmrs��/5�|�/D�/D�S�/I�/I�,�F�F�D�%����~�*�*�4�0�0�H� �w�~�~�h���C��~�%�%�c�*�*�*� ���s� � �C��� � �h� 7� 7�C�����H�%�%� @� @�A��w�|�|�H�a�0�0�H��L� � ��(�C�(�(�%�B��7�7�9�9�D�%�%�%�%�%�%�%�%�%�%�%����%�%�%�%�������x�(�(� ��S��� �L�L�6�=�=�1�=�E�E� F� F� F� F�X� ��;�;�3�d�i�i��.>�.>�;�?�?�D�#����� B������{�+�G��+�d�#�#�K� �<� !� !�#�v�w��� M� M�Ms�D(�(D, �/D, ro)r)Zr��sysr_rdrrTrwr�r�r�r�� configparserr�� http.clientro� urllib.parser:�urllib.request� urllib.error� functoolsrr� pkg_resourcesrrrrr r r r r rrrrr� distutilsr�distutils.errorsr�fnmatchr�setuptools.wheelr� setuptools.extern.more_itertoolsrr�rJ�IrrrKr�r=rW�__all__�_SOCKET_TIMEOUT�_tmplr� version_infor�r&rrFrrIrarrtrxr�r�r�rrr�r�r�r�r�r��RawConfigParserr�r�r�rnr�r�rmr�r2r%�r!s���*�*� � � � � � � � � � � � � � � � � � � � � � � � � � � � ����������������� � � � ����������������������������������������������������������� ������+�+�+�+�+�+�������"�"�"�"�"�"�<�<�<�<�<�<��r�z�6�7�7� ��r�z�3�R�T�:�:�� �2�:�J� � ���R�Z�,�b�d� 3� 3� 9� � .� 4� 4� 6� 6� � � � ����F�� �\�\� �W�^�S�-� .�:���� � ������0��� � � � � � � � �F����.2�k�TX�# �# �# �# �L � � ��b�j�K�R�T�R�R��� �L�L���L�$��������2�����.����BP �P �P �P �P �;�P �P �P �j�R�Z�<� =� =� A� ���� +� +� +� � � � �%�%�%�*8�8�8�8�8�8�8�8�"$�$�$�$�$��-�$�$�$�N &�~�5�+�+�+�+�^+�+�+�1����0�0��@�@�����N�N�N�N�Nr2