3

g0                 @   sj  d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lm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mZ ddl m!Z! e!r*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- ddl.m/Z/ ddl0m1Z1 ej2e3Z4G dd deZ5G dd dee5Z6G dd de6Z7dS )a  Contains the Command base classes that depend on PipSession.

The classes in this module are in a separate module so the commands not
needing download / PackageFinder capability don't unnecessarily import the
PackageFinder machinery and all its vendored dependencies, etc.
    N)partial)Command)CommandContextMixIn)CommandError)PackageFinder)Resolver)SelectionPreferences)
Downloader)
PipSession)RequirementPreparer)install_req_from_editableinstall_req_from_lineinstall_req_from_req_string)parse_requirements)make_link_collectorpip_self_version_check)MYPY_CHECK_RUNNING)Values)ListOptionalTuple)
WheelCache)TargetPython)RequirementSet)RequirementTracker)TempDirectoryc                   s>   e Zd ZdZ fddZedd Zdd Zdd	d
Z  Z	S )SessionCommandMixinzE
    A class mixin for command classes needing _build_session().
    c                s   t t| j  d | _d S )N)superr   __init___session)self)	__class__ A/tmp/pip-unpacked-wheel-v59g9nu1/pip/_internal/cli/req_command.pyr   2   s    zSessionCommandMixin.__init__c             C   sL   g }t |dds*t |dd}|r*|j| t |dd}|rD|j| |pJdS )z7Return a list of index urls from user-provided options.no_indexF	index_urlNextra_index_urls)getattrappendextend)clsoptions
index_urlsurlurlsr"   r"   r#   _get_index_urls7   s    

z#SessionCommandMixin._get_index_urlsc             C   s0   | j dkr*| j| j|| _ | j dk	s*t| j S )zGet a default-managed session.N)r   enter_context_build_sessionAssertionError)r    r+   r"   r"   r#   get_default_sessionF   s    
z'SessionCommandMixin.get_default_sessionNc             C   s   |j  stjj|j stt|j r2tjj|j dnd |d k	r@|n|j|j| j	|d}|j
rd|j
|_|jrr|j|_
|js||r|d k	r|n|j|_|jr|j|jd|_|j |j_|S )Nhttp)cacheretriestrusted_hostsr,   )r4   https)	cache_dirospathisabsr2   r
   joinr6   r7   r/   certverifyclient_certtimeoutproxyproxiesno_inputauth	prompting)r    r+   r6   rA   sessionr"   r"   r#   r1   Q   s"    
z"SessionCommandMixin._build_session)NN)
__name__
__module____qualname____doc__r   classmethodr/   r3   r1   __classcell__r"   r"   )r!   r#   r   -   s
   r   c               @   s   e Zd ZdZdd ZdS )IndexGroupCommandz
    Abstract base class for commands with the index_group options.

    This also corresponds to the commands that permit the pip version check.
    c          
   C   sT   t |dst|js|jrdS | j|dtd|jd}| t|| W dQ R X dS )z
        Do the pip version check if not disabled.

        This overrides the default behavior of not doing the check.
        r$   Nr      )r6   rA   )hasattrr2   disable_pip_version_checkr$   r1   minrA   r   )r    r+   rG   r"   r"   r#   handle_pip_version_check   s    z*IndexGroupCommand.handle_pip_version_checkN)rH   rI   rJ   rK   rS   r"   r"   r"   r#   rN   y   s   rN   c            	   @   sF   e Zd ZedddZedddZd	d
 Zedd ZdddZdS )RequirementCommandNc       
      C   sB   t ||jd}| j}	|	dk	s tt|	|j|||j||||j|d
S )zQ
        Create a RequirementPreparer instance for the given parameters.
        )progress_barN)
	build_dirsrc_dirdownload_dirwheel_download_dirbuild_isolationreq_tracker
downloaderfinderrequire_hashesuse_user_site)r	   rU   r;   r2   r   rW   rZ   r^   )
temp_build_dirr+   r[   rG   r]   r_   rX   rY   r\   temp_build_dir_pathr"   r"   r#   make_requirement_preparer   s    z,RequirementCommand.make_requirement_preparerFTto-satisfy-onlyc             C   s0   t t|j||	d}t| ||||j|||||
d
S )zF
        Create a Resolver instance for the given parameters.
        )isolatedwheel_cache
use_pep517)
preparerr]   make_install_reqr_   ignore_dependenciesignore_installedignore_requires_pythonforce_reinstallupgrade_strategypy_version_info)r   r   isolated_moder   ri   )rg   r]   r+   re   r_   rj   rk   rl   rm   rf   rn   rh   r"   r"   r#   make_resolver   s     z RequirementCommand.make_resolverc          	   C   sj  x<|j D ]2}x,t|d||||dD ]}d|_|j| q"W qW x2|D ]*}	t|	d|j|j|d}d|_|j| qDW x2|jD ](}	t|	|j|j|d}d|_|j| qzW x>|j	D ]4}x.t||||||jdD ]}d|_|j| qW qW |j
t|j	j  }
tdd |
D rd|_|p&|jp&|j	sfd| ji}|jrZtd	t|d
j|jd ntd| dS )z?
        Marshal cmd line args into a requirement set.
        T)
constraintr]   r+   rG   re   N)rd   rf   re   )r]   r+   rG   re   rf   c             s   s   | ]}|j V  qd S )N)has_hash_options).0reqr"   r"   r#   	<genexpr>  s    z>RequirementCommand.populate_requirement_set.<locals>.<genexpr>namez^You must give at least one requirement to %(name)s (maybe you meant "pip %(name)s %(links)s"?) )linkszLYou must give at least one requirement to %(name)s (see "pip help %(name)s"))constraintsr   	is_directadd_requirementr   ro   rf   	editablesr   requirementsunnamed_requirementslistvaluesanyr^   rv   
find_linksr   dictr=   )r    requirement_setargsr+   r]   rG   re   filename
req_to_addrt   r}   optsr"   r"   r#   populate_requirement_set   sV    

z+RequirementCommand.populate_requirement_setc             C   s    | j }|j }|rtj| dS )zE
        Trace basic information about the provided objects.
        N)search_scopeget_formatted_locationsloggerinfo)r]   r   	locationsr"   r"   r#   trace_basic_info&  s    z#RequirementCommand.trace_basic_infoc             C   s4   t ||d}td|j|j|j|d}tj|||dS )z
        Create a package finder appropriate to this requirement command.

        :param ignore_requires_python: Whether to ignore incompatible
            "Requires-Python" values in links. Defaults to False.
        )r+   T)allow_yankedformat_controlallow_all_prereleasesprefer_binaryrk   )link_collectorselection_prefstarget_python)r   r   r   prer   r   create)r    r+   rG   r   rk   r   r   r"   r"   r#   _build_package_finder2  s    z(RequirementCommand._build_package_finder)NN)NFTFFrc   NN)NN)	rH   rI   rJ   staticmethodrb   rp   r   r   r   r"   r"   r"   r#   rT      s            F rT   )8rK   loggingr:   	functoolsr   pip._internal.cli.base_commandr   !pip._internal.cli.command_contextr   pip._internal.exceptionsr   "pip._internal.index.package_finderr   pip._internal.legacy_resolver   $pip._internal.models.selection_prefsr   pip._internal.network.downloadr	   pip._internal.network.sessionr
    pip._internal.operations.preparer   pip._internal.req.constructorsr   r   r   Zpip._internal.req.req_filer   !pip._internal.self_outdated_checkr   r   pip._internal.utils.typingr   optparser   typingr   r   r   pip._internal.cacher   "pip._internal.models.target_pythonr   Zpip._internal.req.req_setr   pip._internal.req.req_trackerr   pip._internal.utils.temp_dirr   	getLoggerrH   r   r   rN   rT   r"   r"   r"   r#   <module>   s8   
L