o
    Vhm>                     @  s2  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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lmZ d dl m!Z! d dl"m#Z# d dl$m%Z% e&e'e'e'e(e'f Z)G dd de	Z*dS )    )annotationsN)ABC)abstractmethod)cached_propertyPath)CalledProcessError)TYPE_CHECKING)Any)SCHEME_NAMES)get_embed_wheel)EnvCommandError)SitePackages)get_real_windows_path)is_dir_writable)Tag)
BaseMarker)Wheel
GenericEnvc                   @  sr  e Zd ZdZddd	d
ZedddZedddZedddZedddZ	edddZ
edddZedddZedddZddd Zdd!d"Zdd#d$Zdd&d'Zedd(d)Zedd*d+Zedd,d-Zedd.d/Zedd1d2Zedd3d4Zedd5d6Zedd7d8Zedd9d:Zedd<d=Z				dddCdDZeddFdGZddHdIZddKdLZ ee!ddNdOZ"eddPdQZ#eddSdTZ$e%ddUdVZ&e!ddWdXZ'ddd[d\Z(e!dd]d^Z)e!dd_d`Z*ddcddZ+ddedfZ,ddhdiZ-ddmdnZ.ddodpZ/ddrdsZ0ddudvZ1ddxdyZ2e!ddzd{Z3edd|d}Z4dd~dZ5dddZ6dddZ7dS )Envz)
    An abstract Python environment.
    Npathr   basePath | NonereturnNonec                 C  s   t jdk| _t d| _ttj	
d| _| jr&t|}|r$t|nd }| jr,| jr.dnd}|| _| j| | _d| _d| _|   |pF|| _d | _d | _d | _d | _d | _d | _d S )Nwin32mingwCONDA_DEFAULT_ENVbinScriptspythonpip)sysplatform_is_windows	sysconfigget_platform
startswith	_is_mingwboolosenvironget	_is_condar   _path_bin_dir_executable_pip_executablefind_executables_base_site_packages_supported_tags_purelib_platlib_script_dirs_embedded_pip_path)selfr   r   bin_dir r=   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/poetry/utils/env/base_env.py__init__*   s&   

zEnv.__init__c                 C     | j S N)r0   r;   r=   r=   r>   r<   F      zEnv.bin_dirc                 C  r@   rA   )r/   rB   r=   r=   r>   r   J   rC   zEnv.pathc                 C  r@   rA   )r4   rB   r=   r=   r>   r   N   rC   zEnv.basePythonVersionc                 C     | j d }|S )Nversion_info
marker_env)r;   rF   r=   r=   r>   rF   R      
zEnv.version_infostrc                 C  rE   )Nplatform_python_implementationrG   )r;   implementationr=   r=   r>   python_implementationW   rI   zEnv.python_implementationc                 C  s   t | | jS )z3
        Path to current python executable
        )r   _binr1   rB   r=   r=   r>   r!   \   s   z
Env.pythondict[str, Any]c                 C  s   |   S rA   )get_marker_envrB   r=   r=   r>   rH   c   s   zEnv.marker_envr   c                 C  s   ddl m} || j| dS )Nr   r   )	child_env)poetry.utils.env.generic_envr   r   )r;   r   r=   r=   r>   
parent_envg   s   zEnv.parent_envc                 C  s`   | j }| jr| jr| j}tdd |dD }|r.|d }|dr)|d d }|| _d S d S )Nc                 s  $    | ]}t d |jr|jV  qdS )z#python(?:\d+(?:\.\d+)?)?(?:\.exe)?$Nrematchname.0pr=   r=   r>   	<genexpr>s       
z.Env._find_python_executable.<locals>.<genexpr>zpython*r   .exe)r0   r%   r.   r/   sortedglobendswithr1   )r;   r<   python_executables
executabler=   r=   r>   _find_python_executablem   s   

zEnv._find_python_executablec                 C  sJ   t dd | jdD }|r#|d }|dr|d d }|| _d S d S )Nc                 s  rT   )z pip(?:\d+(?:\.\d+)?)?(?:\.exe)?$NrU   rY   r=   r=   r>   r\      r]   z+Env._find_pip_executable.<locals>.<genexpr>zpip*r   r^   r_   )r`   r0   ra   rb   r2   )r;   pip_executablespip_executabler=   r=   r>   _find_pip_executable   s   


zEnv._find_pip_executablec                 C  s   |    |   d S rA   )re   rh   rB   r=   r=   r>   r3      s   zEnv.find_executablesdistributionc                 C  s*   t || jd  d| jd  }|j}|S )Nr   .   )r   rF   r   )r;   ri   wheelr   r=   r=   r>   get_embedded_wheel   s
   zEnv.get_embedded_wheelc                 C  s    | j d u r| dd | _ | j S Nr"   )r:   rm   rB   r=   r=   r>   pip_embedded   s   
zEnv.pip_embeddedc                 C  s"   t | | j}| s| jS |S )z0
        Path to current pip executable
        )r   rN   r2   existsro   )r;   r   r=   r=   r>   r"      s   zEnv.pipc                 C     t jS rA   )r#   r$   rB   r=   r=   r>   r$      rC   zEnv.platformc                 C  rq   rA   )r+   rX   rB   r=   r=   r>   r+      rC   zEnv.osr   c                 C  s$   | j d u rt| j| j| j| _ | j S rA   )r5   r   purelibplatlib	fallbacksrB   r=   r=   r>   site_packages   s   
zEnv.site_packagesc                 C     d| j v rt| j d S d S )Nusersitepathsr   rB   r=   r=   r>   rw         
zEnv.usersitec                 C  rv   )Nuserbaserx   rB   r=   r=   r>   r{      rz   zEnv.userbasec                 C  s    | j d u rt| jd | _ | j S )Nrr   )r7   r   ry   rB   r=   r=   r>   rr      s   
zEnv.purelibc                 C  s8   | j d u rd| jv rt| jd | _ | j S | j| _ | j S )Nrs   )r8   ry   r   rr   rB   r=   r=   r>   rs      s   

zEnv.platlib
list[Path]c                 C  s8   dd | j dg D }|| jr| jg7 }|S g 7 }|S )Nc                 S  s   g | ]}t |qS r=   r   )rZ   r   r=   r=   r>   
<listcomp>   s    z!Env.fallbacks.<locals>.<listcomp>rt   )ry   r-   rw   r;   ry   r=   r=   r>   rt      s
   zEnv.fallbacksrr   str | Path | Noners   r{   rw   c                 C  sh   |r	t || jd< |rt || jd< |rt || jd< |r$t || jd< | jdd | jdd dS )a}  
        A cached property aware way to set environment paths during runtime.

        In some cases, like in `PluginManager._install()` method, paths are modified during execution. Direct
        modification of `self.paths` is not safe as caches relying on are not invalidated. This helper method
        ensures that we clear the relevant caches why paths are modified.
        rr   rs   r{   rw   rt   Nscheme_dict)rJ   ry   __dict__pop)r;   rr   rs   r{   rw   r=   r=   r>   	set_paths   s   zEnv.set_pathsdict[str, str]c                   s    j  }  sr|drrd|v rrd|v rri }ztj|d |d g}W n ty1   | Y S w  fddtD }|D ]}t	t
|| ddsK nq=|S |D ]}|| ||d }t	t
|ddsh|  S |||< qP|| |S )a  
        This property exists to allow cases where system environment paths are not writable and
        user site is enabled. This enables us to ensure packages (wheels) are correctly installed
        into directories where the current user can write to.

        If all candidates in `self.paths` is writable, no modification is made. If at least one path is not writable
        and all generated writable candidates are indeed writable, these are used instead. If any candidate is not
        writable, the original paths are returned.

        Alternative writable candidates are generated by replacing discovered prefix, with "userbase"
        if available. The original prefix is computed as the common path prefix of "scripts" and "purelib".
        For example, given `{ "purelib": "/usr/local/lib/python3.13/site-packages", "scripts": "/usr/local/bin",
        "userbase": "/home/user/.local" }`; the candidate "purelib" path would be
        `/home/user/.local/lib/python3.13/site-packages`.
        r{   scriptsrr   c                   s   g | ]	}| j v r|qS r=   )ry   )rZ   keyrB   r=   r>   r}     s    z#Env.scheme_dict.<locals>.<listcomp>T)r   create)ry   copyis_venvr-   r+   r   
commonpath
ValueErrorr   r   r   replaceupdate)r;   ry   	overrides	base_pathscheme_namesr   	candidater=   rB   r>   r      s2   


zEnv.scheme_dictc                 C  s   | j | jg| jS rA   )rr   rs   rt   rB   r=   r=   r>   _get_lib_dirs1  s   zEnv._get_lib_dirsr*   c              	   C  sL   |   D ]}tt || 	 W d     dS 1 sw   Y  qdS )NTF)r   
contextlibsuppressr   relative_to)r;   r   lib_pathr=   r=   r>   is_path_relative_to_lib4  s   
$zEnv.is_path_relative_to_lib	list[str]c                 C     d S rA   r=   rB   r=   r=   r>   sys_path<  s   zEnv.sys_pathc              
   C  sD   |   }|  r t| jddd| jd  d| jd  |d< |S )Nincludesiter!   r   rj   rk   )	get_pathsr   rJ   r   joinpathrF   r~   r=   r=   r>   ry   @  s   z	Env.paths	list[Tag]c                 C  s   | j d u r
|  | _ | j S rA   )r6   get_supported_tagsrB   r=   r=   r>   supported_tagsO  s   

zEnv.supported_tagsc                 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_prefixbase_prefix)getattrr#   r   prefix)clsr   r   r=   r=   r>   get_base_prefixV  s   
zEnv.get_base_prefixc                 C  r   rA   r=   rB   r=   r=   r>   rP   b     zEnv.get_marker_envFembeddedc                 C  s<   |st | | j st| jt| jgS t| jddgS )Nz-mr"   )r   rN   r2   rp   rJ   r!   ro   )r;   r   r=   r=   r>   get_pip_commande  s   zEnv.get_pip_commandc                 C  r   rA   r=   rB   r=   r=   r>   r   k  r   zEnv.get_supported_tagsc                 C  r   rA   r=   rB   r=   r=   r>   r   n  r   zEnv.get_pathsmarkerr   c                 C  s   | | j}|S rA   )validaterH   )r;   r   validr=   r=   r>   is_valid_for_markerq  s   zEnv.is_valid_for_markerc                 C  s   dS )zH
        Checks whether the current environment is sane or not.
        Tr=   rB   r=   r=   r>   is_saneu  s   zEnv.is_saner   c                 C  s   |dkr|   S | |gS rn   )r   rN   )r;   r   r=   r=   r>   get_command_from_bin{  s   zEnv.get_command_from_binargskwargsr
   c                 O  s$   |  |t| }| j|fi |S rA   )r   list_run)r;   r   r   r   cmdr=   r=   r>   run  s   zEnv.runc                 O  s&   |   }|t| }| j|fi |S rA   )r   r   r   )r;   r   r   r"   r   r=   r=   r>   run_pip  s   zEnv.run_pipcontentc                 K  s$   | j | jdddd|fdtji|S )Nz-Iz-Wignorez-cstderr)r   r1   
subprocessPIPE)r;   r   r   r=   r=   r>   run_python_script  s   zEnv.run_python_scriptr   c           	   
   K  s   | dd}| dttj}| dtj}z4|r1|tjks J tj|f||d| d}W |S tj	dkr8dnd	}tj
|f||d
|d|}W |S  tyZ } zt|d	}~ww )z>
        Run a command inside the Python environment.
        callFenvr   )r   r    )   
   localeNT)r   r   textencoding)r   dictr+   r,   r   STDOUTr   
check_callr#   rF   check_outputr   r   )	r;   r   r   r   r   r   outputr   er=   r=   r>   r     s,   	zEnv._runintc                 O  sj   |  |t| }|dttj}| jstj|d ||dS d|d< tj	|fd|i|}|
  |jS )Nr   r   )r   Tshell)r   r   r   r   r+   r,   r%   execvper   Popencommunicate
returncode)r;   r   r   r   commandr   exer=   r=   r>   execute  s   zEnv.executec                 C  r   rA   r=   rB   r=   r=   r>   r     r   zEnv.is_venvc                 C  sV   | j d u r(| jd}|d urt|n| jg| _ | jr(| j | j| j d j  | j S )Nr   r   )r9   ry   r-   r   r0   r{   appendrX   )r;   r   r=   r=   r>   script_dirs  s   
zEnv.script_dirsc                 C  sx   | j r|ds| j|d  }n| j| }| s8| j r6|ds)| j|d  }n| j| }| r6t|S |S t|S )z6
        Return path to the given executable.
        r^   )r%   rb   r0   rp   r/   rJ   )r;   r   bin_pathr=   r=   r>   rN     s   


zEnv._binotherobjectc                 C  s&   t |tsdS |j| jko|j| jkS )NF)
isinstancer   	__class__r   )r;   r   r=   r=   r>   __eq__  s   
z
Env.__eq__c                 C  s   | j j d| j dS )Nz("z"))r   __name__r/   rB   r=   r=   r>   __repr__  s   zEnv.__repr__rA   )r   r   r   r   r   r   )r   r   )r   rD   )r   rJ   )r   rO   )r   r   )r   r   )ri   rJ   r   r   )r   r   )r   r   )r   r|   )NNNN)
rr   r   rs   r   r{   r   rw   r   r   r   )r   r   )r   r   r   r*   )r   r   )r   r   )F)r   r*   r   r   )r   r   r   r*   )r   r*   )r   rJ   r   r   )r   rJ   r   rJ   r   r
   r   rJ   )r   rJ   r   r
   r   rJ   )r   rJ   r   r
   r   rJ   )r   r   r   r
   r   rJ   )r   rJ   r   rJ   r   r
   r   r   )r   rJ   r   rJ   )r   r   r   r*   )8r   
__module____qualname____doc__r?   propertyr<   r   r   rF   rM   r!   r   rH   rS   re   rh   r3   rm   ro   r"   r$   r+   ru   rw   r{   rr   rs   rt   r   r   r   r   r   r   ry   r   classmethodr   rP   r   r   r   r   r   r   r   r   r   r   r   r   r   rN   r   r   r=   r=   r=   r>   r   %   s    



		
4











r   )+
__future__r   r   r+   rV   r   r#   r&   abcr   r   	functoolsr   pathlibr   r   typingr	   r
   installer.utilsr   virtualenv.seed.wheels.embedr   poetry.utils.env.exceptionsr   poetry.utils.env.site_packagesr   poetry.utils.helpersr   r   packaging.tagsr   poetry.core.version.markersr   virtualenv.seed.wheels.utilr   rR   r   tupler   rJ   rD   r   r=   r=   r=   r>   <module>   s6    