a
    ˆÀàg±  ã                   @   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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   úS/var/www/sistema_ama/venv/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 )z‚Check 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 )Ú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)Ú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