ó
b]c           @@  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 qÞ d  d
 l m Z n  d Z d d d g Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   i    (   t   absolute_importN(   t	   iteritemst   iterkeyst
   itervalues(   t   HashMismatcht   HashMissingt   InstallationError(   t   read_chunks(   t   MYPY_CHECK_RUNNING(   t   Dictt   Listt   BinaryIOt   NoReturnt   Iterator(   t   PY3(   t   _Hash(   t   _hasht   sha256t   sha384t   sha512t   Hashesc           B@  sh   e  Z d  Z d
 d „ Z e d „  ƒ Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d	 „  Z RS(   sa   A wrapper that builds multiple hashes at once and checks them against
    known-good values

    c         C@  s   | d k r i  n | |  _ d S(   so   
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        N(   t   Nonet   _allowed(   t   selft   hashes(    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyt   __init__'   s    c         C@  s   t  d „  |  j j ƒ  Dƒ ƒ S(   Nc         s@  s   |  ] } t  | ƒ Vq d  S(   N(   t   len(   t   .0t   digests(    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pys	   <genexpr>2   s    (   t   sumR   t   values(   R   (    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyt   digest_count/   s    c         C@  s   | |  j  j | g  ƒ k S(   s/   Return whether the given hex digest is allowed.(   R   t   get(   R   t	   hash_namet
   hex_digest(    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyt   is_hash_allowed4   s    c         C@  sá   i  } xX t  |  j ƒ D]G } y t j | ƒ | | <Wq t t f k
 r\ t d | ƒ ‚ q Xq Wx2 | D]* } x! t | ƒ D] } | j | ƒ q{ Wqh Wx7 t	 | ƒ D]) \ } } | j
 ƒ  |  j | k r£ d Sq£ W|  j | ƒ d S(   s‚   Check good hashes against ones built from iterable of chunks of
        data.

        Raise HashMismatch if none match.

        s   Unknown hash name: %sN(   R   R   t   hashlibt   newt
   ValueErrort	   TypeErrorR   R   t   updateR   t	   hexdigestt   _raise(   R   t   chunkst   gotsR!   t   chunkt   hasht   got(    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyt   check_against_chunks<   s    c         C@  s   t  |  j | ƒ ‚ d  S(   N(   R   R   (   R   R,   (    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyR*   T   s    c         C@  s   |  j  t | ƒ ƒ S(   sa   Check good hashes against a file-like object

        Raise HashMismatch if none match.

        (   R0   R   (   R   t   file(    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyt   check_against_fileX   s    c         C@  s)   t  | d ƒ  } |  j | ƒ SWd  QXd  S(   Nt   rb(   t   openR2   (   R   t   pathR1   (    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyt   check_against_patha   s    c         C@  s   t  |  j ƒ S(   s,   Return whether I know any known-good hashes.(   t   boolR   (   R   (    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyt   __nonzero__f   s    c         C@  s
   |  j  ƒ  S(   N(   R8   (   R   (    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyt   __bool__k   s    N(   t   __name__t
   __module__t   __doc__R   R   t   propertyR   R#   R0   R*   R2   R6   R8   R9   (    (    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyR   "   s   							t   MissingHashesc           B@  s    e  Z d  Z d „  Z d „  Z RS(   sÀ   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.

    c         C@  s$   t  t |  ƒ j d i g  t 6ƒ d S(   s!   Don't offer the ``hashes`` kwarg.R   N(   t   superR>   R   t   FAVORITE_HASH(   R   (    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyR   w   s    c         C@  s   t  | t j ƒ  ƒ ‚ d  S(   N(   R   R@   R)   (   R   R,   (    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyR*   ~   s    (   R:   R;   R<   R   R*   (    (    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyR>   p   s   	(   t
   __future__R    R$   t   pip._vendor.sixR   R   R   t   pip._internal.exceptionsR   R   R   t   pip._internal.utils.miscR   t   pip._internal.utils.typingR   t   typingR	   R
   R   R   R   R   R   R   R@   t   STRONG_HASHESt   objectR   R>   (    (    (    s9   lib/python2.7/site-packages/pip/_internal/utils/hashes.pyt   <module>   s   (N