3
eJ                 @   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j tjd S )Nzpy{}r   )formatsysversion_info r   r   2/tmp/pip-build-o4kl84jy/wheel/wheel/bdist_wheel.py
python_tag+   s    r   c             C   s@   t jj }|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jdj| 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   sN  t d} tj }|  r|dkrttdrd}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dtjdkd|dkotjdk drtjd k rd}d|tj |||f }n| r| j	drd| j
dd  }n`| r*| j	dr*dj| j
ddd }|jddjdd}n | rF| jddj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gettotalrefcount)r'   dWITH_PYMALLOCr      mPy_UNICODE_SIZEi    )r+   r'   uz
%s%s%s%s%szcpython--r   zpypy-Nr%   ._)r/   r0   )r   r7   )r   r7   )r   r   )r   r   )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 | jddS )Nr<   r>   )	safe_namerD   )namer   r   r   
safer_nameo   s    rK   c             C   s   t | jddS )Nr<   r>   )safe_versionrD   )versionr   r   r   safer_versions   s    rN   c             C   s*   t t|d  tj|tj | | d S )Nr   )printstroschmodstatS_IWRITE)funcpathZexcinfor   r   r   remove_readonlyw   s    rW   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@dAdBdCdd
dj	d j
efd!d
d"e  fdDdEgZddddgZd'd( Zd)d* Zed+d, Zd-d. Zd/d0 Zd1e d2 fd3d4Zd5d6 Zed7d8 Zd9d: Zd
S )Fbdist_wheelzcreate a wheel distributionZstoreddeflated
bdist-dir=b1temporary directory for creating the distributionz
plat-name=pz;platform name to embed in generated filenames (default: %s)N	keep-tempkz/keep the pseudo-installation tree around after z!creating the distribution archive	dist-dir=r5   -directory to put final built distributions in
skip-build2skip rebuilding everything (for testing/debugging)relative7build the archive using relative paths (default: false)owner=r;   @Owner name used when creating a tar file [default: current user]group=gAGroup name used when creating a tar file [default: current group]	universal'make a universal wheel (default: false)zcompression=z6zipfile compression (one of: {}) (default: 'deflated')z, zpython-tag=z7Python implementation compatibility tag (default: '%s')build-number=qBuild number for this particular version. As specified in PEP-0427, this must start with a digit. [default: None]py-limited-api=?Python tag (cp32|cp33|cpNN) for abi3 wheel tag (default: false)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zipFrY   )	bdist_dirdata_dir	plat_nameplat_tagr   	keep_tempdist_diregginfo_dirroot_is_pure
skip_buildrd   ownergrouprk   compressionr   build_numberpy_limited_apiplat_name_supplied)selfr   r   r   initialize_options   s&    zbdist_wheel.initialize_optionsc             C   s:  | j d kr&| jdj}tjj|d| _ | jd | _| jd k	| _	y| j
| j | _W n$ tk
rt   tdj| jY nX d}| jdt||  | jj p| jj  | _| jrtjt| j rtdt | jjd}d	|krtjd
 |d	 d j }|j dkrd| _| jd k	r6| jd d j   r6tdd S )Nbdistwheelz.datazUnsupported compression: {}rw   rt   rz   zpy-limited-api must match '%s'rk   z=The [wheel] section is deprecated. Use [bdist_wheel] instead.r   1trueyesTz1Build tag (build-number) must start with a digit.)rw   rt   rz   )r   )r   r   r   )!rr   get_finalized_command
bdist_baserQ   rV   rC   wheel_dist_namers   rt   r   supported_compressionsr}   KeyError
ValueErrorr   set_undefined_optionsrq   distributionhas_ext_moduleshas_c_librariesry   r   rematchPY_LIMITED_API_PATTERNget_option_dictloggerr'   striplowerrk   r~   isdigit)r   r   Zneed_optionsr   r,   r   r   r   finalize_options   s0    



"zbdist_wheel.finalize_optionsc             C   s8   t | jj t| jj f}| jr.|| jf7 }dj|S )z4Return distribution full name with - replaced with _r<   )rK   r   get_namerN   get_versionr~   rC   )r   
componentsr   r   r   r      s
    zbdist_wheel.wheel_dist_namec                s  | j r| j nH| jrd n<| jr6| jjd r6| j n
t| j  dkrVtjdkrVd  j j	ddj	d	d | jr| j
rd
}n| j}|d f}n~tj }tj }|| }| jr|| jdr| j}d}ntt j }|| f} fddtj D }||kstdj||S )Nanyr   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)rt   r   r   
<listcomp>  s   z'bdist_wheel.get_tag.<locals>.<listcomp>z)would build wheel with unsupported tag {})r   r   )r   rt   ry   r!   r    rr   r   r"   r   rD   rk   r   r   r?   rA   r   rP   rH   Zsys_tagsAssertionErrorr   )r   rF   tagZ	impl_nameimpl_verabi_tagsupported_tagsr   )rt   r   get_tag   s6    


zbdist_wheel.get_tagc             C   sD  | j d}d|_d|_| j d}d|_| js6| jd | j ddd}| j|_d|_| j|_d|_	| j d	}d|_
x(d#D ] }t|d| tjj| j| qvW d}tjdkrtjjtjj| jd}| | _| _t|| jrdnd| tjd| j | jd | j \}}}	dj| j|||	}
| js*| j}ntjj| j| j|j}| jdd$ djt| jj  t!| jj" }tjj| j|}| j#| j$| | j%| tjj&| j'stj(| j' tjj| j'|
d }t)|d| j*}|j+| W d Q R X t,| jdg j-ddjt.j/d d   |f | j0s@tj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targetrx   z{}-{}.dist-infoz.whlw
dist_filesrX   z{}.{}r%   zremoving %s)onerror)r   r   r   r   r   )r   rx   )4reinitialize_command
executableforceZinplacerz   run_commandrr   rootcompilewarn_dirZno_epsetattrrQ   rV   rC   rs   rJ   normpathinstall_libbaseinstall_libry   r   infor   r   r   rd   _ensure_relativeinstall_baser   rK   r   r   rN   r   egg2distrx   write_wheelfileexistsrw   makedirsr   r}   Zwrite_filesgetattrappendr   r   rv   dry_runr   rW   )r   r   r   r   r   keyZbasedir_observedimpl_tagr   ru   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 r,|jd}| }d|d< ||d< t| jj |d< | j	d k	rh| j	|d	< | j
 \}}}xN|jd
D ]@}x:|jd
D ],}	x&|jd
D ]}
dj||	|
f|d< qW qW qW tjj|d}tjd| t }t|ddj| t|d}|j|j jdd W d Q R X d S )Nr   )Messager   zutf-8z1.0zWheel-Versionr   zRoot-Is-PurelibZBuildr=   r<   ZTagWHEELzcreating %s)maxheaderlenwbs   
   )r   )email.messager   r   r   
isinstancerP   encodery   r   r~   r   rB   rC   rQ   rV   r   r   r   r   flattenopenwritegetvaluerD   )r   Zwheelfile_base	generatorr   msgr   r   ru   rF   rG   platZwheelfile_pathbufferfr   r   r   r   v  s(    


 zbdist_wheel.write_wheelfilec             C   s6   t jj|\}}|dd t jkr2||dd   }|S )Nr   r   )rQ   rV   
splitdrivesep)r   rV   driver   r   r   r     s    zbdist_wheel._ensure_relativec             C   s   | j jd}t }tdd |jddd j D }d|krZtjdt |j	|d d  d|krnd|krnd}xb|D ]Z}xTt
|D ]H}|jdrtjd| q||krtjj|rtjd|| |j	| qW 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_filesr2   r   Zlicense_filezEThe "license_file" option is deprecated. Use "license_files" instead.LICEN[CS]E*COPYING*NOTICE*AUTHORS*~z4ignoring license file "%s" as it looks like a backupz/adding license file "%s" (matched pattern "%s"))r2   r2   )r   r   r   r   )r   r   setsortedgetrB   r&   r'   DeprecationWarningaddr   endswithr   debugrQ   rV   isfiler   )r   r   filespatternspatternrV   r   r   r   license_paths  s&    

zbdist_wheel.license_pathsc             C   s\  dd }|| t jj|sxddl}t jjt jj|d}|j|}d|f }|rpt jj|d }|d|f 7 }t|t jj|r|}	t	||}
t j
| njt jj|d}	t	||	}
tj||d	d
 d t jj|d}t|d}|j j }W dQ R X |s|| tt jj|d|
 x2| jD ](}t jj|}tj|t jj|| q$W || dS )z:Convert an .egg-info directory into a .dist-info directoryc             S   sL   t jj| r2t jj|  r2t jj| r2tj|  nt jj| rHt j|  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)r   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)rZ   r[   r\   Pkeep the pseudo-installation tree around after creating the distribution archive)r^   r_   r  )r`   r5   ra   )rb   Nrc   )rd   Nre   )rf   r;   rg   )rh   ri   rj   )rk   Nrl   )rm   Nrn   )ro   Nrp   )__name__
__module____qualname__descriptionr   r
   r	   r   r    r   rC   r   user_optionsboolean_optionsr   r   propertyr   r   r   wheel_versionr   r   r   r   r   r   r   r   rX   }   sX    
          $	0TrX   )r   )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   rW   rX   r   r   r   r   <module>   sH   
(