U
    «ÃT_é  ã                   @   s   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 e e¡Zerädd	lmZ dd
lmZmZmZmZmZmZmZ eedf Zeeef Zeeeef Zeeee f Zeeee f Z eee f Z!edddgƒZ"dd„ Z#ddd„Z$dd„ Z%dd„ Z&dd„ Z'dS )z'Validation of dependencies of packages
é    N)Ú
namedtuple)Úcanonicalize_name)ÚRequirementParseError)Ú)make_distribution_for_install_requirement)Úget_installed_distributions)ÚMYPY_CHECK_RUNNING)ÚInstallRequirement)ÚAnyÚCallableÚDictÚOptionalÚSetÚTupleÚListÚPackageDetailsÚversionÚrequiresc                  K   sŠ   | i krdddœ} i }d}t f | ŽD ]\}t|jƒ}zt|j| ¡ ƒ||< W q$ tk
r~ } zt d||¡ d}W 5 d}~X Y q$X q$||fS )z8Converts a list of distributions into a PackageSet.
    F© )Ú
local_onlyÚskipz%Error parsing requirements for %s: %sTN)	r   r   Úproject_namer   r   r   r   ÚloggerÚwarning)ÚkwargsÚpackage_setÚproblemsÚdistÚnameÚer   r   úB/tmp/pip-unpacked-wheel-8u7dkzi1/pip/_internal/operations/check.pyÚ!create_package_set_from_installed(   s    

r    c                 C   sà   |dkrdd„ }i }i }| D ]º}t ƒ }t ƒ }||ƒr6q| | jD ]l}t|jƒ}|| kr‚d}	|jdk	rn|j ¡ }	|	r@| ||f¡ q@| | j}
|jj	|
dd�s@| ||
|f¡ q@|rÂt
|td�||< |rt
|td�||< q||fS )z—Check if a package set is consistent

    If should_ignore is passed, it should be a callable that takes a
    package name and returns a boolean.
    Nc                 S   s   dS )NFr   ©r   r   r   r   Úshould_ignoreE   s    z(check_package_set.<locals>.should_ignoreT)Úprereleases)Úkey)Úsetr   r   r   ÚmarkerÚevaluateÚaddr   Ú	specifierÚcontainsÚsortedÚstr)r   r"   ÚmissingÚconflictingÚpackage_nameÚmissing_depsÚconflicting_depsÚreqr   Úmissedr   r   r   r   Úcheck_package_set=   s4    



r4   c                    s6   t ƒ \}}t| |ƒ}t||ƒ‰ |t|‡ fdd„d�fS )zeFor checking if the dependency graph would be consistent after     installing given requirements
    c                    s   | ˆ kS ©Nr   r!   ©Ú	whitelistr   r   Ú<lambda>|   ó    z)check_install_conflicts.<locals>.<lambda>)r"   )r    Ú_simulate_installation_ofÚ_create_whitelistr4   )Ú
to_installr   Ú_Úwould_be_installedr   r6   r   Úcheck_install_conflictsl   s    


 
ÿþr?   c                 C   sL   t ƒ }| D ]<}t|ƒ}| ¡ }t|jƒ}t|j| ¡ ƒ||< | |¡ q
|S )zBComputes the version of packages after installing to_install.
    )	r%   r   Úget_pkg_resources_distributionr   r$   r   r   r   r(   )r<   r   Ú	installedÚinst_reqÚabstract_distr   r   r   r   r   r:   �   s    
r:   c                 C   sL   t | ƒ}|D ]:}||krq|| jD ] }t|jƒ|kr$| |¡  qq$q|S r5   )r%   r   r   r   r(   )r>   r   Úpackages_affectedr/   r2   r   r   r   r;   –   s    
r;   )N)(Ú__doc__ÚloggingÚcollectionsr   Úpip._vendor.packaging.utilsr   Zpip._vendor.pkg_resourcesr   Úpip._internal.distributionsr   Úpip._internal.utils.miscr   Úpip._internal.utils.typingr   Ú	getLoggerÚ__name__r   Úpip._internal.req.req_installr   Útypingr	   r
   r   r   r   r   r   r,   Z
PackageSetZMissingZConflictingZMissingDictZConflictingDictZCheckResultr   r    r4   r?   r:   r;   r   r   r   r   Ú<module>   s.   
$
/