a
    !0f                      @  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mZmZ d dlmZ d dlmZmZmZ erd dlmZmZmZ d d	lmZ eeej e f Z!G d
d deeeZ"e#dej$Z%dZ&dddddZ'G dd deZ(dS )    )annotationsN)StringIOTextIOWrapper)IOTYPE_CHECKINGLiteral)ZIP_DEFLATEDZipFileZipInfo)
WheelError)logurlsafe_b64decodeurlsafe_b64encode)ProtocolSizedUnion)Bufferc                   @  s   e Zd ZdS )SizedBufferN)__name__
__module____qualname__ r   r   .lib/python3.9/site-packages/wheel/wheelfile.pyr          r   z^(?P<namever>(?P<name>[^\s-]+?)-(?P<ver>[^\s-]+?))(-(?P<build>\d[^\s-]*))?
     -(?P<pyver>[^\s-]+?)-(?P<abi>[^\s-]+?)-(?P<plat>\S+)\.whl$i zfloat | NoneZ	timestampc                 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gmtimer   r   r   r   get_zipinfo_datetime$   s    
r%   c                   @  s   e Zd ZdZejZdefddddddZd!d
ddddddZ	ddddZ
d"dddddddZd#d
dd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.
    rStrPathzLiteral['r', 'w', 'x', 'a']r   )filemodecompressionc              
   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 rztd|
 d|
t|df| j|< qW d    n1 s0    Y  d S )Nz.whlzBad wheel filename T)r+   Z
allowZip64z{}.dist-infoZnameverz/RECORDr'   )NNz.jwsz.p7szMissing z file utf-8)newlineencoding=zUnsupported hash algorithm: >   Zmd5Zsha1zWeak hash algorithm (z) 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)selfr)   r*   r+   r3   recordliner2   Zhash_sumsize	algorithmr   r   r   r7   3   sT    



zWheelFile.__init__Nzstr | ZipInfozLiteral['r', 'w']zbytes | Nonez	IO[bytes])name_or_infor*   pwdreturnc                   s   ddd fdd}t |tr,|jn||dkr\ds\| jvr\td d	t| ||| |dkrds| j \}d urt	| j
|  _
 S )
NbytesNone)newdatarN   c                   s<    j }|  |  |r8 kr8td dd S )NzHash mismatch for file '')Z_eofupdatedigestr   )rQ   eofZefZef_nameZexpected_hashZrunning_hashZupdate_crc_origr   r   _update_crcs   s
    
z#WheelFile.open.<locals>._update_crcr'   /zNo hash found for file 'rR   )
isinstancer
   filenamer6   r;   r   r	   r=   rB   rC   rW   )rG   rL   r*   rM   rW   rK   r   rV   r   r=   m   s"    
zWheelFile.openstr)base_dirc           	      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 itrX   z
.dist-info)r   inforZ   r   walksortsortedr2   normpathjoinisfilerelpathreplacesepr:   r6   appendwrite)	rG   r\   ZdeferredrootZdirnames	filenamesnamer2   arcnamer   r   r   write_files   s     

zWheelFile.write_filesz
str | Nonez
int | NonerP   )rZ   rl   compress_typerN   c                 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+   rn   writestr)rG   rZ   rl   rn   fstdataZzinfor   r   r   rh      s    &zWheelFile.writezSizedBuffer | str)zinfo_or_arcnamer~   rn   c                 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 )Nrp   i  rq   r-   zadding 'rR   r1   )rY   r[   r
   r%   r+   rn   rv   S_IFREGrz   rF   r	   r{   rZ   r   r]   r:   _default_algorithmrk   r   rT   decoder;   lenr<   )rG   r   r~   rn   fnamehash_r   r   r   r{      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 )r0   N)r<   ).0r   rK   r   rG   r   r   	<genexpr>   s   
z"WheelFile.close.<locals>.<genexpr>r,   )fpr*   r;   r   r?   writerZ	writerowsitemsZwriterowr8   r:   r{   getvaluer	   close)rG   r~   r   r   r   r   r      s    
zWheelFile.close)r'   N)NN)N)r   r   r   __doc__rB   Zsha256r   r   r7   r=   rm   rh   r{   r   r   r   r   r   r&   ,   s   =  "   r&   )N))Z
__future__r   r?   rB   os.pathr   rerv   r!   ior   r   typingr   r   r   Zzipfiler   r	   r
   Z	wheel.clir   Z
wheel.utilr   r   r   r   r   r   Ztyping_extensionsr   r[   PathLiker(   r   compileVERBOSEr4   r#   r%   r&   r   r   r   r   <module>   s.   