U
    ee+                     @  sx  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Zd dlZd dlmZmZ ddlmZ ddlmZ ejdkrd dlmZ nejrd dlmZ nejZeeZG d	d
 d
eZej ddddddZ!dddddZ"G dd deZ#dddddZ$ej ddddddZ%dddddZ&dd dd!d"Z'd
dgZ(dS )#    )annotationsN)
CollectionMapping   )FailedProcessError)check_dependency      )Protocolc                   @  s<   e Zd ZdZeejddddZejddddZd	S )
IsolatedEnvzIsolated build environment ABC.strreturnc                 C  s   dS )z2The Python executable of the isolated environment.N selfr   r   -/tmp/pip-unpacked-wheel-f07x2s22/build/env.pypython_executable%   s    zIsolatedEnv.python_executablezMapping[str, str] | Nonec                 C  s   dS )zBGenerate additional env vars specific to the isolated environment.Nr   r   r   r   r   make_extra_environ*   s    zIsolatedEnv.make_extra_environN)	__name__
__module____qualname____doc__propertyabcabstractmethodr   r   r   r   r   r   r   "   s   r   )maxsizeboolr   c                     s4   dd l  tjdd k	o2t fddtdD  S )Nr   
virtualenvc                 3  s0   | ](}t |d kr j|d  jdkV  qdS )r   r   N)lenrequirementsRequirementname).0d	packagingr   r   	<genexpr>6   s   z)_should_use_virtualenv.<locals>.<genexpr>zbuild[virtualenv])Zpackaging.requirements	importlibutil	find_specanyr   r   r   r&   r   _should_use_virtualenv/   s    r-   z	list[str]None)cmdr   c              
   C  s\   zt j| dt jt jd W n< t jk
rV } zt|j dtj	d  W 5 d}~X Y nX dS )z;Invoke subprocess and output stdout and stderr if it fails.T)checkstdoutstderr )endfileN)

subprocessrunPIPESTDOUTCalledProcessErrorprintoutputdecodesysr2   )r/   er   r   r   _subprocess=   s
    r@   c                   @  s   e Zd ZdZd dddZddddd	Zed
dddZed
dddZddddZ	dddddZ
ed
ddddZdS )DefaultIsolatedEnvzDAn isolated environment which combines venv and virtualenv with pip.r   c                 C  s   zht jdd| _t r4| d t| j\| _| _n2| d tj	
t jdd| _t| j\| _| _W n$ tk
r   | jt    Y nX | S )Nz
build-env-prefixz+Creating virtualenv isolated environment...z%Creating venv isolated environment...)tempfilemkdtemp_pathr-   log_create_isolated_env_virtualenv_python_executable_scripts_dirospathrealpath_create_isolated_env_venv	Exception__exit__r>   exc_infor   r   r   r   	__enter__I   s    

zDefaultIsolatedEnv.__enter__objectr.   )argsr   c                 G  s   t j| jrt| j d S )N)rK   rL   existsrF   shutilrmtree)r   rT   r   r   r   rP   `   s    zDefaultIsolatedEnv.__exit__r   c                 C  s   | j S )z/The location of the isolated build environment.)rF   r   r   r   r   rL   d   s    zDefaultIsolatedEnv.pathc                 C  s   | j S )z8The python executable of the isolated build environment.)rI   r   r   r   r   r   i   s    z$DefaultIsolatedEnv.python_executablezdict[str, str]c                 C  s0   t jd}d|d k	r(t j| j|gn| jiS )NPATH)rK   environgetpathsepjoinrJ   )r   rL   r   r   r   r   n   s    z%DefaultIsolatedEnv.make_extra_environzCollection[str])r!   r   c              
   C  s   |sdS |  ddt| d tjddddd	d
}|tj| W 5 Q R X z,| j
ddddddtj|j	g}t| W 5 t|j	 X 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.
        Nz0Installing packages in isolated environment... (z, )wzbuild-reqs-z.txtFzutf-8)rC   suffixdeleteencodingz-Impipinstallz--use-pep517z--no-warn-script-locationz-r)rG   r\   sortedrD   NamedTemporaryFilewriterK   linesepunlinkr#   r   rL   abspathr@   )r   r!   req_filer/   r   r   r   rc   r   s"    	
zDefaultIsolatedEnv.install)messager   c                 C  s0   t jdkrtjtj| dd nttj|  dS )z
        Prints message

        The default implementation uses the logging module but this function can be
        overwritten by users to have a different implementation.

        :param msg: Message to output
        r      )
stacklevelN)r>   version_info_loggerrG   loggingINFO)rk   r   r   r   rG      s    

zDefaultIsolatedEnv.logN)r   r   r   r   rR   rP   r   rL   r   r   rc   staticmethodrG   r   r   r   r   rA   F   s   !rA   r   ztuple[str, str])rL   r   c                 C  sH   ddl }t| ddddg}|j|dd}t|jj}t|jj}||fS )	z
    We optionally can use the virtualenv package to provision a virtual environment.

    :param path: The path where to create the isolated build environment
    :return: The Python executable and script folder
    r   Nz--no-setuptoolsz
--no-wheelz--activatorsr3   F)setup_logging)r   r   Zcli_runZcreatorZexe
script_dir)rL   r   r/   result
executablert   r   r   r   rH      s    rH   c                  C  s   t jdsdS tjdd^} |  d}zt| j| t| W n& t	t
tfk
rj   Y W 5 Q R  dS X W 5 Q R  dS Q R X dS )z%Return True if symlinks are supportedwinTzbuild-symlink-rB   z-bFN)r>   platform
startswithrD   re   rK   symlinkr#   rh   OSErrorNotImplementedErrorAttributeError)Ztmp_filedestr   r   r   _fs_supports_symlink   s    
r   c              
   C  s|  ddl }ddl}tjdk r$ddl}nddlm} t }zLt	 : tjdd dkrbt
ddt |jd	|d
|  W 5 Q R X W n0 tjk
r } zt|ddW 5 d}~X Y nX t| \}}}tt|jd|gd}	|j|	j}
t dkr2tt d dd dkr2t dk}|r,dnd}nd}|
|j|k r`t|dddd| g t|dddddg ||fS )z
    On Python 3 we use the venv package from the standard library.

    :param path: The path where to create the isolated build environment
    :return: The Python executable and script folder
    r   Nr   )metadatar	   )r	      r   ignorez.check_home argument is deprecated and ignored.T)Zwith_pipsymlinksz7Failed to create venv. Maybe try installing virtualenv.rb   )r#   rL   Darwin.r   x86_64z21.0.1z20.3.0z19.1.0z-mrc   zpip>=	uninstall
setuptoolsz-y)venvZpackaging.versionr>   rn   Zimportlib_metadatar)   r   r   warningscatch_warningsfilterwarningsDeprecationWarningZ
EnvBuildercreater6   r:   r   _find_executable_and_scriptsnextiterdistributionsversionVersionrx   systemintmac_versplitmachiner@   )rL   r   r'   r   r   excrv   rt   purelibZpip_distributionZcurrent_pip_versionZis_apple_silicon_pythonZminimum_pip_versionr   r   r   rN      s0    


".rN   ztuple[str, str, str]c                 C  s   t   }| |d< t  }d|kr4t jd|d}n<d|krLt jd|d}n$d|krdt jd|d}nt j|d}tj|d tj	
d	rd
nd}tj|sd| 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varsZposix_localposix_prefixZosx_framework_library)r   scriptsrw   z
python.exepythonz0Virtual environment creation failed, executable z missingr   )	sysconfigget_config_varscopyget_scheme_names	get_pathsrK   rL   r\   r>   rx   ry   rU   RuntimeError)rL   config_varsZscheme_namespathsrv   msgr   r   r   r      s    "r   ))
__future__r   r   	functoolsimportlib.utilr)   rp   rK   rx   rV   r6   r>   r   rD   typingr   collections.abcr   r   _exceptionsr   Z_utilr   rn   r   TYPE_CHECKINGZtyping_extensionsABC	getLoggerr   ro   r   	lru_cacher-   r@   rA   rH   r   rN   r   __all__r   r   r   r   <module>   sF   


	]
0+