o
    DxMg                      @  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rod 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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.10/site-packages/wheel/wheelfile.pyr      s    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 	timestampfloat | Nonec                 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)r   r   r   r   get_zipinfo_datetime$   s   
r%   c                   @  sf   e Zd ZdZejZdefd(d	d
Z		d)d*ddZ	d+ddZ
		d,d-dd Z	d.d/d$d%Zd&d' ZdS )0	WheelFilezA ZipFile derivative class that also reads SHA-256 hashes from
    .dist-info/RECORD and checks any read files against those.
    rfileStrPathmodeLiteral['r', 'w', 'x', 'a']compressionr   c              
   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yp   td| j dd w |V tt|dddD ]B}|\}}}	|sq~|d\}
}zt|
 W n ty   td|
 d w |
 dv rtd|
 d|
t|df| j|< q~W d    d S 1 sw   Y  d S 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,   r5   recordliner4   Zhash_sumsize	algorithmr   r   r   r9   3   s^   


"zWheelFile.__init__Nname_or_infostr | ZipInfoLiteral['r', 'w']pwdbytes | Nonereturn	IO[bytes]c                   s   d fdd}t |tr|jn||dkr+ds+| jvr+td	 d
t| ||| |dkrSdsS| j \}d urSt	| j
| _
 S )NnewdatabytesrS   Nonec                   s@    j }|  |  |r krtd dd S d S )NzHash mismatch for file '')_eofupdatedigestr   )rU   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 'rX   )rU   rV   rS   rW   )
isinstancer
   filenamer8   r=   r   r	   r?   rD   rE   r^   )rI   rN   r*   rQ   r^   rM   r   r]   r   r?   m   s   

zWheelFile.openbase_dirstrc           	      C  s   t d| j d| d g }t|D ]G\}}}|  t|D ]9}tjtj	||}tj
|rZtj||tjjd}|| jkrGq!|drT|||f q!| || q!q|  |D ]
\}}| || qbd S )Nz
creating 'z' and adding 'z' to itr_   z
.dist-info)r   infora   r   walksortsortedr4   normpathjoinisfilerelpathreplacesepr<   r8   appendwrite)	rI   rb   Zdeferredrootdirnames	filenamesnamer4   arcnamer   r   r   write_files   s&   

zWheelFile.write_filesra   rt   
str | Nonecompress_type
int | NonerW   c                 C  s   t |d}t| }| }W d    n1 sw   Y  t|p$|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,   rw   writestr)rI   ra   rt   rw   fstdataZzinfor   r   r   ro      s   
zWheelFile.writezinfo_or_arcnamer   SizedBuffer | strc                 C  s   t |trt|t d}| j|_dtjB d> |_t |tr"|	d}t
| ||| t |tr2|jn|}td| d || jkr_| |}|jt| df| j|< t|| j|< d S d S )Nrz   i  r{   r/   zadding 'rX   r3   )r`   rc   r
   r%   r,   rw   r   S_IFREGr   rH   r	   r   ra   r   rd   r<   _default_algorithmrs   r   r[   decoder=   lenr>   )rI   r   r   rw   fnamehash_r   r   r   r      s*   





zWheelFile.writestrc                   s    j d ur< jdkr< jr<t }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  s0    | ]\}\}}||d  |  j | fV  qdS )r2   N)r>   ).0r   rM   r   rI   r   r   	<genexpr>   s
    

z"WheelFile.close.<locals>.<genexpr>r.   )fpr*   r=   r   rA   writerZ	writerowsitemsZwriterowr:   r<   r   getvaluer	   close)rI   r   r   r   r   r   r      s   
zWheelFile.close)r(   r)   r*   r+   r,   r   )r'   N)rN   rO   r*   rP   rQ   rR   rS   rT   )rb   rc   r-   )ra   rc   rt   rv   rw   rx   rS   rW   N)r   rO   r   r   rw   rx   )r   r   r   __doc__rD   Zsha256r   r   r9   r?   ru   ro   r   r   r   r   r   r   r&   ,   s     =
"r&   r   )r   r   ))Z
__future__r   rA   rD   Zos.pathr   rer   r!   ior   r   typingr   r   r   zipfiler   r	   r
   Z	wheel.clir   Z
wheel.utilr   r   r   r   r   r   Ztyping_extensionsr   rc   PathLiker)   r   compileVERBOSEr6   r#   r%   r&   r   r   r   r   <module>   s0    