B
    #Y]6                 @   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dejZdd	d
ZG dd deZdS )    )print_functionN)OrderedDict)log)ZIP_DEFLATEDZipInfoZipFile)
WheelError)urlsafe_b64decode
as_unicodenativeurlsafe_b64encodeas_bytesStringIOzt^(?P<namever>(?P<name>.+?)-(?P<ver>.+?))(-(?P<build>\d[^-]*))?
     -(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)\.whl$c             C   s,   t tjd| pt } t| dd S )NSOURCE_DATE_EPOCHr      )intosenvirongettimeZgmtime)Z	timestamp r   .lib/python3.7/site-packages/wheel/wheelfile.pyget_zipinfo_datetime   s    r   c               @   sN   e Zd ZdZejZdddZdddZdd	 Z	dd
dZ
dddZdd ZdS )	WheelFilezA ZipFile derivative class that also reads SHA-256 hashes from
    .dist-info/RECORD and checks any read files against those.
    rc       
   
   C   s  t j|}t|| _|dr,| jd kr:td|t	j
| ||tdd d| jd| _| jd | _t | _i | _|dkrd	| j| j< d	| j| jd
 < d	| j| jd < y| | j}W n$ tk
r   td| jY nX | x|D ]}|d}|dd\}}}|r|d\}	}yt|	 W n$ tk
rX   td|	Y nX |	 dkrvtd|	|	t|df| j|< qW W d Q R X d S )Nz.whlzBad wheel filename {!r}T)ZcompressionZ
allowZip64z{}.dist-infoZnameverz/RECORDr   )NNz.jwsz.p7szMissing {} filezutf-8,   =zUnsupported hash algorithm: {}>   md5sha1z4Weak hash algorithm ({}) is not permitted by PEP 427ascii)r   pathbasenameWHEEL_INFO_REmatchZparsed_filenameendswithr   formatr   __init__r   groupZdist_info_pathrecord_pathr   _file_hashes_file_sizesopenKeyErrordecodersplitsplithashlibnew
ValueErrorlowerr	   encode)
selffilemoder"   recordliner!   Zhash_sumsize	algorithmr   r   r   r'   &   s@    


zWheelFile.__init__Nc                s   d fdd	}t | ||| tt|tr8|jn||dkrds| jkrltd	t
| j \}d k	rt| j|  _ S )Nc                sR   |d kr j }|  n
| | |  |rN krNtdtd S )NzHash mismatch for file '{}')Z_eofupdatedigestr   r&   r   )newdataeof)efef_nameexpected_hashrunning_hashupdate_crc_origr   r   _update_crcR   s    


z#WheelFile.open.<locals>._update_crcr   /zNo hash found for file '{}')N)r   r,   r
   
isinstancer   filenamer%   r*   r   r&   r   r1   r2   rF   )r6   Zname_or_infor8   pwdrF   r<   r   )rA   rB   rC   rD   rE   r   r,   Q   s    

zWheelFile.openc       	      C   s   t d| j| g }xt|D ]\}}}|  xrt|D ]f}tjtj	||}tj
|r<tj||}|| jkr|q<|dr|||f q<| || q<W q W |  x|D ]\}}| || qW d S )Nz#creating '%s' and adding '%s' to itz
.dist-info)loggerinforI   r   walksortsortedr!   normpathjoinisfilerelpathr)   r%   appendwrite)	r6   Zbase_dirZdeferredrootZdirnames	filenamesnamer!   arcnamer   r   r   write_filesl   s     

zWheelFile.write_filesc          	   C   sx   t |d}t| }| }W d Q R X t|p4|t|jd}t	|j
t|j
B d> |_t|_| ||| d S )Nrb)	date_time   )r,   r   fstatfilenoreadr   r   st_mtimestatS_IMODEst_modeS_IFMTexternal_attrr   compress_typewritestr)r6   rI   rY   rg   fstdatazinfor   r   r   rU      s    zWheelFile.writec             C   sr   t | ||| t|tr |jn|}td| || jkrn| |}|j	t
t| f| j|< t|| j|< d S )Nzadding '%s')r   rh   rH   r   rI   rK   rL   r)   _default_algorithmrX   r   r   r>   r*   lenr+   )r6   Zzinfo_or_arcnamebytesrg   fnamehash_r   r   r   rh      s    

zWheelFile.writestrc                s    j d k	r jdkr jrt }tj|dddd}| fdd j D  |t	 j
ddf tt j
t d	}t|_d
|_ |t|  t  d S )Nwr   "
)Z	delimiterZ	quotecharZlineterminatorc             3   s.   | ]&\}\}}||d  |  j | fV  qdS )r   N)r+   ).0rp   r<   rq   )r6   r   r   	<genexpr>   s   z"WheelFile.close.<locals>.<genexpr> )r\   i  )fpr8   r*   r   csvwriterZ	writerowsitemsZwriterowr&   r)   r   r   r   r   rg   rf   rh   r   getvaluer   close)r6   rk   rz   rl   r   )r6   r   r}      s    
zWheelFile.close)r   )r   N)NN)N)__name__
__module____qualname____doc__r1   Zsha256rm   r'   r,   rZ   rU   rh   r}   r   r   r   r   r      s   
+




r   )N) Z
__future__r   ry   r1   os.pathr   rerb   r   collectionsr   Z	distutilsr   rK   Zzipfiler   r   r   Z	wheel.clir   Z
wheel.utilr	   r
   r   r   r   r   compileVERBOSEr#   r   r   r   r   r   r   <module>   s     
