3
e                 @   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	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krd d	lmZ d
d Zndd Zej 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StringIO   )TextIOWrapperc             C   s   t jt| dddS )N zutf-8)newlineencoding)csvreaderr   )fp r   0/tmp/pip-build-o4kl84jy/wheel/wheel/wheelfile.pyread_csv   s    r   c             c   s(   x"t j| D ]}dd |D V  qW d S )Nc             S   s   g | ]}|j d qS )zutf-8)decode).0columnr   r   r   
<listcomp>   s    zread_csv.<locals>.<listcomp>)r   r   )r   liner   r   r   r      s    zt^(?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 )NZSOURCE_DATE_EPOCHr      )intosenvirongettimegmtime)	timestampr   r   r   get_zipinfo_datetime#   s    r'   c               @   sR   e Zd ZdZejZdef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j|}tj|| _|jd s.| jd kr<tdj|t	j
| |||dd dj| jjd| _| jd | _t | _i | _|dkrd| j| j< d| j| jd	 < d| j| jd
 < y| j| j}W n$ tk
r   tdj| jY nX | xt|D ]}|\}}}	|s q|jd\}
}ytj|
 W n$ tk
rR   tdj|
Y nX |
j dkrptdj|
|
t|jdf| j|<  qW W d Q R X d S )Nz.whlzBad wheel filename {!r}T)compression
allowZip64z{}.dist-infoZnameverz/RECORDr)   z.jwsz.p7szMissing {} file=zUnsupported hash algorithm: {}md5sha1z4Weak hash algorithm ({}) is not permitted by PEP 427ascii)NN)NN)NN>   r-   r.   )r!   pathbasenameWHEEL_INFO_REmatchZparsed_filenameendswithr   formatr   __init__groupZdist_info_pathrecord_pathr   _file_hashes_file_sizesopenKeyErrorr   splithashlibnew
ValueErrorlowerr	   encode)selffilemoder*   r1   recordr   r0   Zhash_sumsize	algorithmr   r   r   r6   1   s@    

zWheelFile.__init__Nc                s   d fdd	}t t|tr(|jn||dkr^jd r^| jkr^tdjtt	j
| ||| |dkrjd r| j \}d k	rtj| j|  _ S )Nc                sR   |d kr j }|  n
| | j|  |rNj krNtdjtd S )NzHash mismatch for file '{}')_eofupdatedigestr   r5   r   )newdataeof)efef_nameexpected_hashrunning_hashupdate_crc_origr   r   _update_crc^   s    


z#WheelFile.open.<locals>._update_crcr)   /zNo hash found for file '{}')N)r
   
isinstancer   filenamer4   r9   r   r5   r   r   r;   r>   r?   rS   )rC   Zname_or_inforE   pwdrS   rH   r   )rN   rO   rP   rQ   rR   r   r;   ]   s    
zWheelFile.openc       	      C   s   t jd| j| g }xtj|D ]\}}}|j  x~t|D ]r}tjjtjj	||}tjj
|r<tjj||jtjjd}|| jkrq<|jdr|j||f q<| j|| q<W q W |j  x|D ]\}}| j|| qW d S )Nz#creating '%s' and adding '%s' to itrT   z
.dist-info)loggerinforV   r!   walksortsortedr0   normpathjoinisfilerelpathreplacesepr8   r4   appendwrite)	rC   base_dirdeferredrootdirnames	filenamesnamer0   arcnamer   r   r   write_filesx   s     

zWheelFile.write_filesc             C   s~   t |d}tj|j }|j }W d Q R X t|p4|t|jd}tj	|j
tj|j
B d> |_|ph| j|_| j||| 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)rC   rV   rk   ry   fstdatazinfor   r   r   rd      s    zWheelFile.writec             C   sr   t j| ||| t|tr |jn|}tjd| || jkrn| j|}|j	t
t|j f| j|< t|| j|< d S )Nzadding '%s')r   rz   rU   r   rV   rX   rY   r8   _default_algorithmrj   r   r   rK   r9   lenr:   )rC   zinfo_or_arcnamebytesry   fnamehash_r   r   r   rz      s    

zWheelFile.writestrc                s    j d k	r jdkr jrt }tj|dddd}|j fdd jj D  |jt	 j
ddf tt j
t d	} j|_d|_ j|t|j  tj  d S )Nw,"
)	delimiter	quotecharlineterminatorc             3   s.   | ]&\}\}}||d  |  j | fV  qdS )r,   N)r:   )r   r   rH   r   )rC   r   r   	<genexpr>   s   z"WheelFile.close.<locals>.<genexpr>r   )rn   i  ro   i  )r   rE   r9   r   r   writer	writerowsitemswriterowr5   r8   r   r   r'   r*   ry   rx   rz   r   getvaluer   close)rC   r}   r   r~   r   )rC   r   r      s    
zWheelFile.close)r)   N)NN)N)__name__
__module____qualname____doc__r>   sha256r   r   r6   r;   rl   rd   rz   r   r   r   r   r   r(   *   s   ,




r(   )r   )N)%
__future__r   r   r>   os.pathr!   rert   sysr$   collectionsr   	distutilsr   rX   zipfiler   r   r   Z	wheel.clir   Z
wheel.utilr	   r
   r   r   r   r   version_infoior   r   compileVERBOSEr2   r'   r(   r   r   r   r   <module>   s*    


