o
    6‘ðiLD  ã                   @  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 )8zðContains 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   ú\/root/parts/websockify/install/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-depszÊpip 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|	ƒr‡t d¡ t|	|d�D ]\}
}| t|
||	|jdd	�¡ qtqct|	|||d
�D ]}t||jd|jrŸ|j d¡ndd�}| |¡ q�qc|j�rt|jƒdkr¹tdƒ‚|jd }zt|ƒ}W n tyÕ } zt|jƒ‚d}~ww | dd¡}|rú|jsút |ƒ}t!||j"d�sút#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š   z‹Using 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    

ý

