o
    �PÔaø>  ã                   @   s|  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	m
Z
mZmZmZmZ z
d dlmZmZ W n eyG   d dlmZmZ Y nw 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 d dlm Z m!Z!m"Z"m#Z# d dl$m%Z%m&Z& d dl'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6 e 7e8¡Z9e :dej;¡Z<G dd„ dƒZ=G dd„ dƒZ>dS )é    N)ÚPath)ÚCompletedProcess)ÚDictÚ	GeneratorÚListÚNoReturnÚOptionalÚSet)ÚDistributionÚ
EntryPoint)Úcanonicalize_name)Úanimate)ÚPIPX_SHARED_PTHÚExitCode)Úhazard)ÚDEFAULT_PYTHON)Úfix_package_nameÚ
get_extrasÚparse_specifier_for_installÚparse_specifier_for_metadata)ÚPackageInfoÚPipxMetadata)Úshared_libs)
Ú	PipxErrorÚexec_appÚfull_package_descriptionÚget_site_packagesÚget_venv_pathsÚ	pipx_wrapÚrmdirÚrun_subprocessÚsubprocess_post_checkÚ&subprocess_post_check_handle_pip_error)ÚVenvMetadataÚinspect_venvz[
    ^(?P<module>[\w.]+)\s*
    (:\s*(?P<attr>[\w.]+))?\s*
    (?P<extras>\[.*\])?\s*$
    c                   @   sn   e Zd ZdZdefdd„Zdefdd„Zdefdd	„Zde	ed
d
f fdd„Z
dedefdd„Zddd„Zd
S )ÚVenvContainerz&A collection of venvs managed by pipx.Úrootc                 C   s
   || _ d S ©N)Ú_root)Úselfr&   © r*   ú+/usr/lib/python3/dist-packages/pipx/venv.pyÚ__init__9   ó   
zVenvContainer.__init__Úreturnc                 C   s   dt | jƒ›d�S )NzVenvContainer(ú)©Ústrr(   ©r)   r*   r*   r+   Ú__repr__<   s   zVenvContainer.__repr__c                 C   s
   t | jƒS r'   r0   r2   r*   r*   r+   Ú__str__?   r-   zVenvContainer.__str__Nc                 c   s4   � | j  ¡ sdS | j  ¡ D ]
}| ¡ sq|V  qdS )z+Iterate venv directories in this container.N)r(   Úis_dirÚiterdir)r)   Úentryr*   r*   r+   Úiter_venv_dirsB   s   €
ýzVenvContainer.iter_venv_dirsÚpackage_namec                 C   s   | j  t|ƒ¡S )z7Return the expected venv path for given `package_name`.)r(   Újoinpathr   )r)   r9   r*   r*   r+   Úget_venv_dirK   s   zVenvContainer.get_venv_dirc                 C   s   |   ¡ D ]}t|ƒ qd S r'   )r8   ÚVenv)r)   Úpr*   r*   r+   Úverify_shared_libsO   s   
ÿz VenvContainer.verify_shared_libs©r.   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r,   r1   r3   r4   r   r8   r;   r>   r*   r*   r*   r+   r%   6   s    	r%   c                   @   sH  e Zd ZdZdedœdedededdfd	d
„Ze	defdd„ƒZ
e	defdd„ƒZe	deeef fdd„ƒZe	defdd„ƒZdee dee ddfdd„Zdefdd„ZdDdd„Zdee ddfdd„Z	dEdededee d ed!ed"ed#eddfd$d%„Zdedee defd&d'„Zded(ee defd)d*„Z	dEdededee d ed!ed"ed#eddfd+d,„Zdefd-d.„Zdee fd/d0„Zd1edee fd2d3„Zd1ed4ed5ee de fd6d7„Z!d1ed4edefd8d9„Z"dedee ddfd:d;„Z#	dEdededee d ed!ed"ed#eddfd<d=„Z$d>ee dd?fd@dA„Z%d>ee de&fdBdC„Z'dS )Fr<   zJAbstraction for a virtual environment with various useful methods for pipxF)ÚverboseÚpythonÚpathrD   rE   r.   Nc                C   sà   || _ || _t| j ƒ\| _| _t|d�| _|| _| | _z| j  	¡ o*t
t| j  ¡ ƒƒ| _W n ty9   d| _Y nw | jrj| jrltjrMtjrLtj|d� nt |¡ tjsnttdtj › d�ƒd| j j› d� dd�‚d S d S d S )	N)Úvenv_dirF©rD   z3
                        Error: pipx's shared venv z© is invalid
                        and needs re-installation. To fix this, install or
                        reinstall a package. For example:
                        z
  pipx install z --force©Úwrap_message)r&   rE   r   Úbin_pathÚpython_pathr   Úpipx_metadatarD   Údo_animationÚexistsÚboolÚnextr6   Ú	_existingÚStopIterationÚuses_shared_libsr   Úis_validÚneeds_upgradeÚupgradeÚcreater   r   Úname)r)   rF   rD   rE   r*   r*   r+   r,   W   s<   "
ÿ€
ÿÿù÷øzVenv.__init__c                 C   s6   | j jjd ur| j jj› | j jj› �}|S | jj}|S r'   )rM   Úmain_packageÚpackageÚsuffixr&   rY   )r)   Ú	venv_namer*   r*   r+   rY   y   s   
ÿÿÿz	Venv.namec                 C   s(   | j r| j dt ¡}t|d ƒd uS dS )Nz**/T)rR   r&   Úglobr   rQ   )r)   Ú	pth_filesr*   r*   r+   rT   „   s   zVenv.uses_shared_libsc                 C   s0   | j j ¡ }| j jjd ur| j j|| j jj< |S r'   )rM   Úinjected_packagesÚcopyrZ   r[   )r)   Úreturn_dictr*   r*   r+   Úpackage_metadata�   s   þÿzVenv.package_metadatac                 C   s    | j jjd u r| jjS | j jjS r'   )rM   rZ   r[   r&   rY   r2   r*   r*   r+   Úmain_package_name–   s   
zVenv.main_package_nameÚ	venv_argsÚpip_argsc                 C   s¢   t d| jƒ� | jdddg}t|| t| jƒg ƒ}W d   ƒ n1 s$w   Y  t|ƒ t | j	¡ t
| jƒt }|jtj› d�dd� || j_|  ¡ | j_d S )Nzcreating virtual environmentú-mÚvenvz--without-pipÚ
zutf-8)Úencoding)r   rN   rE   r    r1   r&   r!   r   rX   rD   r   rL   r   Ú
write_textÚsite_packagesrM   re   Úget_python_versionÚpython_version)r)   re   rf   ÚcmdÚvenv_processÚpipx_pthr*   r*   r+   Úcreate_venvŸ   s   þ
zVenv.create_venvc                 C   s   | j  S r'   )rR   r2   r*   r*   r+   Úsafe_to_removeµ   s   zVenv.safe_to_removec                 C   s<   |   ¡ rt| jƒ d S t tdt› d| j› d�dd�¡ d S )Nz
                    z  Not removing existing venv zT because it
                    was not created in this session
                    z    )Úsubsequent_indent)rs   r   r&   ÚloggerÚwarningr   r   r2   r*   r*   r+   Úremove_venv¸   s   ÿÿûÿzVenv.remove_venvc                 C   s(   | j rtj| jd� d S |  d|¡ d S )NrH   Úpip)rT   r   rW   rD   Ú_upgrade_package_no_metadata)r)   rf   r*   r*   r+   Úupgrade_packaging_librariesÆ   s   z Venv.upgrade_packaging_librariesÚ r9   Úpackage_or_urlÚinclude_dependenciesÚinclude_appsÚis_main_packager\   c           
   	   C   sä   t ||ƒ}t||ƒ\}}tdt||ƒ› �| jƒ� t| jƒdddg| |g }t|ddd�}	W d   ƒ n1 s8w   Y  t|	ƒ |	j	rOt
dt||ƒ› d�ƒ‚| j|||||||d	� | j| jd u rpt
d
t||ƒ› d�dd�‚d S )Nzinstalling rg   rx   ÚinstallF)Ú
log_stdoutÚ
log_stderrzError installing Ú.©r9   r|   rf   r}   r~   r   r\   zUnable to install zR.
Check the name or spec for errors, and verify that it can be installed with pip.rI   )r   r   r   r   rN   r1   rL   r    r"   Ú
returncoder   Ú_update_package_metadatarc   Úpackage_version)
r)   r9   r|   rf   r}   r~   r   r\   ro   Úpip_processr*   r*   r+   Úinstall_packageÎ   sL   
ÿþÿþÿóÿùÿûÿzVenv.install_packagec                 C   sà   t d|›�| jƒ� |  ¡ }dgdg | |g }|  |¡}W d   ƒ n1 s(w   Y  t|dd� |jr>td|›d�ƒ‚|  ¡ | }t|ƒdkrX| ¡ }t	 
d	|› �¡ |S t	 
d
|› �¡ t	 
d|› �¡ td|›d�ƒ‚)Nzdetermining package name from r€   z--no-dependenciesF)Úraise_errorz9
                Cannot determine package name from spec zA.
                Check package spec for errors.
                é   zDetermined package name: zold_package_set = zinstall_packages = )r   rN   Úlist_installed_packagesÚ_run_pipr!   r…   r   ÚlenÚpopru   Úinfo)r)   r|   rf   Úold_package_setro   rˆ   Úinstalled_packagesr9   r*   r*   r+   Úinstall_package_no_deps  s4   ÿûÿÿ÷ÿÿzVenv.install_package_no_depsÚpackage_extrasc                 C   s>   t   ¡ }t||| j| jƒ}t ddt   ¡ |  d›d�¡ |S )Nzget_venv_metadata_for_package: g     @�@z.0fÚms)Útimer$   rK   rL   ru   r�   )r)   r9   r”   Ú
data_startÚvenv_metadatar*   r*   r+   Úget_venv_metadata_for_package(  s   ÿÿz"Venv.get_venv_metadata_for_packagec           
      C   sd   |   |t|ƒ¡}t|t|ƒ||||j|j|j|j|j|d�}	|r%|	| j	_
n|	| j	j|< | j	 ¡  d S )N)r[   r|   rf   r~   r}   ÚappsÚ	app_pathsÚapps_of_dependenciesÚapp_paths_of_dependenciesr‡   r\   )r™   r   r   r   rš   r›   rœ   r�   r‡   rM   rZ   r`   Úwrite)
r)   r9   r|   rf   r}   r~   r   r\   Úvenv_package_metadataÚpackage_infor*   r*   r+   r†   4  s(   
ÿõ
zVenv._update_package_metadatac                 C   s   t t| jƒdgƒj ¡ S )Nz	--version)r    r1   rL   ÚstdoutÚstripr2   r*   r*   r+   rm   U  s   zVenv.get_python_versionc                 C   s:   t t| jƒddddgƒ}t |j ¡ ¡}tdd„ |D ƒƒS )Nrg   rx   Úlistz--format=jsonc                 S   s   g | ]}|d  ‘qS )rY   r*   )Ú.0Úxr*   r*   r+   Ú
<listcomp>]  s    z0Venv.list_installed_packages.<locals>.<listcomp>)r    r1   rL   ÚjsonÚloadsr¡   r¢   Úset)r)   Úcmd_runÚpip_listr*   r*   r+   rŒ   X  s
   ÿzVenv.list_installed_packagesÚappc                 C   sd   | j  ¡ sd S tj| jtt| j ƒƒgd�}|D ]}|jD ]}|jdkr.|j	|kr.|    S qqd S )N)rY   rF   zpipx.run)
rL   rO   r
   Údiscoverrd   r1   r   Úentry_pointsÚgrouprY   )r)   r¬   ÚdistsÚdistÚepr*   r*   r+   Ú_find_entry_point_  s   
ÿ
€þzVenv._find_entry_pointÚfilenameÚapp_argsc           	   	   C   s’   |   |¡}|d u rtt| j| ƒg| ƒ t |j¡}|d us#J dƒ‚| dd¡\}}d|› d|j›d|› d|› d�	}tt| j	ƒd	|g| ƒ d S )
Nzinvalid entry pointÚmoduleÚattrzimport sys, z
sys.argv[0] = z

sys.exit(rƒ   z())
z-c)
r³   r   r1   rK   Ú_entry_point_value_patternÚmatchÚvaluer¯   rY   rL   )	r)   r¬   r´   rµ   Úentry_pointr¹   r¶   r·   Úcoder*   r*   r+   Úrun_appk  s   
ÿþþÿzVenv.run_appc                 C   s    |   |¡d ur	dS | j|  ¡ S )NT)r³   rK   Úis_file)r)   r¬   r´   r*   r*   r+   Úhas_app  s   zVenv.has_appc                 C   s\   t dt||ƒ› �| jƒ� |  dg| d|g ¡}W d   ƒ n1 s#w   Y  t|ƒ d S )Nú
upgrading r€   ú	--upgrade)r   r   rN   r�   r!   )r)   r9   rf   rˆ   r*   r*   r+   ry   „  s   þÿüz!Venv._upgrade_package_no_metadatac           	   	   C   st   t dt||ƒ› �| jƒ� |  dg| d|g ¡}W d   ƒ n1 s#w   Y  t|ƒ | j|||||||d� d S )NrÀ   r€   rÁ   r„   )r   r   rN   r�   r!   r†   )	r)   r9   r|   rf   r}   r~   r   r\   rˆ   r*   r*   r+   Úupgrade_package�  s$   
þÿü
ùzVenv.upgrade_packagero   zCompletedProcess[str]c                 C   s,   t | jƒddg| }| js| d¡ t|ƒS )Nrg   rx   ú-q)r1   rL   rD   Úappendr    )r)   ro   r*   r*   r+   r�   ­  s   
zVenv._run_pipc                 C   sd   t | jƒddg| }| js| d¡ t|ddd�j}|r.d dd„ |D ƒ¡}t |›d	�¡ t	|ƒS )
Nrg   rx   rÃ   F)Úcapture_stdoutÚcapture_stderrú c                 s   s   � | ]}t |ƒV  qd S r'   )r1   )r¤   Úcr*   r*   r+   Ú	<genexpr>»  s   € z-Venv.run_pip_get_exit_code.<locals>.<genexpr>z failed)
r1   rL   rD   rÄ   r    r…   Újoinru   Úerrorr   )r)   ro   r…   Úcmd_strr*   r*   r+   Úrun_pip_get_exit_code³  s   
ÿþzVenv.run_pip_get_exit_coder?   )r{   )(r@   rA   rB   rC   r   r   rP   r1   r,   ÚpropertyrY   rT   r   r   rc   rd   r   rr   rs   rw   rz   r‰   r“   r	   r#   r™   r†   rm   rŒ   r   r   r³   r   r½   r¿   ry   rÂ   r�   r   rÍ   r*   r*   r*   r+   r<   T   sÈ    ÿÿÿÿ
þ"

øþýüûúùø	
÷: ÿÿ
þøþýüûúùø	
÷!ÿÿ
þøþýüûúùø	
÷r<   )?r§   ÚloggingÚrer–   Úpathlibr   Ú
subprocessr   Útypingr   r   r   r   r   r	   Úimportlib.metadatar
   r   ÚImportErrorÚimportlib_metadataÚpackaging.utilsr   Úpipx.animater   Úpipx.constantsr   r   Úpipx.emojisr   Úpipx.interpreterr   Úpipx.package_specifierr   r   r   r   Úpipx.pipx_metadata_filer   r   Úpipx.shared_libsr   Ú	pipx.utilr   r   r   r   r   r   r   r    r!   r"   Úpipx.venv_inspectr#   r$   Ú	getLoggerr@   ru   ÚcompileÚVERBOSEr¸   r%   r<   r*   r*   r*   r+   Ú<module>   s:     ÿ0
ú
