o
    �PÔaÄ$  ã                   @   sì  d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZ zd dlmZ W n eyC   d dlZY nw d dlmZ d dlmZmZ e e¡ZG d	d
„ d
eƒZG dd„ deƒZdedeej de	ej fdd„Z dejde
e deeef dee fdd„Z!dejdedee fdd„Z"	d+dejdededeeee f de	eee#f  deeee f fdd„Z$d ee dee fd!d"„Z%d#edeee eeef ef fd$d%„Z&d&ed'e
e d(ed#edef
d)d*„Z'dS ),é    N)ÚPath)ÚDictÚListÚ
NamedTupleÚOptionalÚSetÚTuple)ÚRequirement)Úcanonicalize_name)Úmetadata)ÚWINDOWS)Ú	PipxErrorÚrun_subprocessc                   @   s4   e Zd ZU eej ed< eeef ed< e	ed< dS )ÚVenvInspectInformationÚdistributionsÚenvÚbin_pathN)
Ú__name__Ú
__module__Ú__qualname__r   r   ÚDistributionÚ__annotations__r   Ústrr   © r   r   ú3/usr/lib/python3/dist-packages/pipx/venv_inspect.pyr      s   
 r   c                   @   sV   e Zd ZU ee ed< ee ed< ee ed< eeee f ed< eed< eed< dS )ÚVenvMetadataÚappsÚ	app_pathsÚapps_of_dependenciesÚapp_paths_of_dependenciesÚpackage_versionÚpython_versionN)r   r   r   r   r   r   r   r   r   r   r   r   r      s   
 r   Úpackager   Úreturnc                 C   s,   |D ]}t |jd ƒt | ƒkr|  S qdS )z6Find matching distribution in the canonicalized sense.ÚnameN)r
   r   )r"   r   Údistr   r   r   Úget_dist$   s
   ÿr&   r%   Úextrasr   c                 C   sr   |  ¡ }|s| d¡ g }tt| jpg ƒD ]!}|js | |¡ q|D ]}||d< |j |¡r5| |¡  nq"q|S )NÚ Úextra)ÚcopyÚaddÚmapr	   ÚrequiresÚmarkerÚappendÚevaluate)r%   r'   r   Úeval_envÚdependenciesÚreqr)   r   r   r   Úget_package_dependencies.   s   

þ€r4   r   c              	   C   s8  t ƒ }ddh}| jD ](}|j|vrq
||j  ¡ r| |j¡ tr2||jd   ¡ r2| |jd ¡ q
| jp7g D ]*}t|ƒj	d dkrDq8t|  
|¡ƒ}z|j |¡rX| |j¡ W q8 tyb   Y q8w |  d¡pid}| ¡ D ])}| d¡d }	t|  
|	¡ƒ ¡ }
z|
j |¡r�| |
j¡ W qn ty—   Y qnw t|ƒS )	NÚconsole_scriptsÚgui_scriptsz.exer   z..zinstalled-files.txtr(   ú,)ÚsetÚentry_pointsÚgroupr$   Úexistsr+   r   Úfilesr   ÚpartsÚlocate_fileÚparentÚsamefileÚFileNotFoundErrorÚ	read_textÚ
splitlinesÚsplitÚresolveÚsorted)r%   r   r   ÚsectionsÚepÚpathÚdist_file_pathÚ
inst_filesÚlineÚentryÚinst_file_pathr   r   r   Úget_appsC   sB   

€€ÿ€ÿrO   Úpackage_reqÚvenv_inspect_infor   Údep_visitedc           
         s¤   |d u rt |jƒdi}t| |jˆ jƒ}|D ]:}t |jƒ}||v r!qt|jˆ jƒ}|d u r0tdƒ‚t|ˆ j	ƒ}	|	rC‡ fdd„|	D ƒ||< d||< t
||ˆ ||ƒ}q|S )NTzCPipx Internal Error: cannot find package {dep_req.name!r} metadata.c                    s   g | ]}ˆ j | ‘qS r   )r   ©Ú.0Úapp©rQ   r   r   Ú
<listcomp>‰   s    
ÿz%_dfs_package_apps.<locals>.<listcomp>)r
   r$   r4   r'   r   r&   r   r   rO   r   Ú_dfs_package_apps)
r%   rP   rQ   r   rR   r2   Údep_reqÚdep_nameÚdep_distÚ	app_namesr   rV   r   rX   n   s0   
ÿ
ÿ

ÿ
ÿrX   r   c                 C   sZ   |   ¡ }| D ]$}|j|jd  }| ¡ r| |¡ |j|jd  }| ¡ r*| |¡ q|S )Nz
-script.pyz.exe.manifest)r*   r?   Ústemr;   r/   )r   Úapp_paths_outputÚapp_pathÚwin_app_pathr   r   r   Ú_windows_extra_app_paths”   s   

€ra   Úvenv_python_pathc                 C   sB   t  d¡}t t| d|gddd�j¡}|d |d d|d	 › �fS )
NaP  
        import json
        import os
        import platform
        import sys

        impl_ver = sys.implementation.version
        implementation_version = "{0.major}.{0.minor}.{0.micro}".format(impl_ver)
        if impl_ver.releaselevel != "final":
            implementation_version = "{}{}{}".format(
                implementation_version,
                impl_ver.releaselevel[0],
                impl_ver.serial,
            )

        sys_path = sys.path
        try:
            sys_path.remove("")
        except ValueError:
            pass

        print(
            json.dumps(
                {
                    "sys_path": sys_path,
                    "python_version": "{0.major}.{0.minor}.{0.micro}".format(sys.version_info),
                    "environment": {
                        "implementation_name": sys.implementation.name,
                        "implementation_version": implementation_version,
                        "os_name": os.name,
                        "platform_machine": platform.machine(),
                        "platform_release": platform.release(),
                        "platform_system": platform.system(),
                        "platform_version": platform.version(),
                        "python_full_version": platform.python_version(),
                        "platform_python_implementation": platform.python_implementation(),
                        "python_version": ".".join(platform.python_version_tuple()[:2]),
                        "sys_platform": sys.platform,
                    },
                }
            )
        )
        z-cFz<fetch_info_in_venv commands>)Úcapture_stderrÚlog_cmd_strÚsys_pathÚenvironmentzPython r!   )ÚtextwrapÚdedentÚjsonÚloadsr   Ústdout)rb   Úcommand_strÚ	venv_infor   r   r   Úfetch_info_in_venv¤   s   ÿ-ýûýrn   Úroot_package_nameÚroot_package_extrasÚvenv_bin_pathc                    sà   i }g }t | ƒ}||_t|ƒ\}}}	tˆ |ttj|d�ƒd�}
t|j|
jƒ}|d u r.t	dƒ‚t
|||
|ƒ}t|ˆ ƒ}‡ fdd„|D ƒ}trIt|ƒ}|D ]}|dd„ || D ƒ7 }trbt|| ƒ||< qKt|||||j|	d�}|S )N)rI   )r   r   r   zDPipx Internal Error: cannot find package {root_req.name!r} metadata.c                    s   g | ]}ˆ | ‘qS r   r   rS   ©rq   r   r   rW      s    z inspect_venv.<locals>.<listcomp>c                 S   s   g | ]}|j ‘qS r   )r$   )rT   Údep_pathr   r   r   rW     s    ÿ)r   r   r   r   r    r!   )r	   r'   rn   r   Úlistr   r   r&   r$   r   rX   rO   r   ra   r   Úversion)ro   rp   rq   rb   r   r   Úroot_reqÚvenv_sys_pathÚvenv_envÚvenv_python_versionrQ   Ú	root_distr   r   ÚdepÚvenv_metadatar   rr   r   Úinspect_venvà   sT   
ÿýÿÿ
ÿÿ€ú	r}   )N)(ri   Úloggingrg   Úpathlibr   Útypingr   r   r   r   r   r   Úpackaging.requirementsr	   Úpackaging.utilsr
   Ú	importlibr   ÚImportErrorÚimportlib_metadataÚpipx.constantsr   Ú	pipx.utilr   r   Ú	getLoggerr   Úloggerr   r   r   r   r&   r4   rO   ÚboolrX   ra   rn   r}   r   r   r   r   Ú<module>   sz     ÿ
	ÿÿ
þ
ÿÿ
ÿ
þ0ûÿþýüû
ú&(<ÿþýüû