a
    3xd                     @   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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d< ee ed< dS )PackageDetailsversiondependenciesN)__name__
__module____qualname__r   __annotations__r   r	    r   r   V/var/www/html/Ranjet/env/lib/python3.9/site-packages/pip/_internal/operations/check.pyr      s   
r   )returnc                  C   s   i } d}t  }|jdddD ]f}|j}z t| }t|j|| |< W q ttfy } zt	
d|| d}W Y d}~qd}~0 0 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listiter_dependenciesr   r   OSError
ValueErrorloggerwarning)package_setproblemsenvdistnamer   er   r   r   !create_package_set_from_installed"   s    r)   )r#   should_ignorer   c                 C   s   i }i }|   D ]\}}t }t }|r2||r2q|jD ]r}t|j}	|	| vrd}
|jdurl|jddi}
|
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extra )prereleases)key)itemssetr   r   r'   markerevaluateaddr   	specifiercontainssortedstr)r#   r*   missingconflictingpackage_nameZpackage_detailmissing_depsconflicting_depsreqr'   missedr   r   r   r   check_package_set3   s0    	



r?   )
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   |  vS Nr   )r'   	whitelistr   r   <lambda>o       z)check_install_conflicts.<locals>.<lambda>)r*   )r)   _simulate_installation_of_create_whitelistr?   )r@   r#   _would_be_installedr   rB   r   check_install_conflicts`   s    


rJ   )r@   r#   r   c                 C   sL   t  }| D ]<}t|}| }|j}t|jt| ||< || q
|S )z=Computes the version of packages after installing to_install.)	r0   r   Zget_metadata_distributionr   r   r   r   r   r3   )r@   r#   	installedinst_reqabstract_distr&   r'   r   r   r   rF   t   s    rF   )rI   r#   r   c                 C   sL   t | }|D ]:}||v rq|| jD ] }t|j|v r$||  qq$q|S rA   )r0   r   r   r'   r3   )rI   r#   packages_affectedr:   r=   r   r   r   rG      s    
rG   )N))__doc__loggingtypingr   r   r   r   r   r   r   Z"pip._vendor.packaging.requirementsr	   Zpip._vendor.packaging.utilsr
   r   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)   r7   r?   rJ   rF   rG   r   r   r   r   <module>   s<   $
 -