B
    Kkd                 @   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rd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_abstract_dist)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}xjt f | D ]\}t|j}yt|j| ||< W q& tk
r } ztd|| d}W dd}~X Y q&X q&W ||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   loggingwarning)kwargspackage_setproblemsdistnameer   r   ?/tmp/pip-install-gxxfd9b7/pip/pip/_internal/operations/check.py!create_package_set_from_installed"   s    

r    c             C   s   |dkrdd }t  }t  }x| D ]}t }t }||r<q"xz| | jD ]l}t|j}|| krd}	|jdk	rv|j }	|	rH|||f qH| | j}
|j	j
|
ddsH|||
|f qHW |rt|td||< |r"t|td||< q"W ||fS )zCheck 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_ignore?   s    z(check_package_set.<locals>.should_ignoreT)prereleases)key)dict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_set7   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>v       z)check_install_conflicts.<locals>.<lambda>)r!   )r    _simulate_installation_of_create_whitelistr4   )
to_installr   _would_be_installedr   )r5   r   check_install_conflictsf   s    


r=   c             C   sL   t  }x@| D ]8}t| }t|j}t|j| ||< || qW |S )zBComputes the version of packages after installing to_install.
    )	r%   r   r   r   r#   r   r   r   r(   )r:   r   	installedinst_reqr   r   r   r   r   r8   {   s    

r8   c             C   sR   t | }xD|D ]<}||krqx,|| jD ]}t|j|kr(|| P q(W qW |S )N)r%   r   r   r   r(   )r<   r   packages_affectedr/   r2   r   r   r   r9      s    


r9   )N)(__doc__r   collectionsr   pip._vendor.packaging.utilsr   Zpip._vendor.pkg_resourcesr    pip._internal.operations.preparer   pip._internal.utils.miscr   pip._internal.utils.typingr   	getLogger__name__loggerZpip._internal.req.req_installr   typingr	   r
   r   r   r   r   r   r,   Z
PackageSetZMissingZConflictingZMissingDictZConflictingDictZCheckResultr   r    r4   r=   r8   r9   r   r   r   r   <module>   s.   
$
/