o
    Vh4                     @  sD  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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 ejd	 ZeeZG d
d dejZd&d'ddZG dd deZG dd dejZ G dd de Z!G dd de Z"ej#ddd(d d!Z$d)d$d%Z%ddgZ&dS )*    )annotationsN)
CollectionMapping   )_ctx)run_subprocess)FailedProcessError)check_dependency)pipuvc                   @  s4   e Zd ZdZeejd
ddZejdddZd	S )IsolatedEnvzIsolated build environment ABC.returnstrc                 C     dS )z2The Python executable of the isolated environment.N selfr   r   ]/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/build/env.pypython_executable       zIsolatedEnv.python_executableMapping[str, str] | Nonec                 C  r   )zBGenerate additional env vars specific to the isolated environment.Nr   r   r   r   r   make_extra_environ$   r   zIsolatedEnv.make_extra_environNr   r   )r   r   )	__name__
__module____qualname____doc__propertyabcabstractmethodr   r   r   r   r   r   r      s    r   namer   minimum_version_str
str | Nonedistargsobjectr   bool | Nonec                K  sn   ddl m} ddlm} ztt|jjdd| i|}W n
 ty'   Y dS w |du r.dS ||j	||kS )	z
    Given a path, see if a package is present and return True if the version is
    sufficient for build, False if it is not, None if the package is missing.
    r   )Versionr   )	importlibr    NTr   )
packaging.versionr&   _compatr'   nextitermetadatadistributionsStopIterationversion)r    r!   r#   r&   r'   distributionr   r   r   _has_dependency)   s   "r1   c                   @  sd   e Zd ZdZddddd	Zdd
dZdddZed ddZed ddZ	d!ddZ
d"ddZdS )#DefaultIsolatedEnvz[
    Isolated environment which supports several different underlying implementations.
    r
   	installerr4   	Installerr   Nonec                C  s
   || _ d S Nr3   )r   r4   r   r   r   __init__B   s   
zDefaultIsolatedEnv.__init__c                 C  s   z4t jdd}tj|}|| _|  | jdkrt | _nt	 | _t
d| jj d | j| j W | S  tyC   | jt    w )Nz
build-env-prefixr   zCreating isolated environment: z...)tempfilemkdtempospathrealpath_pathr4   
_UvBackend_env_backend_PipBackendr   logdisplay_namecreate	Exception__exit__sysexc_infor   r>   r   r   r   	__enter__I   s   

zDefaultIsolatedEnv.__enter__argsr$   c                 G  s"   t j| jrt| j d S d S r7   )r=   r>   existsr@   shutilrmtree)r   rM   r   r   r   rH   e   s   zDefaultIsolatedEnv.__exit__r   c                 C  s   | j S )z/The location of the isolated build environment.)r@   r   r   r   r   r>   i   s   zDefaultIsolatedEnv.pathc                 C  s   | j jS )z8The python executable of the isolated build environment.)rB   r   r   r   r   r   r   n   s   z$DefaultIsolatedEnv.python_executabledict[str, str]c                 C  s6   t jd}d|d urt j| jj|giS | jjiS )NPATH)r=   environgetpathsepjoinrB   scripts_dirrK   r   r   r   r   s   s   z%DefaultIsolatedEnv.make_extra_environrequirementsCollection[str]c                 C  s:   |sdS t dddd t|D   | j| dS )at  
        Install packages from PEP 508 requirements in the isolated build environment.

        :param requirements: PEP 508 requirement specification to install

        :note: Passing non-PEP 508 strings will result in undefined behavior, you *should not* rely on it. It is
               merely an implementation detail, it may change any time without warning.
        Nz-Installing packages in isolated environment:

c                 s  s    | ]}d | V  qdS )z- Nr   ).0rr   r   r   	<genexpr>   s    z-DefaultIsolatedEnv.install.<locals>.<genexpr>)r   rD   rV   sortedrB   install_requirementsr   rX   r   r   r   install{   s   	"zDefaultIsolatedEnv.installN)r4   r5   r   r6   )r   r2   )rM   r$   r   r6   r   )r   rQ   rX   rY   r   r6   )r   r   r   r   r8   rL   rH   r   r>   r   r   ra   r   r   r   r   r2   =   s    


r2   c                   @  s@   e Zd ZU ded< ded< dddZdddZedddZdS )_EnvBackendr   r   rW   r>   r   r6   c                 C     d S r7   r   rK   r   r   r   rF      r   z_EnvBackend.createrX   rY   c                 C  rd   r7   r   r`   r   r   r   r_      r   z _EnvBackend.install_requirementsc                 C  rd   r7   r   r   r   r   r   rE      s   z_EnvBackend.display_nameNr>   r   r   r6   rb   r   )r   r   r   __annotations__rF   r_   r   rE   r   r   r   r   rc      s   
 

rc   c                   @  sf   e Zd ZdddZejdddZejdd	d
ZedddZ	dddZ
dddZedddZdS )rC   r   r6   c                 C  s   | j  o| j| _d S r7   )_has_valid_outer_pip_has_virtualenv_create_with_virtualenvr   r   r   r   r8      s   z_PipBackend.__init__r%   c                 C  s
   t ddS )z
        This checks for a valid global pip. Returns None if pip is missing, False
        if pip is too old, and True if it can be used.
        r
   z22.3)r1   r   r   r   r   rg      s   
z _PipBackend._has_valid_outer_pipboolc                   sF   ddl m  dtjduo"t fddtd dD  S )	z
        virtualenv might be incompatible if it was installed separately
        from build. This verifies that virtualenv and all of its
        dependencies are installed as required by build.
        r   )Requirement
virtualenvNc                 3  s.    | ]}t |d kr |d  jkV  qdS )r   N)lenr    )r[   drk   r    r   r   r]      s    $z._PipBackend._has_virtualenv.<locals>.<genexpr>zbuild[])packaging.requirementsrk   r'   util	find_specanyr	   r   r   ro   r   rh      s
   
z_PipBackend._has_virtualenvr   c                  C  sL   t  dkr$t  \} }}t| d | d dkr$|dk}|r"dS dS dS )NDarwin.   x86_64z21.0.1z20.3.0z19.1.0)platformsystemmac_verintfind)release_machineis_apple_silicon_pythonr   r   r   _get_minimum_pip_version_str   s   z(_PipBackend._get_minimum_pip_version_strr>   c           	   
   C  s  | j r#dd l}|j|ddddgdd}t|jj| _t|jj| _d S dd l	}| j
 }z|jt |d| W n tjyP } zt| t|d	d d }~ww t|\| _| _}|r|  }td
||gdsut| jdd
dd| g td|gdrt| jdd
dddg d S d S d S )Nr   z--activators z--no-setuptoolsz
--no-wheelF)setup_loggingsymlinkswith_pipz7Failed to create venv. Maybe try installing virtualenv.r
   )r>   -Imra   zpip>=
setuptools	uninstallz-y)ri   rl   cli_runr   creatorexer   
script_dirrW   venvrg   
EnvBuilder_fs_supports_symlinkrF   
subprocessCalledProcessErrorr   log_subprocess_errorr   _find_executable_and_scriptsr   r1   r   )	r   r>   rl   resultr   r   excpurelibminimum_pip_version_strr   r   r   rF      sL   
z_PipBackend.createrX   rY   c              	   C  s   t jdddddd}|tj| W d    n1 sw   Y  zA| jr1tjddd	| j	g}n| j	d
dg}t
jdkrI|ddt
jd   g7 }|dddddtj|jg7 }t| W t|j d S t|j w )Nwzbuild-reqs-z.txtFzutf-8)r:   suffixdeleteencodingz-mr
   z--pythonr   r   -vra   z--use-pep517z--no-warn-script-locationz--no-compilez-r)r;   NamedTemporaryFilewriter=   lineseprV   rg   rI   
executabler   r   	verbosityr>   abspathr    r   unlink)r   rX   req_filecmdr   r   r   r_      s&   

z _PipBackend.install_requirementsc                 C  s   | j rdS dS )Nzvirtualenv+pipzvenv+pip)ri   r   r   r   r   rE     s   z_PipBackend.display_nameN)r   r6   )r   r%   r   rj   r   re   rb   )r   r   r   r8   	functoolscached_propertyrg   rh   staticmethodr   rF   r_   r   rE   r   r   r   r   rC      s    


1rC   c                   @  s.   e Zd ZdddZdd	d
ZedddZdS )rA   r>   r   r   r6   c              	   C  s   dd l }|| _zdd l}| | _W n& ttfy8   td}|d u r+d}t	|d t
d|  || _Y nw |jt dd| j t| j\| _| _}d S )Nr   r   zuv executable not foundzUsing external uv from Fr   )r   	_env_pathr   find_uv_bin_uv_binModuleNotFoundErrorFileNotFoundErrorrO   whichRuntimeErrorr   rD   r   r   rF   r   r   rW   )r   r>   r   r   uv_binmsgr   r   r   r   rF     s   


	z_UvBackend.createrX   rY   c                 C  s`   | j dg}tjdkr|ddtdtjd   g7 }tg |d|i tjd| jid d S )	Nr
   r   r   r      ra   VIRTUAL_ENV)env)r   r   r   minr   r=   rS   r   )r   rX   r   r   r   r   r_   )  s   

 ,z_UvBackend.install_requirementsc                 C  r   )Nzvenv+uvr   r   r   r   r   rE   /  s   z_UvBackend.display_nameNre   rb   r   )r   r   r   rF   r_   r   rE   r   r   r   r   rA     s
    

rA   )maxsizerj   c                  C  s   t jdkrdS tjdd1} |  d}zt | j| t | W n tttfy4   Y W d   dS w 	 W d   dS 1 sAw   Y  dS )z%Return True if symlinks are supportedntTzbuild-symlink-r9   z-bNF)	r=   r    r;   r   symlinkr   OSErrorNotImplementedErrorAttributeError)tmp_filedestr   r   r   r   4  s   

$r   r>   tuple[str, str, str]c                 C  s   t   }| |d< t  }d|v rt jd|d}nd|v r&t jd|d}nd|v r2t jd|d}nt j|d}tj|d tjd	krEd
nd}tj	|sXd| d}t
|||d |d fS )z
    Detect the Python executable and script folder of a virtual environment.

    :param path: The location of the virtual environment
    :return: The Python executable, script folder, and purelib folder
    baser   )schemevarsposix_localposix_prefixosx_framework_library)r   scriptsr   z
python.exepythonz0Virtual environment creation failed, executable z missingr   )	sysconfigget_config_varscopyget_scheme_names	get_pathsr=   r>   rV   r    rN   r   )r>   config_varsscheme_namespathsr   r   r   r   r   r   F  s    r   r7   )r    r   r!   r"   r#   r$   r   r%   r   )r>   r   r   r   )'
__future__r   r   r   importlib.utilr'   r=   ry   rO   r   rI   r   r;   typingcollections.abcr   r   r   r   r   _exceptionsr   _utilr	   Literalr5   get_args
INSTALLERSProtocolr   r1   r2   rc   rC   rA   	lru_cacher   r   __all__r   r   r   r   <module>   s>    

N|
!
,