3
ûâdeõ  ã               @   sx  d Z ddlZddlmZmZmZmZmZmZm	Z	 ddl
mZ ddlmZ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G d
d„ deƒZeee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	ee"f dœdd„Z#deeee$ge"f  e dœdd„Z%ee e!dœdd„Z&ee eee dœdd„Z'ee eee dœdd„Z(dS )z'Validation of dependencies of packages
é    N)ÚCallableÚDictÚListÚ
NamedTupleÚOptionalÚSetÚTuple)ÚRequirement)ÚNormalizedNameÚcanonicalize_name)Ú)make_distribution_for_install_requirement)Úget_default_environment)ÚDistributionVersion)ÚInstallRequirementc               @   s   e Zd ZU eee dS )ÚPackageDetailsN)Ú__name__Ú
__module__Ú__qualname__r   Úversionr   r	   Údependencies© r   r   ú=/tmp/pip-build-red6nood/pip/pip/_internal/operations/check.pyr      s   
r   )Úreturnc              C   sŽ   i } d}t ƒ }xv|jdf d�D ]d}|j}y t|jƒ ƒ}t|j|ƒ| |< W q ttfk
r€ } zt	j
d||ƒ d}W Y dd}~X qX qW | |fS )z3Converts a list of distributions into a PackageSet.F)Ú
local_onlyÚskipz%Error parsing requirements for %s: %sTN)r   Ziter_installed_distributionsÚcanonical_nameÚlistÚiter_dependenciesr   r   ÚOSErrorÚ
ValueErrorÚloggerÚwarning)Úpackage_setZproblemsÚenvÚdistÚnamer   Úer   r   r   Ú!create_package_set_from_installed"   s    r'   )r"   Úshould_ignorer   c             C   sà   i }i }xÎ| j ƒ D ]Â\}}tƒ }tƒ }|r4||ƒr4qxv|jD ]l}t|jƒ}	|	| kr~d}
|jdk	rj|jjƒ }
|
r<|j|	|fƒ q<| |	 j}|j	j
|dd�s<|j|	||fƒ q<W |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.
    TN)Úprereleases)Úkey)ÚitemsÚsetr   r   r%   ÚmarkerÚevaluateÚaddr   Ú	specifierÚcontainsÚsortedÚstr)r"   r(   ÚmissingZconflictingÚpackage_nameZpackage_detailZmissing_depsZconflicting_depsÚreqr%   Zmissedr   r   r   r   Úcheck_package_set3   s0    	



r7   )Ú
to_installr   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>o   s    z)check_install_conflicts.<locals>.<lambda>)r(   )r'   Ú_simulate_installation_ofÚ_create_whitelistr7   )r8   r"   Ú_Úwould_be_installedr   )r9   r   Úcheck_install_conflicts`   s    


r?   )r8   r"   r   c             C   sP   t ƒ }xD| D ]<}t|ƒ}|jƒ }|j}t|jt|jƒ ƒƒ||< |j|ƒ qW |S )z=Computes the version of packages after installing to_install.)	r,   r   Zget_metadata_distributionr   r   r   r   r   r/   )r8   r"   Ú	installedZinst_reqÚabstract_distr$   r%   r   r   r   r;   t   s    
r;   )r>   r"   r   c             C   sR   t | ƒ}xD|D ]<}||krqx,|| jD ]}t|jƒ|kr(|j|ƒ P q(W qW |S )N)r,   r   r   r%   r/   )r>   r"   Zpackages_affectedr5   r6   r   r   r   r<   ‡   s    


r<   )N))Ú__doc__ÚloggingÚtypingr   r   r   r   r   r   r   Ú"pip._vendor.packaging.requirementsr	   Úpip._vendor.packaging.utilsr
   r   Zpip._internal.distributionsr   Zpip._internal.metadatar   Zpip._internal.metadata.baser   Zpip._internal.req.req_installr   Ú	getLoggerr   r    r   Z
PackageSetZMissingZConflictingZMissingDictZConflictingDictZCheckResultZConflictDetailsÚboolr'   r3   r7   r?   r;   r<   r   r   r   r   Ú<module>   s2   $
+