3
ÕZð]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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ÚStringIOzt^(?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)Ú	timestamp© r   ú0/tmp/pip-build-uspjrw0y/wheel/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 )Ú	WheelFilez‚A 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
| ||tdd� dj| jjdƒƒ| _| jd | _tƒ | _i | _|dk�r¢d| 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 |�® x¦|D ]ž}|jdƒ}|jddƒ\}}}|� rö|jdƒ\}	}ytj|	ƒ W n$ tk
�r\   tdj|	ƒƒ‚Y nX |	jƒ dk�rztdj|	ƒƒ‚|	t|jdƒƒf| j|< � qöW W d Q R X d S )Nz.whlzBad wheel filename {!r}T)ÚcompressionÚ
allowZip64z{}.dist-infoZnameverz/RECORDr   z.jwsz.p7szMissing {} filezutf-8ú,é   ú=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__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 j| |||ƒ‰ tt|tƒr8|jn|ƒ‰|dkrœˆjdƒ rœˆ| jkrntdj	t
ˆƒƒƒ‚| jˆ \}‰ˆd k	rœt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   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   r4   r5   rJ   )r9   Zname_or_infor;   ÚpwdrJ   r?   r   )rE   rF   rG   rH   rI   r   r/   Q   s    

zWheelFile.openc       	      C   sÔ   t jd| j|ƒ g }x”tj|ƒD ]†\}}}|jƒ  xrt|ƒD ]f}tjjtjj	||ƒƒ}tjj
|ƒr<tjj||ƒ}|| jkr|q<|jdƒr–|j||fƒ q<| j||ƒ q<W q W |jƒ  x|D ]\}}| j||ƒ q¸W d S )Nz#creating '%s' and adding '%s' to itz
.dist-info)ÚloggerÚinforM   r   ÚwalkÚsortÚsortedr$   ÚnormpathÚjoinÚisfileÚrelpathr,   r(   ÚappendÚwrite)	r9   Úbase_dirÚdeferredÚrootÚdirnamesÚ	filenamesÚnamer$   Úarcnamer   r   r   Úwrite_filesl   s     

zWheelFile.write_filesc             C   sx   t |dƒ�}tj|jƒ ƒ}|jƒ }W d Q R X t|p4|t|jƒd�}tj	|j
ƒtj|j
ƒB d> |_t|_| 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)r9   rM   r`   rn   ÚfÚstÚdataÚzinfor   r   r   rY   ‚   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   ro   rL   r   rM   rO   rP   r,   Ú_default_algorithmr_   r   r   rB   r-   Úlenr.   )r9   Úzinfo_or_arcnameÚbytesrn   ÚfnameÚhash_r   r   r   ro   Œ   s    

zWheelFile.writestrc                s¨   ˆ j d k	ršˆ jdkršˆ jrštƒ }tj|dddd�}|j‡ fdd„ˆ jjƒ D ƒƒ |jt	ˆ j
ƒddfƒ ttˆ j
ƒtƒ d	�}t|_d|_ˆ j|t|jƒ ƒƒ tjˆ ƒ d S )NÚwr   ú"Ú
)Ú	delimiterÚ	quotecharÚlineterminatorc             3   s.   | ]&\}\}}||d  | ˆ j | fV  qdS )r    N)r.   )Ú.0rx   r?   ry   )r9   r   r   ú	<genexpr>œ   s   z"WheelFile.close.<locals>.<genexpr>Ú )rc   i´  rd   i  ´)Úfpr;   r-   r   ÚcsvÚwriterÚ	writerowsÚitemsÚwriterowr)   r,   r   r   r   r   rn   rm   ro   r   Úgetvaluer   Úclose)r9   rr   r…   rs   r   )r9   r   rŠ   –   s    
zWheelFile.close)r   )r   N)NN)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r4   Úsha256rt   r*   r/   ra   rY   ro   rŠ   r   r   r   r   r      s   
+




r   )N) Ú
__future__r   r„   r4   Úos.pathr   Úreri   r   Úcollectionsr   Ú	distutilsr   rO   Úzipfiler   r   r   Z	wheel.clir   Z
wheel.utilr	   r
   r   r   r   r   ÚcompileÚVERBOSEr&   r   r   r   r   r   r   Ú<module>   s     
