o
    8jLD                     @  s  d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZ ddlmZ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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) ddl*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@mAZA ddlBmCZCmDZDmEZE eFeGZHd5d"d#ZIeEjJeEjKeEjLgZMed$d%d&ZNd6d)d*ZOd7d2d3ZPG d4d% d%eZQdS )8zContains the RequirementCommand base class.

This class is in a separate module so the commands that do not always
need PackageFinder capability don't unnecessarily import the
PackageFinder machinery and all its vendored dependencies, etc.
    )annotationsN)partial)Values)AnyCallableTypeVar)BuildEnvironmentInstaller"InprocessBuildEnvironmentInstaller#SubprocessBuildEnvironmentInstaller)
WheelCache)
cmdoptions)make_target_python)IndexGroupCommand)SessionCommandMixin)CommandErrorPreviousBuildDirErrorUnsupportedPythonVersion)LinkCollector)PackageFinder)SelectionPreferences)TargetPython)
PipSession)BuildTracker)RequirementPreparer)install_req_from_editableinstall_req_from_line#install_req_from_parsed_requirementinstall_req_from_pylock_packageinstall_req_from_req_string)PEP723Exceptionpep723_metadata)parse_dependency_groups)parse_requirements)InstallRequirement)BaseResolver)check_requires_python)is_valid_pylock_filenameselect_from_pylock_path_or_url)TempDirectoryTempDirectoryTypeRegistrytempdir_kindsoptionsr   returnboolc                 C  s   t jddkS )z
    Check if regular constraints should be ignored because
    we are in a isolated build process and build constraints
    feature is enabled but no build constraints were passed.
     _PIP_IN_BUILD_IGNORE_CONSTRAINTS1)osenvirongetr+    r4   x/opt/pipey-apps/247c6e86-d9cc-49a2-98d3-9f311455f2db/.venv/lib/python3.10/site-packages/pip/_internal/cli/req_command.py!should_ignore_regular_constraints@   s   r6   	_CommandTRequirementCommand)boundfunc-Callable[[_CommandT, Values, list[str]], int]c                   s   ddd d fdd}|S )zNDecorator for common logic related to managing temporary
    directories.
    registryr)   r,   Nonec                 S  s   t D ]}| |d qd S NF)KEEPABLE_TEMPDIR_TYPES
set_delete)r<   tr4   r4   r5   configure_tempdir_registry[   s   z0with_cleanup.<locals>.configure_tempdir_registryselfr7   r+   r   args	list[str]intc                   sH   | j d usJ |jr | j  z| ||W S  ty#    | j   w N)tempdir_registryno_cleanr   )rC   r+   rD   rB   r:   r4   r5   wrapper_   s   

zwith_cleanup.<locals>.wrapperN)r<   r)   r,   r=   )rC   r7   r+   r   rD   rE   r,   rF   r4   )r:   rK   r4   rJ   r5   with_cleanupT   s   
rL   constraint_filesrE   finderr   sessionr   list[InstallRequirement]c                 C  sD   g }| D ]}t |d|||dD ]}t||jdd}|| qq|S )NT)
constraintrN   r+   rO   Fisolateduser_supplied)r"   r   isolated_modeappend)rM   rN   r+   rO   requirementsfilename
parsed_req
req_to_addr4   r4   r5   parse_constraint_filesp   s"   
r[   c                      s   e Zd Zd9 fddZed:ddZe		d;d<ddZe		 	!	 	 	"	d=d>d-d.Zd?d1d2Z	ed@d3d4Z
		 dAdBd7d8Z  ZS )Cr8   rD   r   kwr,   r=   c                   s6   t  j|i | | jt  | jt  d S rG   )super__init__cmd_opts
add_optionr   dependency_groupsrI   )rC   rD   r\   	__class__r4   r5   r^      s   zRequirementCommand.__init__r+   r   strc                 C  s   d| j v rdS dS )zEDetermines which resolver should be used, based on the given options.zlegacy-resolverlegacy
resolvelib)deprecated_features_enabledr3   r4   r4   r5   determine_resolver_variant   s   
z-RequirementCommand.determine_resolver_variantNr   temp_build_dirr(   build_trackerr   rO   r   rN   r   use_user_siter-   download_dir
str | None	verbosityrF   r   c	                 C  s   |j }	|	dus	J d}
| |}|dkr!d|jv }|r td nd}
d}d|jv r/td t|dg }d	|jv }d
|jv rSt||||}t||||t|j	d}nt
|||d}t|	|j||j||j|||j||j||||
dS )zQ
        Create a RequirementPreparer instance for the given parameters.
        NFrf   z	fast-depszpip is using lazily downloaded wheels using HTTP range requests to obtain dependency information. This experimental feature is enabled through --use-feature=fast-deps and it is not ready for production.Tz;fast-deps has no effect when used with the legacy resolver.build_constraintszbuild-constraintzinprocess-build-deps)rN   rj   ro   rn   wheel_cache)ro    build_constraint_feature_enabled)	build_dirsrc_dirrl   build_isolationbuild_isolation_installercheck_build_depsrj   rO   progress_barrN   require_hashesrk   
lazy_wheelrn   legacy_resolver)pathrh   features_enabledloggerwarninggetattrr[   r	   r   	cache_dirr
   r   rs   rt   rv   rw   rx   )clsri   r+   rj   rO   rN   rk   rl   rn   temp_build_dir_pathrz   resolver_variantry   ro   rq   build_constraint_reqsenv_installerr4   r4   r5   make_requirement_preparer   sj   



z,RequirementCommand.make_requirement_preparerFTto-satisfy-onlypreparerrp   WheelCache | Noneignore_installedignore_requires_pythonforce_reinstallupgrade_strategypy_version_infotuple[int, ...] | Noner$   c                 C  s   t t|jd}| |}|dkr)ddl}|jjjjj	||||||j
||||	|
dS ddl}|jjjjj	||||||j
||||	|
dS )zF
        Create a Resolver instance for the given parameters.
        )rS   rf   r   N)r   rN   rp   make_install_reqrk   ignore_dependenciesr   r   r   r   r   )r   r   rU   rh   ,pip._internal.resolution.resolvelib.resolver	_internal
resolutionrf   resolverResolverr   (pip._internal.resolution.legacy.resolverre   )r   r   rN   r+   rp   rk   r   r   r   r   r   r   r   pipr4   r4   r5   make_resolver   sD   
z RequirementCommand.make_resolverrE   rP   c                 C  s  g }t |st|j|||}|| |D ]}| sqt|d|jdt|ddd}|| q|j	rHt
|j	D ]}t||jdd}|| q8|jD ]}t|d|jt|ddd}|| qK|jD ]F}	t|	rtd t|	|dD ]\}
}|t|
||	|jdd	 qtqct|	|||d
D ]}t||jd|jr|jdndd}|| qqc|jrt|jdkrtd|jd }zt|}W n ty } zt|jd}~ww |dd}|r|jst |}t!||j"dst#d|d|j$ d||dg D ]}t||jdd}|| q t%dd |D rd|_&|sV|jsV|jsV|j	sV|jsVd| j'i}|j(rLtdj)di t*|d+|j(dtdj)di ||S )zS
        Parse command-line arguments into the corresponding requirements.
        NTconfig_settings)
comes_fromrS   rT   r   rR   )rT   rS   r   zUsing pylock.toml as a requirements source is an experimental feature. It may be removed/changed in a future release without prior warning.)rO   )rT   )rN   r+   rO   )rS   rT   r      z1--requirements-from-script can only be given oncer   zrequires-python )requires_pythonversion_infozScript z requires a different Python: z not in dependenciesc                 s  s    | ]}|j V  qd S rG   )has_hash_options).0reqr4   r4   r5   	<genexpr>  s    z6RequirementCommand.get_requirements.<locals>.<genexpr>namezXYou must give at least one requirement to {name} (maybe you meant "pip {name} {links}"?) )linkszHYou must give at least one requirement to {name} (see "pip help {name}")r4   ),r6   r[   constraintsextendstripr   rU   r   rV   ra   r!   r   	editablesr   rW   r&   r}   r~   r'   r   format_controlr"   r   r+   r2   requirements_from_scriptslenr   r    r   msgr   r   r%   r   r   
py_versionanyrx   r   
find_linksformatdictjoin)rC   rD   r+   rN   rO   rW   r   r   rZ   rX   packagepackage_distrY   scriptscript_metadataexcscript_requires_pythontarget_pythonoptsr4   r4   r5   get_requirements"  s   






	





z#RequirementCommand.get_requirementsc                 C  s$   | j }| }|rt| dS dS )zE
        Trace basic information about the provided objects.
        N)search_scopeget_formatted_locationsr}   info)rN   r   	locationsr4   r4   r5   trace_basic_info  s
   z#RequirementCommand.trace_basic_infor   TargetPython | Nonec                 C  s:   t j||d}td|j|j|j|d}tj||||jdS )z
        Create a package finder appropriate to this requirement command.

        :param ignore_requires_python: Whether to ignore incompatible
            "Requires-Python" values in links. Defaults to False.
        r3   T)allow_yankedr   release_controlprefer_binaryr   )link_collectorselection_prefsr   uploaded_prior_to)r   creater   r   r   r   r   r   )rC   r+   rO   r   r   r   r   r4   r4   r5   _build_package_finder  s   z(RequirementCommand._build_package_finder)rD   r   r\   r   r,   r=   )r+   r   r,   rd   )Nr   )ri   r(   r+   r   rj   r   rO   r   rN   r   rk   r-   rl   rm   rn   rF   r,   r   )NFTFFr   N)r   r   rN   r   r+   r   rp   r   rk   r-   r   r-   r   r-   r   r-   r   rd   r   r   r,   r$   )
rD   rE   r+   r   rN   r   rO   r   r,   rP   )rN   r   r,   r=   r>   )
r+   r   rO   r   r   r   r   r-   r,   r   )__name__
__module____qualname__r^   staticmethodrh   classmethodr   r   r   r   r   __classcell__r4   r4   rb   r5   r8      s0    	P
8 )r+   r   r,   r-   )r:   r;   r,   r;   )
rM   rE   rN   r   r+   r   rO   r   r,   rP   )R__doc__
__future__r   loggingr0   	functoolsr   optparser   typingr   r   r   pip._internal.build_envr   r	   r
   pip._internal.cacher   pip._internal.clir   pip._internal.cli.cmdoptionsr   pip._internal.cli.index_commandr   r   pip._internal.exceptionsr   r   r   pip._internal.index.collectorr   "pip._internal.index.package_finderr   $pip._internal.models.selection_prefsr   "pip._internal.models.target_pythonr   pip._internal.network.sessionr   ,pip._internal.operations.build.build_trackerr    pip._internal.operations.preparer   pip._internal.req.constructorsr   r   r   r   r   pip._internal.req.pep723r   r    &pip._internal.req.req_dependency_groupr!   pip._internal.req.req_filer"   pip._internal.req.req_installr#   pip._internal.resolution.baser$   pip._internal.utils.packagingr%   pip._internal.utils.pylockr&   r'   pip._internal.utils.temp_dirr(   r)   r*   	getLoggerr   r}   r6   	BUILD_ENVEPHEM_WHEEL_CACHE	REQ_BUILDr?   r7   rL   r[   r8   r4   r4   r4   r5   <module>   sP    



