
}_2                 @   s   d  d l  m Z d  d l Z d  d l m Z m Z m Z d  d l m Z d  d l	 m
 Z
 m Z m Z d Z d d d g Z Gd	 d
   d
 e  Z Gd d   d e  Z d S)    )absolute_importN)HashMismatchHashMissingInstallationError)read_chunks)	iteritemsiterkeys
itervaluessha256sha384sha512c               @   sm   e  Z d  Z d Z d 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   //tmp/pip-build-3_sjtvrs/pip/pip/utils/hashes.py__init__   s    zHashes.__init__c             C   s   i  } xY t  |  j  D]H } y t j |  | | <Wq t t f k
 r] t d |   Yq Xq Wx2 | D]* } x! t |  D] } | j |  q| Wqi 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: %sN)r   r   hashlibnew
ValueError	TypeErrorr   r	   updater   	hexdigest_raise)r   chunksgots	hash_namechunkhashgotr   r   r   check_against_chunks    s    zHashes.check_against_chunksc             C   s   t  |  j |   d  S)N)r   r   )r   r   r   r   r   r   7   s    zHashes._raisec             C   s   |  j  t |   S)zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )r!   r   )r   filer   r   r   check_against_file:   s    zHashes.check_against_filec          	   C   s*   t  | d   } |  j |  SWd  QRXd  S)Nrb)openr#   )r   pathr"   r   r   r   check_against_pathB   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__F   s    zHashes.__nonzero__c             C   s
   |  j    S)N)r)   )r   r   r   r   __bool__J   s    zHashes.__bool__)__name__
__module____qualname____doc__r   r!   r   r#   r'   r)   r*   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)superr/   r   FAVORITE_HASH)r   )	__class__r   r   r   U   s    zMissingHashes.__init__c             C   s   t  | t j     d  S)N)r   r1   r   )r   r   r   r   r   r   [   s    zMissingHashes._raise)r+   r,   r-   r.   r   r   r   r   )r2   r   r/   N   s   r/   )
__future__r   r   pip.exceptionsr   r   r   	pip.utilsr   Zpip._vendor.sixr   r   r	   r1   STRONG_HASHESobjectr   r/   r   r   r   r   <module>   s   :