o
    i                     @  s  d Z ddlmZ ddl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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/d0ddZ0	d1d2ddZ1d3d!d"Z2d4d(d)Z3d5d+d,Z4d6d.d/Z5dS )7z&Validation of dependencies of packages    )annotationsN)	GeneratorIterable)suppress)Parser)reduce)Callable
NamedTuple)Requirement)Tag	parse_tag)NormalizedNamecanonicalize_name)Version))make_distribution_for_install_requirement)get_default_environment)BaseDistribution)InstallRequirementc                   @  s   e Zd ZU ded< ded< dS )PackageDetailsr   versionzlist[Requirement]dependenciesN)__name__
__module____qualname____annotations__ r   r   >lib/python3.10/site-packages/pip/_internal/operations/check.pyr      s   
 r   returntuple[PackageSet, bool]c                  C  s   i } d}t  }|jdddD ]2}|j}zt| }t|j|| |< W q ttfy@ } zt	
d|| d}W Y d}~qd}~ww | |fS )z3Converts a list of distributions into a PackageSet.Fr   )Z
local_onlyskipz$Error parsing dependencies of %s: %sTN)r   Ziter_installed_distributionscanonical_namelistiter_dependenciesr   r   OSError
ValueErrorloggerZwarning)package_setZproblemsenvdistnamer   er   r   r   !create_package_set_from_installed,   s   r+   r&   
PackageSetshould_ignoreCallable[[str], bool] | NoneCheckResultc                 C  s   i }i }|   D ]b\}}t }t }|r||rq|jD ]9}t|j}	|	| vr@d}
|jdur6|jddi}
|
r?||	|f q| |	 j}|j	j
|ddsU||	||f q|r`t|td||< |rjt|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.
    TNZextra )Zprereleases)key)itemssetr   r   r)   ZmarkerZevaluateaddr   Z	specifiercontainssortedstr)r&   r-   missingZconflictingpackage_nameZpackage_detailZmissing_depsZconflicting_depsreqr)   Zmissedr   r   r   r   check_package_set=   s4   	



r;   
to_installlist[InstallRequirement]ConflictDetailsc                   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   |  vS Nr   )r)   Z	whitelistr   r   <lambda>y   s    z)check_install_conflicts.<locals>.<lambda>)r-   )r+   _simulate_installation_of_create_whitelistr;   )r<   r&   _would_be_installedr   r@   r   check_install_conflictsj   s   


rF   packagesIterable[BaseDistribution]supported_tagsIterable[Tag]'Generator[BaseDistribution, None, None]c              
   c  sx    | D ]6}t t( |d}ttjttt 	|
dg t }||r*|V  W d    n1 s4w   Y  qd S )NZWHEELr   )r   FileNotFoundError	read_textr   	frozensetunionmapr   r   ZparsestrZget_all
isdisjoint)rG   rI   pZ
wheel_fileZ
wheel_tagsr   r   r   check_unsupported~   s   


rS   set[NormalizedName]c                 C  sL   t  }| D ]}t|}| }|j}t|jt| ||< || q|S )z=Computes the version of packages after installing to_install.)	r3   r   Zget_metadata_distributionr    r   r   r!   r"   r4   )r<   r&   Z	installedZinst_reqZabstract_distr(   r)   r   r   r   rB      s   rB   rE   c                 C  sL   t | }|D ]}||v rq|| jD ]}t|j|v r"||  nqq|S r?   )r3   r   r   r)   r4   )rE   r&   Zpackages_affectedr9   r:   r   r   r   rC      s   
rC   )r   r   r?   )r&   r,   r-   r.   r   r/   )r<   r=   r   r>   )rG   rH   rI   rJ   r   rK   )r<   r=   r&   r,   r   rT   )rE   rT   r&   r,   r   rT   )6__doc__Z
__future__r   ZloggingZcollections.abcr   r   
contextlibr   Zemail.parserr   	functoolsr   typingr   r	   Z"pip._vendor.packaging.requirementsr
   Zpip._vendor.packaging.tagsr   r   Zpip._vendor.packaging.utilsr   r   Zpip._vendor.packaging.versionr   Zpip._internal.distributionsr   Zpip._internal.metadatar   Zpip._internal.metadata.baser   Zpip._internal.req.req_installr   Z	getLoggerr   r%   r   dictr,   tupleZMissingZConflictingr!   ZMissingDictZConflictingDictr/   r>   r+   r;   rF   rS   rB   rC   r   r   r   r   <module>   s@    


-

