B
    `d;                 @   s  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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mZ ddl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-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl$m9Z9m:Z: e;e<Z=G dd de
Z>G dd dee>Z?e%j@e%jAe%jBgZCdd  ZDG d!d" d"e?ZEd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)
cmdoptions)Command)CommandContextMixIn)CommandErrorPreviousBuildDirError)PackageFinder)SelectionPreferences)
Downloader)
PipSession)RequirementPreparer)install_req_from_editableinstall_req_from_line#install_req_from_parsed_requirementinstall_req_from_req_string)parse_requirements)RequirementSet)make_link_collectorpip_self_version_check)tempdir_kinds)MYPY_CHECK_RUNNING)Values)AnyListOptionalTuple)
WheelCache)TargetPython)InstallRequirement)RequirementTracker)BaseResolver)TempDirectoryTempDirectoryTypeRegistryc                   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__ A/tmp/pip-unpacked-wheel-hu9qqap1/pip/_internal/cli/req_command.pyr%   ;   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_urls@   s    

z#SessionCommandMixin._get_index_urlsc             C   s0   | j dkr*| | || _ | j dk	s*t| j S )zGet a default-managed session.N)r&   enter_context_build_sessionAssertionError)r'   r2   r)   r)   r*   get_default_sessionO   s    
z'SessionCommandMixin.get_default_sessionNc             C   s   |j rtj|j stt|j r0tj|j dnd |d k	r>|n|j|j| 	|d}|j
rb|j
|_|jrp|j|_
|jsz|r|d k	r|n|j|_|jr|j|jd|_|j |j_|S )Nhttp)cacheretriestrusted_hostsr3   )r;   https)	cache_dirospathisabsr9   r   joinr=   r>   r6   certverifyclient_certtimeoutproxyproxiesno_inputauth	prompting)r'   r2   r=   rH   sessionr)   r)   r*   r8   Z   s"    
z"SessionCommandMixin._build_session)NN)
__name__
__module____qualname____doc__r%   classmethodr6   r:   r8   __classcell__r)   r)   )r(   r*   r#   6   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      )r=   rH   )hasattrr9   disable_pip_version_checkr+   r8   minrH   r   )r'   r2   rN   r)   r)   r*   handle_pip_version_check   s    z*IndexGroupCommand.handle_pip_version_checkN)rO   rP   rQ   rR   rZ   r)   r)   r)   r*   rU      s   rU   c                s   dd   fdd}|S )zNDecorator for common logic related to managing temporary
    directories.
    c             S   s   xt D ]}| |d qW d S )NF)KEEPABLE_TEMPDIR_TYPES
set_delete)registrytr)   r)   r*   configure_tempdir_registry   s    
z0with_cleanup.<locals>.configure_tempdir_registryc                sP   | j d k	st|jr | j  y| ||S  tk
rJ    | j   Y nX d S )N)tempdir_registryr9   no_cleanr   )r'   r2   args)r_   funcr)   r*   wrapper   s    

zwith_cleanup.<locals>.wrapperr)   )rc   rd   r)   )r_   rc   r*   with_cleanup   s    re   c            	       sX   e Zd Z fddZedddZedd	d
ZdddZedd ZdddZ	  Z
S )RequirementCommandc                s&   t t| j|| | jt  d S )N)r$   rf   r%   cmd_opts
add_optionr   ra   )r'   rb   kw)r(   r)   r*   r%      s    zRequirementCommand.__init__Nc       
      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
   rj   rB   r9   r   rl   ro   rs   )
temp_build_dirr2   rp   rN   rr   rt   rm   rn   rq   temp_build_dir_pathr)   r)   r*   make_requirement_preparer   s    z,RequirementCommand.make_requirement_preparerFTto-satisfy-onlyc             C   s~   t t|j|	d}d|jkrLddl}|jjjjj	| |||||j
|||||
dS ddl}|jjjjj	| |||||j
|||||
dS )zF
        Create a Resolver instance for the given parameters.
        )isolated
use_pep517resolverr   N)preparerrr   wheel_cachemake_install_reqrt   ignore_dependenciesignore_installedignore_requires_pythonforce_reinstallupgrade_strategypy_version_info)r   r   isolated_modeunstable_features,pip._internal.resolution.resolvelib.resolver	_internal
resolution
resolvelibr{   Resolverr   (pip._internal.resolution.legacy.resolverlegacy)r|   rr   r2   r}   rt   r   r   r   r   rz   r   r~   pipr)   r)   r*   make_resolver   s>    
z RequirementCommand.make_resolverc             C   s  t |d}xH|jD ]>}x8t|d|||dD ]"}t||jd}	d|	_||	 q*W qW x0|D ](}
t|
d|j|jd}	d|	_||	 qZW x0|j	D ]&}
t
|
|j|jd}	d|	_||	 qW xJ|jD ]@}x:t||||dD ]&}t||j|jd}	d|	_||	 qW qW |j}tdd	 |D r$d|_|s~|j	s~|js~d
| ji}|jrntdjf t|d|jdntdjf ||S )zS
        Parse command-line arguments into the corresponding requirements.
        )check_supported_wheelsT)
constraintrr   r2   rN   )ry   N)ry   rz   )rr   r2   rN   c             s   s   | ]}|j V  qd S )N)has_hash_options).0reqr)   r)   r*   	<genexpr>`  s    z6RequirementCommand.get_requirements.<locals>.<genexpr>namezXYou must give at least one requirement to {name} (maybe you meant "pip {name} {links}"?) )linkszHYou must give at least one requirement to {name} (see "pip help {name}"))r   constraintsr   r   r   	is_directadd_requirementr   rz   	editablesr   requirementsall_requirementsanyrs   r   
find_linksr   formatdictrD   )r'   rb   r2   rr   rN   r   requirement_setfilename
parsed_req
req_to_addr   r   optsr)   r)   r*   get_requirements%  s`    





z#RequirementCommand.get_requirementsc             C   s    | j }| }|rt| dS )zE
        Trace basic information about the provided objects.
        N)search_scopeget_formatted_locationsloggerinfo)rr   r   	locationsr)   r)   r*   trace_basic_infoq  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.
        )r2   T)allow_yankedformat_controlallow_all_prereleasesprefer_binaryr   )link_collectorselection_prefstarget_python)r   r	   r   prer   r   create)r'   r2   rN   r   r   r   r   r)   r)   r*   _build_package_finder}  s    z(RequirementCommand._build_package_finder)NN)NFTFFrx   NN)T)NN)rO   rP   rQ   r%   staticmethodrw   r   r   r   r   rT   r)   r)   )r(   r*   rf      s"           2
F rf   )FrR   loggingrA   	functoolsr   Zpip._internal.clir   pip._internal.cli.base_commandr   !pip._internal.cli.command_contextr   pip._internal.exceptionsr   r   "pip._internal.index.package_finderr   $pip._internal.models.selection_prefsr	   pip._internal.network.downloadr
   pip._internal.network.sessionr    pip._internal.operations.preparer   pip._internal.req.constructorsr   r   r   r   Zpip._internal.req.req_filer   Zpip._internal.req.req_setr   !pip._internal.self_outdated_checkr   r   pip._internal.utils.temp_dirr   pip._internal.utils.typingr   optparser   typingr   r   r   r   pip._internal.cacher   "pip._internal.models.target_pythonr   Zpip._internal.req.req_installr   pip._internal.req.req_trackerr   pip._internal.resolution.baser    r!   r"   	getLoggerrO   r   r#   rU   	BUILD_ENVEPHEM_WHEEL_CACHE	REQ_BUILDr[   re   rf   r)   r)   r)   r*   <module>   sF   
L 