U
    42i	X                  
   @  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 ddlmZ dd	lmZ dd
lmZmZ ddlmZ erd dlmZ d dlmZ eeZddddddddddg
Z edZ!edZ"G dd deZ#ede#dZ$e%dZ&dd d!d"dZ'd#d#d$d%d&Z(d#d'd'd(d)d*Z)d+d,d-d.d/Z*d0d1d#d2d3d4d5Z+d0d1d#dd3d6d7Z,d0d1d#d8d9d:d;Z-d0d1d<d#d=d>d?d@Z.d0d1d<d#dd>dAdBZ/d0d1d<d#dCdDdEdFZ0d0dGd#dHdIdJdKZ1d0dGd#dLdMdNdOZ2d0dGd#dPdMdQdRZ3d#dSdTdUdVZ4dWdWdXdYdZd[Z5d0d0d\d]d^Z6G d_d de7Z8G d`da dae8Z9G dbd de8Z:edcdddeG dfd dZ;edcdddeG dgd dZ<edcdddeG dhd dZ=edcdddeG did dZ>edcdddeG djd dZ?edcdddeG dkd dZ@edcdddeG dld dZAdS )m    )annotationsN)MappingSequence)	dataclass)datetime)TYPE_CHECKINGAnyCallableProtocolTypeVar   )Marker)SpecifierSet)NormalizedNameis_normalized_name)Version)Path)SelfPackagePackageArchivePackageDirectoryPackageSdist
PackageVcsPackageWheelPylockPylockUnsupportedVersionErrorPylockValidationErroris_valid_pylock_path_T_T2c                   @  s    e Zd ZedddddZdS )_FromMappingProtocolMapping[str, Any]r   dreturnc                 C  s   d S N clsr#   r&   r&   4/tmp/pip-unpacked-wheel-7wv4vqcv/packaging/pylock.py
_from_dict/   s    z_FromMappingProtocol._from_dictN)__name__
__module____qualname__classmethodr*   r&   r&   r&   r)   r    .   s   r    _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)namer1   _PYLOCK_FILE_NAME_REmatch)r2   r&   r&   r)   r   9   s    strkeyr$   c                 C  s   |  ddS )N_-)replace)r8   r&   r&   r)   	_toml_key>   s    r<   r   )r8   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&   )r6   ).0vr&   r&   r)   
<listcomp>F   s     z_toml_value.<locals>.<listcomp>)
isinstancer   r   r   r6   r   )r8   r=   r&   r&   r)   _toml_valueB   s
    rC   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%   )r<   rC   )r?   r8   r=   r&   r&   r)   
<dictcomp>K   s    z&_toml_dict_factory.<locals>.<dictcomp>r&   )rD   r&   r&   r)   _toml_dict_factoryJ   s    rF   r!   ztype[_T]z	_T | None)r#   expected_typer8   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)getrB   r   typer+   r#   rG   r8   r=   r&   r&   r)   _getR   s    
rP   c                 C  s    t | || }dkrt||S )zKGet a required value from the dictionary and verify it's the expected type.N)rP   _PylockRequiredKeyErrorrO   r&   r&   r)   _get_required_   s    rR   zSequence[_T] | None)r#   expected_item_typer8   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.NrH   z (expected Sequence)rK   rI   rJ   [])	rP   r   rB   r6   bytesr   rN   r+   	enumerate)r#   rS   r8   r=   iitemr&   r&   r)   _get_sequencef   s    
rZ   zCallable[[_T], _T2]z
_T2 | None)r#   rG   target_typer8   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.
    NrK   )rP   	Exceptionr   )r#   rG   r[   r8   r=   er&   r&   r)   _get_as|   s    
r^   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)r^   rQ   )r#   rG   r[   r8   r=   r&   r&   r)   _get_required_as   s    r_   zlist[_T2] | None)r#   rS   target_item_typer8   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.NrT   rU   rK   )rZ   appendr\   r   len)	r#   rS   r`   r8   r=   resultrY   
typed_itemr]   r&   r&   r)   _get_sequence_as   s    0re   ztype[_FromMappingProtocolT]z_FromMappingProtocolT | None)r#   r[   r8   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.NrK   )rP   r   r*   r\   r   )r#   r[   r8   r=   r]   r&   r&   r)   _get_object   s    rf   z"list[_FromMappingProtocolT] | None)r#   r`   r8   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.NrT   rU   rK   )rZ   r   r*   ra   r\   r   rb   )r#   r`   r8   r=   rc   rY   rd   r]   r&   r&   r)   _get_sequence_of_objects   s    
0rg   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)rg   rQ   )r#   r`   r8   rc   r&   r&   r)   !_get_required_sequence_of_objects   s    rh   r   )r3   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   )r3   r&   r&   r)   _validate_normalized_name   s    ri   
str | NoneNone)r2   urlr$   c                 C  s   | s|st dd S )Nzpath or url must be provided)r   )r2   rl   r&   r&   r)   _validate_path_url   s    rm   )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%   )rB   r6   )r?   Zhash_valr&   r&   r)   	<genexpr>   s     z#_validate_hashes.<locals>.<genexpr>zHash values must be strings)r   allvalues)rn   r&   r&   r)   _validate_hashes   s
    rr   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.Nrj   rL   r6   messagerK   zstr | Exceptionrk   )causerL   r$   c                C  sR   t |tr>|jr.|r$| d|j n|j| _n|| _|j| _n|| _t|| _d S )N.)rB   r   rL   rs   r6   )selfrt   rL   r&   r&   r)   __init__   s    

zPylockValidationError.__init__r$   c                 C  s   | j r| j d| j S | jS )Nz in )rL   rs   rv   r&   r&   r)   __str__  s    zPylockValidationError.__str__)r+   r,   r-   __doc__rL   __annotations__rw   rz   r&   r&   r&   r)   r      s   
c                      s$   e Zd Zddd fddZ  ZS )rQ   r6   rk   r7   c                   s   t  jd|d d S )NzMissing required valuerK   )superrw   )rv   r8   	__class__r&   r)   rw     s    z _PylockRequiredKeyError.__init__)r+   r,   r-   rw   __classcell__r&   r&   r~   r)   rQ     s   rQ   c                   @  s   e Zd ZdZdS )r   z7Raised when encountering an unsupported `lock_version`.N)r+   r,   r-   r{   r&   r&   r&   r)   r     s   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   r6   rN   Nrj   rl   r2   requested_revision	commit_idsubdirectory)rl   r2   r   r   rk   )rN   rl   r2   r   r   r   r$   c                C  sX   t | d| t | d| t | d| t | d| t | d| t | d| d S )NrN   rl   r2   r   r   r   object__setattr__)rv   rN   rl   r2   r   r   r   r&   r&   r)   rw     s    zPackageVcs.__init__r!   r   r"   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 )NrN   rl   r2   zrequested-revisionz	commit-idr   )rN   rl   r2   r   r   r   )rR   r6   rP   rm   r2   rl   )r(   r#   Zpackage_vcsr&   r&   r)   r*   +  s    





zPackageVcs._from_dict)r+   r,   r-   r|   rl   r2   r   r   rw   r.   r*   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dddddd	d
ddZedddddZdS )r   r6   r2   Nzbool | Noneeditablerj   r   )r   r   rk   )r2   r   r   r$   c                C  s.   t | d| t | d| t | d| d S )Nr2   r   r   r   )rv   r2   r   r   r&   r&   r)   rw   ?  s    zPackageDirectory.__init__r!   r   r"   c                 C  s&   | t |tdt|tdt|tddS )Nr2   r   r   )r2   r   r   )rR   r6   rP   r1   r'   r&   r&   r)   r*   K  s
    


zPackageDirectory._from_dict)	r+   r,   r-   r|   r   r   rw   r.   r*   r&   r&   r&   r)   r   9  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   Nrj   rl   r2   
int | Nonesizedatetime | Noneupload_timeMapping[str, str]rn   r   )rl   r2   r   r   r   rk   )rl   r2   r   r   rn   r   r$   c                C  sX   t | d| t | d| t | d| t | d| t | d| t | d| d S )Nrl   r2   r   r   rn   r   r   )rv   rl   r2   r   r   rn   r   r&   r&   r)   rw   ]  s    zPackageArchive.__init__r!   r   r"   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 )Nrl   r2   r   upload-timern   r   )rl   r2   r   r   rn   r   )
rP   r6   intr   r_   r   rr   rm   r2   rl   )r(   r#   Zpackage_archiver&   r&   r)   r*   o  s    




zPackageArchive._from_dict)r+   r,   r-   rl   r|   r2   r   r   r   rw   r.   r*   r&   r&   r&   r)   r   T  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dS )r   Nrj   r3   r   r   rl   r2   r   r   r   rn   r3   r   rl   r2   r   rk   r3   r   rl   r2   r   rn   r$   c                C  sX   t | d| t | d| t | d| t | d| t | d| t | d| d S Nr3   r   rl   r2   r   rn   r   rv   r3   r   rl   r2   r   rn   r&   r&   r)   rw     s    zPackageSdist.__init__r!   r   r"   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 Nr3   r   rl   r2   r   rn   )r3   r   rl   r2   r   rn   
rP   r6   r   r   r_   r   rr   rm   r2   rl   )r(   r#   Zpackage_sdistr&   r&   r)   r*     s    




zPackageSdist._from_dictr+   r,   r-   r3   r|   r   rl   r2   r   rw   r.   r*   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dS )r   Nrj   r3   r   r   rl   r2   r   r   r   rn   r   rk   r   c                C  sX   t | d| t | d| t | d| t | d| t | d| t | d| d S r   r   r   r&   r&   r)   rw     s    zPackageWheel.__init__r!   r   r"   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   )r(   r#   Zpackage_wheelr&   r&   r)   r*     s    




zPackageWheel._from_dictr   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   r3   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archiverj   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   rk   )r3   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 )Nr3   r   r   r   r   r   r   r   r   r   r   r   r   r   )rv   r3   r   r   r   r   r   r   r   r   r   r   r   r   r&   r&   r)   rw     s    zPackage.__init__r!   r   r"   c                 C  sd  | 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z,t|jpg D ]\}}t|td q
W n: tk
r^ } zt|d| dd|W 5 d }~X Y nX |S )Nr3   r   requires-pythonr   r   r   r   r   r   r   r   zattestation-identitiesr   )r3   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 setkindzattestation-identities[rU   rK   )r_   r6   ri   r^   r   r   rZ   r   r   rf   r   r   r   rP   r   rg   r   r1   r   rb   r   r   r   r   r   rW   r   rR   r\   )r(   r#   packagedistributionsZdirect_urlsrX   Zattestation_identityr]   r&   r&   r)   r*     sN    









 
zPackage._from_dictr1   rx   c                 C  s   | j p
| j S r%   )r   r   ry   r&   r&   r)   	is_direct(  s    zPackage.is_direct)r+   r,   r-   r|   r   r   r   r   r   r   r   r   r   r   r   r   rw   r.   r*   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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S )%r   z#A class representing a pylock file.r   lock_versionNzSequence[Marker] | Noner>   r   r   zSequence[NormalizedName] | NoneextraszSequence[str] | Nonedependency_groupsdefault_groupsr6   
created_byzSequence[Package]packagesr   r   )r>   r   r   r   r   r   rk   )
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	|	 d S )
Nr   r>   r   r   r   r   r   r   r   r   )
rv   r   r>   r   r   r   r   r   r   r   r&   r&   r)   rw   ;  s    zPylock.__init__r!   r   r"   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-versionr>   r   zdependency-groupszdefault-groupsz
created-byr   r   r   )	r   r>   r   r   r   r   r   r   r   12zpylock version z is not supportedz1.0z(pylock minor version %s is not supported)r_   r6   r   re   r   ri   rZ   rR   r^   r   rh   r   rP   r   r   r   _loggerwarning)r(   r#   Zpylockr&   r&   r)   r*   S  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.
        )r*   r'   r&   r&   r)   	from_dictj  s    zPylock.from_dictrx   c                 C  s   t j| tdS )z1Convert the Pylock instance to a TOML dictionary.)Zdict_factory)dataclassesZasdictrF   ry   r&   r&   r)   to_dicts  s    zPylock.to_dictc                 C  s   |  |   dS )zqValidate the Pylock instance against the specification.

        Raises :class:`PylockValidationError` otherwise.N)r   r   ry   r&   r&   r)   validatew  s    zPylock.validate)r+   r,   r-   r{   r|   r>   r   r   r   r   r   rw   r.   r*   r   r   r   r&   r&   r&   r)   r   -  s.   
$)B
__future__r   r   loggingrecollections.abcr   r   r   r   typingr   r   r	   r
   r   markersr   
specifiersr   utilsr   r   r   r   pathlibr   Ztyping_extensionsr   	getLoggerr+   r   __all__r   r   r    r/   compiler4   r   r<   rC   rF   rP   rR   rZ   r^   r_   re   rf   rg   rh   ri   rm   rr   r\   r   rQ   r   r   r   r   r   r   r   r   r&   r&   r&   r)   <module>   s   



(

(
(
(
]
