a
    TeQ                     @  s  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
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& ddl'm(Z( dd Z)dd Z*e+ej,dd Z-dZ.dd Z/dd Z0dd Z1d.d d!Z2d"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)BytesGenerator	Generator)EmailPolicy)iglob)BytesIO)rmtree)ZIP_DEFLATED
ZIP_STORED)Command   )__version__)calculate_macosx_platform_tag)pkginfo_to_metadata)log)tagsversion)	WheelFilec                 C  s   t dd| S )zConvert an arbitrary string to a standard distribution name
    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
    [^A-Za-z0-9.]+-)resubname r   0lib/python3.9/site-packages/wheel/bdist_wheel.py	safe_name$   s    r   c                 C  sD   zt t| W S  tjy>   | dd} tdd|  Y S 0 dS )zB
    Convert an arbitrary string to a standard version string
     .r   r   N)str_packaging_versionZVersionZInvalidVersionreplacer   r   r   r   r   r   safe_version+   s
    r#   r   zcp3\dc                   C  s   t ddkS )NP   )structZcalcsizer   r   r   r   _is_32bit_interpreter<   s    r'   c                   C  s   dt jd  S )Npyr   )sysversion_infor   r   r   r   
python_tag@   s    r+   c                 C  sR   t  }|dr&| dur&t| |}n t rF|dkr:d}n|dkrFd}|ddS )	z0Return our platform name 'win32', 'linux_x86_64'macosxNlinux-x86_64z
linux-i686linux-aarch64zlinux-armv7lr   _)	sysconfigget_platform
startswithr   r'   r"   )archive_rootresultr   r   r   r1   D   s    r1   Tc                 C  s:   t | }|du r2|r.tjd|  dtdd |S ||kS )zfUse a fallback value for determining SOABI flags if the needed config
    var is unset or unavailable.NzConfig variable 'z+' is unset, Python ABI tag may be incorrect   
stacklevel)r0   get_config_varwarningswarnRuntimeWarning)varZfallbackZexpectedr:   valr   r   r   get_flagV   s    

r>   c                  C  sX  t d} t }| s|dv 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  | | | }n| r|dkrd| 	dd  }n| r|dkrd
| 	ddd }|dddd}n^| r4|dkr4d
| 	ddd }|dddd}n | rP| 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gettotalrefcountr?   )r:   dZWITH_PYMALLOC)      mr   r   r@   Nr5   r   r/   ZgraalpyrD   )r0   r8   r   interpreter_namehasattrr)   r>   r*   interpreter_versionsplitjoinr"   )ZsoabiimplrC   rF   uabir   r   r   get_abi_tage   s:    
rO   c                 C  s   t | ddS Nr   r/   )r   r"   r   r   r   r   
safer_name   s    rQ   c                 C  s   t | ddS rP   )r#   r"   r   r   r   r   safer_version   s    rR   c                 C  s   t | ||d  d S )Nr   )remove_readonly_exc)funcpathexcinfor   r   r   remove_readonly   s    rW   c                 C  s   t |tj | | d S )N)oschmodstatS_IWRITE)rT   rU   excr   r   r   rS      s    rS   c                   @  s   e Zd ZdZeed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g d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 distribution)Zstoreddeflated)z
bdist-dir=bz1temporary directory for creating the distributionz
plat-name=pz;platform name to embed in generated filenames (default: %s)N)	keep-tempkzPkeep the pseudo-installation tree around after creating the distribution archive)z	dist-dir=rC   z-directory to put final built distributions in)
skip-buildNz2skip rebuilding everything (for testing/debugging))relativeNz7build the archive using relative paths (default: false))zowner=rM   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))ra   rc   rd   rf   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zipFr^   )	bdist_dirdata_dir	plat_nameplat_tagformat	keep_tempdist_diregginfo_dirroot_is_pure
skip_buildrd   ownergrouprf   compressionr+   build_numberpy_limited_apiplat_name_supplied)selfr   r   r   initialize_options   s&    zbdist_wheel.initialize_optionsc                 C  sN  | j d u r&| dj}tj|d| _ | jd}|  | j	d | _
| jd u| _z| j| j | _W n$ ty   td| j d Y n0 d}| jdgt||R   | j p| j  | _| jrtt| jstdt | jd}d|v r"td	 |d d
  }| dv r"d| _| j d urJ| j d d
 ! sJtdd S )NZbdistwheelegg_infoz.datazUnsupported compression: )rn   rj   rq   zpy-limited-api must match '%s'rf   z=The [wheel] section is deprecated. Use [bdist_wheel] instead.r   )1trueZyesTz1Build tag (build-number) must start with a digit.)"rh   Zget_finalized_command
bdist_baserX   rU   rK   distributionZget_command_objZensure_finalizedwheel_dist_nameri   rj   rw   supported_compressionsrt   KeyError
ValueErrorset_undefined_optionsrg   Zhas_ext_modulesZhas_c_librariesrp   rv   r   matchPY_LIMITED_API_PATTERNget_option_dictr   Zwarningstriplowerrf   ru   isdigit)rx   r~   r{   Zneed_optionsrz   r=   r   r   r   finalize_options   s:    


 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   )rQ   r   get_namerR   get_versionru   rK   )rx   Z
componentsr   r   r   r     s    zbdist_wheel.wheel_dist_namec                   s"  | j r| j nN| jrd nB| jr4| jds4| j n
t| j t r\ dv rPd  dv r\d   ddd	dd
d | jr| j	rd}n| j
}|d f}n~t }t }|| }| jr|| dr| j}d}ntt  }|| f} fddt D }||v sJ d| |S )Nanyr,   )r-   Zlinux_x86_64Z
linux_i686)r.   Zlinux_aarch64Zlinux_armv7lr   r/   r   r   zpy2.py3ZnoneZcp3Zabi3c                   s   g | ]}|j |j fqS r   )ZinterpreterrN   ).0trj   r   r   
<listcomp>[  s   z'bdist_wheel.get_tag.<locals>.<listcomp>z'would build wheel with unsupported tag )rw   rj   rp   r2   r1   rh   r'   r   r"   rf   r+   r   rG   rI   rv   r    rO   Zsys_tags)rx   rL   tagZ	impl_nameZimpl_verabi_tagZsupported_tagsr   r   r   get_tag)  sF    


zbdist_wheel.get_tagc                 C  s  |  d}d|_d|_|  d}d|_| js6| d | j ddd}| j|_d|_| j|_d|_	|  d	}d|_
d
D ] }t|d| tj| j| qtd}tjdkrtjtj| jd}| | _| _t|| jrdnd| td| j  | d |  \}}}	| j d| d| d|	 }
| js4| j}ntj| j| |j}| dd dt| j  t!| j" }tj| j|}| #| j$| | %| tj&| j'st(| j' tj| j'|
d }t)|d| j*}|+| W d    n1 s 0    Y  t,| jdg -ddjt.j/d d  |f | j0std| j  | j1st.j/dk rrt2| jt3d nt2| jt4d d S ) Nbuild_scriptsZpythonT	build_extFZbuildinstall)Zreinit_subcommandsinstall_scripts)ZheadersZscriptsdataZpurelibZplatlibZinstall_rB   ntz..Zinstall_purelibZinstall_platlibzinstalling to r   Zinstall_egg_info)targetro   z{}-{}.dist-infoz.whlwZ
dist_filesr]   z{}.{}r5   z	removing )rD      )onerror)Zonexc)5Zreinitialize_command
executableZforceZinplacerq   Zrun_commandrh   rootcompileZwarn_dirZno_epsetattrrX   rU   rK   ri   r   normpathZinstall_libbaseZinstall_librp   r   infor   r   rd   _ensure_relativeZinstall_baser   rl   rQ   r   r   rR   r   egg2distro   write_wheelfileexistsrn   makedirsr   rt   Zwrite_filesgetattrappendr)   r*   rm   Zdry_runr   rW   rS   )rx   r   r   r   r   keyZbasedir_observedimpl_tagr   rk   Zarchive_basenamer3   Zdistinfo_dirnameZdistinfo_dirZ
wheel_pathZwfr   r   r   runc  sv    






*zbdist_wheel.runzbdist_wheel ()c                 C  s  ddl m} | }d|d< ||d< t| j |d< | jd urH| j|d< |  \}}}|dD ]8}|dD ](}	|dD ]}
d	||	|
f|d
< q|qnq`t	j
|d}td|  t }t|dd| t|d&}|| dd W d    n1 s0    Y  d S )Nr   )Messagez1.0zWheel-Versionr   zRoot-Is-PurelibZBuildr   r   ZTagZWHEELz	creating )Zmaxheaderlenwbs   
   )Zemail.messager   r    rp   r   ru   r   rJ   rK   rX   rU   r   r   r   r   flattenopenwritegetvaluer"   )rx   Zwheelfile_base	generatorr   msgr   r   rk   rL   rN   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   )rX   rU   
splitdrivesep)rx   rU   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|v rV|d d  }nd}d|v rtjdt	d	d
 |
|d d  |s|st|tsd}|D ]f}t|D ]X}|drtd| d q||vrtj|rtd| d| d |
| qq|S )N9   r   metadata*   license_filesr   Zlicense_filezEThe "license_file" option is deprecated. Use "license_files" instead.r5   r6   )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_versionr   r   r   setr   rJ   r9   r:   DeprecationWarningadd
isinstancelistr   endswithr   debugrX   rU   isfiler   )rx   filesr   ZpatternspatternrU   r   r   r   license_paths  s>    

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 
| nt j|d
}	t	||	}
tj||dd d t j|d}t|dd}|  }W d   n1 s0    Y  |s$|| t j|d}tdddd}t|ddd"}t||d|
 W d   n1 sx0    Y  | jD ](}t j|}t|t j|| q|| 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)rX   rU   r   islinkisdirshutilr   unlink)r`   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?)PKG-INFOc                 S  s   h dS )N>   r   zSOURCES.txtznot-zip-safezrequires.txtr   )xyr   r   r   <lambda>5      z&bdist_wheel.egg2dist.<locals>.<lambda>)ignorezdependency_links.txtzutf-8)encodingZMETADATATF)utf8Zmangle_from_Zmax_line_lengthr   )Zpolicy)rX   rU   r   globrK   dirnamebasenamer   r   r   mkdirr   Zcopytreer   readr   r   r   r   r   copy)rx   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     sN    


,2
zbdist_wheel.egg2dist)__name__
__module____qualname__Zdescriptionr
   r	   r   r1   rl   rK   r+   Zuser_optionsZboolean_optionsry   r   propertyr   r   r   wheel_versionr   r   r   r   r   r   r   r   r]      s\   :+

:[


,r]   )TT)9__doc__Z
__future__r   rX   r   r   rZ   r&   r)   r0   r9   Zemail.generatorr   r   Zemail.policyr   r   r   ior   r   Zzipfiler	   r
   Z
setuptoolsr   rB   r   r   Zmacosx_libfiler   r   r   utilr   Zvendored.packagingr   r   r!   Z	wheelfiler   r   r#   intrJ   r   r   r'   r+   r1   r>   rO   rQ   rR   rW   rS   r]   r   r   r   r   <module>   sL   
$