a
    e                     @   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   sha384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hashesallowedalgkeys r   N/var/www/sunrise/env/lib/python3.9/site-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   chunksgotsr4   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    r<   m   s    zHashes._raisec                 C   s   |  t|S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )rA   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)openrD   )r   pathrC   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   r1   r   r   r    __nonzero__   s    zHashes.__nonzero__c                 C   s   |   S r-   )rJ   r1   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_listdigestr   r   r    r/      s   z"Hashes.__hash__.<locals>.<genexpr>)r@   rO   r   r   r   r1   r   r   r    __hash__   s
    zHashes.__hash__)N)__name__
__module____qualname____doc__r!   r,   propertyr2   r5   rA   r<   rD   rH   rJ   rK   rL   rQ   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)superrW   r!   FAVORITE_HASHr1   	__class__r   r    r!      s    zMissingHashes.__init__c                 C   s   t |t  d S r-   )r   rY   r;   rB   r   r   r    r<      s    zMissingHashes._raise)rR   rS   rT   rU   r!   r<   __classcell__r   r   rZ   r    rW      s   rW   )
__future__r   r6   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   rY   STRONG_HASHESobjectr   rW   r   r   r   r    <module>   s   z