
    DIeR,                    Z   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 ddlmZ ddlmZmZ ddlmZmZmZ ddlmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&  ej'        e(          Z) G d dej*                  Z+ ej,        d          dd            Z-dS )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)Literaloverload)AuthBase   )dals)context)Solver)CondaValueErrorPluginError   )solverssubcommandsvirtual_packages)
CondaSpecs	spec_name)CondaAuthHandlerCondaPostCommandCondaPreCommandCondaSolverCondaSubcommandCondaVirtualPackagec                  *    e Zd ZdZdZd3d4 fdZd5dZd3d6 fdZd7dZd3d8d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d3d@d(ZdAd*ZdBd,ZdBd-ZdCd.ZdDd0ZdEd2Z xZS )FCondaPluginManagerzg
    The conda plugin manager to implement behavior additional to pluggy's default plugin manager.
    Nproject_name
str | NonereturnNonec                    |t           } t                      j        |g|R i |  t          j        d           | j                  | _        d S )Nmaxsize)r   super__init__	functools	lru_cacheget_solver_backendget_cached_solver_backend)selfr   argskwargs	__class__s       5lib/python3.11/site-packages/conda/plugins/manager.pyr&   zCondaPluginManager.__init__0   sf    $L7777777 *K)<T)J)J)J#*
 *
&&&    pluginobjectstrc                    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+   r1   prefixmodules       r/   get_canonical_namez%CondaPluginManager.get_canonical_name;   s    #'''F 	*V_ 	*_)F VM V__ 	M44v2444 LLv/<LLr&zzLLLLr0   r9   c                    	 t                                          ||          S # t          $ r Y dS t          $ r0}t	          d|p|                     |           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.
        r9   Nz"Error while loading conda plugin:  ())r%   register
ValueError	Exceptionr   r>   )r+   r1   r9   errr.   s       r/   rC   zCondaPluginManager.registerM   s    
	 77##F#666 	 	 	44 	 	 	E:4226::E E>AE E E  	s   "& 
A,	A,+A''A,intc                H    d}|D ]}|                      |          r|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   )rC   )r+   pluginscountr1   s       r/   load_pluginszCondaPluginManager.load_plugins_   s;      	 	F}}V$$ 
r0   groupc           
     L   d}t                      D ]}|j        D ]}|j        |k    s||j        |k    r	 |                                }n=# t
          $ r0}t                              d|j         d| d           Y d}~fd}~ww xY w|                     |          r|dz  }|S )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: rA   rB   r   )	r   entry_pointsrL   r9   loadrE   logwarningrC   )r+   rL   r9   rJ   distentry_pointr1   rF   s           r/   load_entrypointsz#CondaPluginManager.load_entrypointsk   s     !OO 	 	D#0  $--$)9T)A)A
(--//FF    
 KK\+BR\\VY\\\   HHHH ==(( QJE+, s   A
B&B  BLiteral['subcommands']list[CondaSubcommand]c                    d S N r+   r9   s     r/   get_hook_resultsz#CondaPluginManager.get_hook_results       r0   Literal['virtual_packages']list[CondaVirtualPackage]c                    d S rX   rY   rZ   s     r/   r[   z#CondaPluginManager.get_hook_results   	     	r0   Literal['solvers']list[CondaSolver]c                    d S rX   rY   rZ   s     r/   r[   z#CondaPluginManager.get_hook_results   r\   r0   Literal['pre_commands']list[CondaPreCommand]c                    d S rX   rY   rZ   s     r/   r[   z#CondaPluginManager.get_hook_results   r\   r0   Literal['post_commands']list[CondaPostCommand]c                    d S rX   rY   rZ   s     r/   r[   z#CondaPluginManager.get_hook_results   r`   r0   Literal['auth_handlers']list[CondaAuthHandler]c                    d S rX   rY   rZ   s     r/   r[   z#CondaPluginManager.get_hook_results   r`   r0   c                   | j          d| }t          | j        |d          }|t          d| d          d  |            D             }d |D             }|r=t          t	          dd                    d	 |D                        d
                    t          |d           }t                      fd|D             }|rCt          t	          d| dd                    d |D                        d| d                    |S )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	` pluginsc                    g | ]	}|D ]}|
S rY   rY   ).0itemsitems      r/   
<listcomp>z7CondaPluginManager.get_hook_results.<locals>.<listcomp>   s%    >>>E>>4>>>>r0   c                F    g | ]}t          |j        t                    |S rY   )
isinstancer9   r3   rp   r1   s     r/   rs   z7CondaPluginManager.get_hook_results.<locals>.<listcomp>   s)    TTTfz&+s7S7ST6TTTr0   zF
                    Invalid plugin names found:

                    , c                ,    g | ]}t          |          S rY   r3   rv   s     r/   rs   z7CondaPluginManager.get_hook_results.<locals>.<listcomp>   s    BBBFBBBr0   z\

                    Please report this issue to the plugin author(s).
                    c                    | j         S rX   r@   )r1   s    r/   <lambda>z5CondaPluginManager.get_hook_results.<locals>.<lambda>   s    V[ r0   )keyc                Z    g | ]'}|j         v s                    |j                   %|(S rY   )r9   add)rp   r1   seens     r/   rs   z7CondaPluginManager.get_hook_results.<locals>.<listcomp>   s?     
 
 
FK4,?,?488FKCXCX,?F,?,?,?r0   z"
                    Conflicting `z&` plugins found:

                    c                ,    g | ]}t          |          S rY   ry   )rp   conflicts     r/   rs   z7CondaPluginManager.get_hook_results.<locals>.<listcomp>   s    HHH(HHHHr0   zE

                    Multiple conda plugins are registered via the `zy` hook.
                    Please make sure that you don't have any incompatible plugins installed.
                    )r   getattrhookr   r   joinsortedset)r+   r9   specnamer   rI   invalid	conflictsr   s          @r/   r[   z#CondaPluginManager.get_hook_results   s   
 '00$00ty(D11<J4JJJKKK>>TTVV>>> UTTTT 	 YYBB'BBBCC   
 
 
 &@&@AAA uu
 
 
 
!(
 
 
	  	"&  YYHHiHHHII 
 EM  	 	   r0   dict[str, CondaSolver]c                @    d |                      d          D             S )z2Return a mapping from solver name to solver class.c                B    i | ]}|j                                         |S rY   r9   lower)rp   solver_plugins     r/   
<dictcomp>z2CondaPluginManager.get_solvers.<locals>.<dictcomp>   s9     
 
 
 $$&&
 
 
r0   r   r[   r+   s    r/   get_solverszCondaPluginManager.get_solvers   s1    
 
!%!6!6y!A!A
 
 
 	
r0   type[Solver]c                    |t           j        }|                                }|                                 }|                    |d          }|(t          d| dd                    |                     |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: rw   )r   solverr   r   getr   r   backend)r+   r9   solvers_mappingr   s       r/   r)   z%CondaPluginManager.get_solver_backend   s     <>Dzz||**,, (++D$77 !0 0 099_--0 0   $$r0   type[AuthBase] | Nonec                    |                      d          }t          fd|D                       }t          |          dk    r|d         j        S dS )zB
        Get the auth handler with the given name or None
        auth_handlersc              3     K   | ]G}|j                                                                                                         k    C|V  Hd S rX   )r9   r   strip)rp   rr   r9   s     r/   	<genexpr>z6CondaPluginManager.get_auth_handler.<locals>.<genexpr>  sV       
 
dioo.?.?4::<<CUCUCWCW.W.WD.W.W.W.W
 
r0   r   N)r[   tuplelenhandler)r+   r9   r   matchess    `  r/   get_auth_handlerz#CondaPluginManager.get_auth_handler   sr     --o>> 
 
 
 
*
 
 
 
 
 w<<!1:%%tr0   commandc                r    |                      d          D ] }||j        v r|                    |           !dS )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r+   r   r   s      r/   invoke_pre_commandsz&CondaPluginManager.invoke_pre_commands  sK     )).99 	% 	%D$,&&G$$$	% 	%r0   c                r    |                      d          D ] }||j        v r|                    |           !dS )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_commands  sK     ))/:: 	% 	%D$,&&G$$$	% 	%r0   c                    |                                  D ]D\  }}|                    d          s*|                     |          s|                     |           EdS )zY
        Disables all currently registered plugins except built-in conda plugins
        zconda.plugins.N)list_name_plugin
startswith
is_blockedset_blocked)r+   r9   r1   s      r/   disable_external_pluginsz+CondaPluginManager.disable_external_plugins!  sj     !1133 	' 	'LD&??#344 'T__T=R=R '  &&&	' 	'r0   dict[str, CondaSubcommand]c                @    d |                      d          D             S )Nc                B    i | ]}|j                                         |S rY   r   )rp   
subcommands     r/   r   z6CondaPluginManager.get_subcommands.<locals>.<dictcomp>*  s8     
 
 
 O!!##Z
 
 
r0   r   r   r   s    r/   get_subcommandsz"CondaPluginManager.get_subcommands)  s1    
 
"33MBB
 
 
 	
r0   tuple[CondaVirtualPackage, ...]c                F    t          |                     d                    S )Nr   )r   r[   r   s    r/   get_virtual_packagesz'CondaPluginManager.get_virtual_packages/  s    T**+=>>???r0   rX   )r   r   r    r!   )r1   r2   r    r3   )r9   r   r    r   )r    rG   )rL   r3   r9   r   r    rG   )r9   rU   r    rV   )r9   r]   r    r^   )r9   ra   r    rb   )r9   rd   r    re   )r9   rg   r    rh   )r9   rj   r    rk   )r    r   )r9   r   r    r   )r9   r3   r    r   )r   r3   r    r!   )r    r!   )r    r   )r    r   )__name__
__module__r:   __doc__r*   r&   r>   rC   rK   rT   r   r[   r   r)   r   r   r   r   r   r   __classcell__)r.   s   @r/   r   r   '   s:         !%	
 	
 	
 	
 	
 	
 	
M M M M$      $
 
 
 
         D    X    X
    X    X    X
    X
. . .`
 
 
 
% % % % %<   % % % %% % % %' ' ' '
 
 
 
@ @ @ @ @ @ @ @r0   r   r#   r    c                     t                      } |                     t                      | j        t          gt
          j        t          j        R   |                     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   rK   r   r   rI   r   rT   r   )plugin_managers    r/   get_plugin_managerr   3  st     ())N  ,,,N"*-8-@    ##I...r0   )r    r   ).r   
__future__r   r'   loggingimportlib.metadatar   inspectr   r   typingr   r   pluggyrequests.authr	   
auxlib.ishr   base.contextr   
core.solver   
exceptionsr   r    r   r   r   hookspecr   r   typesr   r   r   r   r   r   	getLoggerr   rP   PluginManagerr   r(   r   rY   r0   r/   <module>r      s    # " " " " "      , , , , , , & & & & & & & & $ $ $ $ $ $ $ $  " " " " " "       " " " " " "       5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 + + + + + + + +                g!!I@ I@ I@ I@ I@- I@ I@ I@X T"""   #"  r0   