U
    „~$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	m
Z
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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" ddl#m$Z$ e %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)e0f dœdd„Z1d#e)ee	e2ge0f  e.dœdd„Z3ee$ e/dœdd„Z4ee" ee ee"ddf dœdd„Z5ee$ e)ee dœdd„Z6ee e)ee d œd!d"„Z7dS )$z'Validation of dependencies of packages
é    N)Úsuppress)ÚParser)Úreduce)
ÚCallableÚDictÚ	FrozenSetÚ	GeneratorÚIterableÚListÚ
NamedTupleÚOptionalÚSetÚTuple)ÚRequirement)ÚTagÚ	parse_tag)ÚNormalizedNameÚcanonicalize_name)ÚVersion)Ú)make_distribution_for_install_requirement)Úget_default_environment)ÚBaseDistribution)ÚInstallRequirementc                   @   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-g27rp152/pip/_internal/operations/check.pyr   "   s   
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 dependencies of %s: %sTN)r   Ziter_installed_distributionsÚcanonical_nameÚlistÚiter_dependenciesr   r   ÚOSErrorÚ
ValueErrorÚloggerÚwarning)Úpackage_setÚproblemsÚenvÚdistÚnamer   Úer    r    r!   Ú!create_package_set_from_installed2   s    r2   )r,   Úshould_ignorer"   c                 C   sÞ   i }i }|   ¡ D ]Ä\}}tƒ }tƒ }|r2||ƒr2q|jD ]r}t|jƒ}	|	| kr€d}
|jdk	rl|j ddi¡}
|
r8| |	|f¡ q8| |	 j}|j	j
|dd�s8| |	||f¡ q8|rÀt|td�||< |rt|td�||< q||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ÚextraÚ )Úprereleases)Úkey)ÚitemsÚsetr   r   r0   ÚmarkerÚevaluateÚaddr   Ú	specifierÚcontainsÚsortedÚstr)r,   r3   ÚmissingÚconflictingÚpackage_nameZpackage_detailÚmissing_depsÚconflicting_depsÚreqr0   Úmissedr   r    r    r!   Úcheck_package_setC   s0    	



rH   )Ú
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    )r0   ©Ú	whitelistr    r!   Ú<lambda>   ó    z)check_install_conflicts.<locals>.<lambda>)r3   )r2   Ú_simulate_installation_ofÚ_create_whitelistrH   )rI   r,   Ú_Úwould_be_installedr    rK   r!   Úcheck_install_conflictsp   s    


 
ÿþrS   )ÚpackagesÚsupported_tagsr"   c              
   c   sb   | D ]X}t tƒ�F | d¡}ttjtttƒ  	|¡ 
dg ¡ƒtƒ ƒ}| |¡rR|V  W 5 Q R X qd S )NZWHEELr   )r   ÚFileNotFoundErrorÚ	read_textr   Ú	frozensetÚunionÚmapr   r   ÚparsestrÚget_allÚ
isdisjoint)rT   rU   ÚpÚ
wheel_fileZ
wheel_tagsr    r    r!   Úcheck_unsupported„   s    

ý
r`   )rI   r,   r"   c                 C   sL   t ƒ }| D ]<}t|ƒ}| ¡ }|j}t|jt| ¡ ƒƒ||< | |¡ q
|S )z=Computes the version of packages after installing to_install.)	r9   r   Zget_metadata_distributionr%   r   r   r&   r'   r<   )rI   r,   Ú	installedÚinst_reqÚabstract_distr/   r0   r    r    r!   rO   ”   s    rO   )rR   r,   r"   c                 C   sL   t | ƒ}|D ]:}||krq|| jD ] }t|jƒ|kr$| |¡  qq$q|S rJ   )r9   r   r   r0   r<   )rR   r,   Úpackages_affectedrC   rF   r    r    r!   rP   §   s    
rP   )N)8Ú__doc__ÚloggingÚ
contextlibr   Úemail.parserr   Ú	functoolsr   Útypingr   r   r   r   r	   r
   r   r   r   r   Ú"pip._vendor.packaging.requirementsr   Úpip._vendor.packaging.tagsr   r   Úpip._vendor.packaging.utilsr   r   Zpip._vendor.packaging.versionr   Úpip._internal.distributionsr   Zpip._internal.metadatar   Zpip._internal.metadata.baser   Úpip._internal.req.req_installr   Ú	getLoggerr   r*   r   Z
PackageSetZMissingZConflictingZMissingDictZConflictingDictZCheckResultZConflictDetailsÚboolr2   r@   rH   rS   r`   rO   rP   r    r    r    r!   Ú<module>   sT   0
 ÿ þ-ý þ þ