B
    lcp                 @  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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 edejZd	Zdd
dZG dd deZdS )    )annotationsN)OrderedDict)StringIOTextIOWrapper)ZIP_DEFLATEDZipFileZipInfo)
WheelError)logurlsafe_b64decodeurlsafe_b64encodez^(?P<namever>(?P<name>[^\s-]+?)-(?P<ver>[^\s-]+?))(-(?P<build>\d[^\s-]*))?
     -(?P<pyver>[^\s-]+?)-(?P<abi>[^\s-]+?)-(?P<plat>\S+)\.whl$i c             C  s6   t tjd| pt } t| t} t| dd S )NSOURCE_DATE_EPOCHr      )intosenvirongettimemaxMINIMUM_TIMESTAMPZgmtime)Z	timestamp r   .lib/python3.7/site-packages/wheel/wheelfile.py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|}t|| _|dr,| jd kr:td|tj	| |||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 dY nX | xtt|dddD ]}|\}}}	|sq|d\}
}yt|
 W n$ tk
r^   td|
 Y nX |
 dkr|td
|
|
t|df| j|< qW W d Q R X d S )Nz.whlzBad wheel filename T)compressionZ
allowZip64z{}.dist-infoZnameverz/RECORDr   )NNz.jwsz.p7szMissing z file zutf-8)newlineencoding=zUnsupported hash algorithm: >   sha1md5z4Weak hash algorithm ({}) is not permitted by PEP 427ascii)r   pathbasenameWHEEL_INFO_REmatchZparsed_filenameendswithr	   r   __init__formatgroupZdist_info_pathrecord_pathr   _file_hashes_file_sizesopenKeyErrorcsvreaderr   splithashlibnew
ValueErrorlowerr   encode)selffilemoder   r$   recordliner#   Zhash_sumsize	algorithmr   r   r   r(   )   sF    

zWheelFile.__init__Nc               s    fdd}t |tr$|jn||dkrTdsT| jkrTtd dt| ||| |dkrds| j \}d k	rt	| j
|  _
 S )Nc               s<    j }|  |  |r8 kr8td dd S )NzHash mismatch for file '')Z_eofupdatedigestr	   )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 'r?   )
isinstancer   filenamer'   r,   r	   r   r.   r3   r4   rI   )r8   Zname_or_infor:   pwdrI   r>   r   )rD   rE   rF   rG   rH   r   r.   \   s    


zWheelFile.openc       	      C  s   t d| j d| d g }xt|D ]\}}}|  x~t|D ]r}tjtj	||}tj
|rFtj||tjjd}|| jkrqF|dr|||f qF| || qFW q*W |  x|D ]\}}| || qW d S )Nz
creating 'z' and adding 'z' to itrJ   z
.dist-info)r
   inforL   r   walksortsortedr#   normpathjoinisfilerelpathreplacesepr+   r'   appendwrite)	r8   Zbase_dirZdeferredrootZdirnames	filenamesnamer#   arcnamer   r   r   write_filesy   s     

zWheelFile.write_filesc          	   C  s~   t |d}t| }| }W d Q R X t|p4|t|jd}t	|j
t|j
B d> |_|ph| 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)r8   rL   r]   rk   fstdatazinfor   r   r   rY      s    zWheelFile.writec             C  s   t |tr|d}t| ||| t |tr4|jn|}td| d || j	kr| 
|}|jt| df| j|< t|| j|< d S )Nzutf-8zadding 'r?   r"   )rK   strr7   r   rl   r   rL   r
   rN   r+   _default_algorithmr\   r   rA   decoder,   lenr-   )r8   Zzinfo_or_arcnamero   rk   fnamehash_r   r   r   rl      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 j
t d	} j|_d
|_ ||  t  d S )Nw,"
)Z	delimiterZ	quotecharZlineterminatorc             3  s.   | ]&\}\}}||d  |  j | fV  qdS )r   N)r-   ).0ru   r>   rv   )r8   r   r   	<genexpr>   s   z"WheelFile.close.<locals>.<genexpr>r   )r`   i  )fpr:   r,   r   r0   writerZ	writerowsitemsZwriterowr)   r+   r   r   r   rk   rj   rl   getvaluer   close)r8   ro   r~   rp   r   )r8   r   r      s    
zWheelFile.close)r   N)NN)N)__name__
__module____qualname____doc__r3   Zsha256rr   r   r(   r.   r^   rY   rl   r   r   r   r   r   r   "   s   3


r   )N)Z
__future__r   r0   r3   os.pathr   rerf   r   collectionsr   ior   r   Zzipfiler   r   r   Z	wheel.clir	   Z
wheel.utilr
   r   r   compileVERBOSEr%   r   r   r   r   r   r   r   <module>   s"   
