o
    ›aÎc¥  ã                   @   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	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kr^d d	lmZ d
d„ Zndd„ Ze  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ÚStringIO)é   )ÚTextIOWrapperc                 C   s   t  t| ddd�¡S )NÚ úutf-8)ÚnewlineÚencoding)ÚcsvÚreaderr   )Úfp© r   ú1/usr/lib/python3/dist-packages/wheel/wheelfile.pyÚread_csv   s   r   c                 c   s&   � t  | ¡D ]
}dd„ |D ƒV  qd S )Nc                 S   s   g | ]}|  d ¡‘qS )r   )Údecode)Ú.0Úcolumnr   r   r   Ú
<listcomp>   s    zread_csv.<locals>.<listcomp>)r   r   )r   Úliner   r   r   r      s   €ÿzƒ^(?P<namever>(?P<name>[^-]+?)-(?P<ver>[^-]+?))(-(?P<build>\d[^-]*))?
     -(?P<pyver>[^-]+?)-(?P<abi>[^-]+?)-(?P<plat>[^.]+?)\.whl$c                 C   s,   t tj d| p
t ¡ ¡ƒ} t | ¡dd… S )NÚSOURCE_DATE_EPOCHr   é   )ÚintÚosÚenvironÚgetÚtimeÚgmtime)Ú	timestampr   r   r   Ú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 )Ú	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 |¡}t |¡| _| d¡r| jd u rtd |¡ƒ‚t	j
| |||dd� d | j d¡¡| _| jd | _tƒ | _i | _|dkrÊd	| j| j< d	| j| jd
 < d	| j| jd < z|  | j¡}W n tyo   td | j¡ƒ‚w |�N t|ƒD ]@}|\}}}	|s�qw| d¡\}
}zt |
¡ W n ty�   td |
¡ƒ‚w |
 ¡ dv r«td |
¡ƒ‚|
t| d¡ƒf| j|< qwW d   ƒ d S 1 sÃw   Y  d S d S )Nz.whlzBad wheel filename {!r}T)ÚcompressionÚ
allowZip64z{}.dist-infoÚnameverz/RECORDr+   ©NNz.jwsz.p7szMissing {} fileú=zUnsupported hash algorithm: {}>   Úmd5Úsha1z4Weak hash algorithm ({}) is not permitted by PEP 427Úascii)r#   ÚpathÚbasenameÚWHEEL_INFO_REÚmatchÚparsed_filenameÚendswithr   Úformatr   Ú__init__ÚgroupÚdist_info_pathÚrecord_pathr   Ú_file_hashesÚ_file_sizesÚopenÚKeyErrorr   ÚsplitÚhashlibÚnewÚ
ValueErrorÚlowerr	   Úencode)ÚselfÚfileÚmoder,   r5   Úrecordr   r4   Úhash_sumÚsizeÚ	algorithmr   r   r   r;   1   sN   ÿ
ÿþÿð"ÿôzWheelFile.__init__Nc                    s°   d‡ ‡‡‡‡fdd„	}t t|tƒr|jn|ƒ‰|dkr.ˆ d¡s.ˆ| jvr.td tˆƒ¡ƒ‚t	 
| |||¡‰ |dkrVˆ d¡sV| jˆ \}‰ˆd urVt |¡‰ˆ j|‰ˆ _ˆ S )Nc                    sV   |d u rˆ j }ˆ| ƒ nˆ| |ƒ ˆ | ¡ |r'ˆ ¡ ˆkr)td tˆƒ¡ƒ‚d S 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_crc^   s   


ÿz#WheelFile.open.<locals>._update_crcr+   ú/zNo hash found for file '{}'©N)r
   Ú
isinstancer   Úfilenamer9   r?   r   r:   r   r   rA   rD   rE   r[   )rI   Úname_or_inforK   Úpwdr[   rO   r   rU   r   rA   ]   s   ÿ
zWheelFile.openc           	      C   sÔ   t  d| j|¡ g }t |¡D ]G\}}}| ¡  t|ƒD ]9}tj tj 	||¡¡}tj 
|¡rUtj ||¡ tjjd¡}|| jkrBq| d¡rO| ||f¡ q|  ||¡ qq| ¡  |D ]
\}}|  ||¡ q]d S )Nz#creating '%s' and adding '%s' to itr\   z
.dist-info)ÚloggerÚinfor_   r#   ÚwalkÚsortÚsortedr4   ÚnormpathÚjoinÚisfileÚrelpathÚreplaceÚsepr>   r9   ÚappendÚwrite)	rI   Úbase_dirÚdeferredÚrootÚdirnamesÚ	filenamesÚnamer4   Úarcnamer   r   r   Úwrite_filesx   s&   

€÷ÿzWheelFile.write_filesc                 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©Ú	date_timeé   )rA   r#   ÚfstatÚfilenoÚreadr   r)   Úst_mtimeÚstatÚS_IMODEÚst_modeÚS_IFMTÚexternal_attrr,   Úcompress_typeÚwritestr)rI   r_   ru   r„   ÚfÚstÚdataÚzinfor   r   r   rn   Ž   s   
þzWheelFile.writec                 C   sv   t  | |||¡ t|tƒr|jn|}t d|¡ || jkr9|  |¡}|j	t
t| ¡ ƒƒf| j|< t|ƒ| j|< d S d S )Nzadding '%s')r   r…   r^   r   r_   rb   rc   r>   Ú_default_algorithmrt   r   r   rR   r?   Úlenr@   )rI   Úzinfo_or_arcnameÚbytesr„   ÚfnameÚhash_r   r   r   r…   ˜   s   ÿ

ýzWheelFile.writestrc                    sª   ˆ j d urNˆ jdkrNˆ jrNtƒ }tj|dddd�}| ‡ fdd„ˆ j ¡ D ƒ¡ | t	ˆ j
ƒddf¡ ttˆ j
ƒtƒ d	�}ˆ j|_d
|_ˆ  |t| ¡ ƒ¡ t ˆ ¡ d S )NÚwú,ú"Ú
)Ú	delimiterÚ	quotecharÚlineterminatorc                 3   s0   � | ]\}\}}||d  | ˆ j | fV  qdS )r0   N)r@   )r   rŽ   rO   r�   ©rI   r   r   Ú	<genexpr>§   s   € 
ü
ý
ÿz"WheelFile.close.<locals>.<genexpr>r   rx   i  ´)r   rK   r?   r   r   ÚwriterÚ	writerowsÚitemsÚwriterowr:   r>   r   r   r)   r,   r„   rƒ   r…   r   Úgetvaluer   Úclose)rI   rˆ   r™   r‰   r   r—   r   rž   ¢   s   úzWheelFile.close)r+   Nr/   r]   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rD   Úsha256rŠ   r   r;   rA   rv   rn   r…   rž   r   r   r   r   r*   *   s    
,



r*   r]   )%Ú
__future__r   r   rD   Úos.pathr#   Úrer   Úsysr&   Úcollectionsr   Ú	distutilsr   rb   Úzipfiler   r   r   Ú	wheel.clir   Ú
wheel.utilr	   r
   r   r   r   r   Úversion_infoÚior   r   ÚcompileÚVERBOSEr6   r)   r*   r   r   r   r   Ú<module>   s.     

ý
