U
    
Ha                     @   s@  d Z ddlZddlmZmZmZmZmZmZm	Z	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 dd	lmZ erdd
lmZ eeZG dd deZedef Ze
def Ze
deef Zedee f Zedee f Z e
ee f Z!e
ee!f Z"e
ee#f d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)TYPE_CHECKINGCallableDictList
NamedTupleOptionalSetTuple)Requirement)canonicalize_name))make_distribution_for_install_requirement)get_default_environment)DistributionVersion)InstallRequirement)NormalizedNamec                   @   s"   e Zd ZU eed< ee ed< dS )PackageDetailsversiondependenciesN)__name__
__module____qualname__r   __annotations__r   r
    r   r   B/tmp/pip-unpacked-wheel-tx790h60/pip/_internal/operations/check.pyr      s   
r   r   )returnc                  C   s   i } d}t  }|jdddD ]d}|j}z t| }t|j|| |< W q ttfk
r~ } zt	
d|| d}W 5 d}~X Y qX q| |fS )z3Converts a list of distributions into a PackageSet.Fr   )
local_onlyskipz%Error parsing requirements for %s: %sTN)r   Ziter_installed_distributionscanonical_namelistZiter_dependenciesr   r   OSError
ValueErrorloggerwarning)package_setproblemsenvdistnamer   er   r   r   !create_package_set_from_installed%   s    r)   c                 C   s   i }i }|   D ]\}}t }t }|r2||r2q|jD ]l}t|j}	|	| krzd}
|jdk	rf|j }
|
r8||	|f q8| |	 j}|j	j
|dds8||	||f q8|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)prereleases)key)itemssetr   r   r'   markerevaluateaddr   	specifiercontainssortedstr)r#   should_ignoremissingconflictingpackage_nameZpackage_detailmissing_depsconflicting_depsreqr'   missedr   r   r   r   check_package_set6   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   |  kS Nr   )r'   	whitelistr   r   <lambda>r       z)check_install_conflicts.<locals>.<lambda>)r5   )r)   _simulate_installation_of_create_whitelistr=   )
to_installr#   _would_be_installedr   r?   r   check_install_conflictsb   s    


 
rH   c                 C   sX   t  }| D ]H}t|}| }|dk	s*tt|j}t|j| ||< |	| q
|S )zBComputes the version of packages after installing to_install.
    N)
r-   r   get_pkg_resources_distributionAssertionErrorr   project_namer   parsed_versionrequiresr0   )rE   r#   	installedinst_reqabstract_distr&   r'   r   r   r   rC   w   s    
rC   c                 C   sL   t | }|D ]:}||krq|| jD ] }t|j|kr$||  qq$q|S r>   )r-   r   r   r'   r0   )rG   r#   packages_affectedr8   r;   r   r   r   rD      s    
rD   )N))__doc__loggingtypingr   r   r   r   r   r   r   r	   "pip._vendor.packaging.requirementsr
   pip._vendor.packaging.utilsr   pip._internal.distributionsr   Zpip._internal.metadatar   Zpip._internal.metadata.baser   pip._internal.req.req_installr   r   	getLoggerr   r!   r   Z
PackageSetZMissingZConflictingZMissingDictZConflictingDictZCheckResultZConflictDetailsboolr)   r=   rH   rC   rD   r   r   r   r   <module>   s0   (

,