U
    :û<if  ã                   @   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   úZ/var/www/html/mysite/school/venv/lib/python3.8/site-packages/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)Ú.0Z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_nameZ
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ÚhashZgotr   r   r   Úcheck_against_chunks?   s    zHashes.check_against_chunksc                 C   s   t | j|ƒ‚d S r   )r   r   ©r   r0   r   r   r   r.   W   s    zHashes._raisec                 C   s   |   t|ƒ¡S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )r3   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)Úopenr6   )r   Úpathr5   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'   r3   r.   r6   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)ÚsuperrC   r   ÚFAVORITE_HASHr#   ©Ú	__class__r   r   r   z   s    zMissingHashes.__init__c                 C   s   t |t  ¡ ƒ‚d S r   )r   rE   r-   r4   r   r   r   r.   �   s    zMissingHashes._raise)r>   r?   r@   rA   r   r.   Ú__classcell__r   r   rF   r   rC   s   s   rC   )Ú
__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   rE   ÚSTRONG_HASHESÚobjectr   rC   r   r   r   r   Ú<module>   s   
O