ó
"j]c           @  s  d  d l  m Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l	 m
 Z
 d  d l m Z d  d l m Z m Z m Z d  d l m Z d  d l m Z m Z m Z m Z m Z m Z e j d e j ƒ Z d d	 „ Z d
 e f d „  ƒ  YZ  d S(   iÿÿÿÿ(   t   print_functionN(   t   OrderedDict(   t   log(   t   ZIP_DEFLATEDt   ZipInfot   ZipFile(   t
   WheelError(   t   urlsafe_b64decodet
   as_unicodet   nativet   urlsafe_b64encodet   as_bytest   StringIOst   ^(?P<namever>(?P<name>.+?)-(?P<ver>.+?))(-(?P<build>\d[^-]*))?
     -(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)\.whl$c         C  s;   t  t j j d |  p t j ƒ  ƒ ƒ }  t j |  ƒ d d !S(   Nt   SOURCE_DATE_EPOCHi    i   (   t   intt   ost   environt   gett   timet   gmtime(   t	   timestamp(    (    s0   /tmp/pip-install-MqWfHP/wheel/wheel/wheelfile.pyt   get_zipinfo_datetime   s    't	   WheelFilec           B  s_   e  Z d  Z e j Z d d „ Z d d d „ Z d „  Z	 d d d „ Z
 d d „ Z d „  Z RS(	   s‚   A ZipFile derivative class that also reads SHA-256 hashes from
    .dist-info/RECORD and checks any read files against those.
    t   rc   
      C  s<  t  j j | ƒ } t j | ƒ |  _ | j d ƒ sC |  j d  k r[ t d j	 | ƒ ƒ ‚ n  t
 j |  | | d t d t ƒd j	 |  j j d ƒ ƒ |  _ |  j d |  _ t ƒ  |  _ i  |  _ | d k r8d |  j |  j <d |  j |  j d	 <d |  j |  j d
 <y |  j |  j ƒ } Wn) t k
 rBt d j	 |  j ƒ ƒ ‚ n X| ê xâ | D]Ú } | j d ƒ } | j d d ƒ \ } } } | rQ| j d ƒ \ }	 } y t j |	 ƒ Wn& t k
 rÕt d j	 |	 ƒ ƒ ‚ n X|	 j ƒ  d d h k rt d j	 |	 ƒ ƒ ‚ n  |	 t | j d ƒ ƒ f |  j | <qQqQWWd  QXn  d  S(   Ns   .whls   Bad wheel filename {!r}t   compressiont
   allowZip64s   {}.dist-infot   namevers   /RECORDR   s   .jwss   .p7ss   Missing {} files   utf-8u   ,i   u   =s   Unsupported hash algorithm: {}t   md5t   sha1s4   Weak hash algorithm ({}) is not permitted by PEP 427t   ascii(   NN(   NN(   NN(   R   t   patht   basenamet   WHEEL_INFO_REt   matcht   parsed_filenamet   endswitht   NoneR   t   formatR   t   __init__R   t   Truet   groupt   dist_info_patht   record_pathR   t   _file_hashest   _file_sizest   opent   KeyErrort   decodet   rsplitt   splitt   hashlibt   newt
   ValueErrort   lowerR   t   encode(
   t   selft   filet   modeR   t   recordt   lineR   t   hash_sumt   sizet	   algorithm(    (    s0   /tmp/pip-install-MqWfHP/wheel/wheel/wheelfile.pyR&   &   s@    	c           sî   d  ‡ ‡ ‡ ‡ ‡  f d † } t j |  | | | ƒ ‰ t t | t ƒ rQ | j n | ƒ ‰ | d k rê ˆ j d ƒ rê ˆ |  j k r£ t	 d j
 t ˆ ƒ ƒ ƒ ‚ n  |  j ˆ \ } ‰ ˆ d  k	 rê t j | ƒ ‰ ˆ j | ‰  ˆ _ qê n  ˆ S(   Nc           sv   | d  k r" ˆ j } ˆ |  ƒ n ˆ |  | ƒ ˆ j |  ƒ | rr ˆ j ƒ  ˆ k rr t d j t ˆ  ƒ ƒ ƒ ‚ n  d  S(   Ns   Hash mismatch for file '{}'(   R$   t   _eoft   updatet   digestR   R%   R	   (   t   newdatat   eof(   t   ef_namet   eft   running_hasht   expected_hasht   update_crc_orig(    s0   /tmp/pip-install-MqWfHP/wheel/wheel/wheelfile.pyt   _update_crcR   s    	R   t   /s   No hash found for file '{}'(   R$   R   R-   R   t
   isinstanceR   t   filenameR#   R+   R   R%   R	   R2   R3   RI   (   R7   t   name_or_infoR9   t   pwdRI   R>   (    (   RH   RE   RG   RF   RD   s0   /tmp/pip-install-MqWfHP/wheel/wheel/wheelfile.pyR-   Q   s    	c   	      C  s'  t  j d |  j | ƒ g  } xÓ t j | ƒ D]Â \ } } } | j ƒ  x¦ t | ƒ D]˜ } t j j t j j	 | | ƒ ƒ } t j j
 | ƒ rR t j j | | ƒ } | |  j k r² qê | j d ƒ r× | j | | f ƒ qê |  j | | ƒ qR qR Wq, W| j ƒ  x$ | D] \ } } |  j | | ƒ qWd  S(   Ns#   creating '%s' and adding '%s' to its
   .dist-info(   t   loggert   infoRL   R   t   walkt   sortt   sortedR   t   normpatht   joint   isfilet   relpathR*   R#   t   appendt   write(	   R7   t   base_dirt   deferredt   roott   dirnamest	   filenamest   nameR   t   arcname(    (    s0   /tmp/pip-install-MqWfHP/wheel/wheel/wheelfile.pyt   write_filesl   s     
!
c         C  s£   t  | d ƒ ( } t j | j ƒ  ƒ } | j ƒ  } Wd  QXt | pE | d t | j ƒ ƒ} t j	 | j
 ƒ t j | j
 ƒ Bd >| _ t | _ |  j | | | ƒ d  S(   Nt   rbt	   date_timei   (   R-   R   t   fstatt   filenot   readR   R   t   st_mtimet   statt   S_IMODEt   st_modet   S_IFMTt   external_attrR   t   compress_typet   writestr(   R7   RL   R`   Rm   t   ft   stt   datat   zinfo(    (    s0   /tmp/pip-install-MqWfHP/wheel/wheel/wheelfile.pyRY   ‚   s    !)	c         C  s¤   t  j |  | | | ƒ t | t ƒ r. | j n | } t j d | ƒ | |  j k r  |  j | ƒ } | j	 t
 t | j ƒ  ƒ ƒ f |  j | <t | ƒ |  j | <n  d  S(   Ns   adding '%s'(   R   Rn   RK   R   RL   RO   RP   R*   t   _default_algorithmR_   R	   R
   RA   R+   t   lenR,   (   R7   t   zinfo_or_arcnamet   bytesRm   t   fnamet   hash_(    (    s0   /tmp/pip-install-MqWfHP/wheel/wheel/wheelfile.pyRn   Œ   s    (c      
     sö   ˆ  j  d  k	 rå ˆ  j d k rå ˆ  j rå t ƒ  } t j | d d d d d d ƒ} | j ‡  f d †  ˆ  j j ƒ  Dƒ ƒ | j	 t
 ˆ  j ƒ d	 d	 f ƒ t t ˆ  j ƒ d
 t ƒ  ƒ} t | _ d | _ ˆ  j | t | j ƒ  ƒ ƒ n  t j ˆ  ƒ d  S(   Nt   wt	   delimitert   ,t	   quotechart   "t   lineterminators   
c         3  s9   |  ]/ \ } \ } } | | d  | ˆ  j  | f Vq d S(   t   =N(   R,   (   t   .0Rw   R>   Rx   (   R7   (    s0   /tmp/pip-install-MqWfHP/wheel/wheel/wheelfile.pys	   <genexpr>œ   s   t    Rc   i´  i   i  ´(   t   fpR$   R9   R+   R   t   csvt   writert	   writerowst   itemst   writerowR%   R*   R   R	   R   R   Rm   Rl   Rn   R   t   getvalueR   t   close(   R7   Rq   R„   Rr   (    (   R7   s0   /tmp/pip-install-MqWfHP/wheel/wheel/wheelfile.pyR‰   –   s    '	!		N(   t   __name__t
   __module__t   __doc__R2   t   sha256Rs   R&   R$   R-   Ra   RY   Rn   R‰   (    (    (    s0   /tmp/pip-install-MqWfHP/wheel/wheel/wheelfile.pyR      s   	+	

(!   t
   __future__R    Rƒ   R2   t   os.pathR   t   reRh   R   t   collectionsR   t	   distutilsR   RO   t   zipfileR   R   R   t	   wheel.cliR   t
   wheel.utilR   R   R	   R
   R   R   t   compilet   VERBOSER    R$   R   R   (    (    (    s0   /tmp/pip-install-MqWfHP/wheel/wheel/wheelfile.pyt   <module>   s    .