o
    i2#                     @  sr  d Z ddlm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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&m'Z' ddl(m)Z) ddl*m+Z+ e,e-Z.e/dej0Z1e2e3e" e3e" f Z4d5ddZ5d6ddZ6d7d"d#Z7d8d&d'Z8d9d,d-Z9d:d.d/Z:d;d3d4Z;dS )<z:Orchestrator for building wheels from InstallRequirements.    )annotationsN)Iterable)TemporaryDirectory)canonicalize_namecanonicalize_version)InvalidVersionVersion)
WheelCache)InvalidWheelFilenameUnsupportedWheel)FilesystemWheelget_wheel_distribution)Link)Wheel)build_wheel_pep517)build_wheel_editable)InstallRequirement)
indent_log)
ensure_dir	hash_file)path_to_url)vcsz([a-z0-9_.]+)-([a-z0-9_.!+-]+)sstrreturnboolc                 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/ocr-read/venv/lib/python3.10/site-packages/pip/_internal/wheel_builder.py_contains_egg_info"   s   r    reqr   bool | Nonec                 C  s   | j s| jsdS | jr1| jjr1| j rJ | jsJ t| jj}|s$J || jj| jr/dS dS | js6J | j	 \}}t
|rCdS dS )z
    Return whether a built InstallRequirement can be stored in the persistent
    wheel cache, assuming the wheel cache is available.
    FT)editable
source_dirlinkis_vcsr   get_backend_for_schemeschemeis_immutable_rev_checkouturlsplitextr    )r!   vcs_backendbaseextr   r   r   _should_cache*   s   


r/   wheel_cacher	   c                 C  s@   t |j}| js
J |rt| r|| j}|S || j}|S )zdReturn the persistent or temporary cache directory where the built
    wheel need to be stored.
    )r   	cache_dirr%   r/   get_path_for_linkget_ephem_path_for_link)r!   r0   cache_availabler1   r   r   r   _get_cache_dirI   s   

r5   
wheel_pathNonec           	      C  s   t | jpd}ttj|}|j|krtd|d|jtt||}t	|j
}t|t|j
kr?td|d|j
|j}|d u rJtdzt|}W n ty`   d| }t|w |tdkrut|j
tswtd|dd S 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!   r6   canonical_namewdistdist_verstrmetadata_version_valuer>   msgr   r   r   _verify_oneY   s<   



rF   
output_dirverifyr#   
str | Nonec              
   C  s   |rdnd}zt | W n ty( } ztd|| j| W Y d}~dS d}~ww | j t| ||}W d   n1 s=w   Y  |rm|rmzt| | W |S  tt	fyl } ztd|| j| W Y d}~dS d}~ww |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warningr9   	build_env_build_one_inside_envrF   r
   r   )r!   rG   rH   r#   artifacter6   r   r   r   
_build_onev   s4   

rR   c           
      C  s*  t |d}| jsJ | jsJ | jsJ |r#t| j| j| j|d}nt| j| j| j|d}|d urtj|}tj	||}z(t
|\}}t|| td| j|||  td| |W W  d    S  ty }	 ztd| j|	 W Y d }	~	nd }	~	ww 	 W d    d S 1 sw   Y  d S )N)dir)r9   backendmetadata_directorywheel_directoryz3Created wheel for %s: filename=%s size=%d sha256=%szStored in directory: %sz Building wheel for %s failed: %s)r   r9   rU   pep517_backendr   r   r:   r;   r<   joinr   replacerL   info	hexdigest	ExceptionrM   )
r!   rG   r#   rV   r6   
wheel_name	dest_path
wheel_hashlengthrQ   r   r   r   rO      sV   


&$rO   requirementsIterable[InstallRequirement]BuildResultc                 C  s*  | sg g fS t dddd | D  t R g g }}| D ]B}|js&J t||}t||||jo4|j}|r\|j	durD|
||j	 tt||_|jj|_|jjsVJ || q|| qW d   n1 slw   Y  |rt dddd	 |D  |rt 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 )Nr9   .0r!   r   r   r   	<genexpr>   s    zbuild.<locals>.<genexpr>NzSuccessfully built %s c                 S     g | ]}|j qS r   rd   re   r   r   r   
<listcomp>       zbuild.<locals>.<listcomp>zFailed to build %sc                 S  ri   r   rd   re   r   r   r   rj     rk   )rL   rZ   rX   r   r9   r5   rR   r#   permit_editable_wheelsdownload_inforecord_download_originr   r   r%   	file_pathlocal_file_pathis_wheelappend)ra   r0   rH   build_successesbuild_failuresr!   r1   
wheel_filer   r   r   build   sL   






rv   )r   r   r   r   )r!   r   r   r"   )r!   r   r0   r	   r   r   )r!   r   r6   r   r   r7   )
r!   r   rG   r   rH   r   r#   r   r   rI   )r!   r   rG   r   r#   r   r   rI   )ra   rb   r0   r	   rH   r   r   rc   )<__doc__
__future__r   loggingos.pathr:   recollections.abcr   tempfiler   pip._vendor.packaging.utilsr   r   pip._vendor.packaging.versionr   r   pip._internal.cacher	   pip._internal.exceptionsr
   r   pip._internal.metadatar   r   pip._internal.models.linkr   pip._internal.models.wheelr   $pip._internal.operations.build.wheelr   -pip._internal.operations.build.wheel_editabler   pip._internal.req.req_installr   pip._internal.utils.loggingr   pip._internal.utils.miscr   r   pip._internal.utils.urlsr   pip._internal.vcsr   	getLogger__name__rL   compile
IGNORECASEr   tuplelistrc   r    r/   r5   rF   rR   rO   rv   r   r   r   r   <module>   s>    






"4