
0c@_                 @   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 d d d g Z Gd d   d e  Z Gd d   d e  Z d S)    )absolute_importN)	iteritemsiterkeys
itervalues)HashMismatchHashMissingInstallationError)read_chunks)MYPY_CHECK_RUNNING)DictListBinaryIONoReturnIterator)PY3)_Hash)_hashsha256sha384sha512c               @   s   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 S)HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    Nc             C   s   | d k r i  n | |  _  d S)zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        N)_allowed)selfhashes r   9/tmp/pip-build-jynh7p1z/pip/pip/_internal/utils/hashes.py__init__)   s    zHashes.__init__c             C   s}   t  | t  s t S|  j j   } xN t | j  D]= \ } } y | | | 7<Wq2 t k
 rn | | | <Yq2 Xq2 Wt |  S)N)
isinstancer   NotImplementedr   copyr   KeyError)r   othernewZalgvaluesr   r   r   __or__1   s    zHashes.__or__c             C   s    t  d d   |  j j   D  S)Nc             s   s   |  ] } t  |  Vq d  S)N)len).0Zdigestsr   r   r   	<genexpr>@   s    z&Hashes.digest_count.<locals>.<genexpr>)sumr   r#   )r   r   r   r   digest_count=   s    zHashes.digest_countc             C   s   | |  j  j | g   k S)z/Return whether the given hex digest is allowed.)r   get)r   	hash_nameZ
hex_digestr   r   r   is_hash_allowedB   s    zHashes.is_hash_allowedc             C   s   i  } x^ t  |  j  D]M } y t j |  | | <Wq t t f k
 rb t d j |    Yq Xq Wx2 | D]* } x! t |  D] } | j	 |  q Wqn Wx7 t
 |  D]) \ } } | j   |  j | k r d Sq W|  j |  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gotsr+   chunkhashgotr   r   r   check_against_chunksK   s    zHashes.check_against_chunksc             C   s   t  |  j |   d  S)N)r   r   )r   r5   r   r   r   r3   e   s    zHashes._raisec             C   s   |  j  t |   S)zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )r9   r	   )r   filer   r   r   check_against_filei   s    zHashes.check_against_filec          	   C   s*   t  | d   } |  j |  SWd  QRXd  S)Nrb)openr;   )r   pathr:   r   r   r   check_against_pathr   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   __nonzero__w   s    zHashes.__nonzero__c             C   s
   |  j    S)N)rA   )r   r   r   r   __bool__|   s    zHashes.__bool__)__name__
__module____qualname____doc__r   r$   propertyr)   r,   r9   r3   r;   r?   rA   rB   r   r   r   r   r   $   s   		r   c                   s4   e  Z d  Z d Z   f d d   Z d d   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 d t g  i  d S)z!Don't offer the ``hashes`` kwarg.r   N)superrH   r   FAVORITE_HASH)r   )	__class__r   r   r      s    zMissingHashes.__init__c             C   s   t  | t j     d  S)N)r   rJ   r2   )r   r5   r   r   r   r3      s    zMissingHashes._raise)rC   rD   rE   rF   r   r3   r   r   )rK   r   rH      s   rH   )
__future__r   r-   Zpip._vendor.sixr   r   r   Zpip._internal.exceptionsr   r   r   Zpip._internal.utils.miscr	   Zpip._internal.utils.typingr
   Ztypingr   r   r   r   r   r   r   r   rJ   STRONG_HASHESobjectr   rH   r   r   r   r   <module>   s   (]