U
    e                     @   s  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 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 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.e!dddd Z/dS )"z'Validation of dependencies of packages
    N)CallableDictList
NamedTupleOptionalSetTuple)Requirement)LegacySpecifier)NormalizedNamecanonicalize_name)LegacyVersion))make_distribution_for_install_requirement)get_default_environment)DistributionVersion)InstallRequirement)
deprecatedc                   @   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-cc4ltlvd/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 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   t |  i }i }|  D ]\}}t }t }|r:||r:q|jD ]r}t|j}	|	| krd}
|jdk	rt|jddi}
|
r@||	|f q@| |	 j	}|j
j|dds@||	||f q@|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)#warn_legacy_versions_and_specifiers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_set6   s2    	



rC   )
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>t       z)check_install_conflicts.<locals>.<lambda>)r-   )r,   _simulate_installation_of_create_whitelistrC   )rD   r&   _would_be_installedr   rF   r   check_install_conflictse   s    


 
rN   )rD   r&   r   c                 C   sL   t  }| D ]<}t|}| }|j}t|jt| ||< || q
|S )z=Computes the version of packages after installing to_install.)	r4   r   Zget_metadata_distributionr   r   r   r    r!   r7   )rD   r&   	installedinst_reqabstract_distr)   r*   r   r   r   rJ   y   s    rJ   )rM   r&   r   c                 C   sL   t | }|D ]:}||krq|| jD ] }t|j|kr$||  qq$q|S rE   )r4   r   r   r*   r7   )rM   r&   packages_affectedr>   rA   r   r   r   rK      s    
rK   )r&   r   c              	   C   s   |   D ]\}}t|jtrBt| d|j dd| dddd |jD ]D}tdd	 |jD rHt| d|j d
| dd| dddd qHqd S )N z# has a non-standard version number.z!to upgrade to a newer version of z^ or contact the author to suggest that they release a version with a conforming version numberi/  z24.1)reasonreplacementissuegone_inc                 s   s   | ]}t |tV  qd S rE   )
isinstancer
   ).0specr   r   r   	<genexpr>   s     z6warn_legacy_versions_and_specifiers.<locals>.<genexpr>z) has a non-standard dependency specifier .ze or contact the author to suggest that they release a version with a conforming dependency specifiers)r3   rX   r   r   r   r   anyr8   )r&   project_nameZpackage_detailsdepr   r   r   r2      s     


r2   )N)0__doc__loggingtypingr   r   r   r   r   r   r   "pip._vendor.packaging.requirementsr	   Z pip._vendor.packaging.specifiersr
   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   pip._internal.utils.deprecationr   	getLoggerr   r$   r   Z
PackageSetZMissingZConflictingZMissingDictZConflictingDictZCheckResultZConflictDetailsboolr,   r;   rC   rN   rJ   rK   r2   r   r   r   r   <module>   sJ   $
  /  