manager#

This module contains a subclass implementation of pluggy's PluginManager.

Additionally, it contains a function we use to construct the PluginManager object and register all plugins during conda's startup process.

Classes#

CondaPluginManager

The conda plugin manager to implement behavior additional to pluggy's default plugin manager.

Functions#

get_plugin_manager(→ CondaPluginManager)

Get a cached version of the CondaPluginManager instance,

class CondaPluginManager(*args, **kwargs)#

Bases: pluggy.PluginManager

The conda plugin manager to implement behavior additional to pluggy's default plugin manager.

get_cached_solver_backend: collections.abc.Callable[[str | None], type[conda.core.solve.Solver]]#

Cached version of the get_solver_backend() method.

get_cached_session_headers: collections.abc.Callable[[str], dict[str, str]]#

Cached version of the get_session_headers() method.

get_cached_request_headers: collections.abc.Callable[[str, str], dict[str, str]]#

Cached version of the get_request_headers() method.

get_canonical_name(plugin: object) str#

Return a canonical name for a plugin object.

Note that a plugin may be registered under a different name specified by the caller of register(plugin, name). To obtain the name of a registered plugin use get_name(plugin) instead.

register(plugin, name: str | None = None) str | None#

Call pluggy.PluginManager.register() and return the result or ignore errors raised, except ValueError, which means the plugin had already been registered.

load_plugins(*plugins) int#

Load the provided list of plugins and fail gracefully on error. The provided list of plugins can either be classes or modules with hookimpl.

load_entrypoints(group: str, name: str | None = None) int#

Load modules from querying the specified setuptools group.

Parameters:
  • group (str) -- Entry point group to load plugins.

  • name (str) -- If given, loads only plugins with the given name.

Return type:

int

Returns:

The number of plugins loaded by this call.

get_hook_results(name: Literal['subcommands']) list[conda.plugins.types.CondaSubcommand]#
get_hook_results(name: Literal['virtual_packages']) list[conda.plugins.types.CondaVirtualPackage]
get_hook_results(name: Literal['solvers']) list[conda.plugins.types.CondaSolver]
get_hook_results(name: Literal['pre_commands']) list[conda.plugins.types.CondaPreCommand]
get_hook_results(name: Literal['post_commands']) list[conda.plugins.types.CondaPostCommand]
get_hook_results(name: Literal['auth_handlers']) list[conda.plugins.types.CondaAuthHandler]
get_hook_results(name: Literal['health_checks']) list[conda.plugins.types.CondaHealthCheck]
get_hook_results(name: Literal['pre_solves']) list[conda.plugins.types.CondaPreSolve]
get_hook_results(name: Literal['post_solves']) list[conda.plugins.types.CondaPostSolve]
get_hook_results(name: Literal['session_headers'], *, host: str) list[conda.plugins.types.CondaRequestHeader]
get_hook_results(name: Literal['request_headers'], *, host: str, path: str) list[conda.plugins.types.CondaRequestHeader]
get_hook_results(name: Literal['settings']) list[conda.plugins.types.CondaSetting]
get_hook_results(name: Literal['reporter_backends']) list[conda.plugins.types.CondaReporterBackend]
get_hook_results(name: Literal['pre_transaction_actions']) list[conda.plugins.types.CondaPreTransactionAction]
get_hook_results(name: Literal['post_transaction_actions']) list[conda.plugins.types.CondaPostTransactionAction]
get_hook_results(name: Literal['prefix_data_loaders']) list[conda.plugins.types.CondaPrefixDataLoader]
get_hook_results(name: Literal['environment_specifiers']) list[conda.plugins.types.CondaEnvironmentSpecifier]
get_hook_results(name: Literal['package_extractors']) list[conda.plugins.types.CondaPackageExtractor]
get_hook_results(name: Literal['environment_exporters']) list[conda.plugins.types.CondaEnvironmentExporter]

Return results of the plugin hooks with the given name and raise an error if there is a conflict.

get_solvers() dict[str, conda.plugins.types.CondaSolver]#

Return a mapping from solver name to solver class.

get_solver_backend(name: str | None = None) type[conda.core.solve.Solver]#

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 get_cached_solver_backend() for high-throughput code paths which is set up as a instance-specific LRU cache.

get_auth_handler(name: str) type[requests.auth.AuthBase] | None#

Get the auth handler with the given name or None

get_settings() dict[str, conda.plugins.types.CondaSetting]#

Return a mapping of plugin setting name to CondaSetting objects.

This method intentionally overwrites any duplicates that may be present

invoke_pre_commands(command: str) None#

Invokes CondaPreCommand.action functions registered with conda_pre_commands.

Parameters:

command -- name of the command that is currently being invoked

invoke_post_commands(command: str) None#

Invokes CondaPostCommand.action functions registered with conda_post_commands.

Parameters:

command -- name of the command that is currently being invoked

disable_external_plugins() None#

Disables all currently registered plugins except built-in conda plugins

get_subcommands() dict[str, conda.plugins.types.CondaSubcommand]#
get_health_checks() dict[str, conda.plugins.types.CondaHealthCheck]#

Return a mapping of health check name to health check.

get_reporter_backends() tuple[conda.plugins.types.CondaReporterBackend, Ellipsis]#
get_reporter_backend(name: str) conda.plugins.types.CondaReporterBackend#

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.

get_virtual_package_records() tuple[conda.models.records.PackageRecord, Ellipsis]#
get_session_headers(host: str) dict[str, str]#
get_request_headers(host: str, path: str) dict[str, str]#
get_prefix_data_loaders() collections.abc.Iterable[conda.plugins.types.CondaPrefixDataLoaderCallable]#
invoke_pre_solves(specs_to_add: frozenset[conda.models.match_spec.MatchSpec], specs_to_remove: frozenset[conda.models.match_spec.MatchSpec]) None#

Invokes CondaPreSolve.action functions registered with conda_pre_solves.

Parameters:
  • specs_to_add

  • specs_to_remove

invoke_post_solves(repodata_fn: str, unlink_precs: tuple[conda.models.records.PackageRecord, Ellipsis], link_precs: tuple[conda.models.records.PackageRecord, Ellipsis]) None#

Invokes CondaPostSolve.action functions registered with conda_post_solves.

Parameters:
  • repodata_fn

  • unlink_precs

  • link_precs

load_settings() None#

Iterates through all registered settings and adds them to the conda.common.configuration.PluginConfig class.

get_config(data) conda.plugins.config.PluginConfig#

Retrieve the configuration for the plugin. :returns: The configuration object for the plugin, initialized with raw data from the context. :rtype: PluginConfig

get_environment_specifiers(*, supports_detection: bool | None = None, with_aliases: bool = True) dict[str, conda.plugins.types.CondaEnvironmentSpecifier]#

Returns a mapping from environment specifier name to environment specifier.

param supports_detection:

ternary value that returns either everything, only supporting detection or not supporting detection.

Parameters:

with_aliases -- whether to include aliased values of environment specifiers.

_get_name_and_alias_mapping(plugins: collections.abc.Iterable[conda.plugins.types.CondaPlugin]) dict[str, conda.plugins.types.CondaEnvironmentSpecifier]#

Get a mapping from plugin names (including aliases) to plugin.

Parameters:

plugins -- List of plugins that have a name and aliases attribute.

Returns:

Dict mapping format name to CondaEnvironmentExporter

Raises:

PluginError -- If multiple exporters use the same format name or alias

get_environment_specifier_by_name(source: str, name: str) conda.plugins.types.CondaEnvironmentSpecifier#

Get an environment specifier plugin by name

Parameters:
  • source -- full path to the environment spec file/source

  • name -- name of the environment plugin to load

Raises:
  • CondaValueError -- if the requested plugin is not available.

  • PluginError -- if the requested plugin is unable to handle the provided file.

Returns:

an environment specifier plugin that matches the provided plugin name, or can handle the provided file

_detect_filename_env_spec(source: str, basename: str, hooks: dict[str, conda.plugins.types.CondaEnvironmentSpecifier]) list[conda.plugins.types.CondaEnvironmentSpecifier]#

Detect environment specifier by filename pattern matching.

Parameters:
  • basename -- basename of the source file

  • hooks -- mapping of environment specifier plugins

Returns:

list of matching plugins, or None if no filename matches

static _detect_content_env_spec(source: str, hooks: dict[str, conda.plugins.types.CondaEnvironmentSpecifier]) list[conda.plugins.types.CondaEnvironmentSpecifier]#

Detect environment specifier by content-based autodetection.

Parameters:
  • source -- full path to the environment spec file or source

  • hooks -- mapping of environment specifier plugins

Returns:

tuple of (found plugins, autodetect disabled plugin names)

detect_environment_specifier(source: str) conda.plugins.types.CondaEnvironmentSpecifier#

Detect the environment specifier plugin for a given spec source

Uses two-phase detection: 1. Filename-based filtering using fnmatch patterns 2. Fallback to content-based autodetection (can_handle())

Raises PluginError if more than one environment_spec plugin is found to be able to handle the file. Raises EnvironmentSpecPluginNotDetected if no plugins were found.

Parameters:

source -- full path to the environment spec file or source

Returns:

an environment specifier plugin that can handle the provided file

get_environment_specifier(source: str, name: str | None = None) conda.plugins.types.CondaEnvironmentSpecifier#

Get the environment specifier plugin for a given spec source, or given a plugin name Raises PluginError if more than one environment_spec plugin is found to be able to handle the file. Raises EnvironmentSpecPluginNotDetected if no plugins were found. Raises CondaValueError if the requested plugin is not available.

Parameters:
  • filename -- full path to the environment spec file/source

  • name -- name of the environment plugin to load

Returns:

an environment specifier plugin that matches the provided plugin name, or can handle the provided file

get_environment_exporters() collections.abc.Iterable[conda.plugins.types.CondaEnvironmentExporter]#

Yields all detected environment exporters.

get_exporter_format_mapping() dict[str, conda.plugins.types.CondaEnvironmentExporter]#

Get a mapping from format names (including aliases) to environment exporters.

Returns:

Dict mapping format name to CondaEnvironmentExporter

Raises:

PluginError -- If multiple exporters use the same format name or alias

detect_environment_exporter(filename: str) conda.plugins.types.CondaEnvironmentExporter#

Detect an environment exporter based on filename matching against default_filenames.

Uses fnmatch pattern matching for flexible filename patterns (e.g., *.conda-lock.yml).

Parameters:

filename -- Filename to find an exporter for (basename is used for detection)

Returns:

CondaEnvironmentExporter that supports the filename

Raises:
get_environment_exporter_by_format(format_name: str) conda.plugins.types.CondaEnvironmentExporter#

Get an environment exporter based on the format name.

Parameters:

format_name -- Format name to find an exporter for (e.g., 'yaml', 'json', 'environment-yaml')

Returns:

CondaEnvironmentExporter that supports the format

Raises:

CondaValueError -- If no exporter is found for the given format

get_pre_transaction_actions(transaction_context: dict[str, str] | None = None, target_prefix: str | None = None, unlink_precs: collections.abc.Iterable[conda.models.records.PackageRecord] | None = None, link_precs: collections.abc.Iterable[conda.models.records.PackageRecord] | None = None, remove_specs: collections.abc.Iterable[conda.models.match_spec.MatchSpec] | None = None, update_specs: collections.abc.Iterable[conda.models.match_spec.MatchSpec] | None = None, neutered_specs: collections.abc.Iterable[conda.models.match_spec.MatchSpec] | None = None) list[conda.core.path_actions.Action]#

Get the plugin-defined pre-transaction actions.

Parameters:
  • transaction_context -- Mapping between target prefixes and PrefixActionGroup instances

  • target_prefix -- Target prefix for the action

  • unlink_precs -- Package records to be unlinked

  • link_precs -- Package records to link

  • remove_specs -- Specs to be removed

  • update_specs -- Specs to be updated

  • neutered_specs -- Specs to be neutered

Returns:

The plugin-defined pre-transaction actions

get_post_transaction_actions(transaction_context: dict[str, str] | None = None, target_prefix: str | None = None, unlink_precs: collections.abc.Iterable[conda.models.records.PackageRecord] | None = None, link_precs: collections.abc.Iterable[conda.models.records.PackageRecord] | None = None, remove_specs: collections.abc.Iterable[conda.models.match_spec.MatchSpec] | None = None, update_specs: collections.abc.Iterable[conda.models.match_spec.MatchSpec] | None = None, neutered_specs: collections.abc.Iterable[conda.models.match_spec.MatchSpec] | None = None) list[conda.core.path_actions.Action]#

Get the plugin-defined post-transaction actions.

Parameters:
  • transaction_context -- Mapping between target prefixes and PrefixActionGroup instances

  • target_prefix -- Target prefix for the action

  • unlink_precs -- Package records to be unlinked

  • link_precs -- Package records to link

  • remove_specs -- Specs to be removed

  • update_specs -- Specs to be updated

  • neutered_specs -- Specs to be neutered

Returns:

The plugin-defined post-transaction actions

get_package_extractors() dict[str, conda.plugins.types.CondaPackageExtractor]#

Return a mapping from file extension to package extractor plugin.

Extensions are lowercased for case-insensitive matching.

Returns:

Dictionary mapping lowercased extensions (e.g., ".conda") to their CondaPackageExtractor plugins.

get_package_extractor(source_full_path: conda.common.path.PathType) conda.plugins.types.CondaPackageExtractor#

Get the package extractor plugin for a given package path.

Searches through registered package extractor plugins to find one that handles the file extension of the provided package path.

Parameters:

source_full_path -- Full path to the package archive file.

Returns:

The matching CondaPackageExtractor plugin.

Raises:

PluginError -- If no registered extractor handles the file extension.

extract_package(source_full_path: conda.common.path.PathType, destination_directory: conda.common.path.PathType) None#

Extract a package archive to a destination directory.

Finds the appropriate extractor plugin based on the file extension and extracts the package.

Parameters:
  • source_full_path -- Full path to the package archive file.

  • destination_directory -- Directory to extract the package contents to.

Raises:

PluginError -- If no registered extractor handles the file extension.

has_package_extension(path: conda.common.path.PathType) str | None#

Check if a path has a supported package file extension.

Parameters:

path -- Path to check.

Returns:

The matched extension (lowercased) if found, None otherwise.

get_plugin_manager() CondaPluginManager#

Get a cached version of the CondaPluginManager instance, with the built-in and entrypoints provided by the plugins loaded.