U
    «ÃT_«  ã                   @   s´   d dl Z d dlZd dlZd dl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 d dlmZmZ er d dlmZmZmZmZ d d	lmZ d d
lmZ G dd„ deƒZdS )é    N)Úparse)ÚWHEEL_EXTENSION)Úredact_auth_from_urlÚsplit_auth_from_netlocÚsplitext)ÚKeyBasedCompareMixin)ÚMYPY_CHECK_RUNNING)Úpath_to_urlÚurl_to_path)ÚOptionalÚTextÚTupleÚUnion)ÚHTMLPage)ÚHashesc                       s@  e Zd ZdZd6‡ fdd„	Zdd„ Zdd„ Zed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZdd„ Zedd„ ƒZedd„ ƒZe d¡Zedd„ ƒZe d¡Zedd „ ƒZe d!¡Zed"d#„ ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZd*d+„ Zed,d-„ ƒZed.d/„ ƒZed0d1„ ƒZed2d3„ ƒZ d4d5„ Z!‡  Z"S )7ÚLinkz?Represents a parsed link from a Package Index's simple URL
    Nc                    sV   |  d¡rt|ƒ}t |¡| _|| _|| _|r2|nd| _|| _t	t
| ƒj|t
d� dS )a`  
        :param url: url of the resource pointed to (href of the link)
        :param comes_from: instance of HTMLPage where the link was found,
            or string.
        :param requires_python: String containing the `Requires-Python`
            metadata field, specified in PEP 345. This may be specified by
            a data-requires-python attribute in the HTML link tag, as
            described in PEP 503.
        :param yanked_reason: the reason the file has been yanked, if the
            file has been yanked, or None if the file hasn't been yanked.
            This is the value of the "data-yanked" attribute, if present, in
            a simple repository HTML link. If the file has been yanked but
            no reason was provided, this should be the empty string. See
            PEP 592 for more information and the specification.
        z\\N)ÚkeyÚdefining_class)Ú
startswithr	   Úurllib_parseÚurlsplitÚ_parsed_urlÚ_urlÚ
comes_fromÚrequires_pythonÚyanked_reasonÚsuperr   Ú__init__)ÚselfÚurlr   r   r   ©Ú	__class__© ú=/tmp/pip-unpacked-wheel-8u7dkzi1/pip/_internal/models/link.pyr      s    
zLink.__init__c                 C   sD   | j rd| j  }nd}| jr2dt| jƒ| j|f S tt| jƒƒS d S )Nz (requires-python:%s)Ú z%s (from %s)%s)r   r   r   r   Ústr)r   Úrpr"   r"   r#   Ú__str__B   s    
 ÿzLink.__str__c                 C   s   d|  S )Nz	<Link %s>r"   ©r   r"   r"   r#   Ú__repr__N   s    zLink.__repr__c                 C   s   | j S ©N)r   r(   r"   r"   r#   r   R   s    zLink.urlc                 C   sL   | j  d¡}t |¡}|s,t| jƒ\}}|S t |¡}|sHtd| j	 ƒ‚|S )Nú/zURL %r produced no filename)
ÚpathÚrstripÚ	posixpathÚbasenamer   Únetlocr   ÚunquoteÚAssertionErrorr   )r   r,   Únamer0   Ú	user_passr"   r"   r#   ÚfilenameW   s    

zLink.filenamec                 C   s
   t | jƒS r*   )r
   r   r(   r"   r"   r#   Ú	file_pathf   s    zLink.file_pathc                 C   s   | j jS r*   )r   Úschemer(   r"   r"   r#   r7   k   s    zLink.schemec                 C   s   | j jS )z4
        This can contain auth information.
        )r   r0   r(   r"   r"   r#   r0   p   s    zLink.netlocc                 C   s   t  | jj¡S r*   )r   r1   r   r,   r(   r"   r"   r#   r,   x   s    z	Link.pathc                 C   s   t t | j d¡¡ƒS )Nr+   )r   r.   r/   r,   r-   r(   r"   r"   r#   r   }   s    zLink.splitextc                 C   s   |   ¡ d S ©Né   )r   r(   r"   r"   r#   Úext�   s    zLink.extc                 C   s$   | j \}}}}}t ||||d f¡S r*   )r   r   Ú
urlunsplit)r   r7   r0   r,   ÚqueryÚfragmentr"   r"   r#   Úurl_without_fragment†   s    zLink.url_without_fragmentz[#&]egg=([^&]*)c                 C   s    | j  | j¡}|sd S | d¡S r8   )Ú_egg_fragment_reÚsearchr   Úgroup©r   Úmatchr"   r"   r#   Úegg_fragmentŽ   s    zLink.egg_fragmentz[#&]subdirectory=([^&]*)c                 C   s    | j  | j¡}|sd S | d¡S r8   )Ú_subdirectory_fragment_rer@   r   rA   rB   r"   r"   r#   Úsubdirectory_fragment˜   s    zLink.subdirectory_fragmentz2(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)c                 C   s    | j  | j¡}|r| d¡S d S )Né   ©Ú_hash_rer@   r   rA   rB   r"   r"   r#   Úhash¤   s    
z	Link.hashc                 C   s    | j  | j¡}|r| d¡S d S r8   rH   rB   r"   r"   r#   Ú	hash_name¬   s    
zLink.hash_namec                 C   s$   t  | j dd¡d  dd¡d ¡S )Nú#r9   r   ú?)r.   r/   r   Úsplitr(   r"   r"   r#   Úshow_url´   s    zLink.show_urlc                 C   s
   | j dkS )NÚfile)r7   r(   r"   r"   r#   Úis_file¹   s    zLink.is_filec                 C   s   | j otj | j¡S r*   )rQ   Úosr,   Úisdirr6   r(   r"   r"   r#   Úis_existing_dir¾   s    zLink.is_existing_dirc                 C   s
   | j tkS r*   )r:   r   r(   r"   r"   r#   Úis_wheelÂ   s    zLink.is_wheelc                 C   s   ddl m} | j|jkS )Nr   )Úvcs)Úpip._internal.vcsrV   r7   Úall_schemes)r   rV   r"   r"   r#   Úis_vcsÇ   s    zLink.is_vcsc                 C   s
   | j d k	S r*   )r   r(   r"   r"   r#   Ú	is_yankedÎ   s    zLink.is_yankedc                 C   s
   | j d k	S r*   )rK   r(   r"   r"   r#   Úhas_hashÓ   s    zLink.has_hashc                 C   s@   |dks| j sdS | jdk	s t‚| jdk	s.t‚|j| j| jd�S )zG
        Return True if the link has a hash and it is allowed.
        NF)Ú
hex_digest)r[   rK   r2   rJ   Úis_hash_allowed)r   Úhashesr"   r"   r#   r]   Ø   s
    zLink.is_hash_allowed)NNN)#Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r'   r)   Úpropertyr   r5   r6   r7   r0   r,   r   r:   r>   ÚreÚcompiler?   rD   rE   rF   rI   rJ   rK   rO   rQ   rT   rU   rY   rZ   r[   r]   Ú__classcell__r"   r"   r    r#   r      sf      û'











ÿ







r   )rR   r.   rd   Zpip._vendor.six.moves.urllibr   r   Úpip._internal.utils.filetypesr   Úpip._internal.utils.miscr   r   r   Úpip._internal.utils.modelsr   Úpip._internal.utils.typingr   Úpip._internal.utils.urlsr	   r
   Útypingr   r   r   r   Úpip._internal.index.collectorr   Úpip._internal.utils.hashesr   r   r"   r"   r"   r#   Ú<module>   s   