a
    T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	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)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_TIMESTAMPgmtime)Z	timestamp r   .lib/python3.9/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 u r:td|tj	| |||dd d
| jd| _| jd | _i | _i | _|dkrd	| j| j< d	| j| jd
 < d	| j| jd < z| | j}W n& ty   td| j dd Y n0 | tt|dddD ]}|\}}}	|sq|d\}
}zt|
 W n$ tyZ   td|
 d Y n0 |
 dv rxtd
|
|
t|df| j|< qW d    n1 s0    Y  d S )Nz.whlzBad wheel filename T)compressionZ
allowZip64z{}.dist-infoZnameverz/RECORDr   )NNz.jwsz.p7szMissing z file utf-8)newlineencoding=zUnsupported hash algorithm: >   Zmd5Zsha1z4Weak 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_path_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'   (   sX    


zWheelFile.__init__Nc                   s    fdd}t |tr$|jn||dkrTdsT| jvrTtd dt| ||| |dkrds| j \}d urt	| j
|  _
 S )Nc                   s<    j }|  |  |r8 kr8td dd S )NzHash mismatch for file '')Z_eofupdatedigestr   )newdataeofZefZef_nameZexpected_hashZrunning_hashZ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-   r2   r3   rD   )r7   Zname_or_infor9   pwdrD   r=   r   rC   r   r-   ]   s"    
zWheelFile.openc           	      C  s   t d| j d| d g }t|D ]\}}}|  t|D ]r}tjtj	||}tj
|rBtj||tjjd}|| jkrqB|dr|||f qB| || qBq(|  |D ]\}}| || qd S )Nz
creating 'z' and adding 'z' to itrE   z
.dist-info)r	   inforG   r   walksortsortedr"   normpathjoinisfilerelpathreplacesepr*   r&   appendwrite)	r7   Zbase_dirZdeferredrootZdirnames	filenamesnamer"   arcnamer   r   r   write_filesz   s     

zWheelFile.write_filesc                 C  s   t |d&}t| }| }W d    n1 s60    Y  t|pH|t|jd}t	|j
t|j
B d> |_|p|| j|_| ||| d S )NrbZ	date_time   )r-   r   fstatfilenoreadr   r   st_mtimestatS_IMODEst_modeS_IFMTexternal_attrr   compress_typewritestr)r7   rG   rX   rf   fstdataZzinfor   r   r   rT      s    &zWheelFile.writec                 C  s   t |tr0t|t d}| j|_dtjB d> |_t |trD|	d}t
| ||| t |trd|jn|}td| d || jkr| |}|jt| df| j|< t|| j|< d S )Nr[   i  r\   r   zadding 'r>   r!   )rF   strr   r   r   rf   ra   S_IFREGre   r6   r   rg   rG   r	   rI   r*   _default_algorithmrW   r   r@   decoder+   lenr,   )r7   Zzinfo_or_arcnamerj   rf   fnamehash_r   r   r   rg      s(    





zWheelFile.writestrc                   s    j d urx jdkrx jrxt }tj|dddd}| fdd j D  |t	 j
ddf   j
|  t  d S )	Nw,"
)Z	delimiterZ	quotecharZlineterminatorc                 3  s.   | ]&\}\}}||d  |  j | fV  qdS )r    N)r,   ).0rp   r=   rq   r7   r   r   	<genexpr>   s   
z"WheelFile.close.<locals>.<genexpr>r   )fpr9   r+   r   r/   writerZ	writerowsitemsZwriterowr(   r*   rg   getvaluer   close)r7   rj   rz   r   rw   r   r}      s    
zWheelFile.close)r   N)NN)N)__name__
__module____qualname____doc__r2   Zsha256rm   r   r'   r-   rY   rT   rg   r}   r   r   r   r   r   !   s   5


r   )N)Z
__future__r   r/   r2   os.pathr   rera   r   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"   
