U
    Ðvagð!  ã                
   @   sl  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	m
Z
mZ d dlmZ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  e¡Zee Zee Z eegee f Z!eege"f Z#G d	d
„ d
ƒZ$e%e"dœdd„Z&G dd„ dƒZ'G dd„ de$ƒZ(G dd„ de$ƒZ)G dd„ de$ƒZ*G dd„ de$ƒZ+e%e!e#e"e"e%ee
e% e
e$ f dœdd„Z,dS )é    N)Údefaultdict)ÚCallableÚDictÚIterableÚListÚOptionalÚTuple)ÚInvalidSdistFilenameÚInvalidVersionÚInvalidWheelFilenameÚcanonicalize_nameÚparse_sdist_filenameÚparse_wheel_filename)ÚInstallationCandidate)ÚLink)Úpath_to_urlÚurl_to_path)Úis_urlc                   @   s>   e Zd Zeee dœdd„ƒZedœdd„Ze	dœdd„Z
dS )	Ú
LinkSource©Úreturnc                 C   s
   t ƒ ‚dS )z,Returns the underlying link, if there's one.N©ÚNotImplementedError©Úself© r   úO/var/www/html/myvenv/lib/python3.8/site-packages/pip/_internal/index/sources.pyÚlink   s    zLinkSource.linkc                 C   s
   t ƒ ‚dS )z9Candidates found by parsing an archive listing HTML file.Nr   r   r   r   r   Úpage_candidates#   s    zLinkSource.page_candidatesc                 C   s
   t ƒ ‚dS )z,Links found by specifying archives directly.Nr   r   r   r   r   Ú
file_links'   s    zLinkSource.file_linksN)Ú__name__Ú
__module__Ú__qualname__Úpropertyr   r   r   ÚFoundCandidatesr   Ú
FoundLinksr   r   r   r   r   r      s   r   )Úfile_urlr   c                 C   s   t j| dd�d dkS )NF)Ústrictr   z	text/html)Ú	mimetypesÚ
guess_type)r&   r   r   r   Ú_is_html_file,   s    r*   c                   @   sb   e Zd ZdZeddœdd„Zddœdd„Zeee dœd	d
„ƒZ	ee
eee f dœdd„ƒZdS )Ú_FlatDirectoryToUrlsz"Scans directory and caches resultsN)Úpathr   c                 C   s    || _ g | _ttƒ| _d| _d S )NF)Ú_pathÚ_page_candidatesr   ÚlistÚ_project_name_to_urlsÚ_scanned_directory)r   r,   r   r   r   Ú__init__3   s    
z_FlatDirectoryToUrls.__init__r   c                 C   sª   t  | j¡D ]’}t|jƒ}t|ƒr0| j |¡ qzt|j	ƒd }W nJ t
tfk
rŒ   zt|j	ƒd }W n ttfk
r†   Y Y qY nX Y nX | j|  |¡ qd| _dS )zrScans directory once and populates both page_candidates
        and project_name_to_urls at the same time
        r   TN)ÚosÚscandirr-   r   r,   r*   r.   Úappendr   Únamer   r
   r   r	   r0   r1   )r   ÚentryÚurlZproject_filenamer   r   r   Ú_scan_directory9   s    
z$_FlatDirectoryToUrls._scan_directoryc                 C   s   | j s|  ¡  | jS ©N)r1   r9   r.   r   r   r   r   r   P   s    z$_FlatDirectoryToUrls.page_candidatesc                 C   s   | j s|  ¡  | jS r:   )r1   r9   r0   r   r   r   r   Úproject_name_to_urlsW   s    z)_FlatDirectoryToUrls.project_name_to_urls)r    r!   r"   Ú__doc__Ústrr2   r9   r#   r   r   r   r;   r   r   r   r   r+   0   s   r+   c                   @   sl   e Zd ZU dZi Zeeef ed< e	eeddœdd„Z
eee dœdd	„ƒZedœd
d„Zedœdd„ZdS )Ú_FlatDirectorySourcezûLink source specified by ``--find-links=<path-to-dir>``.

    This looks the content of the directory, and returns:

    * ``page_candidates``: Links listed on each HTML file in the directory.
    * ``file_candidates``: Archives in the directory.
    Ú_paths_to_urlsN)Úcandidates_from_pager,   Úproject_namer   c                 C   sD   || _ t|ƒ| _|| jkr(| j| | _nt|d�| _| j| j|< d S )N)r,   )Ú_candidates_from_pager   Ú_project_namer?   Ú_path_to_urlsr+   )r   r@   r,   rA   r   r   r   r2   j   s    

z_FlatDirectorySource.__init__r   c                 C   s   d S r:   r   r   r   r   r   r   z   s    z_FlatDirectorySource.linkc                 c   s&   | j jD ]}|  t|ƒ¡E d H  qd S r:   )rD   r   rB   r   ©r   r8   r   r   r   r   ~   s    z$_FlatDirectorySource.page_candidatesc                 c   s"   | j j| j D ]}t|ƒV  qd S r:   )rD   r;   rC   r   rE   r   r   r   r   ‚   s    z_FlatDirectorySource.file_links)r    r!   r"   r<   r?   r   r=   r+   Ú__annotations__ÚCandidatesFromPager2   r#   r   r   r   r$   r   r%   r   r   r   r   r   r>   _   s   
ûr>   c                   @   sT   e Zd ZdZeeddœdd„Zeee dœdd„ƒZ	e
dœd	d
„Zedœdd„ZdS )Ú_LocalFileSourceaC  ``--find-links=<path-or-url>`` or ``--[extra-]index-url=<path-or-url>``.

    If a URL is supplied, it must be a ``file:`` URL. If a path is supplied to
    the option, it is converted to a URL first. This returns:

    * ``page_candidates``: Links listed on an HTML file.
    * ``file_candidates``: The non-HTML file.
    N©r@   r   r   c                 C   s   || _ || _d S r:   ©rB   Ú_link©r   r@   r   r   r   r   r2   ‘   s    z_LocalFileSource.__init__r   c                 C   s   | j S r:   ©rK   r   r   r   r   r   ™   s    z_LocalFileSource.linkc                 c   s&   t | jjƒsd S |  | j¡E d H  d S r:   )r*   rK   r8   rB   r   r   r   r   r   �   s    z _LocalFileSource.page_candidatesc                 c   s   t | jjƒrd S | jV  d S r:   )r*   rK   r8   r   r   r   r   r   ¢   s    z_LocalFileSource.file_links©r    r!   r"   r<   rG   r   r2   r#   r   r   r$   r   r%   r   r   r   r   r   rH   ‡   s   ürH   c                   @   sV   e Zd ZdZeeeddœdd„Zee	e dœdd„ƒZ
edœd	d
„Zedœdd„ZdS )Ú_RemoteFileSourcez¸``--find-links=<url>`` or ``--[extra-]index-url=<url>``.

    This returns:

    * ``page_candidates``: Links listed on an HTML file.
    * ``file_candidates``: The non-HTML file.
    N)r@   Úpage_validatorr   r   c                 C   s   || _ || _|| _d S r:   )rB   Ú_page_validatorrK   )r   r@   rP   r   r   r   r   r2   ±   s    z_RemoteFileSource.__init__r   c                 C   s   | j S r:   rM   r   r   r   r   r   »   s    z_RemoteFileSource.linkc                 c   s&   |   | j¡sd S |  | j¡E d H  d S r:   )rQ   rK   rB   r   r   r   r   r   ¿   s    z!_RemoteFileSource.page_candidatesc                 c   s   | j V  d S r:   rM   r   r   r   r   r   Ä   s    z_RemoteFileSource.file_links)r    r!   r"   r<   rG   ÚPageValidatorr   r2   r#   r   r   r$   r   r%   r   r   r   r   r   rO   ¨   s   
û
rO   c                   @   sT   e Zd ZdZeeddœdd„Zeee dœdd„ƒZ	e
dœd	d
„Zedœdd„ZdS )Ú_IndexDirectorySourcez·``--[extra-]index-url=<path-to-directory>``.

    This is treated like a remote URL; ``candidates_from_page`` contains logic
    for this by appending ``index.html`` to the link.
    NrI   c                 C   s   || _ || _d S r:   rJ   rL   r   r   r   r2   Ï   s    z_IndexDirectorySource.__init__r   c                 C   s   | j S r:   rM   r   r   r   r   r   ×   s    z_IndexDirectorySource.linkc                 c   s   |   | j¡E d H  d S r:   rJ   r   r   r   r   r   Û   s    z%_IndexDirectorySource.page_candidatesc                 C   s   dS )Nr   r   r   r   r   r   r   Þ   s    z _IndexDirectorySource.file_linksrN   r   r   r   r   rS   È   s   ürS   )Úlocationr@   rP   Ú
expand_dirÚcache_link_parsingrA   r   c          
      C   s   d }d }t j | ¡r"t| ƒ}| }n$|  d¡r:| }t| ƒ}nt| ƒrF| }|d krbd}t || ¡ dS |d krˆt	||t
||d�d�}	||	fS t j |¡rÄ|r¨t|||d�}	nt|t
||d�d�}	||	fS t j |¡rìt|t
||d�d�}	||	fS t d| ¡ |d fS )	Nzfile:zVLocation '%s' is ignored: it is either a non-existing path or lacks a specific scheme.)NN)rV   )r@   rP   r   )r@   r,   rA   )r@   r   z?Location '%s' is ignored: it is neither a file nor a directory.)r3   r,   Úexistsr   Ú
startswithr   r   ÚloggerÚwarningrO   r   Úisdirr>   rS   ÚisfilerH   )
rT   r@   rP   rU   rV   rA   r,   r8   ÚmsgÚsourcer   r   r   Úbuild_sourceâ   sZ    	

ÿ
ýý
þ
þþr_   )-Úloggingr(   r3   Úcollectionsr   Útypingr   r   r   r   r   r   Zpip._vendor.packaging.utilsr	   r
   r   r   r   r   Zpip._internal.models.candidater   Úpip._internal.models.linkr   Úpip._internal.utils.urlsr   r   Úpip._internal.vcsr   Ú	getLoggerr    rY   r$   r%   rG   ÚboolrR   r   r=   r*   r+   r>   rH   rO   rS   r_   r   r   r   r   Ú<module>   s:     	
/(! ø