o
    ac                     @   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 )	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 | _t | _i | _|dkrd	| j| j< d	| j| jd
 < d	| j| jd < z| | j}W n tyo   td| jw |N t|D ]@}|\}}}	|sqw|d\}
}zt|
 W n ty   td|
w |
 dv rtd|
|
t|df| j|< qwW d    d S 1 sw   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.     


