U
    +5øi¥*  ã                   @  sÒ  d dl mZ 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 e	r„d dlZd dlmZ ejdkrxd dlmZ nd dlmZ dd	d
ddgZddœdd„ZedƒZG dd„ deƒZeded�Zdddœdd„Zdddddœd d!„Zdddddœd"d#„Zdd$dd%d&œd'd(„Ze d)¡Zdd*dd+œd,d-„Zdd*dd.œd/d0„ZG d1d„ deƒZ G d2d3„ d3e ƒZ!ej"d4d5d6�G d7d„ dƒƒZ#ej"d4d5d6�G d8d„ dƒƒZ$ej"d4d5d6�G d9d	„ d	ƒƒZ%ej"d4d5d6�G d:d
„ d
ƒƒZ&dS );é    )ÚannotationsN)ÚMapping)ÚTYPE_CHECKINGÚAnyÚProtocolÚTypeVar)Ú
Collection)é   é   )ÚSelfÚArchiveInfoÚDirInfoÚ	DirectUrlÚDirectUrlValidationErrorÚVcsInfoz	list[str]©Úreturnc                   C  s   t S ©N)Ú__all__© r   r   ú8/tmp/pip-unpacked-wheel-xj899fla/packaging/direct_url.pyÚ__dir__   s    r   Ú_Tc                   @  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   ©Úclsr   r   r   r   Ú
_from_dict#   s    z_FromMappingProtocol._from_dictN)Ú__name__Ú
__module__Ú__qualname__Úclassmethodr   r   r   r   r   r   "   s   r   Ú_FromMappingProtocolT)Úboundzlist[tuple[str, Any]]zdict[str, Any])Údatar   c                 C  s   dd„ | D ƒS )Nc                 S  s   i | ]\}}|d k	r||“qS r   r   )Ú.0ÚkeyÚvaluer   r   r   Ú
<dictcomp>+   s       z&_json_dict_factory.<locals>.<dictcomp>r   )r&   r   r   r   Ú_json_dict_factory*   s    r+   r   ztype[_T]Ústrz	_T | None)r   Úexpected_typer(   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.NzUnexpected type z (expected ú)©Úcontext)ÚgetÚ
isinstancer   Útyper    ©r   r-   r(   r)   r   r   r   Ú_get.   s    
ýr5   c                 C  s    t | ||ƒ }dkrt|ƒ‚|S )zKGet a required value from the dictionary and verify it's the expected type.N)r5   Ú_DirectUrlRequiredKeyErrorr4   r   r   r   Ú_get_required;   s    r7   ztype[_FromMappingProtocolT]z_FromMappingProtocolT | None)r   Útarget_typer(   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.Nr/   )r5   r   r   Ú	Exceptionr   )r   r8   r(   r)   Úer   r   r   Ú_get_objectB   s    r;   z.^\$\{[A-Za-z0-9-_]+\}(:\$\{[A-Za-z0-9-_]+\})?$úCollection[str])ÚnetlocÚsafe_user_passwordsr   c                 C  s:   d| kr| S |   dd¡\}}||kr(| S t |¡r6| S |S )Nú@é   )ÚsplitÚ _PEP610_USER_PASS_ENV_VARS_REGEXÚmatch)r=   r>   Ú	user_passZnetloc_no_user_passr   r   r   Ú_strip_auth_from_netlocS   s    
rE   )Úurlr>   r   c                 C  s6   t j | ¡}t|j|ƒ}t j |j||j|j|j	f¡S )z¥url with user:password part removed unless it is formed with
    environment variables as specified in PEP 610, or it is a safe user:password
    such as `git`.
    )
ÚurllibÚparseÚurlsplitrE   r=   Ú
urlunsplitÚschemeÚpathÚqueryÚfragment)rF   r>   Ú
parsed_urlr=   r   r   r   Ú
_strip_url^   s    ûÿrP   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.Nú
str | Noner0   r,   Úmessager/   zstr | ExceptionÚNone)Úcauser0   r   c                C  sR   t |tƒr>|jr.|r$|› d|j› �n|j| _n|| _|j| _n|| _t|ƒ| _d S )NÚ.)r2   r   r0   rR   r,   )ÚselfrT   r0   r   r   r   Ú__init__v   s    
ÿ
z!DirectUrlValidationError.__init__r   c                 C  s   | j r| j› d| j ›�S | jS )Nz in )r0   rR   ©rV   r   r   r   Ú__str__ˆ   s    z DirectUrlValidationError.__str__)r    r!   r"   Ú__doc__r0   Ú__annotations__rW   rY   r   r   r   r   r   p   s   
üc                      s$   e Zd Zdddœ‡ fdd„Z‡  ZS )r6   r,   rS   )r(   r   c                   s   t ƒ jd|d� d S )NzMissing required valuer/   )ÚsuperrW   )rV   r(   ©Ú	__class__r   r   rW   �   s    z#_DirectUrlRequiredKeyError.__init__)r    r!   r"   rW   Ú__classcell__r   r   r]   r   r6   Ž   s   r6   TF)ÚfrozenÚinitc                   @  sX   e Zd ZU ded< ded< dZded< ddœddddd	œd
d„Zedddœdd„ƒZdS )r   r,   ÚvcsÚ	commit_idNrQ   Úrequested_revision)rd   rS   )rb   rc   rd   r   c                C  s.   t  | d|¡ t  | d|¡ t  | d|¡ d S )Nrb   rc   rd   ©ÚobjectÚ__setattr__)rV   rb   rc   rd   r   r   r   rW   ™   s    zVcsInfo.__init__r   r   r   c                 C  s&   | t |tdƒt|tdƒt |tdƒd�S )Nrb   rd   rc   )rb   rd   rc   )r7   r,   r5   r   r   r   r   r   ¤   s
    


ýzVcsInfo._from_dict)r    r!   r"   r[   rd   rW   r#   r   r   r   r   r   r   “   s   
ûc                   @  sD   e Zd ZU dZded< ddœdddœdd„Zed	d
dœdd„ƒZdS )r   NzMapping[str, str] | NoneÚhashes©rh   rS   )rh   r   c                C  s   t  | d|¡ d S )Nrh   re   )rV   rh   r   r   r   rW   ²   s    zArchiveInfo.__init__r   r   r   c                 C  sÆ   t |tdƒ}|d k	r6tdd„ | ¡ D ƒƒs6tddd�‚t |tdƒ}|d k	r¼d|kr^tddd�‚| dd	¡\}}|d kr€||i}n<||krœtd
|›d�dd�‚|| |kr¼td
|›d�dd�‚| |d�S )Nrh   c                 s  s   | ]}t |tƒV  qd S r   )r2   r,   )r'   Úhr   r   r   Ú	<genexpr>¼   s     z)ArchiveInfo._from_dict.<locals>.<genexpr>zHash values must be stringsr/   Úhashú=z3Invalid hash format (expected '<algorithm>=<hash>')r@   z
Algorithm z2 used in hash field is not present in hashes fieldz7 used in hash field has different value in hashes fieldri   )r5   r   ÚallÚvaluesr   r,   rA   )r   r   rh   Zlegacy_hashÚhash_algorithmÚ
hash_valuer   r   r   r   ¹   s6     ÿþ

ý
ýzArchiveInfo._from_dict)r    r!   r"   rh   r[   rW   r#   r   r   r   r   r   r   ®   s
   
ýc                   @  sD   e Zd ZU dZded< ddœdddœdd„Zed	d
dœdd„ƒZdS )r   Nzbool | NoneÚeditable©rr   rS   )rr   r   c                C  s   t  | d|¡ d S )Nrr   re   )rV   rr   r   r   r   rW   à   s    zDirInfo.__init__r   r   r   c                 C  s   | t |tdƒd�S )Nrr   rs   )r5   Úboolr   r   r   r   r   ç   s    
ÿzDirInfo._from_dict)r    r!   r"   rr   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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œdddddœd d!„Zdd"œd#d$„ZdS )%r   z"A class representing a direct URL.r,   rF   NzArchiveInfo | NoneÚarchive_infozVcsInfo | NoneÚvcs_infozDirInfo | NoneÚdir_inforQ   Úsubdirectory)ru   rv   rw   rx   rS   )rF   ru   rv   rw   rx   r   c                C  sJ   t  | d|¡ t  | d|¡ t  | d|¡ t  | d|¡ t  | d|¡ d S )NrF   ru   rv   rw   rx   re   )rV   rF   ru   rv   rw   rx   r   r   r   rW   ø   s
    	zDirectUrl.__init__r   r   r   c              	   C  sŠ   | t |tdƒt|tdƒt|tdƒt|tdƒt|tdƒd�}t|jƒt|j	ƒ t|j
ƒ dkrdtdƒ‚|j
d k	r†|j d	¡s†td
dd�‚|S )NrF   ru   rv   rw   rx   )rF   ru   rv   rw   rx   r@   z?Exactly one of vcs_info, archive_info, dir_info must be presentzfile://z3URL scheme must be file:// when dir_info is presentr/   )r7   r,   r;   r   r   r   r5   rt   rv   ru   rw   r   rF   Ú
startswith)r   r   Z
direct_urlr   r   r   r     s.    




ûÿþüÿþzDirectUrl._from_dictc                C  s
   |   |¡S )z@Create and validate a DirectUrl instance from a JSON dictionary.)r   r   r   r   r   Ú	from_dict   s    zDirectUrl.from_dictFT)Úgit)Úgenerate_legacy_hashÚstrip_user_passwordr>   rt   r<   )r|   r}   r>   r   c                C  sf   t j| td�}|rN| jrN| jjrNtt| jj ¡ ƒƒ\}}|› d|› �|d d< |rbt| j	|ƒ|d< |S )aŽ  Convert the DirectUrl instance to a JSON dictionary.

        :param generate_legacy_hash: If True, include a legacy `hash` field in
            `archive_info` for backward compatibility with tools that don't
            support the `hashes` field.
        :param strip_user_password: If True, strip user:password from the URL
            unless it is formed with environment variables as specified in PEP
            610, or it is a safe user:password such as `git`.
        :param safe_user_passwords: A collection of user:password strings that
            should not be stripped from the URL even if `strip_user_password` is
            True.
        )Zdict_factoryrm   ru   rl   rF   )
ÚdataclassesZasdictr+   ru   rh   ÚnextÚiterÚitemsrP   rF   )rV   r|   r}   r>   Úresrp   rq   r   r   r   Úto_dict%  s    zDirectUrl.to_dictr   c                 C  s   |   |  ¡ ¡ dS )z�Validate the DirectUrl instance against the specification.

        Raises :class:`DirectUrlValidationError` if invalid.
        N)rz   rƒ   rX   r   r   r   Úvalidate@  s    zDirectUrl.validate)r    r!   r"   rZ   r[   ru   rv   rw   rx   rW   r#   r   rz   rƒ   r„   r   r   r   r   r   î   s(   
ùû)'Ú
__future__r   r~   ÚreÚurllib.parserG   Úcollections.abcr   Útypingr   r   r   r   Úsysr   Úversion_infor   Ztyping_extensionsr   r   r   r   r$   r+   r5   r7   r;   ÚcompilerB   rE   rP   r9   r   r6   Z	dataclassr   r   r   r   r   r   r   r   Ú<module>   sP   
û	ÿ-