B
    ülc]K  ã               @  sx  d Z 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mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddlZddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ej)Z)ej*Z*e+e ,d¡j- .d¡d ƒZ/dZ0dd„ Z1dd„ Z2d'dd„Z3dd„ Z4dd „ Z5d!d"„ Z6d#d$„ Z7G d%d&„ d&eƒZ8dS )(zI
Create a wheel (.whl) distribution.

A wheel is a built archive format.
é    )ÚannotationsN)ÚOrderedDict)ÚBytesGeneratorÚ	Generator)ÚEmailPolicy)Úiglob)ÚBytesIO)Úrmtree)ÚZIP_DEFLATEDÚ
ZIP_STORED)ÚCommandé   )Ú__version__)Úcalculate_macosx_platform_tag)Úpkginfo_to_metadata)Úlog)Útags)Ú	WheelFileÚ
setuptoolsÚ.zcp3\dc               C  s   dt jd › S )NÚpyr   )ÚsysÚversion_info© r   r   ú0lib/python3.7/site-packages/wheel/bdist_wheel.pyÚ
python_tag+   s    r   c             C  sH   t  ¡ }| d¡r&| dk	r&t| |ƒ}n|dkr<tjdkr<d}| dd¡S )z0Return our platform name 'win32', 'linux_x86_64'ÚmacosxNzlinux-x86_64iÿÿÿz
linux-i686ú-Ú_)Ú	sysconfigÚget_platformÚ
startswithr   r   ÚmaxsizeÚreplace)Úarchive_rootÚresultr   r   r   r    /   s    r    Tc             C  s6   t  | ¡}|dkr.|r*t d | ¡td¡ |S ||kS )zfUse a fallback value for determining SOABI flags if the needed config
    var is unset or unavailable.Nz>Config variable '{}' is unset, Python ABI tag may be incorrecté   )r   Úget_config_varÚwarningsÚwarnÚformatÚRuntimeWarning)ÚvarÚfallbackZexpectedr)   Úvalr   r   r   Úget_flag;   s    
r/   c              C  s  t  d¡} t ¡ }| sœ|dkrœttdƒrœd}d}d}tdttdƒ|dkdrPd	}td
|dk|dkojtjdk dr~tjdk r~d}|› t ¡ › |› |› |› }nz| r¼|dkr¼d|  	d¡d  }nZ| rö|dkröd 
|  	d¡dd… ¡}| dd¡ dd¡}n | r|  dd¡ dd¡}nd}|S )zJReturn the ABI tag based on SOABI (if available) or emulate SOABI (PyPy2).ZSOABI)ÚcpÚppÚ
maxunicodeÚ ZPy_DEBUGZgettotalrefcountr0   )r)   ÚdZWITH_PYMALLOC)é   é   Úmr   r   r1   Nr&   r   r   )r   r'   r   Úinterpreter_nameÚhasattrr   r/   r   Úinterpreter_versionÚsplitÚjoinr#   )ZsoabiÚimplr4   r7   ÚuÚabir   r   r   Úget_abi_tagK   s0    

r@   c             C  s   t | ƒ dd¡S )Nr   r   )Ú	safe_namer#   )Únamer   r   r   Ú
safer_namel   s    rC   c             C  s   t | ƒ dd¡S )Nr   r   )Úsafe_versionr#   )Úversionr   r   r   Úsafer_versionp   s    rF   c             C  s*   t t|d ƒƒ t |tj¡ | |ƒ d S )Nr   )ÚprintÚstrÚosÚchmodÚstatÚS_IWRITE)ÚfuncÚpathÚexcinfor   r   r   Úremove_readonlyt   s    rP   c               @  sÖ   e Zd ZdZedefdefgƒZddddedƒ fd	d
dddddddd 	d 
e¡¡fdddeƒ  fddgZddddgZdd„ Zdd„ Zedd „ ƒZd!d"„ Zd#d$„ Zd%e d& fd'd(„Zd)d*„ Zed+d,„ ƒZd-d.„ ZdS )/Úbdist_wheelzcreate a wheel distributionZstoredÚdeflated)z
bdist-dir=Úbz1temporary directory for creating the distributionz
plat-name=Úpz;platform name to embed in generated filenames (default: %s)N)z	keep-tempÚkzPkeep the pseudo-installation tree around after creating the distribution archive)z	dist-dir=r4   z-directory to put final built distributions in)z
skip-buildNz2skip rebuilding everything (for testing/debugging))ÚrelativeNz7build the archive using relative paths (default: false))zowner=r>   z@Owner name used when creating a tar file [default: current user])zgroup=ÚgzAGroup name used when creating a tar file [default: current group])Ú	universalNz'make a universal wheel (default: false)zcompression=z6zipfile compression (one of: {}) (default: 'deflated')z, zpython-tag=z7Python implementation compatibility tag (default: '%s'))zbuild-number=NzqBuild number for this particular version. As specified in PEP-0427, this must start with a digit. [default: None])zpy-limited-api=Nz?Python tag (cp32|cp33|cpNN) for abi3 wheel tag (default: false)z	keep-tempz
skip-buildrV   rX   c             C  sx   d | _ d | _d | _d | _d| _d| _d | _d | _d | _d | _	d| _
d | _d | _d| _d| _tƒ | _d | _d| _d| _d S )NÚzipFrR   )Ú	bdist_dirÚdata_dirÚ	plat_nameÚplat_tagr*   Ú	keep_tempÚdist_dirÚegginfo_dirÚroot_is_pureÚ
skip_buildrV   ÚownerÚgrouprX   Úcompressionr   Úbuild_numberÚpy_limited_apiÚplat_name_supplied)Úselfr   r   r   Úinitialize_options¾   s&    zbdist_wheel.initialize_optionsc             C  s6  | j d kr&|  d¡j}tj |d¡| _ | jd | _| jd k	| _	y| j
| j | _W n$ tk
rt   td| j› ƒ‚Y nX d}| jdt||ƒžŽ  | j ¡ p | j ¡  | _| jrÆt t| j¡sÆtdt ƒ‚| j d¡}d|kr
t d¡ |d d	  ¡ }| ¡ d
kr
d| _| jd k	r2| jd d	…  ¡ s2tdƒ‚d S )NÚbdistÚwheelz.datazUnsupported compression: )r_   r\   rb   zpy-limited-api must match '%s'rX   z=The [wheel] section is deprecated. Use [bdist_wheel] instead.r   )Ú1ÚtrueZyesTz1Build tag (build-number) must start with a digit.)rk   ) rZ   Zget_finalized_commandÚ
bdist_baserI   rN   r<   Úwheel_dist_namer[   r\   rh   Úsupported_compressionsre   ÚKeyErrorÚ
ValueErrorÚset_undefined_optionsrY   ÚdistributionZhas_ext_modulesZhas_c_librariesra   rg   ÚreÚmatchÚPY_LIMITED_API_PATTERNÚget_option_dictr   ZwarningÚstripÚlowerrX   rf   Úisdigit)ri   ro   Zneed_optionsrl   r.   r   r   r   Úfinalize_optionsÓ   s0    



 zbdist_wheel.finalize_optionsc             C  s8   t | j ¡ ƒt| j ¡ ƒf}| jr.|| jf7 }d |¡S )z4Return distribution full name with - replaced with _r   )rC   ru   Úget_namerF   Úget_versionrf   r<   )ri   Z
componentsr   r   r   rp   û   s
    zbdist_wheel.wheel_dist_namec               s  | j r| j‰ nF| jrd‰ n:| jr4| j d¡s4| j‰ n
t| jƒ‰ ˆ dkrTtjdkrTd‰ ˆ  ¡  	dd¡ 	dd¡‰ | jr| j
r~d	}n| j}|d
ˆ f}n~t ¡ }t ¡ }|| }| jrÈ||  d¡rÈ| j}d}nttƒ ƒ ¡ }||ˆ f}‡ fdd„t ¡ D ƒ}||kstd|› ƒ‚|S )NÚanyr   )zlinux-x86_64Zlinux_x86_64iÿÿÿZ
linux_i686r   r   r   zpy2.py3ZnoneZcp3Zabi3c               s   g | ]}|j |jˆ f‘qS r   )Zinterpreterr?   )Ú.0Út)r\   r   r   ú
<listcomp>5  s    z'bdist_wheel.get_tag.<locals>.<listcomp>z'would build wheel with unsupported tag )rh   r\   ra   r!   r    rZ   r   r"   r{   r#   rX   r   r   r8   r:   rg   rH   r@   Zsys_tagsÚAssertionError)ri   r=   ÚtagZ	impl_nameZimpl_verÚabi_tagZsupported_tagsr   )r\   r   Úget_tag  s8    


zbdist_wheel.get_tagc          	   C  sV  |   d¡}d|_d|_|   d¡}d|_| js6|  d¡ | j ddd}| j|_d|_| j|_d|_	|   d	¡}d|_
x(d
D ] }t|d| tj | j|¡ƒ qvW d}tjdkrÌtj tj | jd¡¡}| | _| _t|| jrÚdnd|ƒ t d| j› ¡ |  d¡ |  ¡ \}}}	| j› d|› d|› d|	› }
| js8| j}ntj | j|  |j¡¡}|  dd¡ d t| j  ¡ ƒt!| j "¡ ƒ¡}tj | j|¡}|  #| j$|¡ |  %|¡ tj &| j'¡sÀt (| j'¡ tj | j'|
d ¡}t)|d| j*ƒ}| +|¡ W d Q R X t,| jdg ƒ -ddjt.j/d d… Ž |f¡ | j0sRt d| j› ¡ | j1sRt2| jt3d d S )NÚbuild_scriptsZpythonTÚ	build_extFZbuildÚinstall)Zreinit_subcommandsÚinstall_scripts)ZheadersZscriptsÚdataZpurelibZplatlibZinstall_r3   Úntz..Zinstall_purelibZinstall_platlibzinstalling to r   Zinstall_egg_info)Útargetr`   z{}-{}.dist-infoz.whlÚwZ
dist_filesrQ   z{}.{}r&   z	removing )Úonerror)4Zreinitialize_commandÚ
executableÚforceZinplacerb   Zrun_commandrZ   ÚrootÚcompileZwarn_dirZno_epÚsetattrrI   rN   r<   r[   rB   ÚnormpathZinstall_libbaseZinstall_libra   r   Úinfor‡   rp   rV   Ú_ensure_relativeZinstall_basert   r*   rC   ru   r~   rF   r   Úegg2distr`   Úwrite_wheelfileÚexistsr_   Úmakedirsr   re   Zwrite_filesÚgetattrÚappendr   r   r^   Zdry_runr	   rP   )ri   rˆ   r‰   rŠ   r‹   ÚkeyZbasedir_observedÚimpl_tagr†   r]   Zarchive_basenamer$   Zdistinfo_dirnameZdistinfo_dirZ
wheel_pathZwfr   r   r   Úrun<  sh    




 


zbdist_wheel.runzbdist_wheel (ú)c          	   C  s  ddl m} |ƒ }d|d< ||d< t| jƒ ¡ |d< | jd k	rH| j|d< |  ¡ \}}}xN| d¡D ]@}x:| d¡D ],}	x&| d¡D ]}
d	 ||	|
f¡|d
< q‚W qrW qbW t	j
 |d¡}t d|› ¡ tƒ }t|dd |¡ t|dƒ}| | ¡  dd¡¡ W d Q R X d S )Nr   )ÚMessagez1.0zWheel-Versionr   zRoot-Is-PurelibZBuildr   r   ZTagZWHEELz	creating )ZmaxheaderlenÚwbs   
ó   )Zemail.messager£   rH   ra   r{   rf   r‡   r;   r<   rI   rN   r   r—   r   r   ÚflattenÚopenÚwriteÚgetvaluer#   )ri   Zwheelfile_baseÚ	generatorr£   Úmsgr    r†   r]   r=   r?   ZplatZwheelfile_pathÚbufferÚfr   r   r   rš   “  s$    

 zbdist_wheel.write_wheelfilec             C  s6   t j |¡\}}|dd… t jkr2||dd …  }|S )Nr   r   )rI   rN   Ú
splitdriveÚsep)ri   rN   Zdriver   r   r   r˜   ­  s    zbdist_wheel._ensure_relativec          	   C  s  t dkr| jjjpdS tƒ }| j d¡}t dkr<| jjj}nd|krV|d d  ¡ }nd}d|kr€t dt	¡ | 
|d d ¡ |s–|s–t|tƒs–d	}xr|D ]j}xdt|ƒD ]X}| d
¡rÌt d|› d¡ qª||krªtj |¡rªt d|› d|› d¡ | 
|¡ qªW qœW |S )Né9   r   Úmetadataé*   Úlicense_filesr   Zlicense_filezEThe "license_file" option is deprecated. Use "license_files" instead.)zLICEN[CS]E*zCOPYING*zNOTICE*zAUTHORS*ú~zignoring license file "z" as it looks like a backupzadding license file "z" (matched pattern "z"))Úsetuptools_major_versionru   r±   r³   Úsetry   r;   r(   r)   ÚDeprecationWarningÚaddÚ
isinstanceÚlistr   Úendswithr   ÚdebugrI   rN   Úisfiler—   )ri   Úfilesr±   ZpatternsÚpatternrN   r   r   r   Úlicense_paths´  s6    

zbdist_wheel.license_pathsc          	   C  s’  dd„ }||ƒ t j |¡s|ddl}t j t j |¡d¡}| |¡}d|› d}|rtt j |d ¡}|d|› d	7 }t|ƒ‚t j |¡r¢|}	t	||ƒ}
t  
|¡ nht j |d
¡}	t	||	ƒ}
tj||dd„ d t j |d¡}t|ƒ}| ¡  ¡ }W dQ R X |s
||ƒ t j |d¡}tdddd}t|ddd}t||d |
¡ W dQ R X x2| jD ](}t j |¡}t |t j ||¡¡ qZW ||ƒ dS )z:Convert an .egg-info directory into a .dist-info directoryc             S  sJ   t j | ¡r0t j | ¡s0t j | ¡r0t | ¡ nt j | ¡rFt  | ¡ dS )z-Appropriately delete directory, file or link.N)rI   rN   r›   ÚislinkÚisdirÚshutilr	   Úunlink)rT   r   r   r   Úadiosã  s    $z#bdist_wheel.egg2dist.<locals>.adiosr   Nz
*.egg-infozEgg metadata expected at z but not foundz (z) found - possible misnamed archive file?)zPKG-INFOc             S  s   ddddhS )NzPKG-INFOzrequires.txtzSOURCES.txtznot-zip-safer   )ÚxÚyr   r   r   Ú<lambda>
  s    z&bdist_wheel.egg2dist.<locals>.<lambda>)Úignorezdependency_links.txtZMETADATATF)Úutf8Zmangle_from_Zmax_line_lengthr   zutf-8)Úencoding)Zpolicy)rI   rN   r›   Úglobr<   ÚdirnameÚbasenamers   r½   r   ÚmkdirrÃ   Zcopytreer§   Úreadrz   r   r   r¦   rÀ   Úcopy)ri   Zegginfo_pathZdistinfo_pathrÅ   rÌ   ZpatÚpossibleÚerrZaltZpkginfo_pathZpkg_infoZdependency_links_pathZdependency_links_fileZdependency_linksZpkg_info_pathZserialization_policyÚoutZlicense_pathÚfilenamer   r   r   r™   à  sJ    


	
zbdist_wheel.egg2dist)Ú__name__Ú
__module__Ú__qualname__Údescriptionr   r   r
   rq   r    r*   r<   r   Zuser_optionsZboolean_optionsrj   r}   Úpropertyrp   r‡   r¡   Úwheel_versionrš   r˜   rÀ   r™   r   r   r   r   rQ   z   sF   
(6X,rQ   )TT)9Ú__doc__Z
__future__r   rI   rv   rÃ   rK   r   r   r(   Úcollectionsr   Zemail.generatorr   r   Zemail.policyr   rÌ   r   Úior   r	   Zzipfiler
   r   Zpkg_resourcesr   r   r3   r   rÛ   Zmacosx_libfiler   r±   r   Úutilr   Zvendored.packagingr   Z	wheelfiler   rA   rD   ÚintZget_distributionrE   r;   rµ   rx   r   r    r/   r@   rC   rF   rP   rQ   r   r   r   r   Ú<module>   sH   
!