a
    ``                     @   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mZmZmZmZmZmZ dd
l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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)AnyCallableDictListOptionalSetTuple)InstallRequirementPackageDetailsversionrequiresc                  K   s   | i krddd} i }d}t f i | D ]b}t|j}zt|j| ||< W q( ttfy } zt	d|| d}W Y d}~q(d}~0 0 q(||fS )z8Converts a list of distributions into a PackageSet.
    F )Z
local_onlyskipz%Error parsing requirements for %s: %sTN)
r   r   project_namer   r   r   OSErrorr   loggerZwarning)kwargspackage_setZproblemsdistnameer   r   @/usr/lib/python3/dist-packages/pip/_internal/operations/check.py!create_package_set_from_installed"   s    

r   c                 C   s   i }i }| D ]}t  }t  }|r*||r*q| | jD ]l}t|j}|| vrvd}	|jdurb|j }	|	r4|||f q4| | j}
|jj	|
dds4|||
|f q4|rt
|td||< |rt
|td||< q||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.
    TN)Zprereleases)key)setr   r   r   ZmarkerZevaluateaddr   Z	specifiercontainssortedstr)r   should_ignoreZmissingZconflictingpackage_nameZmissing_depsZconflicting_depsreqr   Zmissedr   r   r   r   check_package_set7   s0    



r(   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   |  vS Nr   )r   Z	whitelistr   r   <lambda>s       z)check_install_conflicts.<locals>.<lambda>)r%   )r   _simulate_installation_of_create_whitelistr(   )
to_installr   _would_be_installedr   r*   r   check_install_conflictsc   s    


r2   c                 C   sX   t  }| D ]H}t|}| }|dus*J t|j}t|j| ||< || q
|S )zBComputes the version of packages after installing to_install.
    N)	r    r   Zget_pkg_resources_distributionr   r   r   r   r   r!   )r/   r   Z	installedZinst_reqZabstract_distr   r   r   r   r   r-   x   s    
r-   c                 C   sL   t | }|D ]:}||v rq|| jD ] }t|j|v r$||  qq$q|S r)   )r    r   r   r   r!   )r1   r   Zpackages_affectedr&   r'   r   r   r   r.      s    
r.   )N))__doc__Zloggingcollectionsr   Zpip._vendor.packaging.utilsr   Zpip._vendor.pkg_resourcesr   Zpip._internal.distributionsr   Zpip._internal.utils.miscr   Zpip._internal.utils.typingr   Z	getLogger__name__r   typingr   r	   r
   r   r   r   r   Zpip._internal.req.req_installr   r$   Z
PackageSetZMissingZConflictingZMissingDictZConflictingDictZCheckResultZConflictDetailsr   r   r(   r2   r-   r.   r   r   r   r   <module>   s0   
$
,