
(h                 @   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)BinaryIODictIteratorListNoReturn)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 d   Z d d   Z d S)HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    Nc             C   sL   i  } | d k	 r? x* | j    D] \ } } t |  | | <q W| |  _ d S)zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        N)itemssorted_allowed)selfhashesallowedalgkeys r   9/tmp/pip-build-kmztzv_d/pip/pip/_internal/utils/hashes.py__init__$   s
    zHashes.__init__c                s   t  | t  s t S| s  S s' | Si  } xO t | j  D]> \   }    j k r[ q=    f d d   | D |   <q= Wt |  S)Nc                s)   g  |  ] } |  j    k r |  q Sr   )r   ).0v)r   r   r   r    
<listcomp>B   s   	 z"Hashes.__and__.<locals>.<listcomp>)
isinstancer   NotImplementedr   r   )r   othernewvaluesr   )r   r   r    __and__1   s    $zHashes.__and__c             C   s    t  d d   |  j j   D  S)Nc             s   s   |  ] } t  |  Vq d  S)N)len)r"   Zdigestsr   r   r    	<genexpr>H   s    z&Hashes.digest_count.<locals>.<genexpr>)sumr   r)   )r   r   r   r    digest_countE   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_allowedJ   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gotsr0   chunkhashgotr   r   r    check_against_chunksS   s    zHashes.check_against_chunksc             C   s   t  |  j |   d  S)N)r   r   )r   r:   r   r   r    r8   m   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_fileq   s    zHashes.check_against_filec          	   C   s*   t  | d   } |  j |  SWd  QRXd  S)Nrb)openr@   )r   pathr?   r   r   r    check_against_pathz   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__   s    zHashes.__nonzero__c             C   s
   |  j    S)N)rF   )r   r   r   r    __bool__   s    zHashes.__bool__c             C   s#   t  | t  s t S|  j | j k S)N)r%   r   r&   r   )r   r'   r   r   r    __eq__   s    zHashes.__eq__c             C   s/   t  d j t d d   |  j j   D    S)N,c             s   s7   |  ]- \ } } | D] } d  j  | | f  Vq q d S):N)join)r"   r   Zdigest_listdigestr   r   r    r,      s   	z"Hashes.__hash__.<locals>.<genexpr>)r<   rK   r   r   r   )r   r   r   r    __hash__   s    		zHashes.__hash__)__name__
__module____qualname____doc__r!   r*   propertyr.   r1   r>   r8   r@   rD   rF   rG   rH   rM   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)superrS   r!   FAVORITE_HASH)r   )	__class__r   r    r!      s    zMissingHashes.__init__c             C   s   t  | t j     d  S)N)r   rU   r7   )r   r:   r   r   r    r8      s    zMissingHashes._raise)rN   rO   rP   rQ   r!   r8   r   r   )rV   r    rS      s   rS   )
__future__r   r2   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   rU   STRONG_HASHESobjectr   rS   r   r   r   r    <module>   s   (z