
    $TXgPB                       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 dd
lmZmZ ddlmZ ddlmZmZ ddlmZ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l0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<  ejz                  e>      Z? G d dej                        ZAej                  dd       ZCy)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) DEFAULT_CONSOLE_REPORTER_BACKEND)add_plugin_settingcontext)
deprecated)CondaValueErrorPluginError   )post_solvesreporter_backendssolverssubcommandsvirtual_packages)
CondaSpecs	spec_name)health_checks)Literal)AuthBase)ParameterLoader)Solver)	MatchSpec)PackageRecord)CondaAuthHandlerCondaHealthCheckCondaPostCommandCondaPostSolveCondaPreCommandCondaPreSolveCondaReporterBackendCondaRequestHeaderCondaSettingCondaSolverCondaSubcommandCondaVirtualPackagec                  h    e Zd ZdZdZd,d- fdZd.dZd,d/ fdZd0dZd,d1dZ	e
	 	 	 	 d2d       Ze
	 	 	 	 d3d	       Ze
d4d
       Ze
	 	 	 	 d5d       Ze
	 	 	 	 d6d       Ze
	 	 	 	 d7d       Ze
	 	 	 	 d8d       Ze
d9d       Ze
	 	 	 	 d:d       Ze
	 	 	 	 	 	 d;d       Ze
	 	 	 	 	 	 	 	 d<d       Ze
d=d       Ze
	 	 	 	 d>d       Zd Zd?dZd,d@dZdAdZdBdZdCdZdCdZdDdZdEdZ eddd !      dFd"       ZdGd#ZdHd$ZdId%ZdJd&ZdKd'ZdLd(Z	 	 	 	 	 	 dMd)Z	 	 	 	 	 	 	 	 dNd*ZdDd+Z xZS )OCondaPluginManagerzg
    The conda plugin manager to implement behavior additional to pluggy's default plugin manager.
    Nc                   |t         }t        |   |g|i | t        j                  | j
                        | _        t        j                  | j                        | _        t        j                  | j                        | _
        y N)r   super__init__	functoolscacheget_solver_backendget_cached_solver_backendget_session_headersget_cached_session_headersget_request_headersget_cached_request_headers)selfproject_nameargskwargs	__class__s       5lib/python3.12/site-packages/conda/plugins/manager.pyr1   zCondaPluginManager.__init__H   sl    $L777 *39P9P)Q&*3//$:R:R*S'*3//$:R:R*S'    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__r>   id)r:   pluginprefixmodules       r?   get_canonical_namez%CondaPluginManager.get_canonical_nameS   s    #''F'V____))F VM V_XQv22344 XQv//<<=Qr&zl!LLr@   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.
        rF   Nz"Error while loading conda plugin:  ())r0   register
ValueError	Exceptionr   rL   )r:   rI   rF   errr>   s       r?   rQ   zCondaPluginManager.registere   ss    
	 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   )rQ   )r:   pluginscountrI   s       r?   load_pluginszCondaPluginManager.load_pluginsw   s/     F}}V$
  r@   c           
     |   d}t               D ]\  }|j                  D ]K  }|j                  |k7  s||j                  |k7  r$	 |j	                         }| j                  |      sG|dz  }M ^ |S # t
        $ rD}t        j                  d|j                   d| dt        j                  r|n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: rO   rP   )exc_infor   )r   entry_pointsgrouprF   loadrS   logwarningr   inforQ   )r:   r\   rF   rW   distentry_pointrI   rT   s           r?   load_entrypointsz#CondaPluginManager.load_entrypoints   s     !OD#00$$-$)9)9T)A(--/F ==(QJE/  1 $2  ! 
 KKA+BRBRASSUVYUZZ[\(/$    
s   A..	B;7:B66B;c                     y r/    r:   rF   s     r?   get_hook_resultsz#CondaPluginManager.get_hook_results        !$r@   c                     y r/   re   rf   s     r?   rg   z#CondaPluginManager.get_hook_results   s     %(r@   c                     y r/   re   rf   s     r?   rg   z#CondaPluginManager.get_hook_results   s    ORr@   c                     y r/   re   rf   s     r?   rg   z#CondaPluginManager.get_hook_results   rh   r@   c                     y r/   re   rf   s     r?   rg   z#CondaPluginManager.get_hook_results        "%r@   c                     y r/   re   rf   s     r?   rg   z#CondaPluginManager.get_hook_results   rm   r@   c                     y r/   re   rf   s     r?   rg   z#CondaPluginManager.get_hook_results   rm   r@   c                     y r/   re   rf   s     r?   rg   z#CondaPluginManager.get_hook_results   s    TWr@   c                     y r/   re   rf   s     r?   rg   z#CondaPluginManager.get_hook_results   s      #r@   c                    y r/   re   )r:   rF   hosts      r?   rg   z#CondaPluginManager.get_hook_results        $'r@   c                    y r/   re   )r:   rF   rs   paths       r?   rg   z#CondaPluginManager.get_hook_results   rt   r@   c                     y r/   re   rf   s     r?   rg   z#CondaPluginManager.get_hook_results   s    QTr@   c                     y r/   re   rf   s     r?   rg   z#CondaPluginManager.get_hook_results   s     &)r@   c                   | j                    d| }t        | j                  |d      }|t        d| d       |di |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/   rN   )rI   s    r?   <lambda>z5CondaPluginManager.get_hook_results.<locals>.<lambda>   s    V[[r@   )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.
                    re   )r;   getattrhookr   
isinstancerF   strr
   joinsortedsetadd)r:   rF   r=   specnamer   itemsitemrV   rI   invalidseen	conflictsconflicts                r?   rg   z#CondaPluginManager.get_hook_results   s   
 ''($0tyy(D1< :4&	JKK%)^F^F^E44^F )0Tfz&++s7S6T YY'B'F'BCD E
 
 &@A u!(
!(vFKK4,?488FKKCXF 	 
 ""& (YYiHi(HiHIJ KDDL: N	  I G U  C
  Is*   EE!<E!E&.E+E+2E0c                |    | j                  d      D ci c]  }|j                  j                         | c}S c c}w )z2Return a mapping from solver name to solver class.r   rg   rF   lower)r:   solver_plugins     r?   get_solverszCondaPluginManager.get_solvers  sH     "&!6!6y!A
!A $$&5!A
 	
 
   "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: r{   )r   solverr   r   getr   r   backend)r:   rF   solvers_mappingr   s       r?   r4   z%CondaPluginManager.get_solver_backend  s     <>>Dzz|**, (++D$7 !@ G=99_-.0  $$$r@   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/   )rF   r   strip).0r   rF   s     r?   	<genexpr>z6CondaPluginManager.get_auth_handler.<locals>.<genexpr><  s6      
*Tdiioo.?4::<CUCUCW.WD]s   >A	A	r   N)rg   tuplelenhandler)r:   rF   r   matchess    `  r?   get_auth_handlerz#CondaPluginManager.get_auth_handler7  sM     --o> 
*
 
 w<!1:%%%r@   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)rg   rF   r   	parameteraliases)r:   config_params     r?   get_settingszCondaPluginManager.get_settingsD  sY     !% 5 5j A
 A ##%(>(>@T@T'UU A
 	
 
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rg   run_foractionr:   commandr   s      r?   invoke_pre_commandsz&CondaPluginManager.invoke_pre_commandsO  s1     )).9D$,,&G$ :r@   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      r?   invoke_post_commandsz'CondaPluginManager.invoke_post_commandsY  s1     ))/:D$,,&G$ ;r@   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)r:   rF   rI   s      r?   disable_external_pluginsz+CondaPluginManager.disable_external_pluginsc  sA     !113LD&??#34T__T=R  & 4r@   c                |    | j                  d      D ci c]  }|j                  j                         | c}S c c}w )Nr   r   )r:   
subcommands     r?   get_subcommandsz"CondaPluginManager.get_subcommandsk  sF     #33MB
B
 OO!!#Z/B
 	
 
r   z25.3z25.9z@Use `conda.plugins.manager.get_virtual_package_records` instead.)addendumc                6    t        | j                  d            S )Nr   r   rg   r:   s    r?   get_virtual_packagesz'CondaPluginManager.get_virtual_packagesq  s     T**+=>??r@   c                6    t        | j                  d            S )Nr   r   r   s    r?   get_reporter_backendsz(CondaPluginManager.get_reporter_backendsy  s    T**+>?@@r@   c                    | j                         D ci c]  }|j                  | }}|j                  |d      }|5t        j	                  d| dt
         d       |j                  t
              S |S c c}w )z
        Attempts to find a reporter backend while providing a fallback option if it is
        not found.

        This method must return a valid ``CondaReporterBackend`` object or else it will
        raise an exception.
        Nz"Unable to find reporter backend: "z"; falling back to using "")r   rF   r   r^   r_   r   )r:   rF   reporter_backendreporter_backends_maps       r?   get_reporter_backendz'CondaPluginManager.get_reporter_backend|  s     %)$>$>$@!
$@  !!#33$@ 	 !
 144T4@#KK4TF ;**J)K1N ),,-MNN##!
s   A4c                D    t        d | j                  d      D              S )Nc              3  <   K   | ]  }|j                           y wr/   )to_virtual_package)r   r   s     r?   r   zACondaPluginManager.get_virtual_package_records.<locals>.<genexpr>  s!      
A ##%As   r   r   r   s    r?   get_virtual_package_recordsz.CondaPluginManager.get_virtual_package_records  s(     
--.@A
 
 	
r@   c                x    | j                  d|      D ci c]  }|j                  |j                   c}S c c}w )Nsession_headers)rs   rg   rF   value)r:   rs   r   s      r?   r6   z&CondaPluginManager.get_session_headers  sG     --.?d-K
K IItzz!K
 	
 
s   7c                z    | j                  d||      D ci c]  }|j                  |j                   c}S c c}w )Nrequest_headers)rs   rv   r   )r:   rs   rv   r   s       r?   r8   z&CondaPluginManager.get_request_headers  sJ     --.?dQU-V
V IItzz!V
 	
 
s   8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: rO   rP   )rg   r   rS   r^   r_   rF   )r:   rJ   verboser   rT   s        r?   invoke_health_checksz'CondaPluginManager.invoke_health_checks  s_    ))/: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rg   r   )r:   specs_to_addspecs_to_remover   s       r?   invoke_pre_solvesz$CondaPluginManager.invoke_pre_solves  s'     )),7DKKo6 8r@   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   )r:   repodata_fnunlink_precs
link_precsr   s        r?   invoke_post_solvesz%CondaPluginManager.invoke_post_solves  s)     ))-8DKK\:> 9r@   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   r   r   )r:   rF   r   r   s       r?   load_settingsz CondaPluginManager.load_settings  s7    
 +/*;*;*=*C*C*E&D&9gtY8 +Fr@   r/   )r;   
str | NonereturnNone)rI   objectr   r   )rF   r   r   r   )r   int)r\   r   rF   r   r   r   )rF   zLiteral['subcommands']r   zlist[CondaSubcommand])rF   zLiteral['virtual_packages']r   zlist[CondaVirtualPackage])rF   zLiteral['solvers']r   zlist[CondaSolver])rF   zLiteral['pre_commands']r   zlist[CondaPreCommand])rF   zLiteral['post_commands']r   zlist[CondaPostCommand])rF   zLiteral['auth_handlers']r   zlist[CondaAuthHandler])rF   zLiteral['health_checks']r   zlist[CondaHealthCheck])rF   zLiteral['pre_solves']r   zlist[CondaPreSolve])rF   zLiteral['post_solves']r   zlist[CondaPostSolve])rF   zLiteral['session_headers']rs   r   r   list[CondaRequestHeader])rF   zLiteral['request_headers']rs   r   rv   r   r   r   )rF   zLiteral['settings']r   zlist[CondaSetting])rF   zLiteral['reporter_backends']r   zlist[CondaReporterBackend])r   zdict[str, CondaSolver])rF   r   r   ztype[Solver])rF   r   r   ztype[AuthBase] | None)r   zdict[str, ParameterLoader])r   r   r   r   )r   r   )r   zdict[str, CondaSubcommand])r   ztuple[CondaVirtualPackage, ...])r   z tuple[CondaReporterBackend, ...])rF   r   r   r&   )r   tuple[PackageRecord, ...])rs   r   r   dict[str, str])rs   r   rv   r   r   r   )rJ   r   r   boolr   r   )r   frozenset[MatchSpec]r   r   r   r   )r   r   r   r   r   r   r   r   ) __name__
__module__rG   __doc__r5   r1   rL   rQ   rX   rc   r   rg   r   r4   r   r   r   r   r   r   r   r   r   r   r   r6   r8   r   r   r   r   __classcell__)r>   s   @r?   r-   r-   ?   s    !%	TM$$
"H $*$	$ $ (/(	"( ( R R$+$	$ $ %,%	% % %,%	% % %,%	% % W W#*#	# # '.'9<'	!' ' '.'9<'DG'	!' ' T T)0)	#) ).`
%<	
%%'
 S
@
@A$,


7*7 .7 
	7?? 0? .	?
 
? 9r@   r-   c                 $   t               } | j                  t                | j                  t        gt
        j                  t        j                  t        t        j                  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   rX   r   r   rV   r   r   r   r   rc   r   )plugin_managers    r?   get_plugin_managerr     s     ()N  ,N		!	! 
		 		
 
		 
	"	" ##I.r@   )r   r-   )Dr   
__future__r   r2   loggingimportlib.metadatar   inspectr   r   typingr   r   pluggy
auxlib.ishr
   base.constantsr   base.contextr   r   deprecationsr   
exceptionsr   r    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)   r*   r+   	getLoggerr   r^   PluginManagerr-   r3   r   re   r@   r?   <module>r     s    #   , & *   = 6 % 5  , -&6#-.    g!Q9-- Q9h  r@   