
    wBf7                       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m	Z	 ddl
mZmZ ddl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mZmZmZ ddlmZmZ ddlmZ er<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.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5  ejl                  e7      Z8 G d dejr                        Z: ejv                  d      dd       Z<y)a0  
This module contains a subclass implementation of pluggy's
`PluginManager <https://pluggy.readthedocs.io/en/stable/api_reference.html#pluggy.PluginManager>`_.

Additionally, it contains a function we use to construct the ``PluginManager`` object and
register all plugins during conda's startup process.
    )annotationsN)distributions)	getmoduleisclass)TYPE_CHECKINGoverload   )dals)add_plugin_settingcontext)CondaValueErrorPluginError   )post_solvessolverssubcommandsvirtual_packages)
CondaSpecs	spec_name)health_checks)Literal)AuthBase)ParameterLoader)Solver)	MatchSpec)PackageRecord)
CondaAuthHandlerCondaHealthCheckCondaPostCommandCondaPostSolveCondaPreCommandCondaPreSolveCondaSettingCondaSolverCondaSubcommandCondaVirtualPackagec                      e Zd ZdZdZd d! fdZd"dZd d# fdZd$dZd d%dZ	e
	 	 	 	 d&d       Ze
	 	 	 	 d'd	       Ze
d(d
       Ze
	 	 	 	 d)d       Ze
	 	 	 	 d*d       Ze
	 	 	 	 d+d       Ze
	 	 	 	 d,d       Ze
d-d       Ze
	 	 	 	 d.d       Ze
d/d       Zd Zd0dZd d1dZd2dZd3dZd4dZd4dZd5dZd6dZd7dZd8dZ	 	 	 	 	 	 d9dZ	 	 	 	 	 	 	 	 d:dZd5dZ xZS );CondaPluginManagerzg
    The conda plugin manager to implement behavior additional to pluggy's default plugin manager.
    Nc                    |t         }t        |   |g|i |  t        j                  d       | j
                        | _        y )Nmaxsize)r   super__init__	functools	lru_cacheget_solver_backendget_cached_solver_backend)selfproject_nameargskwargs	__class__s       5lib/python3.12/site-packages/conda/plugins/manager.pyr-   zCondaPluginManager.__init__>   sK    $L777 *K)<)<T)J##*
&    c                    d}t        |      x}r"|j                  r|j                  j                  }||u r|S t        |      r| d|j                   S | d|j
                  j                   dt        |       dS )Nz<unknown_module>.[])r   __spec__namer   __qualname__r6   id)r2   pluginprefixmodules       r7   get_canonical_namez%CondaPluginManager.get_canonical_nameI   s    #''F'V____))F VM V_XQv22344 XQv//<<=Qr&zl!LLr8   c                    	 t         |   ||      S # t        $ r Y yt        $ r*}t	        d|xs | j                  |       d| d      d}~ww xY w)z
        Call :meth:`pluggy.PluginManager.register` and return the result or
        ignore errors raised, except ``ValueError``, which means the plugin
        had already been registered.
        r>   Nz"Error while loading conda plugin:  ())r,   register
ValueError	Exceptionr   rD   )r2   rA   r>   errr6   s       r7   rI   zCondaPluginManager.register[   sn    
	 7#F#66 	 	4:4226:;2cU!E 	s    	AA%AAc                F    d}|D ]  }| j                  |      s|dz  } |S )z
        Load the provided list of plugins and fail gracefully on error.
        The provided list of plugins can either be classes or modules with
        :attr:`~conda.plugins.hookimpl`.
        r   r   )rI   )r2   pluginscountrA   s       r7   load_pluginszCondaPluginManager.load_pluginsm   s4      	F}}V$
	 r8   c           
     T   d}t               D ]\  }|j                  D ]K  }|j                  |k7  s||j                  |k7  r$	 |j	                         }| j                  |      sG|dz  }M ^ |S # t
        $ r0}t        j                  d|j                   d| d       Y d}~d}~ww xY w)a$  Load modules from querying the specified setuptools ``group``.

        :param str group: Entry point group to load plugins.
        :param str name: If given, loads only plugins with the given ``name``.
        :rtype: int
        :return: The number of plugins loaded by this call.
        r   Nz'Error while loading conda entry point: rG   rH   r   )	r   entry_pointsgroupr>   loadrK   logwarningrI   )r2   rS   r>   rO   distentry_pointrA   rL   s           r7   load_entrypointsz#CondaPluginManager.load_entrypointsy   s     !O 	D#00 $$-$)9)9T)A
(--/F ==(QJE+	.  ! 
 KKA+BRBRASSUVYUZZ[\ s   A..	B'7&B""B'c                     y N r2   r>   s     r7   get_hook_resultsz#CondaPluginManager.get_hook_results        !$r8   c                     y r[   r\   r]   s     r7   r^   z#CondaPluginManager.get_hook_results   s     %(r8   c                     y r[   r\   r]   s     r7   r^   z#CondaPluginManager.get_hook_results   s    ORr8   c                     y r[   r\   r]   s     r7   r^   z#CondaPluginManager.get_hook_results   r_   r8   c                     y r[   r\   r]   s     r7   r^   z#CondaPluginManager.get_hook_results        "%r8   c                     y r[   r\   r]   s     r7   r^   z#CondaPluginManager.get_hook_results   rd   r8   c                     y r[   r\   r]   s     r7   r^   z#CondaPluginManager.get_hook_results   rd   r8   c                     y r[   r\   r]   s     r7   r^   z#CondaPluginManager.get_hook_results   s    TWr8   c                     y r[   r\   r]   s     r7   r^   z#CondaPluginManager.get_hook_results   s      #r8   c                     y r[   r\   r]   s     r7   r^   z#CondaPluginManager.get_hook_results   s    QTr8   c                   | j                    d| }t        | j                  |d      }|t        d| d       |       D cg c]  }|D ]  }|  }}}|D cg c]  }t	        |j
                  t              r|! }}|r>t        t        ddj                  |D cg c]  }t        |       c}       d            t        |d 	      }t               }	|D cg c].  }|j
                  |	v s|	j                  |j
                        s-|0 }
}|
rDt        t        d
| ddj                  |
D cg c]  }t        |       c}       d| d            |S c c}}w c c}w c c}w c c}w c c}w )z{
        Return results of the plugin hooks with the given name and
        raise an error if there is a conflict.
        _NzCould not find requested `z	` pluginszF
                    Invalid plugin names found:

                    , z\

                    Please report this issue to the plugin author(s).
                    c                    | j                   S r[   rF   )rA   s    r7   <lambda>z5CondaPluginManager.get_hook_results.<locals>.<lambda>   s
    V[[ r8   )keyz"
                    Conflicting `z&` plugins found:

                    zE

                    Multiple conda plugins are registered via the `zy` hook.
                    Please make sure that you don't have any incompatible plugins installed.
                    )r3   getattrhookr   
isinstancer>   strr
   joinsortedsetadd)r2   r>   specnamerq   itemsitemrN   rA   invalidseen	conflictsconflicts               r7   r^   z#CondaPluginManager.get_hook_results   s   
 ''($0tyy(D1< :4&	JKK%)V>E>4>4>> )0Tfz&++s7S6TT YY'BFBCD E
 
 &@A u!(
FKK4,?488FKKCXF
	 
 ""& (YYiH(HHIJ KDDL: N	  I ? U  C
  Is*   EE ;E E%.E*E*1E/c                |    | j                  d      D ci c]  }|j                  j                         | c}S c c}w )z2Return a mapping from solver name to solver class.r   r^   r>   lower)r2   solver_plugins     r7   get_solverszCondaPluginManager.get_solvers   sC     "&!6!6y!A
 $$&5
 	
 
   "9c                    |t         j                  }|j                         }| j                         }|j	                  |d      }| t        d| ddj                  |             |j                  S )aj  
        Get the solver backend with the given name (or fall back to the
        name provided in the context).

        See ``context.solver`` for more details.

        Please use the cached version of this method called
        :meth:`get_cached_solver_backend` for high-throughput code paths
        which is set up as a instance-specific LRU cache.
        Nz.You have chosen a non-default solver backend (z,) but it was not recognized. Choose one of: rl   )r   solverr   r   getr   rt   backend)r2   r>   solvers_mappingr   s       r7   r0   z%CondaPluginManager.get_solver_backend   s     <>>Dzz|**, (++D$7 !@ G=99_-.0  $$$r8   c                    | j                  d      }t        fd|D              }t        |      dkD  r|d   j                  S y)zB
        Get the auth handler with the given name or None
        auth_handlersc              3     K   | ]@  }|j                   j                         j                         j                         k(  s=| B y wr[   )r>   r   strip).0rz   r>   s     r7   	<genexpr>z6CondaPluginManager.get_auth_handler.<locals>.<genexpr>!  s7      
diioo.?4::<CUCUCW.WD
s   >A	A	r   N)r^   tuplelenhandler)r2   r>   r   matchess    `  r7   get_auth_handlerz#CondaPluginManager.get_auth_handler  sM     --o> 
*
 
 w<!1:%%%r8   c                    | j                  d      D ci c]3  }|j                  j                         |j                  |j                  f5 c}S c c}w )z
        Return a mapping of plugin setting name to ParameterLoader class

        This method intentionally overwrites any duplicates that may be present
        settings)r^   r>   r   	parameteraliases)r2   config_params     r7   get_settingszCondaPluginManager.get_settings)  sT     !% 5 5j A
 ##%(>(>@T@T'UU
 	
 
s   8Ac                p    | j                  d      D ]"  }||j                  v s|j                  |       $ y)z
        Invokes ``CondaPreCommand.action`` functions registered with ``conda_pre_commands``.

        :param command: name of the command that is currently being invoked
        pre_commandsNr^   run_foractionr2   commandrq   s      r7   invoke_pre_commandsz&CondaPluginManager.invoke_pre_commands4  s6     )).9 	%D$,,&G$	%r8   c                p    | j                  d      D ]"  }||j                  v s|j                  |       $ y)z
        Invokes ``CondaPostCommand.action`` functions registered with ``conda_post_commands``.

        :param command: name of the command that is currently being invoked
        post_commandsNr   r   s      r7   invoke_post_commandsz'CondaPluginManager.invoke_post_commands>  s6     ))/: 	%D$,,&G$	%r8   c                    | j                         D ]:  \  }}|j                  d      r| j                  |      r*| j                  |       < y)zY
        Disables all currently registered plugins except built-in conda plugins
        zconda.plugins.N)list_name_plugin
startswith
is_blockedset_blocked)r2   r>   rA   s      r7   disable_external_pluginsz+CondaPluginManager.disable_external_pluginsH  sF     !113 	'LD&??#34T__T=R  &	'r8   c                |    | j                  d      D ci c]  }|j                  j                         | c}S c c}w )Nr   r   )r2   
subcommands     r7   get_subcommandsz"CondaPluginManager.get_subcommandsP  sA     #33MB
 OO!!#Z/
 	
 
r   c                6    t        | j                  d            S )Nr   )r   r^   )r2   s    r7   get_virtual_packagesz'CondaPluginManager.get_virtual_packagesV  s    T**+=>??r8   c           	         | j                  d      D ]  }	 |j                  ||        y # t        $ r0}t        j	                  d|j
                   d| d       Y d }~Md }~ww xY w)Nr   zError running health check: rG   rH   )r^   r   rK   rU   rV   r>   )r2   rB   verboserq   rL   s        r7   invoke_health_checksz'CondaPluginManager.invoke_health_checksY  sd    ))/: 	DFG,	  :499+RuANOs   +	A$&AA$c                T    | j                  d      D ]  }|j                  ||        y)z
        Invokes ``CondaPreSolve.action`` functions registered with ``conda_pre_solves``.

        :param specs_to_add:
        :param specs_to_remove:
        
pre_solvesNr^   r   )r2   specs_to_addspecs_to_removerq   s       r7   invoke_pre_solvesz$CondaPluginManager.invoke_pre_solvesa  s,     )),7 	7DKKo6	7r8   c                V    | j                  d      D ]  }|j                  |||        y)z
        Invokes ``CondaPostSolve.action`` functions registered with ``conda_post_solves``.

        :param repodata_fn:
        :param unlink_precs:
        :param link_precs:
        r   Nr   )r2   repodata_fnunlink_precs
link_precsrq   s        r7   invoke_post_solvesz%CondaPluginManager.invoke_post_solveso  s.     ))-8 	?DKK\:>	?r8   c                p    | j                         j                         D ]  \  }\  }}t        |||        y)z
        Iterates through all registered settings and adds them to the
        :class:`conda.common.configuration.PluginConfig` class.
        N)r   ry   r   )r2   r>   r   r   s       r7   load_settingsz CondaPluginManager.load_settings  s;    
 +/*;*;*=*C*C*E 	9&D&9gtY8	9r8   r[   )r3   
str | NonereturnNone)rA   objectr   rs   )r>   r   r   r   )r   int)rS   rs   r>   r   r   r   )r>   zLiteral['subcommands']r   zlist[CondaSubcommand])r>   zLiteral['virtual_packages']r   zlist[CondaVirtualPackage])r>   zLiteral['solvers']r   zlist[CondaSolver])r>   zLiteral['pre_commands']r   zlist[CondaPreCommand])r>   zLiteral['post_commands']r   zlist[CondaPostCommand])r>   zLiteral['auth_handlers']r   zlist[CondaAuthHandler])r>   zLiteral['health_checks']r   zlist[CondaHealthCheck])r>   zLiteral['pre_solves']r   zlist[CondaPreSolve])r>   zLiteral['post_solves']r   zlist[CondaPostSolve])r>   zLiteral['settings']r   zlist[CondaSetting])r   zdict[str, CondaSolver])r>   r   r   ztype[Solver])r>   rs   r   ztype[AuthBase] | None)r   zdict[str, ParameterLoader])r   rs   r   r   )r   r   )r   zdict[str, CondaSubcommand])r   ztuple[CondaVirtualPackage, ...])rB   rs   r   boolr   r   )r   frozenset[MatchSpec]r   r   r   r   )r   rs   r   tuple[PackageRecord, ...]r   r   r   r   )__name__
__module__r?   __doc__r1   r-   rD   rI   rP   rY   r   r^   r   r0   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r6   s   @r7   r(   r(   5   s    !%	
M$$
 D $*$	$ $ (/(	"( ( R R$+$	$ $ %,%	% % %,%	% % %,%	% % W W#*#	# # T T.`
%<	
%%'
@7*7 .7 
	7?? 0? .	?
 
? 9r8   r(   r*   c                    t               } | j                  t                | j                  t        gt
        j                  t        j                  t        t        j                    | j                  t               | S )z
    Get a cached version of the :class:`~conda.plugins.manager.CondaPluginManager` instance,
    with the built-in and entrypoints provided by the plugins loaded.
    )r(   add_hookspecsr   rP   r   r   rN   r   r   r   rY   r   )plugin_managers    r7   get_plugin_managerr     s{     ()N  ,N		!	! 
		 		
 
		 ##I.r8   )r   r(   )=r   
__future__r   r.   loggingimportlib.metadatar   inspectr   r   typingr   r   pluggy
auxlib.ishr
   base.contextr   r   
exceptionsr   r    r   r   r   r   hookspecr   r   subcommands.doctorr   r   requests.authr   common.configurationr   
core.solver   models.match_specr   models.recordsr   typesr   r   r   r    r!   r"   r#   r$   r%   r&   	getLoggerr   rU   PluginManagerr(   r/   r   r\   r8   r7   <module>r      s    #   , & *   6 5 A A + -&6#-.   g!P9-- P9f
 T" #r8   