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
rÊd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rŠd}	|jdk	rv|j ¡ }	|	rH| ||f¡ qH| | j}
|j	j
|
dd�sH| ||
|f¡ qHW |rÌt|td�||< |r"t|td�||< q"W ||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_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(   (
/