U
    +5ib                  
   @  s  d dl mZ d dlZd dlZd dl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mZmZ d dlmZ dd	lmZmZmZ dd
lmZ ddlmZmZ ddlmZmZmZm Z  ddl!m"Z" erd dlm#Z#m$Z$ d dl%m&Z& d dl'm(Z( ddlm)Z) e*e+Z,ddddddddddg
Z-ddddZ.ed Z/ed!Z0G d"d# d#eZ1ed$e1d%Z2e3d&Z4d'd(d)d*dZ5d+d+d,d-d.Z6d+d/d/d0d1d2Z7d3d4d5d6d7Z8d8d9d+d:d;d<d=Z9d8d9d+d d;d>d?Z:d8d9d+d@dAdBdCZ;d8d9dDd+dEdFdGdHZ<d8d9dDd+d!dFdIdJZ=d8d9dDd+dKdLdMdNZ>d8dOd+dPdQdRdSZ?d8dOd+dTdUdVdWZ@d8dOd+dXdUdYdZZAd+d[d\d]d^ZBd_d_d`dadbdcZCd_d_d)dddeZDd_d_dfdgdhZEd8d8didjdkZFG dld deGZHG dmdn dneHZIG dod deHZJG dpdq dqeGZKedrdsdtG dud dZLedrdsdtG dvd dZMedrdsdtG dwd dZNedrdsdtG dxd dZOedrdsdtG dyd dZPedrdsdtG dzd dZQedrdsdtG d{d dZRdS )|    )annotationsN)MappingSequence)	dataclass)datetime)TYPE_CHECKINGAnyCallableProtocolTypeVarcast)urlparse   )EnvironmentMarkerdefault_environment)SpecifierSet)create_compatible_tags_selectorsys_tags)NormalizedNameis_normalized_nameparse_sdist_filenameparse_wheel_filename)Version)
CollectionIterator)Path)Self)TagPackagePackageArchivePackageDirectoryPackageSdist
PackageVcsPackageWheelPylockPylockUnsupportedVersionErrorPylockValidationErroris_valid_pylock_pathz	list[str]returnc                   C  s   t S N)__all__ r-   r-   4/tmp/pip-unpacked-wheel-xj899fla/packaging/pylock.py__dir__6   s    r/   _T_T2c                   @  s    e Zd ZedddddZdS )_FromMappingProtocolMapping[str, Any]r   dr*   c                 C  s   d S r+   r-   clsr5   r-   r-   r.   
_from_dict?   s    z_FromMappingProtocol._from_dictN)__name__
__module____qualname__classmethodr8   r-   r-   r-   r.   r2   >   s   r2   _FromMappingProtocolT)boundz^pylock\.([^.]+)\.toml$r   bool)pathr*   c                 C  s   | j dkptt| j S )z4Check if the given path is a valid pylock file path.zpylock.toml)namer?   _PYLOCK_FILE_NAME_REmatchr@   r-   r-   r.   r(   I   s    strkeyr*   c                 C  s   |  ddS )N_-)replace)rG   r-   r-   r.   	_toml_keyN   s    rK   r   )rG   valuer*   c                 C  s<   t |tttfrt|S t |tr8| dkr8dd |D S |S )Nenvironmentsc                 S  s   g | ]}t |qS r-   )rE   ).0vr-   r-   r.   
<listcomp>V   s     z_toml_value.<locals>.<listcomp>)
isinstancer   r   r   rE   r   )rG   rL   r-   r-   r.   _toml_valueR   s
    rR   zlist[tuple[str, Any]]zdict[str, Any])datar*   c                 C  s   dd | D S )Nc                 S  s(   i | ] \}}|d k	rt |t||qS r+   )rK   rR   )rN   rG   rL   r-   r-   r.   
<dictcomp>[   s    z&_toml_dict_factory.<locals>.<dictcomp>r-   )rS   r-   r-   r.   _toml_dict_factoryZ   s    rU   r3   ztype[_T]z	_T | None)r5   expected_typerG   r*   c                 C  sF   |  | }dkrdS t||sBtdt|j d|j d|d|S )zBGet a value from the dictionary and verify it's the expected type.NUnexpected type  (expected )context)getrQ   r'   typer9   r5   rV   rG   rL   r-   r-   r.   _getb   s    
r_   c                 C  s    t | || }dkrt||S )zKGet a required value from the dictionary and verify it's the expected type.N)r_   _PylockRequiredKeyErrorr^   r-   r-   r.   _get_requiredo   s    ra   zSequence[_T] | None)r5   expected_item_typerG   r*   c                 C  s   t | t| }dkrdS t|ttfr@tdt|j d|dt|D ]@\}}t||sHtdt|j d|j d| d| ddqH|S )	zMGet a list value from the dictionary and verify it's the expected items type.NrW   z (expected Sequence)rZ   rX   rY   [])	r_   r   rQ   rE   bytesr'   r]   r9   	enumerate)r5   rb   rG   rL   iitemr-   r-   r.   _get_sequencev   s    
ri   zCallable[[_T], _T2]z
_T2 | None)r5   rV   target_typerG   r*   c              
   C  sX   t | || }dkrdS z
||W S  tk
rR } zt||d|W 5 d}~X Y nX dS )zGet a value from the dictionary, verify it's the expected type,
    and convert to the target type.

    This assumes the target_type constructor accepts the value.
    NrZ   )r_   	Exceptionr'   )r5   rV   rj   rG   rL   er-   r-   r.   _get_as   s    
rm   c                 C  s"   t | ||| }dkrt||S )zfGet a required value from the dict, verify it's the expected type,
    and convert to the target type.N)rm   r`   )r5   rV   rj   rG   rL   r-   r-   r.   _get_required_as   s    rn   zlist[_T2] | None)r5   rb   target_item_typerG   r*   c           	   
   C  s   t | || }dkrdS g }z |D ]}||}|| q"W n@ tk
r| } z"t|| dt| dd|W 5 d}~X Y nX |S )z>Get list value from dictionary and verify expected items type.Nrc   rd   rZ   )ri   appendrk   r'   len)	r5   rb   ro   rG   rL   resultrh   
typed_itemrl   r-   r-   r.   _get_sequence_as   s    0rt   ztype[_FromMappingProtocolT]z_FromMappingProtocolT | None)r5   rj   rG   r*   c              
   C  sZ   t | t| }dkrdS z||W S  tk
rT } zt||d|W 5 d}~X Y nX dS )zIGet a dictionary value from the dictionary and convert it to a dataclass.NrZ   )r_   r   r8   rk   r'   )r5   rj   rG   rL   rl   r-   r-   r.   _get_object   s    ru   z"list[_FromMappingProtocolT] | None)r5   ro   rG   r*   c              
   C  s   t | t| }dkrdS g }z"|D ]}||}|| q"W n@ tk
r~ } z"t|| dt| dd|W 5 d}~X Y nX |S )zJGet a list value from the dictionary and convert its items to a dataclass.Nrc   rd   rZ   )ri   r   r8   rp   rk   r'   rq   )r5   ro   rG   rL   rr   rh   rs   rl   r-   r-   r.   _get_sequence_of_objects   s    
0rv   zSequence[_FromMappingProtocolT]c                 C  s    t | || }dkrt||S )zWGet a required list value from the dictionary and convert its items to a
    dataclass.N)rv   r`   )r5   ro   rG   rr   r-   r-   r.   !_get_required_sequence_of_objects   s    rw   r   )rA   r*   c                 C  s    t | std| dt| S )z+Validate that a string is a NormalizedName.zName z is not normalized)r   r'   r   )rA   r-   r-   r.   _validate_normalized_name   s    rx   
str | NoneNone)r@   urlr*   c                 C  s   | s|st dd S )Nzpath or url must be provided)r'   )r@   r{   r-   r-   r.   _validate_path_url   s    r|   c                 C  s@   | sd S d| kr |  ddd S d| kr8|  ddd S | S d S )N/r   \)rsplitrD   r-   r-   r.   
_path_name   s    r   )r{   r*   c                 C  s"   | sd S t | j}|ddd S )Nr}   r   r~   )r   r@   r   )r{   Zurl_pathr-   r-   r.   	_url_name   s    
r   )hashesr*   c                 C  s.   | st dtdd |  D s*t d| S )Nz"At least one hash must be providedc                 s  s   | ]}t |tV  qd S r+   )rQ   rE   )rN   Zhash_valr-   r-   r.   	<genexpr>  s     z#_validate_hashes.<locals>.<genexpr>zHash values must be strings)r'   allvalues)r   r-   r-   r.   _validate_hashes  s
    r   c                   @  sL   e Zd ZU dZdZded< ded< ddddd	d
ddZddddZdS )r'   z2Raised when when input data is not spec-compliant.Nry   r[   rE   messagerZ   zstr | Exceptionrz   )causer[   r*   c                C  sR   t |tr>|jr.|r$| d|j n|j| _n|| _|j| _n|| _t|| _d S )N.)rQ   r'   r[   r   rE   )selfr   r[   r-   r-   r.   __init__  s    

zPylockValidationError.__init__r)   c                 C  s   | j r| j d| j S | jS )Nz in )r[   r   r   r-   r-   r.   __str__%  s    zPylockValidationError.__str__)r9   r:   r;   __doc__r[   __annotations__r   r   r-   r-   r-   r.   r'     s   
c                      s$   e Zd Zddd fddZ  ZS )r`   rE   rz   rF   c                   s   t  jd|d d S )NzMissing required valuerZ   )superr   )r   rG   	__class__r-   r.   r   ,  s    z _PylockRequiredKeyError.__init__)r9   r:   r;   r   __classcell__r-   r-   r   r.   r`   +  s   r`   c                   @  s   e Zd ZdZdS )r&   z7Raised when encountering an unsupported `lock_version`.Nr9   r:   r;   r   r-   r-   r-   r.   r&   0  s   c                   @  s   e Zd ZdZdS )PylockSelectErrorz:Base exception for errors raised by :meth:`Pylock.select`.Nr   r-   r-   r-   r.   r   4  s   r   TF)frozeninitc                	   @  s   e Zd ZU ded< dZded< dZded< dZded< ded< dZded	< ddddd
ddddddddddZe	dddddZ
dS )r#   rE   r]   Nry   r{   r@   requested_revision	commit_idsubdirectory)r{   r@   r   r   rz   )r]   r{   r@   r   r   r   r*   c                C  sX   t | d| t | d| t | d| t | d| t | d| t | d| d S )Nr]   r{   r@   r   r   r   object__setattr__)r   r]   r{   r@   r   r   r   r-   r-   r.   r   A  s    zPackageVcs.__init__r3   r   r4   c              
   C  sV   | t |tdt|tdt|tdt|tdt |tdt|tdd}t|j|j |S )Nr]   r{   r@   zrequested-revisionz	commit-idr   )r]   r{   r@   r   r   r   )ra   rE   r_   r|   r@   r{   )r7   r5   Zpackage_vcsr-   r-   r.   r8   S  s    





zPackageVcs._from_dict)r9   r:   r;   r   r{   r@   r   r   r   r<   r8   r-   r-   r-   r.   r#   8  s   
c                   @  s^   e Zd ZU ded< dZded< dZded< ddddddd	d
ddZedddddZdS )r!   rE   r@   Nzbool | Noneeditablery   r   )r   r   rz   )r@   r   r   r*   c                C  s.   t | d| t | d| t | d| d S )Nr@   r   r   r   )r   r@   r   r   r-   r-   r.   r   g  s    zPackageDirectory.__init__r3   r   r4   c                 C  s&   | t |tdt|tdt|tddS )Nr@   r   r   )r@   r   r   )ra   rE   r_   r?   r6   r-   r-   r.   r8   s  s
    


zPackageDirectory._from_dict)	r9   r:   r;   r   r   r   r   r<   r8   r-   r-   r-   r.   r!   a  s   
c                	   @  s   e Zd ZU dZded< dZded< dZded< dZded< d	ed
< dZded< ddddddddddd	dddddZ	e
dddddZdS )r    Nry   r{   r@   
int | Nonesizedatetime | Noneupload_timeMapping[str, str]r   r   )r{   r@   r   r   r   rz   )r{   r@   r   r   r   r   r*   c                C  sX   t | d| t | d| t | d| t | d| t | d| t | d| d S )Nr{   r@   r   r   r   r   r   )r   r{   r@   r   r   r   r   r-   r-   r.   r     s    zPackageArchive.__init__r3   r   r4   c              
   C  sX   | t |tdt |tdt |tdt |tdt|ttdt |tdd}t|j|j	 |S )Nr{   r@   r   upload-timer   r   )r{   r@   r   r   r   r   )
r_   rE   intr   rn   r   r   r|   r@   r{   )r7   r5   Zpackage_archiver-   r-   r.   r8     s    




zPackageArchive._from_dict)r9   r:   r;   r{   r   r@   r   r   r   r   r<   r8   r-   r-   r-   r.   r    |  s   
c                	   @  s   e Zd ZU dZded< dZded< dZded< dZded< dZded	< d
ed< dddddddddddd
ddddZ	e
dddddZeddddZdS )r"   Nry   rA   r   r   r{   r@   r   r   r   r   rA   r   r{   r@   r   rz   rA   r   r{   r@   r   r   r*   c                C  sX   t | d| t | d| t | d| t | d| t | d| t | d| d S NrA   r   r{   r@   r   r   r   r   rA   r   r{   r@   r   r   r-   r-   r.   r     s    zPackageSdist.__init__r3   r   r4   c                 C  sX   | t |tdt |tdt |tdt |tdt |tdt|ttdd}t|j|j	 |S NrA   r   r{   r@   r   r   )rA   r   r{   r@   r   r   
r_   rE   r   r   rn   r   r   r|   r@   r{   )r7   r5   Zpackage_sdistr-   r-   r.   r8     s    




zPackageSdist._from_dictrE   r)   c                 C  s*   | j pt| jpt| j}|s&td|S )zGet the filename of the sdist.zCannot determine sdist filenamerA   r   r@   r   r{   r'   r   filenamer-   r-   r.   r     s    zPackageSdist.filenamer9   r:   r;   rA   r   r   r{   r@   r   r   r<   r8   propertyr   r-   r-   r-   r.   r"     s    
c                	   @  s   e Zd ZU dZded< dZded< dZded< dZded< dZded	< d
ed< dddddddddddd
ddddZ	e
dddddZeddddZdS )r$   Nry   rA   r   r   r{   r@   r   r   r   r   r   rz   r   c                C  sX   t | d| t | d| t | d| t | d| t | d| t | d| d S r   r   r   r-   r-   r.   r     s    zPackageWheel.__init__r3   r   r4   c                 C  sX   | t |tdt |tdt |tdt |tdt |tdt|ttdd}t|j|j	 |S r   r   )r7   r5   Zpackage_wheelr-   r-   r.   r8     s    




zPackageWheel._from_dictrE   r)   c                 C  s*   | j pt| jpt| j}|s&td|S )zGet the filename of the wheel.zCannot determine wheel filenamer   r   r-   r-   r.   r     s    zPackageWheel.filenamer   r-   r-   r-   r.   r$     s    
c                   @  s  e Zd ZU ded< dZded< dZded< dZded	< dZd
ed< dZded< dZ	ded< dZ
ded< dZded< dZded< dZded< dZd
ed< dZded< dddddddddddddddddd
ddddddd
dddddZed d!d"d#d$Zed%d&d'd(ZdS ))r   r   rA   NzVersion | NoneversionzMarker | NonemarkerSpecifierSet | Nonerequires_pythonz"Sequence[Mapping[str, Any]] | NonedependencieszPackageVcs | NonevcszPackageDirectory | None	directoryzPackageArchive | Nonearchivery   indexzPackageSdist | NonesdistzSequence[PackageWheel] | Nonewheelsattestation_identitiesMapping[str, Any] | Nonetool)r   r   r   r   r   r   r   r   r   r   r   r   rz   )rA   r   r   r   r   r   r   r   r   r   r   r   r   r*   c                C  s   t | d| t | d| t | d| t | d| t | d| t | d| t | d| t | d| t | d	|	 t | d
|
 t | d| t | d| t | d| d S )NrA   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   rA   r   r   r   r   r   r   r   r   r   r   r   r   r-   r-   r.   r     s    zPackage.__init__r3   r   r4   c                 C  s   | t |ttdt|ttdt|ttdt|tdt|ttdt	|t
dt	|tdt	|tdt|td	t	|td
t|tdt|tdt|tdd}t|jt|jpg  }t|jt|j t|j }|dkr|dkrtd|dkr|dkrtdt|jpg D ]\}}zt|j\}}}	}	W nB tk
rh }
 z"td|jd| dd|
W 5 d }
~
X Y nX ||jkrtd|jd|jd| dd|jr||jkrtd|jdt|jd| ddq|jrzt|jj\}}W n< tk
r2 }
 ztd|jjd
d|
W 5 d }
~
X Y nX ||jkr^td|jjd|jd
d|jr||jkrtd|jjdt|jd
dz,t|j pg D ]\}}t!|td qW n: tk
r }
 zt|
d| dd|
W 5 d }
~
X Y nX |S )NrA   r   requires-pythonr   r   r   r   r   r   r   r   zattestation-identitiesr   )rA   r   r   r   r   r   r   r   r   r   r   r   r   r   zFNone of vcs, directory, archive must be set if sdist or wheels are setr   zRExactly one of vcs, directory, archive must be set if sdist and wheels are not setzInvalid wheel filename zwheels[rd   rZ   zName in z% is not consistent with package name zVersion in z( is not consistent with package version zInvalid sdist filename kindzattestation-identities[)"rn   rE   rx   rm   r   r   ri   r   r   ru   r#   r!   r    r_   r"   rv   r$   r?   r   rq   r   r   r   r   r'   rf   r   r   rk   rA   r   r   r   ra   )r7   r5   packagedistributionsZdirect_urlsrg   wheelrA   r   rH   rl   Zattestation_identityr-   r-   r.   r8   7  s    














 
zPackage._from_dictr?   r)   c                 C  s   | j p
| j S r+   )r   r   r   r-   r-   r.   	is_direct  s    zPackage.is_direct)r9   r:   r;   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r<   r8   r   r   r-   r-   r-   r.   r     s<   
, Pc                   @  s  e Zd ZU dZded< dZded< dZded< dZd	ed
< dZded< dZ	ded< ded< ded< dZ
ded< ddddddddddd	ddddddd
ddZedddddZedddddZdd d!d"Zdd d#d$Zddddd%d&d'd(d(d)d*d+d,ZdS )-r%   z#A class representing a pylock file.r   lock_versionNzSequence[Marker] | NonerM   r   r   zSequence[NormalizedName] | NoneextraszSequence[str] | Nonedependency_groupsdefault_groupsrE   
created_byzSequence[Package]packagesr   r   )rM   r   r   r   r   r   rz   )
r   rM   r   r   r   r   r   r   r   r*   c       	   
      C  s   t | d| t | d| t | d| t | d| t | d| t | d| t | d| t | d| t | d	|	 d S )
Nr   rM   r   r   r   r   r   r   r   r   )
r   r   rM   r   r   r   r   r   r   r   r-   r-   r.   r     s    zPylock.__init__r3   r   r4   c                 C  s   | t |ttdt|ttdt|ttdt|tdt|tdt|tdt|tt	dt
|tdt|td	d
	}td|j  krtdk sn td|j d|jtdkrtd|j |S )Nzlock-versionrM   r   zdependency-groupszdefault-groupsz
created-byr   r   r   )	r   rM   r   r   r   r   r   r   r   12zpylock version z is not supportedz1.0z(pylock minor version %s is not supported)rn   rE   r   rt   r   rx   ri   ra   rm   r   rw   r   r_   r   r   r&   _loggerwarning)r7   r5   Zpylockr-   r-   r.   r8     s*    




  zPylock._from_dictc                C  s
   |  |S )zCreate and validate a Pylock instance from a TOML dictionary.

        Raises :class:`PylockValidationError` if the input data is not
        spec-compliant.
        )r8   r6   r-   r-   r.   	from_dict  s    zPylock.from_dictr)   c                 C  s   t j| tdS )z1Convert the Pylock instance to a TOML dictionary.)Zdict_factory)dataclassesZasdictrU   r   r-   r-   r.   to_dict  s    zPylock.to_dictc                 C  s   |  |   dS )zqValidate the Pylock instance against the specification.

        Raises :class:`PylockValidationError` otherwise.N)r   r   r   r-   r-   r.   validate  s    zPylock.validate)environmenttagsr   r   zEnvironment | NonezSequence[Tag] | NonezCollection[str] | NonezfIterator[tuple[Package, PackageVcs | PackageDirectory | PackageArchive | PackageWheel | PackageSdist]])r   r   r   r   r*   c                c  sZ  t |p
t }tdt|pi t|p"g t|dkr8| jp:g n|d}|rP|d nt d }| jr| j|st	d|dt
| j| jr| jD ] }|jtd|pi dd	r qqt	d
i }	t| jD ]\}
}|jr|jj|dd	sq|jr*|j|s*t	d|dt
|jd|jd|
 d	|j|	kr^t	d|jd|
 d|	|j d  d|
|f|	|j< q|	 D ]\}
}|jdk	r||jfV  n|jdk	r||jfV  n|jdk	r||jfV  n|jr4t|dd |jD d}|r ||fV  n2|jdk	r||jfV  nt	d|jd|
 dn|jdk	rN||jfV  ntqvdS )a  Select what to install from the lock file.

        The *environment* and *tags* parameters represent the environment being
        selected for. If unspecified, ``packaging.markers.default_environment()`` and
        ``packaging.tags.sys_tags()`` are used.

        The *extras* parameter represents the extras to install.

        The *dependency_groups* parameter represents the groups to install. If
        unspecified, the default groups are used.

        This method must be used on valid Pylock instances (i.e. one obtained
        from :meth:`Pylock.from_dict` or if constructed manually, after calling
        :meth:`Pylock.validate`).
        zdict[str, str | frozenset[str]]N)r   r   python_full_versionzpython_full_version zI in provided environment does not satisfy the Python version requirement zdict[str, str]requirementrZ   zXProvided environment does not satisfy any of the environments specified in the lock fileZ	lock_filez for package z at packages[rd   z Multiple packages with the name z are selected at packages[z] and packages[r   c                 s  s    | ]}|t |jd  fV  qdS )r~   N)r   r   )rN   r   r-   r-   r.   r   p  s   z Pylock.select.<locals>.<genexpr>z6No wheel found matching the provided tags for package z'], and no sdist available as a fallback)r   r   r   dict	frozensetr   r   r   containsr   rE   rM   evaluaterf   r   r   rA   r   r   r   r   r   nextr   NotImplementedError)r   r   r   r   r   Zcompatible_tags_selectorenvZenv_python_full_versionZ
env_markerZselected_packages_by_nameZpackage_indexr   Z
best_wheelr-   r-   r.   select  s     

	
 $	"	zPylock.select)r9   r:   r;   r   r   rM   r   r   r   r   r   r   r<   r8   r   r   r   r   r-   r-   r-   r.   r%     s8   
$	)S
__future__r   r   loggingrecollections.abcr   r   r   r   typingr   r   r	   r
   r   r   urllib.parser   markersr   r   r   
specifiersr   r   r   r   utilsr   r   r   r   r   r   r   r   pathlibr   Ztyping_extensionsr   r   	getLoggerr9   r   r,   r/   r0   r1   r2   r=   compilerB   r(   rK   rR   rU   r_   ra   ri   rm   rn   rt   ru   rv   rw   rx   r|   r   r   r   rk   r'   r`   r&   r   r#   r!   r    r"   r$   r   r%   r-   r-   r-   r.   <module>   s    



(

(
0
0
 
