
0c@__                 @   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 j e  Z e rF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 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 f  i }  i  } d } x t  |    D]v } t | j  } y  t | j | j    | | <Wq7 t k
 r } z t j d | |  d } WYd d } ~ Xq7 Xq7 W| | f S)z8Converts a list of distributions into a PackageSet.
    
local_onlyFskipz%Error parsing requirements for %s: %sTN)	r   r   project_namer   r   r   r   loggerwarning)kwargspackage_setZproblemsdistnamee r   =/tmp/pip-build-jynh7p1z/pip/pip/_internal/operations/check.py!create_package_set_from_installed%   s     r   c             C   s4  i  } i  } x|  D]} t    } t    } | r@ | |  r@ q x |  | j D] } t | j  } | |  k r d }	 | j d k	 r | j j   }	 |	 rN | j | | f  qN |  | j }
 | j j	 |
 d d sN | j | |
 | f  qN W| r
t
 | d t | | <| r t
 | d t | | <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.
    TNprereleaseskey)setr   r   r   markerevaluateaddr   	specifiercontainssortedstr)r   should_ignoremissingZconflictingpackage_nameZmissing_depsZconflicting_depsreqr   Zmissedr   r   r   r   check_package_set:   s0    		r.   c                sO   t    \ } } t |  |  } t | |    | t | d   f d d   f S)zeFor checking if the dependency graph would be consistent after     installing given requirements
    r*   c                s
   |    k S)Nr   )r   )	whitelistr   r   <lambda>v   s    z)check_install_conflicts.<locals>.<lambda>)r   _simulate_installation_of_create_whitelistr.   )
to_installr   _would_be_installedr   )r/   r   check_install_conflictsf   s    r6   c             C   s   t    } xp |  D]h } t |  } | j   } | d k	 s@ t  t | j  } t | j | j    | | <| j	 |  q W| S)zBComputes the version of packages after installing to_install.
    N)
r"   r   Zget_pkg_resources_distributionAssertionErrorr   r!   r   r   r   r%   )r3   r   	installedZinst_reqabstract_distr   r   r   r   r   r1   {   s    	r1   c             C   sk   t  |   } xX | D]P } | | k r( q x8 | | j D]) } t | j  | k r6 | j |  Pq6 Wq W| S)N)r"   r   r   r   r%   )r5   r   Zpackages_affectedr,   r-   r   r   r   r2      s    	r2   ))__doc__loggingcollectionsr   pip._vendor.packaging.utilsr   Zpip._vendor.pkg_resourcesr   Zpip._internal.distributionsr   Zpip._internal.utils.miscr   Zpip._internal.utils.typingr   	getLogger__name__r   Zpip._internal.req.req_installr   Ztypingr	   r
   r   r   r   r   r   r)   Z
PackageSetZMissingZConflictingZMissingDictZConflictingDictZCheckResultZConflictDetailsr   r   r.   r6   r1   r2   r   r   r   r   <module>   s0   4,