o
    Ëý°jË  ã                   @   sŽ   d dl Z d dlmZmZmZmZmZ d dlmZm	Z	m
Z
 d dlmZ er0d dl mZ d dlmZ dZg d¢ZG d	d
„ d
ƒZG dd„ deƒZdS )é    N)ÚTYPE_CHECKINGÚBinaryIOÚDictÚIteratorÚList)ÚHashMismatchÚHashMissingÚInstallationError)Úread_chunks)Ú_Hash)ÚNoReturnÚsha256)r   Úsha384Úsha512c                   @   sä   e Zd ZdZd$deeee f ddfdd„Zd%dd	„Ze	de
fd
d„ƒZdededefdd„Zdee ddfdd„Zdeedf ddfdd„Zdeddfdd„Zdeddfdd„Zdefdd„Zdedefd d!„Zde
fd"d#„ZdS )&ÚHasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    NÚhashesÚreturnc                 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)Úselfr   ÚallowedÚalgÚkeys© r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pip/_internal/utils/hashes.pyÚ__init__   s
   
zHashes.__init__Úotherc                    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   )Ú.0Úv©r   r   r   r   Ú
<listcomp>;   s    z"Hashes.__and__.<locals>.<listcomp>)Ú
isinstancer   ÚNotImplementedr   r   )r   r   ÚnewÚvaluesr   r    r   Ú__and__+   s   

zHashes.__and__c                 C   s   t dd„ | j ¡ D ƒƒS )Nc                 s   s   � | ]}t |ƒV  qd S ©N)Úlen)r   Údigestsr   r   r   Ú	<genexpr>@   s   € z&Hashes.digest_count.<locals>.<genexpr>)Úsumr   r%   ©r   r   r   r   Údigest_count>   s   zHashes.digest_countÚ	hash_nameÚ
hex_digestc                 C   s   || j  |g ¡v S )z/Return whether the given hex digest is allowed.)r   Úget)r   r.   r/   r   r   r   Úis_hash_allowedB   s   zHashes.is_hash_allowedÚchunksc              
   C   s    i }| j  ¡ D ]}z	t |¡||< W q ttfy"   td|› �ƒ‚w |D ]}| ¡ D ]}| |¡ q+q%| 	¡ D ]\}}| 
¡ | j | v rH dS q8|  |¡ 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   r2   Úgotsr.   ÚchunkÚhashÚgotr   r   r   Úcheck_against_chunksF   s    ÿÿÿzHashes.check_against_chunksr9   r   r   c                 C   s   t | j|ƒ‚r'   )r   r   ©r   r9   r   r   r   r8   ]   s   zHashes._raiseÚfilec                 C   s   |   t|ƒ¡S )zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )r=   r
   )r   r?   r   r   r   Úcheck_against_file`   s   zHashes.check_against_fileÚpathc                 C   s8   t |dƒ�}|  |¡W  d   ƒ S 1 sw   Y  d S )NÚrb)Úopenr@   )r   rA   r?   r   r   r   Úcheck_against_pathh   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   Ú__bool__l   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__p   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*   x   s   € ýþÿz"Hashes.__hash__.<locals>.<genexpr>)r;   rJ   r   r   r   r,   r   r   r   Ú__hash__u   s   þÿÿzHashes.__hash__r'   )r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ústrr   r   r&   ÚpropertyÚintr-   rE   r1   r   Úbytesr=   r8   r   r@   rD   rF   ÚobjectrG   rM   r   r   r   r   r      s     
r   c                       s<   e Zd ZdZd‡ fdd„Zdeedf ddf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   Nc                    s   t ƒ jtg id� dS )z!Don't offer the ``hashes`` kwarg.)r   N)Úsuperr   ÚFAVORITE_HASHr,   ©Ú	__class__r   r   r   ‰   s   zMissingHashes.__init__r9   r   r   c                 C   s   t |t  ¡ ƒ‚r'   )r   rY   r7   r>   r   r   r   r8   �   s   zMissingHashes._raise)r   N)	rN   rO   rP   rQ   r   r   rR   r8   Ú__classcell__r   r   rZ   r   rW   �   s    "rW   )r3   Útypingr   r   r   r   r   Úpip._internal.exceptionsr   r   r	   Úpip._internal.utils.miscr
   r   r   rY   ÚSTRONG_HASHESr   rW   r   r   r   r   Ú<module>   s    h