
0c@_.                 @   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 Gd 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 d d d d d d g Z d d d d	   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/ d0    Z d1 d2   Z e d3 d4    Z e d5 d6    Z e d7 d8    Z  e d9 d:    Z! d; d<   Z"   S)=Linkz?Represents a parsed link from a Package Index's simple URL
    _parsed_url_url
comes_fromrequires_pythonyanked_reasoncache_link_parsingNTc                s   | j  d  r t |  } t j |  |  _ | |  _ | |  _ | rK | n d |  _ | |  _ t	 t
 |   j d | d t
  | |  _ 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.
        :param cache_link_parsing: A flag that is used elsewhere to determine
                                   whether resources retrieved from this link
                                   should be cached. PyPI index urls should
                                   generally have this set to False, for
                                   example.
        z\\NkeyZdefining_class)
startswithr	   urllib_parseurlsplitr   r   r   r   r   superr   __init__r   )selfurlr   r   r   r   )	__class__ 8/tmp/pip-build-jynh7p1z/pip/pip/_internal/models/link.pyr   $   s    			zLink.__init__c             C   sc   |  j  r d j |  j   } n d } |  j rL d j t |  j  |  j |  St t |  j   Sd  S)Nz (requires-python:{}) z{} (from {}){})r   formatr   r   r   str)r   rpr!   r!   r"   __str__S   s    		zLink.__str__c             C   s   d j  |   S)Nz	<Link {}>)r$   )r   r!   r!   r"   __repr___   s    zLink.__repr__c             C   s   |  j  S)N)r   )r   r!   r!   r"   r   c   s    zLink.urlc             C   sq   |  j  j d  } t j |  } | s@ t |  j  \ } } | St j |  } | sm t d j	 t
       | S)N/z&URL {self._url!r} produced no filename)pathrstrip	posixpathbasenamer   netlocr   unquoteAssertionErrorr$   locals)r   r*   namer.   	user_passr!   r!   r"   filenameh   s    	zLink.filenamec             C   s   t  |  j  S)N)r
   r   )r   r!   r!   r"   	file_pathx   s    zLink.file_pathc             C   s
   |  j  j S)N)r   scheme)r   r!   r!   r"   r6   }   s    zLink.schemec             C   s
   |  j  j S)z4
        This can contain auth information.
        )r   r.   )r   r!   r!   r"   r.      s    zLink.netlocc             C   s   t  j |  j j  S)N)r   r/   r   r*   )r   r!   r!   r"   r*      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   s4   |  j  \ } } } } } t j | | | | d  f  S)N)r   r   
urlunsplit)r   r6   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)Nr7   )_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)Nr7   )_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  Sd  S)N   )_hash_rer>   r   r?   )r   r@   r!   r!   r"   hash   s    z	Link.hashc             C   s,   |  j  j |  j  } | r( | j d  Sd  S)Nr7   )rE   r>   r   r?   )r   r@   r!   r!   r"   	hash_name   s    zLink.hash_namec             C   s0   t  j |  j j d d  d j d d  d  S)N#r7   r   ?)r,   r-   r   split)r   r!   r!   r"   show_url   s    zLink.show_urlc             C   s   |  j  d k S)Nfile)r6   )r   r!   r!   r"   is_file   s    zLink.is_filec             C   s   |  j  o t j j |  j  S)N)rM   osr*   isdirr5   )r   r!   r!   r"   is_existing_dir   s    zLink.is_existing_dirc             C   s   |  j  t k S)N)r8   r   )r   r!   r!   r"   is_wheel   s    zLink.is_wheelc             C   s    d d l  m } |  j | j k S)Nr   )vcs)Zpip._internal.vcsrR   r6   all_schemes)r   rR   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)rG   )r   r!   r!   r"   has_hash   s    zLink.has_hashc             C   s]   | d k s |  j  r d S|  j d k	 s/ t  |  j d k	 sD t  | j |  j d |  j S)zG
        Return True if the link has a hash and it is allowed.
        NFZ
hex_digest)rV   rG   r0   rF   is_hash_allowed)r   hashesr!   r!   r"   rW      s
    zLink.is_hash_allowed)#__name__
__module____qualname____doc__	__slots__r   r'   r(   propertyr   r4   r5   r6   r.   r*   r   r8   r<   recompiler=   rA   rB   rC   rE   rF   rG   rK   rM   rP   rQ   rT   rU   rV   rW   r!   r!   )r    r"   r      sL   	)	r   )rN   r,   r_   Zpip._vendor.six.moves.urllibr   r   Zpip._internal.utils.filetypesr   Zpip._internal.utils.miscr   r   r   Zpip._internal.utils.modelsr   Zpip._internal.utils.typingr   Zpip._internal.utils.urlsr	   r
   Ztypingr   r   r   r   Zpip._internal.index.collectorr   Zpip._internal.utils.hashesr   r   r!   r!   r!   r"   <module>   s   "