U
    «ÃT_f  ã                   @   sÐ   d dl mZ d dlZd dlmZmZmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZ eržd dlmZmZmZmZmZ d dlmZ er’d d	lmZ nd d
lmZ dZdddgZG dd„ deƒZG dd„ deƒZdS )é    )Úabsolute_importN)Ú	iteritemsÚiterkeysÚ
itervalues)ÚHashMismatchÚHashMissingÚInstallationError)Úread_chunks)ÚMYPY_CHECK_RUNNING)ÚDictÚListÚBinaryIOÚNoReturnÚIterator)ÚPY3)Ú_Hash)Ú_hashÚsha256Úsha384Úsha512c                   @   s^   e Zd ZdZddd„Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚHasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    Nc                 C   s   |dkri n|| _ dS )zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        N)Ú_allowed)ÚselfÚhashes© r   ú>/tmp/pip-unpacked-wheel-8u7dkzi1/pip/_internal/utils/hashes.pyÚ__init__)   s    zHashes.__init__c                 C   s   t dd„ | j ¡ D ƒƒS )Nc                 s   s   | ]}t |ƒV  qd S ©N)Úlen)Ú.0Údigestsr   r   r   Ú	<genexpr>4   s     z&Hashes.digest_count.<locals>.<genexpr>)Úsumr   Úvalues©r   r   r   r   Údigest_count1   s    zHashes.digest_countc                 C   s   || j  |g ¡kS )z/Return whether the given hex digest is allowed.)r   Úget)r   Ú	hash_nameÚ
hex_digestr   r   r   Úis_hash_allowed6   s    zHashes.is_hash_allowedc              
   C   s¦   i }t | jƒD ]<}zt |¡||< W q ttfk
rH   td| ƒ‚Y qX q|D ]}t|ƒD ]}| |¡ q\qPt	|ƒD ] \}}| 
¡ | j| krv dS qv|  |¡ dS )z‚Check good hashes against ones built from iterable of chunks of
        data.

        Raise HashMismatch if none match.

        zUnknown hash name: %sN)r   r   ÚhashlibÚnewÚ
ValueErrorÚ	TypeErrorr   r   Úupdater   Ú	hexdigestÚ_raise)r   ÚchunksÚgotsr'   ÚchunkÚhashÚgotr   r   r   Úcheck_against_chunks?   s    zHashes.check_against_chunksc                 C   s   t | j|ƒ‚d S r   )r   r   ©r   r2   r   r   r   r0   W   s    zHashes._raisec                 C   s   |   t|ƒ¡S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )r6   r	   )r   Úfiler   r   r   Úcheck_against_file[   s    zHashes.check_against_filec              
   C   s,   t |dƒ�}|  |¡W  5 Q R £ S Q R X d S )NÚrb)Úopenr9   )r   Úpathr8   r   r   r   Úcheck_against_pathd   s    zHashes.check_against_pathc                 C   s
   t | jƒS )z,Return whether I know any known-good hashes.)Úboolr   r$   r   r   r   Ú__nonzero__i   s    zHashes.__nonzero__c                 C   s   |   ¡ S r   )r?   r$   r   r   r   Ú__bool__n   s    zHashes.__bool__)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr%   r)   r6   r0   r9   r=   r?   r@   r   r   r   r   r   $   s   

		r   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚMissingHasheszÀA workalike for Hashes used when we're missing a hash for a requirement

    It computes the actual hash of the requirement and raises a HashMissing
    exception showing it to the user.

    c                    s   t t| ƒjtg id� dS )z!Don't offer the ``hashes`` kwarg.)r   N)ÚsuperrF   r   ÚFAVORITE_HASHr$   ©Ú	__class__r   r   r   z   s    zMissingHashes.__init__c                 C   s   t |t  ¡ ƒ‚d S r   )r   rH   r/   r7   r   r   r   r0   �   s    zMissingHashes._raise)rA   rB   rC   rD   r   r0   Ú__classcell__r   r   rI   r   rF   s   s   rF   )Ú
__future__r   r*   Zpip._vendor.sixr   r   r   Úpip._internal.exceptionsr   r   r   Úpip._internal.utils.miscr	   Úpip._internal.utils.typingr
   Útypingr   r   r   r   r   r   r   r   rH   ÚSTRONG_HASHESÚobjectr   rF   r   r   r   r   Ú<module>   s   
O