B
    Ö¹`ƒJ  ã               @   st  d 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 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% ej&dk r
ddl'm(Z) nddl'm)Z) ej*Z*ej+Z+dZ,dd„ Z-dd„ Z.d'dd„Z/dd„ Z0dd „ Z1d!d"„ Z2d#d$„ Z3G d%d&„ d&eƒZ4dS )(zI
Create a wheel (.whl) distribution.

A wheel is a built archive format.
é    N)ÚOrderedDict)ÚCommand)Úlog)ÚBytesIO)Úiglob)Úrmtree)Úget_config_var)ÚZIP_DEFLATEDÚ
ZIP_STOREDé   )Úwrite_pkg_info)Úcalculate_macosx_platform_tag)Úpkginfo_to_metadata)Útags)Ú	WheelFile)Ú__version__)é   )Ú	Generator)ÚBytesGeneratorzcp3\dc               C   s   d  tjd ¡S )Nzpy{}r   )ÚformatÚsysÚversion_info© r   r   ú4/tmp/pip-install-4tin_oll/wheel/wheel/bdist_wheel.pyÚ
python_tag+   s    r   c             C   s@   t j ¡ }| d¡r&| dk	r&t| |ƒ}|dkr<tjdkr<d}|S )z0Return our platform name 'win32', 'linux_x86_64'ÚmacosxNÚlinux_x86_64iÿÿÿÚ
linux_i686)Ú	distutilsÚutilÚget_platformÚ
startswithr   r   Úmaxsize)Úarchive_rootÚresultr   r   r   r    /   s    

r    Tc             C   s4   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 '{0}' is unset, Python ABI tag may be incorrecté   )r   ÚwarningsÚwarnr   ÚRuntimeWarning)ÚvarÚfallbackÚexpectedr'   Úvalr   r   r   Úget_flag;   s    r-   c              C   sL  t dƒ} t ¡ }| sÆ|dkrÆttdƒrÆd}d}d}tdttdƒ|dkdrNd	}td
|dk|dkohtjdk dr|tjdk r|d}tdtjdkd|dkoštjdk dr®tjdk r®d}d|t ¡ |||f }n‚| rè|  	d¡rèd|  
d¡d  }n`| r(|  	d¡r(d |  
d¡dd… ¡}| dd¡ dd¡}n | rD|  dd¡ dd¡}nd}|S )zXReturn the ABI tag based on SOABI (if available) or emulate SOABI
    (CPython 2, PyPy).ÚSOABI)ÚcpÚppÚ
maxunicodeÚ ÚPy_DEBUGÚgettotalrefcountr/   )r'   ÚdÚWITH_PYMALLOC)r   é   ÚmÚPy_UNICODE_SIZEiÿÿ é   )r   r   )r+   r'   Úuz
%s%s%s%s%szcpython-ú-r   zpypy-Nr%   Ú.Ú_)r   r   Úinterpreter_nameÚhasattrr   r-   r   r1   Úinterpreter_versionr!   ÚsplitÚjoinÚreplace)ÚsoabiÚimplr5   r8   r;   Úabir   r   r   Úget_abi_tagG   sB    

rH   c             C   s   t | ƒ dd¡S )Nr<   r>   )Ú	safe_namerD   )Únamer   r   r   Ú
safer_nameo   s    rK   c             C   s   t | ƒ dd¡S )Nr<   r>   )Úsafe_versionrD   )Úversionr   r   r   Úsafer_versions   s    rN   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_readonlyw   s    rX   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=r5   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-buildr^   r`   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ÚzipFrZ   )Ú	bdist_dirÚdata_dirÚ	plat_nameÚplat_tagr   Ú	keep_tempÚdist_dirÚegginfo_dirÚroot_is_pureÚ
skip_buildr^   ÚownerÚgroupr`   Ú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: {})rg   rd   rj   zpy-limited-api must match '%s'r`   z=The [wheel] section is deprecated. Use [bdist_wheel] instead.r   )Ú1ÚtrueÚyesTz1Build tag (build-number) must start with a digit.)rs   )!rb   Úget_finalized_commandÚ
bdist_baserQ   rV   rC   Úwheel_dist_namerc   rd   rp   Úsupported_compressionsrm   ÚKeyErrorÚ
ValueErrorr   Úset_undefined_optionsra   ÚdistributionÚhas_ext_modulesÚhas_c_librariesri   ro   ÚreÚmatchÚPY_LIMITED_API_PATTERNÚget_option_dictÚloggerr'   ÚstripÚlowerr`   rn   Úisdigit)rq   ry   Zneed_optionsrt   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<   )rK   r   Úget_namerN   Úget_versionrn   rC   )rq   Ú
componentsr   r   r   rz   é   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_64r   iÿÿÿr   r<   r>   r=   zpy2.py3ÚnoneZcp3Zabi3c                s   g | ]}|j |jˆ f‘qS r   )ZinterpreterrG   )Ú.0Út)rd   r   r   ú
<listcomp>  s   z'bdist_wheel.get_tag.<locals>.<listcomp>z)would build wheel with unsupported tag {})rp   rd   ri   r!   r    rb   r   r"   rˆ   rD   r`   r   r   r?   rA   ro   rP   rH   Zsys_tagsÚAssertionErrorr   )rq   rF   ÚtagZ	impl_nameÚimpl_verÚabi_tagZsupported_tagsr   )rd   r   Úget_tagò   s6    


zbdist_wheel.get_tagc          	   C   sD  |   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¡ |  ¡ \}}}	d | j|||	¡}
| js*| 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s@t d| j¡ | j1s@t2| jt3d d S )NÚbuild_scriptsÚpythonTÚ	build_extFÚbuildÚinstall)Úreinit_subcommandsÚinstall_scripts)ÚheadersÚscriptsÚdataÚpurelibÚplatlibÚinstall_r2   Úntz..Úinstall_purelibÚinstall_platlibzinstalling to %sz{}-{}-{}-{}Úinstall_egg_info)Útargetrh   z{}-{}.dist-infoz.whlÚwÚ
dist_filesrY   z{}.{}r%   zremoving %s)Úonerror)4Úreinitialize_commandÚ
executableÚforceZinplacerj   Úrun_commandrb   ÚrootÚcompileÚwarn_dirZno_epÚsetattrrQ   rV   rC   rc   rJ   ÚnormpathÚinstall_libbaseÚinstall_libri   r†   Úinfor—   r   rz   r^   Ú_ensure_relativeÚinstall_baser~   rK   r   r‹   rN   rŒ   Úegg2distrh   Úwrite_wheelfileÚexistsrg   Úmakedirsr   rm   Zwrite_filesÚgetattrÚappendr   r   rf   Údry_runr   rX   )rq   r˜   rš   rœ   rž   ÚkeyZbasedir_observedÚimpl_tagr–   re   Zarchive_basenamer#   Zdistinfo_dirnameZdistinfo_dirÚ
wheel_pathZwfr   r   r   Úrun"  sn    







zbdist_wheel.runzbdist_wheel (ú)c          	   C   s&  ddl m} tjdk r*t|tƒs*| d¡}|ƒ }d|d< ||d< t| jƒ ¡ |d< | j	d k	rf| j	|d	< |  
¡ \}}}xN| d
¡D ]@}x:| d
¡D ],}	x&| d
¡D ]}
d ||	|
f¡|d< q W qW q€W tj |d¡}t d|¡ tƒ }t|dd |¡ t|dƒ}| | ¡  dd¡¡ W d Q R X d S )Nr   )ÚMessage)r   zutf-8z1.0zWheel-Versionr   zRoot-Is-PurelibZBuildr=   r<   ZTagÚWHEELzcreating %s)ÚmaxheaderlenÚwbs   
ó   )Úemail.messagerÇ   r   r   Ú
isinstancerP   Úencoderi   rˆ   rn   r—   rB   rC   rQ   rV   r†   r¸   r   r   ÚflattenÚopenÚwriteÚgetvaluerD   )rq   Zwheelfile_baseÚ	generatorrÇ   ÚmsgrÃ   r–   re   rF   rG   ÚplatZwheelfile_pathÚbufferÚfr   r   r   r¼   v  s(    


 zbdist_wheel.write_wheelfilec             C   s6   t j |¡\}}|dd… t jkr2||dd …  }|S )Nr   r   )rQ   rV   Ú
splitdriveÚsep)rq   rV   Údriver   r   r   r¹   ’  s    zbdist_wheel._ensure_relativec             C   sÖ   | j  d¡}tƒ }tdd„ | dd¡d  ¡ D ƒƒ}d|krZt dt¡ | 	|d d ¡ d|krnd|krnd	}xb|D ]Z}xTt
|ƒD ]H}| d
¡ržt d|¡ q‚||kr‚tj |¡r‚t d||¡ | 	|¡ q‚W qtW |S )NÚmetadatac             S   s   h | ]}|’qS r   r   )r   Úoptionr   r   r   ú	<setcomp>  s   z,bdist_wheel.license_paths.<locals>.<setcomp>Zlicense_files)r2   r2   r   Zlicense_filezEThe "license_file" option is deprecated. Use "license_files" instead.)zLICEN[CS]E*zCOPYING*zNOTICE*zAUTHORS*ú~z4ignoring license file "%s" as it looks like a backupz/adding license file "%s" (matched pattern "%s"))r   r…   ÚsetÚsortedÚgetrB   r&   r'   ÚDeprecationWarningÚaddr   Úendswithr†   ÚdebugrQ   rV   Úisfiler¸   )rq   rÛ   ÚfilesÚpatternsÚpatternrV   r   r   r   Úlicense_paths™  s&    

zbdist_wheel.license_pathsc          	   C   s\  dd„ }||ƒ t j |¡sxddl}t j t j |¡d¡}| |¡}d|f }|rpt j |d ¡}|d|f 7 }t|ƒ‚t j |¡rž|}	t	||ƒ}
t  
|¡ njt j |d¡}	t	||	ƒ}
tj||d	d
„ d t j |d¡}t|dƒ}| ¡  ¡ }W dQ R X |s||ƒ tt j |d¡|
ƒ x2| jD ](}t j |¡}t |t j ||¡¡ q$W ||ƒ 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)rQ   rV   r½   ÚislinkÚisdirÚshutilr   Úunlink)r\   r   r   r   Úadios·  s    $z#bdist_wheel.egg2dist.<locals>.adiosr   Nz
*.egg-infoz)Egg metadata expected at %s but not foundz- (%s 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.txtÚrÚMETADATA)rQ   rV   r½   ÚglobrC   ÚdirnameÚbasenamer}   ræ   r   Úmkdirrí   ÚcopytreerÐ   Úreadr‡   r   rê   Úcopy)rq   Zegginfo_pathZdistinfo_pathrï   rö   ÚpatÚpossibleÚerrZaltZpkginfo_pathÚpkg_infoZdependency_links_pathZdependency_links_fileÚdependency_linksZlicense_pathÚfilenamer   r   r   r»   µ  s:    



zbdist_wheel.egg2dist)Ú__name__Ú
__module__Ú__qualname__Údescriptionr   r
   r	   r{   r    r   rC   r   Úuser_optionsÚboolean_optionsrr   rŠ   Úpropertyrz   r—   rÅ   Úwheel_versionr¼   r¹   rê   r»   r   r   r   r   rY   }   sB   
$	0TrY   )TT)5Ú__doc__r   rQ   rí   rS   r   r‚   r&   Úcollectionsr   Údistutils.corer   r   r†   Úior   rö   r   r   Ú	sysconfigr   Úzipfiler	   r
   Úpkg_resourcesZpkginfor   Zmacosx_libfiler   rÛ   r   Zvendored.packagingr   Z	wheelfiler   r2   r   r
  r   Úemail.generatorr   r   rI   rL   r„   r   r    r-   rH   rK   rN   rX   rY   r   r   r   r   Ú<module>   sH   
(