B
    UvgI                 @   s  d 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
rddlmZ ddlmZ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
    )
namedtuple)canonicalize_name)make_abstract_dist)get_installed_distributions)MYPY_CHECK_RUNNING)InstallRequirement)AnyCallableDictIteratorOptionalSetTupleListPackageDetailsversionrequiresc              K   sL   | i krddd} i }x0t f | D ]"}t|j}t|j| ||< q"W |S )z8Converts a list of distributions into a PackageSet.
    F )
local_onlyskip)r   r   project_namer   r   r   )kwargspackage_setdistnamer   r   ?/tmp/pip-install-r_9ig3yj/pip/pip/_internal/operations/check.py!create_package_set_from_installed   s    

r   Nc             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_ignore5   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_set-   s4    




r0   c                s2   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>l       z)check_install_conflicts.<locals>.<lambda>)r   )r   _simulate_installation_of_create_whitelistr0   )
to_installr   would_be_installedr   )r1   r   check_install_conflicts\   s    

r8   c             C   sP   t  }xD| D ]<}t|jdd}t|j}t|j| ||< || qW |S )zBComputes the version of packages after installing to_install.
    N)finder)	r!   r   r   r   r   r   r   r   r$   )r6   r   	installedinst_reqr   r   r   r   r   r4   t   s    

r4   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$   )r7   r   packages_affectedr+   r.   r   r   r   r5      s    


r5   )N)#__doc__collectionsr   pip._vendor.packaging.utilsr    pip._internal.operations.preparer   pip._internal.utils.miscr   pip._internal.utils.typingr   Zpip._internal.req.req_installr   typingr   r	   r
   r   r   r   r   r   r(   Z
PackageSetZMissingZConflictingZMissingDictZConflictingDictZCheckResultr   r   r0   r8   r4   r5   r   r   r   r   <module>   s(   (
/