a
    `                     @   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rd dlmZmZmZmZmZ d dlmZ erd d	lmZ nd d
lmZ dZg d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)BinaryIODictIteratorListNoReturn)PY3)_Hash)_hashsha256)r   Zsha384Zsha512c                   @   sv   e Zd ZdZdddZ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d Zdd ZdS )HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    Nc                 C   s4   i }|dur*|  D ]\}}t|||< q|| _dS )zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        N)itemssorted_allowed)selfhashesZallowedalgkeys r   </usr/lib/python3/dist-packages/pip/_internal/utils/hashes.py__init__$   s
    zHashes.__init__c                    sb   t |tstS |sS s|S i }t|jD ],\ } jvr@q, fdd|D | < q,t|S )Nc                    s   g | ]}|j   v r|qS r   )r   ).0vr   r   r   r   
<listcomp>B       z"Hashes.__and__.<locals>.<listcomp>)
isinstancer   NotImplementedr   r   )r   othernewvaluesr   r!   r   __and__1   s    

zHashes.__and__c                 C   s   t dd | j D S )Nc                 s   s   | ]}t |V  qd S N)len)r   Zdigestsr   r   r   	<genexpr>H   r#   z&Hashes.digest_count.<locals>.<genexpr>)sumr   r(   r   r   r   r   digest_countE   s    zHashes.digest_countc                 C   s   || j |g v S )z/Return whether the given hex digest is allowed.)r   get)r   	hash_nameZ
hex_digestr   r   r   is_hash_allowedJ   s    zHashes.is_hash_allowedc              
   C   s   i }t | jD ]<}zt|||< W q ttfyH   td|Y q0 q|D ]}t|D ]}|	| q\qPt
|D ] \}}| | j| v rv dS qv| | dS )zCheck good hashes against ones built from iterable of chunks of
        data.

        Raise HashMismatch if none match.

        zUnknown hash name: {}N)r   r   hashlibr'   
ValueError	TypeErrorr   formatr   updater   	hexdigest_raise)r   Zchunksgotsr1   chunkhashZgotr   r   r   check_against_chunksS   s    zHashes.check_against_chunksc                 C   s   t | j|d S r*   )r   r   r   r:   r   r   r   r9   m   s    zHashes._raisec                 C   s   |  t|S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )r=   r	   )r   filer   r   r   check_against_fileq   s    zHashes.check_against_filec                 C   s8   t |d}| |W  d    S 1 s*0    Y  d S )Nrb)openr@   )r   pathr?   r   r   r   check_against_pathz   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__   s    zHashes.__nonzero__c                 C   s   |   S r*   )rF   r.   r   r   r   __bool__   s    zHashes.__bool__c                 C   s   t |tstS | j|jkS r*   )r$   r   r%   r   )r   r&   r   r   r   __eq__   s    
zHashes.__eq__c                 C   s"   t dtdd | j D S )N,c                 s   s*   | ]"\}}|D ]}d  ||fV  qqdS ):N)join)r   r   Zdigest_listZdigestr   r   r   r,      s   z"Hashes.__hash__.<locals>.<genexpr>)r<   rK   r   r   r   r.   r   r   r   __hash__   s
    zHashes.__hash__)N)__name__
__module____qualname____doc__r   r)   propertyr/   r2   r=   r9   r@   rD   rF   rG   rH   rL   r   r   r   r   r      s   

		r   c                       s(   e Zd ZdZ fddZdd Z  ZS )MissingHasheszA 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)superrR   r   FAVORITE_HASHr.   	__class__r   r   r      s    zMissingHashes.__init__c                 C   s   t |t  d S r*   )r   rT   r8   r>   r   r   r   r9      s    zMissingHashes._raise)rM   rN   rO   rP   r   r9   __classcell__r   r   rU   r   rR      s   rR   )Z
__future__r   r3   Zpip._vendor.sixr   r   r   Zpip._internal.exceptionsr   r   r   Zpip._internal.utils.miscr	   Zpip._internal.utils.typingr
   typingr   r   r   r   r   r   r   r   rT   ZSTRONG_HASHESobjectr   rR   r   r   r   r   <module>   s   z