
(h`                 @   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 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 f  i }  i  } d } x t  |    D]| } t | j  } y  t | j | j    | | <Wq7 t t f 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   OSErrorr   loggerwarning)kwargspackage_setZproblemsdistnamee r   =/tmp/pip-build-kmztzv_d/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_set7   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>s   s    z)check_install_conflicts.<locals>.<lambda>)r    _simulate_installation_of_create_whitelistr/   )
to_installr   _would_be_installedr   )r0   r   check_install_conflictsc   s    r7   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&   )r4   r   	installedZinst_reqabstract_distr   r   r   r   r   r2   x   s    	r2   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&   )r6   r   Zpackages_affectedr-   r.   r   r   r   r3      s    	r3   ))__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typingr   r	   r
   r   r   r   r   Zpip._internal.req.req_installr   r*   Z
PackageSetZMissingZConflictingZMissingDictZConflictingDictZCheckResultZConflictDetailsr   r    r/   r7   r2   r3   r   r   r   r   <module>   s0   4,