a
    ñ»j†  ã                   @  s’   d dl mZ d dlZd dlmZ d dlmZmZmZ d dl	m
Z
mZmZ d dlmZ erdd dlmZ dZg d	¢ZG d
d„ dƒZG dd„ deƒZdS )é    )ÚannotationsN)ÚIterable)ÚTYPE_CHECKINGÚBinaryIOÚNoReturn)ÚHashMismatchÚHashMissingÚInstallationError)Úread_chunks)Ú_HashÚsha256)r   Úsha384Úsha512c                   @  sÒ   e Zd ZdZd.dddœdd„Zd d dœd	d
„Zeddœdd„ƒZddddœdd„Zdddœdd„Z	dddœdd„Z
dddœdd „Zddd!œd"d#„Zd$ddœd%d&„Zddœd'd(„Zd)ddœd*d+„Zddœd,d-„ZdS )/ÚHasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    Nzdict[str, list[str]] | NoneÚNone)ÚhashesÚreturnc                 C  s>   i }|dur4|  ¡ D ]\}}dd„ t|ƒD ƒ||< q|| _dS )zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        Nc                 S  s   g | ]}|  ¡ ‘qS © )Úlower)Ú.0Úkr   r   ú@E:\soccer\ml_env\Lib\site-packages\pip/_internal/utils/hashes.pyÚ
<listcomp>'   ó    z#Hashes.__init__.<locals>.<listcomp>)ÚitemsÚsortedÚ_allowed)Úselfr   ÚallowedÚalgÚkeysr   r   r   Ú__init__   s
    zHashes.__init__)Úotherr   c                   sb   t |tƒstS |sˆS ˆs|S i }|j ¡ D ],\‰ }ˆ ˆjvr@q,‡ ‡fdd„|D ƒ|ˆ < q,t|ƒS )Nc                   s   g | ]}|ˆj ˆ  v r|‘qS r   )r   )r   Úv©r   r   r   r   r   :   r   z"Hashes.__and__.<locals>.<listcomp>)Ú
isinstancer   ÚNotImplementedr   r   )r   r"   ÚnewÚvaluesr   r$   r   Ú__and__*   s    

zHashes.__and__Úint©r   c                 C  s   t dd„ | j ¡ D ƒƒS )Nc                 s  s   | ]}t |ƒV  qd S ©N)Úlen)r   Údigestsr   r   r   Ú	<genexpr>?   r   z&Hashes.digest_count.<locals>.<genexpr>)Úsumr   r(   ©r   r   r   r   Údigest_count=   s    zHashes.digest_countÚstrÚbool)Ú	hash_nameÚ
hex_digestr   c                 C  s   || j  |g ¡v S )z/Return whether the given hex digest is allowed.)r   Úget)r   r5   r6   r   r   r   Úis_hash_allowedA   s    zHashes.is_hash_allowedzIterable[bytes])Úchunksr   c              
   C  s¦   i }| j  ¡ D ]<}zt |¡||< W q ttfyH   td|› �ƒ‚Y q0 q|D ]}| ¡ D ]}| |¡ q\qP| 	¡ 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	   r(   Úupdater   Ú	hexdigestÚ_raise)r   r9   Úgotsr5   ÚchunkÚhashÚgotr   r   r   Úcheck_against_chunksE   s    zHashes.check_against_chunksúdict[str, _Hash]r   ©r@   r   c                 C  s   t | j|ƒ‚d S r,   )r   r   ©r   r@   r   r   r   r?   \   s    zHashes._raiser   )Úfiler   c                 C  s   |   t|ƒ¡S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )rD   r
   )r   rH   r   r   r   Úcheck_against_file_   s    zHashes.check_against_file)Úpathr   c                 C  s8   t |dƒ�}|  |¡W  d   ƒ S 1 s*0    Y  d S )NÚrb)ÚopenrI   )r   rJ   rH   r   r   r   Úcheck_against_pathg   s    zHashes.check_against_pathzdict[str, str]c                 C  s(   |  ¡ D ]\}}|  ||¡r dS qdS )z3Return whether any of the given hashes are allowed.TF)r   r8   )r   r   r5   r6   r   r   r   Ú
has_one_ofk   s    zHashes.has_one_ofc                 C  s
   t | jƒS )z,Return whether I know any known-good hashes.)r4   r   r1   r   r   r   Ú__bool__r   s    zHashes.__bool__Úobjectc                 C  s   t |tƒstS | j|jkS r,   )r%   r   r&   r   )r   r"   r   r   r   Ú__eq__v   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   Údigest_listÚdigestr   r   r   r/   ~   s   þz"Hashes.__hash__.<locals>.<genexpr>)rB   rT   r   r   r   r1   r   r   r   Ú__hash__{   s    þÿÿzHashes.__hash__)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r)   Úpropertyr2   r8   rD   r?   rI   rM   rN   rO   rQ   rW   r   r   r   r   r      s   r   c                      s6   e Zd ZdZddœ‡ fdd„Zdddœ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.

    r   r+   c                   s   t ƒ jtg id� dS )z!Don't offer the ``hashes`` kwarg.)r   N)Úsuperr!   ÚFAVORITE_HASHr1   ©Ú	__class__r   r   r!   �   s    zMissingHashes.__init__rE   r   rF   c                 C  s   t |t  ¡ ƒ‚d S r,   )r   r_   r>   rG   r   r   r   r?   •   s    zMissingHashes._raise)rX   rY   rZ   r[   r!   r?   Ú__classcell__r   r   r`   r   r]   ‡   s   r]   )Ú
__future__r   r:   Úcollections.abcr   Útypingr   r   r   Úpip._internal.exceptionsr   r   r	   Úpip._internal.utils.miscr
   r   r_   ÚSTRONG_HASHESr   r]   r   r   r   r   Ú<module>   s   o