o
    
j6h                     @   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   i/var/www/html/chefvision.cloud.itp360.com/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 )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	   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 )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.

    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