o
    VhV                     @  s  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	m
Z
 d dlmZ d dlmZ d dlmZ d dl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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l-m.Z. d dl-m/Z/ erd dl0m1Z1 d dl2m3Z3 d dl4m5Z5 G dd deZ6G dd dZ7dS )     )annotationsN)cached_property)Path)CalledProcessError)TYPE_CHECKING)NullIO)Version)TOMLFile)WINDOWS)encode)EnvCommandError)IncorrectEnvError)
GenericEnv)Python) InvalidCurrentPythonVersionError)#NoCompatiblePythonVersionFoundError)PythonVersionNotFoundError)GET_ENV_PATH_ONELINER)GET_PYTHON_VERSION_ONELINER)	SystemEnv
VirtualEnv)get_real_windows_path)remove_directory)IO)Poetry)Envc                   @  s   e Zd ZdZd
ddd	ZdS )EnvsFileay  
    This file contains one section per project with the project's base env name
    as section name. Each section contains the minor and patch version of the
    python executable used to create the currently active virtualenv.

    Example:

    [poetry-QRErDmmj]
    minor = "3.9"
    patch = "3.9.13"

    [poetry-core-m5r7DkRA]
    minor = "3.11"
    patch = "3.11.6"
    Nnamestrminor
str | Nonereturnc                 C  sX   |   }||}|dur*|r|d |kr*||= | | |d }t|ts(J |S dS )z
        Remove a section from the envs file.

        If "minor" is given, the section is only removed if its minor value
        matches "minor".

        Returns the "minor" value of the removed section.
        Nr    )readgetwrite
isinstancer   )selfr   r    envscurrent_env r*   p/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/poetry/utils/env/env_manager.pyremove_section@   s   	

zEnvsFile.remove_sectionN)r   r   r    r!   r"   r!   )__name__
__module____qualname____doc__r,   r*   r*   r*   r+   r   /   s    r   c                   @  s
  e Zd ZdZdZdZdHdId
dZedJddZe	dKddZ
e	dLddZdMddZdNddZdOdPddZdHdQd#d$ZedRd'd(ZdMd)d*ZdSd+d,ZdSd-d.Z			dTdUd1d2Ze				dVdWd<d=ZedXd>d?ZedOdYdAdBZedJdCdDZedZdFdGZdS )[
EnvManagerz
    Environments manager
    Nz	envs.tomlpoetryr   io	None | IOr"   Nonec                 C  s   || _ |pt | _d S r-   )_poetryr   _io)r'   r3   r4   r*   r*   r+   __init__^   s   zEnvManager.__init__r   c                 C  s   | j jjjd }|S )Nz.venv)r7   filepathparent)r'   venvr*   r*   r+   in_project_venvb   s   zEnvManager.in_project_venvr   c                 C  s   t | jjj| j S r-   )r   r7   configvirtualenvs_path	ENVS_FILEr'   r*   r*   r+   	envs_fileg   s   zEnvManager.envs_filer   c                 C  s   |  | jjjt| jjjjS r-   )generate_env_namer7   packager   r   r:   r;   r<   rB   r*   r*   r+   base_env_namek   s   zEnvManager.base_env_namepythonr   c                 C  s  | j jj}t|}|d u rt|d}|  rJd}| j}| r=t	|}d
dd |jd d D }|j |kr=d}| j||d | jddS t }| j rz| j }|| j}	|	d urz|	d	 }
|	d
 }|
|j krz||j krzd}|| j d|j   }| r|rtjdd u}|s| sd}| rt	|}d
dd |jd d D }|j |krd}| j||d |j |j d|| j< | j| | jddS )NF.c                 s      | ]}t |V  qd S r-   r   .0vr*   r*   r+   	<genexpr>       z&EnvManager.activate.<locals>.<genexpr>   T)rG   forcereloadr    patch-pyVIRTUAL_ENVc                 s  rI   r-   rJ   rK   r*   r*   r+   rN      rO   )r    rT   )r7   r?   r@   r   get_by_namer   use_in_project_venvr>   existsr   joinversion_infopatch_version	to_stringcreate_venvr$   tomlkitdocumentrC   r#   rF   minor_versionosenvironr%   )r'   rG   	venv_pathpython_instancecreater=   _venvcurrent_patchr(   r)   current_minorin_venvr*   r*   r+   activater   sX   



zEnvManager.activatec                 C  sZ   | j jj}| j r)| j| j }r+|| j d|  }| jd| d d S d S d S )NrU   z"Deactivating virtualenv: <comment>z
</comment>)	r7   r?   r@   rC   rY   r,   rF   r8   write_error_line)r'   rd   r    r=   r*   r*   r+   
deactivate   s   


zEnvManager.deactivateFrS   boolc                 C  sn  | j d ur
|s
| j S d }d }d }| j r&| j }|| j}|r&|d }tjdtjd}tjd}|d uo>|dk}|rE|d ur|  rP| j	}t
|S | jjdd}	|	s^|  S | jjj}
|d u rvtj| jj| jd}|j }| j d	|  }|
| }| s|r|r|| j= | j| |  S t
|S |d urt|}d }n	ttj}|  }t
||S )
Nr    rV   CONDA_PREFIXCONDA_DEFAULT_ENVbasevirtualenvs.createTr?   r4   rU   )_envrC   rY   r#   r$   rF   rb   rc   in_project_venv_existsr>   r   r7   r?   get_system_envr@   r   get_preferred_pythonr8   ra   r]   stripr%   r   sysprefixget_base_prefix)r'   rS   python_minorenvr(   
env_prefixconda_env_namerj   r=   r^   rd   rG   r   rz   base_prefixr*   r*   r+   r$      sP   






zEnvManager.getr   r!   list[VirtualEnv]c                 C  st   |d u r	| j jj}| |t| j jjj}| j jj	}dd t
|| dD }|  r8| j}|dt| |S )Nc                 S  s   g | ]}t |qS r*   r   rL   pr*   r*   r+   
<listcomp>
  s    z#EnvManager.list.<locals>.<listcomp>z-py*r   )r7   rE   r   rD   r   r:   r;   r<   r?   r@   sortedglobru   r>   insertr   )r'   r   	venv_namerd   env_listr=   r*   r*   r+   list  s   

zEnvManager.listr}   rF   c                 C  s
   |  |S )z
        Check if env name starts with projects name.

        This is done to prevent action on other project's envs.
        
startswith)r}   rF   r*   r*   r+    check_env_is_for_current_project  s   
z+EnvManager.check_env_is_for_current_projectc              
   C  sV  t |}| rBz)tjdkrdnd }tj|dtgd|dd}t |j}| 	|| j
s0t|W n tyA } zt|d }~ww | 	|| j
r|  }|D ].}|jj|kr}| j rsddd	 |jd d
 D }	| j| j
|	 | |j |  S qOtd| d| jjj}
dd t|
dD }||v rt|zt|}d|j }|jdkr|d|j 7 }W n	 ty   Y nw ztjdkrdnd }tj|dt gd|d}W n ty } zt|d }~ww t| }|j d|j }| j
 d| }|
| }
|
 std| d| j r!| j| j
| | |
 t!|
|
S )N)rP   
   localez-cT)textencoding
rH   c                 s  rI   r-   rJ   rK   r*   r*   r+   rN   1  rO   z$EnvManager.remove.<locals>.<genexpr>   z<warning>Environment "z" does not exist.</warning>c                 S  s   g | ]}|j qS r*   )r   r   r*   r*   r+   r   >  s    z%EnvManager.remove.<locals>.<listcomp>z*-*-py*rG      rU   )"r   is_filery   r[   
subprocesscheck_outputr   rx   r   r   rF   r   r   r   r   r;   rC   rY   rZ   r,   remove_venv
ValueErrorr7   r?   r@   r   r   r   parsemajor	precisionr    r   r   )r'   rG   python_pathr   env_direnv_nameevenvsr=   
venv_minorrd   	env_namespython_versionpython_version_stringr    r   r*   r*   r+   remove  s   










zEnvManager.removec                 C  s$   | j jd}|d ur|S | j S )Nvirtualenvs.in-projectr7   r?   r$   r>   is_dirr'   
in_projectr*   r*   r+   rX   e     
zEnvManager.use_in_project_venvc                 C  s$   | j jd}|du rdS | j S )Nr   Fr   r   r*   r*   r+   ru   l  r   z!EnvManager.in_project_venv_existsPython | NonerQ   c                   sF  | j d ur
|s
| j S | jjjj}| jdd}| sd}| rH|sHt	d
dd |jd d D }| jjj|sFt| jjjt||S | jjd}|  }| jjd}	| jjd	}
|d u}|sqtj| jj| jd
}|rv| jn| jjj}|s| jjj}| jjj}||js|r|	rt| jjj|j | jd|j  d| jjj d tj| j| jd}|r|}n| |t|}| d|j   }|| }|
d ur|
j!| jjjpd|j  d}
|" s|du r| jd | # S | jd| dt$s|nt%| n9d}|r6| s"| jd|j d | jd| d| | &| d}n| j' rF| jd| d |rX| j(||j)| jjd|
d t*j+t,j)}|g}t*j-|rt*j+t*j
t*j.|t*/|}|0| t*j-|sit*j+t| t1 fdd|D r| # S t2|S )NTrR   rH   c                 s  rI   r-   rJ   )rL   cr*   r*   r+   rN     rO   z)EnvManager.create_venv.<locals>.<genexpr>rP   rr   zvirtualenvs.use-poetry-pythonzvirtualenvs.promptrs   z0<warning>The currently activated Python version z" is not supported by the project (z:).
Trying to find and use a compatible version.</warning> )r3   r4   rU   
virtualenv)project_namer   FzQ<fg=black;bg=yellow>Skipping virtualenv creation, as specified in config file.</>zCreating virtualenv <c1>z</> in z*<warning>The virtual environment found in z seems to be broken.</warning>zRecreating virtualenv <c1>zVirtualenv <c1>z</> already exists.zvirtualenvs.options)
executableflagspromptc                 3  s    | ]}|  V  qd S r-   r   r   p_venvr*   r+   rN     s    )3rt   r7   r:   r;   r<   r$   is_saneis_venvr   r   rZ   r[   rE   python_constraintallowsr   python_versionsr   r?   rX   r   rw   r8   r>   r@   r   r\   r   r]   rl   get_compatible_pythonrD   ra   formatrY   rv   r
   r   r   is_very_verbose
build_venvr   rb   normcasery   islinkdirnamereadlinkappendanyr   )r'   r   rG   rQ   cwdr}   current_pythonr^   r>   use_poetry_pythonvenv_promptspecific_python_requestedrd   supported_pythonr=   r   pathsr*   r   r+   r^   s  s   





$
zEnvManager.create_venvr;   r   Path | Noner   dict[str, str | bool] | Nonewith_pipbool | Noner   virtualenv.run.session.Sessionc                 C  s4  |pi }|d ur| |d< | dd | dd | dd tr-t|}|r+t|nd }|d u r3d n|  }ddd|p@tjg}|d urM|d|g | D ] \}}	|	du rb|	d	|  qQ|	d
urq|	d	| d|	  qQ|	t
| tj|d
d}
tjdkrdd l}|t
|dtjdtjd |
S )Nzno-pipTzno-setuptoolszno-wheelz--no-downloadz--no-periodic-updatez--try-first-withz--promptz--F=)setup_loggingdarwinr   z/com.apple.metadata:com_apple_backup_excludeItemzcom.apple.backupd)fmt)
setdefaultr
   r   resolveas_posixry   r   extenditemsr   r   r   cli_runplatformxattrsetxattrplistlibdumps
FMT_BINARY)clsr;   r   r   r   r   executable_strargsflagvalue
cli_resultr   r*   r*   r+   r     sB   	

zEnvManager.build_venvc              
   C  s   |  sJ zt| W d S  ty& } z|jdkr|W Y d }~nd }~ww | D ]}| s5| r:|  q+|  rDt|dd q+d S )N   T)rQ   )r   r   OSErrorerrnoiterdirr   
is_symlinkunlink)r   r;   r   	file_pathr*   r*   r+   r   6  s"   
	
zEnvManager.remove_venvnaivec                 C  s4   t tjt |  }}t|}|st||d}|S )a@  
        Retrieve the current Python environment.

        This can be the base Python environment or an activated virtual environment.

        This method also workaround the issue that the virtual environment
        used by Poetry internally (when installed via the custom installer)
        is incorrectly detected as the system environment. Note that this workaround
        happens only when `naive` is False since there are times where we actually
        want to retrieve Poetry's custom virtual environment
        (e.g. plugin installation or self update).
        )	child_env)r   ry   rz   r{   r   r   )r   r   rz   r   r}   r*   r*   r+   rv   K  s
   zEnvManager.get_system_envc                 C  sB   t tdd }|d urt|S t tdd }|d urt|S ttjS )Nreal_prefixr   )getattrry   r   rz   )r   r   r   r*   r*   r+   r{   `  s   
zEnvManager.get_base_prefixr   c                 C  sh   |  }tdd|d d }tjtj|}tt	|
 }t| d d }| d| S )Nz[ $`!*@"\\\r\n\t]_*      -)lowerresubrb   r;   r   realpathhashlibsha256r   digestbase64urlsafe_b64encodedecode)r   r   r   sanitized_namenormalized_cwdh_bytesh_strr*   r*   r+   rD   l  s   zEnvManager.generate_env_namer-   )r3   r   r4   r5   r"   r6   )r"   r   )r"   r   )r"   r   )rG   r   r"   r   )r"   r6   )F)rS   rn   r"   r   )r   r!   r"   r   )r}   r   rF   r   r"   rn   )r"   rn   )NNF)r   r!   rG   r   rQ   rn   r"   r   )NNNN)r;   r   r   r   r   r   r   r   r   r!   r"   r   )r;   r   r"   r6   )r   rn   r"   r   )r   r   r   r   r"   r   )r.   r/   r0   r1   rt   rA   r9   propertyr>   r   rC   rF   rk   rm   r$   r   staticmethodr   r   rX   ru   r^   classmethodr   r   rv   r{   rD   r*   r*   r*   r+   r2   U   sN    

FA

K
	 
9r2   )8
__future__r   r   r   rb   r   r   r   ry   	functoolsr   pathlibr   r   typingr   r_   r   cleo.io.null_ior   poetry.core.constraints.versionr   poetry.toml.filer	   poetry.utils._compatr
   r   poetry.utils.env.exceptionsr   r   poetry.utils.env.generic_envr   poetry.utils.env.pythonr   "poetry.utils.env.python.exceptionsr   r   r   poetry.utils.env.script_stringsr   r   poetry.utils.env.system_envr   poetry.utils.env.virtual_envr   poetry.utils.helpersr   r   
cleo.io.ior   poetry.poetryr   poetry.utils.env.base_envr   r   r2   r*   r*   r*   r+   <module>   sL    &