U
    P^c,                     @   sX  d 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mZmZ ddlmZ ddlmZmZ ddl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l/m0Z0 G dd deZ1G dd dee1Z2G dd de2Z3d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)
PipSession)RequirementPreparer)install_req_from_editableinstall_req_from_lineinstall_req_from_req_string)parse_requirements)make_link_collectorpip_self_version_check)normalize_path)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|   d | _d S )N)superr   __init___session)self	__class__ >/tmp/pip-install-220asx0h/pip/pip/_internal/cli/req_command.pyr   2   s    zSessionCommandMixin.__init__c                 C   sL   g }t |dds*t |dd}|r*|| t |dd}|rD|| |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_urls6   s    

z#SessionCommandMixin._get_index_urlsc                 C   s"   | j dkr| | || _ | j S )zGet a default-managed session.N)r   enter_context_build_session)r    r,   r#   r#   r$   get_default_sessionD   s    
z'SessionCommandMixin.get_default_sessionNc                 C   s   t |jrttj|jdnd |d k	r*|n|j|j| |d}|j	rN|j	|_
|jr\|j|_	|jsf|rz|d k	rr|n|j|_|jr|j|jd|_|j |j_|S )Nhttp)cacheretriestrusted_hostsr-   )r4   https)r	   	cache_dirr   ospathjoinr6   r7   r0   certverifyclient_certtimeoutproxyproxiesno_inputauth	prompting)r    r,   r6   r@   sessionr#   r#   r$   r2   K   s*    
z"SessionCommandMixin._build_session)NN)
__name__
__module____qualname____doc__r   classmethodr0   r3   r2   __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 5 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   r@   )hasattrAssertionErrordisable_pip_version_checkr%   r2   minr@   r   )r    r,   rF   r#   r#   r$   handle_pip_version_checkz   s    
z*IndexGroupCommand.handle_pip_version_checkN)rG   rH   rI   rJ   rS   r#   r#   r#   r$   rM   r   s   rM   c                	   @   s:   e Zd ZedddZedddZd	d
 ZdddZdS )RequirementCommandNc              	   C   s.   | j }|dk	stt||j|||j|j|dS )zQ
        Create a RequirementPreparer instance for the given parameters.
        N)	build_dirsrc_dirdownload_dirwheel_download_dirprogress_barbuild_isolationreq_tracker)r;   rP   r
   rV   rY   rZ   )Ztemp_build_dirr,   r[   rW   rX   Ztemp_build_dir_pathr#   r#   r$   make_requirement_preparer   s    z,RequirementCommand.make_requirement_preparerFTto-satisfy-onlyc                 C   s2   t t|j||
d}t| |||||j||||	|dS )zF
        Create a Resolver instance for the given parameters.
        )isolatedwheel_cache
use_pep517)preparerrF   findermake_install_requse_user_siteignore_dependenciesignore_installedignore_requires_pythonforce_reinstallupgrade_strategypy_version_info)r   r   isolated_moder   re   )ra   rF   rb   r,   r_   rd   rf   rg   rh   ri   r`   rj   rc   r#   r#   r$   make_resolver   s&    z RequirementCommand.make_resolverc              	   C   s,  |j D ].}t|d||||dD ]}d|_|| qq|D ]*}	t|	d|j|j|d}d|_|| q:|jD ](}	t|	|j|j|d}d|_|| ql|j	D ]0}t||||||jdD ]}d|_|| qq|j
|_
|s(|js(|j	s(d| ji}
|jrtdt|
d|jd	 ntd
|
 dS )z?
        Marshal cmd line args into a requirement set.
        T)
constraintrb   r,   rF   r_   N)r^   r`   r_   )rb   r,   rF   r_   r`   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   rk   r`   	editablesr   requirementsrequire_hashesrn   
find_linksr   dictr<   )r    requirement_setargsr,   rb   rF   r_   filename
req_to_addreqoptsr#   r#   r$   populate_requirement_set   sn    
   
  

  

z+RequirementCommand.populate_requirement_setc                 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)Zallow_yankedformat_controlallow_all_prereleasesprefer_binaryrg   )link_collectorselection_prefstarget_python)r   r   r   prer   r   create)r    r,   rF   r   rg   r   r   r#   r#   r$   _build_package_finder  s    z(RequirementCommand._build_package_finder)NN)NFTFFr]   NN)NN)rG   rH   rI   staticmethodr\   rl   r   r   r#   r#   r#   r$   rT      s$             &G  rT   )4rJ   r:   	functoolsr   pip._internal.cli.base_commandr   Z!pip._internal.cli.command_contextr   pip._internal.exceptionsr   pip._internal.indexr   Zpip._internal.legacy_resolver   Z$pip._internal.models.selection_prefsr   Zpip._internal.network.sessionr	    pip._internal.operations.preparer
   pip._internal.req.constructorsr   r   r   Zpip._internal.req.req_filer   Z!pip._internal.self_outdated_checkr   r   pip._internal.utils.miscr   pip._internal.utils.typingr   optparser   typingr   r   r   pip._internal.cacher   Z"pip._internal.models.target_pythonr   Zpip._internal.req.req_setr   pip._internal.req.req_trackerr   pip._internal.utils.temp_dirr   r   rM   rT   r#   r#   r#   r$   <module>   s4   
E