3

g                 @   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rd 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jdZedd ZejdZedd  Zej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   |j drt|}tj|| _|| _|| _|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-v59g9nu1/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 jd}tj|}|s,t| j\}}|S tj|}|sHtd| j	 |S )N/zURL %r produced no filename)
pathrstrip	posixpathbasenamer   netlocr   unquoteAssertionErrorr   )r   r)   namer-   	user_passr!   r!   r"   filenameW   s    

zLink.filenamec             C   s
   t | jS )N)r
   r   )r   r!   r!   r"   	file_pathf   s    zLink.file_pathc             C   s   | j jS )N)r   scheme)r   r!   r!   r"   r4   k   s    zLink.schemec             C   s   | j jS )z4
        This can contain auth information.
        )r   r-   )r   r!   r!   r"   r-   p   s    zLink.netlocc             C   s   t j| jjS )N)r   r.   r   r)   )r   r!   r!   r"   r)   x   s    z	Link.pathc             C   s   t tj| jjdS )Nr(   )r   r+   r,   r)   r*   )r   r!   r!   r"   r   }   s    zLink.splitextc             C   s   | j  d S )N   )r   )r   r!   r!   r"   ext   s    zLink.extc             C   s$   | j \}}}}}tj||||d fS )N)r   r   
urlunsplit)r   r4   r-   r)   queryfragmentr!   r!   r"   url_without_fragment   s    zLink.url_without_fragmentz[#&]egg=([^&]*)c             C   s    | j j| j}|sd S |jdS )Nr5   )_egg_fragment_researchr   group)r   matchr!   r!   r"   egg_fragment   s    zLink.egg_fragmentz[#&]subdirectory=([^&]*)c             C   s    | j j| j}|sd S |jdS )Nr5   )_subdirectory_fragment_rer<   r   r=   )r   r>   r!   r!   r"   subdirectory_fragment   s    zLink.subdirectory_fragmentz2(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)c             C   s    | j j| j}|r|jdS d S )N   )_hash_rer<   r   r=   )r   r>   r!   r!   r"   hash   s    
z	Link.hashc             C   s    | j j| j}|r|jdS d S )Nr5   )rC   r<   r   r=   )r   r>   r!   r!   r"   	hash_name   s    
zLink.hash_namec             C   s$   t j| jjddd jddd S )N#r5   r   ?)r+   r,   r   split)r   r!   r!   r"   show_url   s    zLink.show_urlc             C   s
   | j dkS )Nfile)r4   )r   r!   r!   r"   is_file   s    zLink.is_filec             C   s   | j otjj| jS )N)rK   osr)   isdirr3   )r   r!   r!   r"   is_existing_dir   s    zLink.is_existing_dirc             C   s
   | j tkS )N)r6   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.vcsrP   r4   all_schemes)r   rP   r!   r!   r"   is_vcs   s    zLink.is_vcsc             C   s
   | j d k	S )N)r   )r   r!   r!   r"   	is_yanked   s    zLink.is_yankedc             C   s
   | j d k	S )N)rE   )r   r!   r!   r"   has_hash   s    zLink.has_hashc             C   sB   |dks| j  rdS | jdk	s"t| jdk	s0t|j| j| jdS )zG
        Return True if the link has a hash and it is allowed.
        NF)
hex_digest)rU   rE   r/   rD   is_hash_allowed)r   hashesr!   r!   r"   rW      s
    zLink.is_hash_allowed)NNN)#__name__
__module____qualname____doc__r   r&   r'   propertyr   r2   r3   r4   r-   r)   r   r6   r:   recompiler;   r?   r@   rA   rC   rD   rE   rI   rK   rN   rO   rS   rT   rU   rW   __classcell__r!   r!   )r    r"   r      s>     "

r   )rL   r+   r^   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   