a
    sh+                     @  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m	Z	 ddl
mZmZ ddlmZmZ ddlmZ ddlmZ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! ddl"m#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/m0Z0 ddl1m2Z2 e3e4Z5e6dej7Z8e9e:e# e:e# f Z;dddddZ<ddddd Z=dddd!d"Z>dd#dd$d%Z?dd&dd'd(d)Z@ddd*d+d,d-ZAdddd.d.dd/d0d1d2ZBddd.d.dd/d3d4d5ZCdd.dd6d7d8ZDd9d&dd.d.d:d;d<d=ZEdS )>z:Orchestrator for building wheels from InstallRequirements.    )annotationsN)Iterable)canonicalize_namecanonicalize_version)InvalidVersionVersion)
WheelCache)InvalidWheelFilenameUnsupportedWheel)FilesystemWheelget_wheel_distribution)Link)Wheel)build_wheel_pep517)build_wheel_editable)build_wheel_legacy)InstallRequirement)
indent_log)
ensure_dir	hash_file)make_setuptools_clean_args)call_subprocess)TempDirectory)path_to_url)vcsz([a-z0-9_.]+)-([a-z0-9_.!+-]+)strbool)sreturnc                 C  s   t t| S )zjDetermine whether the string looks like an egg_info.

    :param s: The string to parse. E.g. foo-2.1
    )r   _egg_info_research)r    r!   W/var/www/html/assistant/venv/lib/python3.9/site-packages/pip/_internal/wheel_builder.py_contains_egg_info&   s    r#   r   )reqr   c                 C  s.   | j r
J | jrdS | jsJ | jr*| jS dS )zBReturn whether an InstallRequirement should be built into a wheel.FT)
constraintis_wheel
source_direditableZsupports_pyproject_editabler$   r!   r!   r"   _should_build.   s    

r*   c                 C  s   t | S N)r*   r)   r!   r!   r"    should_build_for_install_command@   s    r,   zbool | Nonec                 C  s   | j s| jsdS | jrb| jjrb| j r(J | js2J t| jj}|sHJ || jj| jr^dS dS | jslJ | j	 \}}t
|rdS dS )z
    Return whether a built InstallRequirement can be stored in the persistent
    wheel cache, assuming the wheel cache is available, and _should_build()
    has determined a wheel needs to be built.
    FT)r(   r'   linkis_vcsr   get_backend_for_schemeschemeis_immutable_rev_checkouturlsplitextr#   )r$   vcs_backendbaseextr!   r!   r"   _should_cacheF   s    


r7   r   )r$   wheel_cacher   c                 C  s>   t |j}| jsJ |r.t| r.|| j}n|| j}|S )zdReturn the persistent or temporary cache directory where the built
    wheel need to be stored.
    )r   	cache_dirr-   r7   get_path_for_linkget_ephem_path_for_link)r$   r8   cache_availabler9   r!   r!   r"   _get_cache_dirf   s    

r=   None)r$   
wheel_pathr   c           	      C  s   t | jp
d}ttj|}t |j|krBtd|d|jtt||}t	|j
}t|t|j
krtd|d|j
|j}|d u rtdzt|}W n$ ty   d| }t|Y n0 |tdkrt|j
tstd|dd S )	N z)Wheel has unexpected file name: expected z, got zMissing Metadata-VersionzInvalid Metadata-Version: z1.2z+Metadata 1.2 mandates PEP 440 version, but z is not)r   namer   ospathbasenamer	   r   r   r   versionr   metadata_versionr
   r   r   
isinstance)	r$   r?   canonical_namewdistZdist_verstrZmetadata_version_valuerF   msgr!   r!   r"   _verify_onev   s8    


rL   z	list[str]z
str | None)r$   
output_dirverifybuild_optionsglobal_optionsr(   r   c           	   
   C  s   |rdnd}zt | W n8 tyP } z td|| j| W Y d}~dS d}~0 0 | j  t| ||||}W d   n1 s~0    Y  |r|rzt| | W n< tt	fy } z td|| j| W Y d}~dS d}~0 0 |S )zaBuild one wheel.

    :return: The filename of the built wheel, or None if the build failed.
    r(   wheelzBuilding %s for %s failed: %sNzBuilt %s for %s is invalid: %s)
r   OSErrorloggerwarningrA   	build_env_build_one_inside_envrL   r	   r
   )	r$   rM   rN   rO   rP   r(   Zartifacter?   r!   r!   r"   
_build_one   s,    
"rX   )r$   rM   rO   rP   r(   r   c                 C  s  t ddl}| jsJ | jr| js(J | js2J |rDtd| j |rVtd| j |rtt| j| j| j|jd}qt	| j| j| j|jd}nt
| j| j| j|||jd}|d urVtj|}tj||}zPt|\}	}
t|| td| j||
|	  td| |W W  d    S  tyT } ztd	| j| W Y d }~n
d }~0 0 | jsht| | W d    d S 1 s0    Y  d S )
NrQ   )kindz7Ignoring --global-option when building %s using PEP 517z6Ignoring --build-option when building %s using PEP 517)rA   backendmetadata_directorytempd)rA   setup_py_pathr'   rP   rO   r\   z3Created wheel for %s: filename=%s size=%d sha256=%szStored in directory: %sz Building wheel for %s failed: %s)r   rA   
use_pep517r[   pep517_backendrS   rT   r   rC   r   r   r]   unpacked_source_directoryrB   rD   joinr   shutilmoveinfo	hexdigest	Exception_clean_one_legacy)r$   rM   rO   rP   r(   temp_dirr?   
wheel_name	dest_path
wheel_hashlengthrW   r!   r!   r"   rV      st    


	

rV   )r$   rP   r   c                 C  sZ   t | j|d}td| j zt|d| jd W dS  tyT   td| j Y dS 0 d S )N)rP   zRunning setup.py clean for %szpython setup.py clean)command_desccwdTz Failed cleaning build dir for %sF)	r   r]   rS   rd   rA   r   r'   rf   error)r$   rP   
clean_argsr!   r!   r"   rg      s    rg   zIterable[InstallRequirement]BuildResult)requirementsr8   rN   rO   rP   r   c           
   	   C  s2  | sg g fS t dddd | D  t  g g  }}| D ]}|jsLJ t||}t||||||jol|j}	|	r|j	dur|
||j	 tt|	|_|jj|_|jjsJ || q>|| q>W d   n1 s0    Y  |rt dddd	 |D  |r*t d
ddd	 |D  ||fS )zBuild wheels.

    :return: The list of InstallRequirement that succeeded to build and
        the list of InstallRequirement that failed to build.
    z*Building wheels for collected packages: %sz, c                 s  s   | ]}|j V  qd S r+   rA   .0r$   r!   r!   r"   	<genexpr>#      zbuild.<locals>.<genexpr>NzSuccessfully built %s c                 S  s   g | ]
}|j qS r!   rs   rt   r!   r!   r"   
<listcomp>F  rw   zbuild.<locals>.<listcomp>zFailed to build %sc                 S  s   g | ]
}|j qS r!   rs   rt   r!   r!   r"   ry   K  rw   )rS   rd   ra   r   rA   r=   rX   r(   Zpermit_editable_wheelsZdownload_infoZrecord_download_originr   r   r-   	file_pathlocal_file_pathr&   append)
rr   r8   rN   rO   rP   build_successesbuild_failuresr$   r9   
wheel_filer!   r!   r"   build  sL    





*r   )F__doc__
__future__r   loggingos.pathrB   rerb   collections.abcr   pip._vendor.packaging.utilsr   r   Zpip._vendor.packaging.versionr   r   pip._internal.cacher   pip._internal.exceptionsr	   r
   Zpip._internal.metadatar   r   pip._internal.models.linkr   pip._internal.models.wheelr   $pip._internal.operations.build.wheelr   Z-pip._internal.operations.build.wheel_editabler   +pip._internal.operations.build.wheel_legacyr   Zpip._internal.req.req_installr   pip._internal.utils.loggingr   pip._internal.utils.miscr   r   $pip._internal.utils.setuptools_buildr   pip._internal.utils.subprocessr   pip._internal.utils.temp_dirr   pip._internal.utils.urlsr   pip._internal.vcsr   	getLogger__name__rS   compile
IGNORECASEr   tuplelistrq   r#   r*   r,   r7   r=   rL   rX   rV   rg   r   r!   r!   r!   r"   <module>   sJ   
 &G