o
    �PÔaø  ã                	   @   s‚  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	 d dl
mZmZ d dlmZ d dlmZ d dlmZ d dlmZmZ e  e¡ZG d	d
„ d
eƒZdede	eef fdd„Zdedefdd„Z	d(dededefdd„Zdededefdd„Zdedee de	eee f fdd„Z dedefdd„Z!dedefdd„Z"dedee fd d!„Z#dedee fd"d#„Z$d$ed%edefd&d'„Z%dS ))é    N)ÚPath)ÚListÚ
NamedTupleÚOptionalÚSetÚTuple)ÚInvalidRequirementÚRequirement)ÚSpecifierSet)Úcanonicalize_name)Úhazard)Ú	PipxErrorÚ	pipx_wrapc                   @   s2   e Zd ZU ee ed< ee ed< ee ed< dS )ÚParsedPackageÚvalid_pep508Ú	valid_urlÚvalid_local_pathN)Ú__name__Ú
__module__Ú__qualname__r   r	   Ú__annotations__Ústr© r   r   ú8/usr/lib/python3/dist-packages/pipx/package_specifier.pyr      s   
 r   Úpackage_specÚreturnc                 C   s,   t  d| ¡}|r| d¡| d¡fS | dfS )zReturns (path, extras_string)z(.+)(\[.+\])é   é   Ú )ÚreÚsearchÚgroup)r   Úpackage_spec_extras_rer   r   r   Ú_split_path_extras   s   r#   c           	      C   sØ   d}d}d}zt | ƒ}W n	 ty   Y nw |}|s.zt d|  ƒ}W n	 ty+   Y nw | }|sX|sXt| ƒ\}}t|ƒ}z| ¡ }W n tyM   d}Y nw |rXt| ¡ ƒ| }|se|se|setd| › �ƒ‚t	|||d�S )z,Parse package_spec as would be given to pipxNznotapackagename @ FzUnable to parse package spec: )r   r   r   )
r	   r   r#   r   ÚexistsÚOSErrorr   Úresolver   r   )	r   r   r   r   Úpackage_reqÚpackage_path_strÚpackage_extras_strÚpackage_pathÚpackage_path_existsr   r   r   Ú_parse_specifier'   sB   þþÿýr,   FÚrequirementÚremove_version_specifiersc                 C   s(   d | _ t| jƒ| _|rtdƒ| _t| ƒS )Nr   )Úmarkerr   Únamer
   Ú	specifierr   )r-   r.   r   r   r   Úpackage_or_url_from_pep508]   s
   
r2   Úparsed_packagec                 C   s€   | j d ur%| j jd urt tdt› d| j j› d�dd�¡ t| j |d�}n| jd ur.| j}n| jd ur6| j}t 	d|› �¡ |S )Nz
                    z4  Ignoring environment markers
                    (zŽ) in package
                    specification. Use pipx options to specify this type of
                    information.
                    ú    ©Úsubsequent_indent©r.   zcleaned package spec: )
r   r/   ÚloggerÚwarningr   r   r2   r   r   Úinfo)r3   r.   Úpackage_or_urlr   r   r   Ú!_parsed_package_to_package_or_urlg   s,   
ÿþùÿþ

r<   Úpip_argsc                 C   sN   t | ƒ}t|dd�}d|v r#|js#t tdt› d�dd�¡ | d¡ ||fS )zþReturn package_or_url and pip_args suitable for pip install

    Specifically:
    * Strip any markers (e.g. python_version > "3.4")
    * Ensure --editable is removed for any package_spec not a local path
    * Convert local paths to absolute paths
    Fr7   z
--editableú
                z·  Ignoring --editable install option. pipx disallows it
                for anything but a local path, to avoid having to create a new
                src/ directory.
                r4   r5   )r,   r<   r   r8   r9   r   r   Úremove)r   r=   r3   r;   r   r   r   Úparse_specifier_for_install„   s   
ÿÿúÿ

r@   c                 C   ó   t | ƒ}t|dd�}|S )z¨Return package_or_url suitable for pipx metadata

    Specifically:
    * Strip any markers (e.g. python_version > 3.4)
    * Convert local paths to absolute paths
    Fr7   ©r,   r<   ©r   r3   r;   r   r   r   Úparse_specifier_for_metadata¢   s
   ÿrD   c                 C   rA   )záReturn package_or_url suitable for pip upgrade

    Specifically:
    * Strip any version specifiers (e.g. package == 1.5.4)
    * Strip any markers (e.g. python_version > 3.4)
    * Convert local paths to absolute paths
    Tr7   rB   rC   r   r   r   Úparse_specifier_for_upgrade°   s
   ÿrE   c                 C   sJ   t | ƒ}|jr|jjd ur|jjS |jr"t|jƒ\}}td| ƒjS tƒ S )NÚnotapackage)r,   r   Úextrasr   r#   r	   Úset)r   r3   Ú_r)   r   r   r   Ú
get_extras¿   s   rJ   c                 C   s6   zt | ƒ}W n
 ty   Y d S w |jrd S t|jƒS )N)r	   r   Úurlr   r0   )r   r'   r   r   r   Úvalid_pypi_nameÊ   s   þ
rL   r;   Úpackage_namec                 C   sr   zt | ƒ}W n ty   |  Y S w t|jƒt|ƒkr2t tdt› d|j›d|›d|›d�	dd�¡ ||_t|ƒS )Nr>   z9  Name supplied in package specifier was
                z but package found has name z.
                Using z.
                r4   r5   )	r	   r   r   r0   r8   r9   r   r   r   )r;   rM   r'   r   r   r   Úfix_package_nameÙ   s,   þÿþþýúÿ
rN   )F)&Úloggingr   Úpathlibr   Útypingr   r   r   r   r   Úpackaging.requirementsr   r	   Úpackaging.specifiersr
   Úpackaging.utilsr   Úpipx.emojisr   Ú	pipx.utilr   r   Ú	getLoggerr   r8   r   r   r#   r,   Úboolr2   r<   r@   rD   rE   rJ   rL   rN   r   r   r   r   Ú<module>   sP   
	7ÿÿÿ
þ
ÿÿ
þÿÿ
þ