From 102ff7cff39365d48e5915dab4feb09b24603584 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Mon, 24 Nov 2025 15:47:42 +0100 Subject: [PATCH 1/2] Use recipe from conda environment --- .../src/climate_ref_esmvaltool/diagnostics/base.py | 8 +++++++- .../src/climate_ref_esmvaltool/recipe.py | 14 +++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/base.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/base.py index 8b8e3652b..d6bd4dc49 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/base.py +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/base.py @@ -101,11 +101,17 @@ def write_recipe(self, definition: ExecutionDefinition) -> Path: : The path to the written recipe. """ + recipe_dir = None + if (env_path := definition.diagnostic.provider.env_path).exists(): # type: ignore[attr-defined] + # Use the recipe from the conda environment if available. + subdir = Path("lib").joinpath("python*", "site-packages", "esmvaltool", "recipes") + if recipe_dirs := sorted(env_path.glob(str(subdir))): + recipe_dir = recipe_dirs[-1] + recipe = load_recipe(self.base_recipe, recipe_dir) input_files = { project: dataset_collection.datasets for project, dataset_collection in definition.datasets.items() } - recipe = load_recipe(self.base_recipe) self.update_recipe(recipe, input_files) recipe_txt = yaml.safe_dump(recipe, sort_keys=False) logger.info(f"Using ESMValTool recipe:\n{recipe_txt}") diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipe.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipe.py index 2cb6fb808..62101b4b4 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipe.py +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipe.py @@ -6,6 +6,7 @@ import pooch import yaml +from loguru import logger from climate_ref_esmvaltool.types import Recipe @@ -160,19 +161,30 @@ def dataframe_to_recipe( _RECIPES.load_registry(_buffer) -def load_recipe(recipe: str) -> Recipe: +def load_recipe(recipe: str, path: Path | None) -> Recipe: """Load a recipe. Parameters ---------- recipe The name of an ESMValTool recipe. + path: + The path where the ESMValTool recipes are located. If None, use the + default path for the recipe registry. Returns ------- The loaded recipe. """ + if path is not None: + # Override default registry path. + previous_path = _RECIPES.path # type: ignore[attr-defined] + _RECIPES.path = path # type: ignore[attr-defined] filename = _RECIPES.fetch(recipe) + if path is not None: + # Restore previous registry path. + _RECIPES.path = previous_path # type: ignore[attr-defined] + logger.info(f"Updating recipe from {filename}") def normalize(obj: Any) -> Any: # Ensure objects in the recipe are not shared. From 0be7e6b008c18ffcba797b0f82ce5fa8eb29e6df Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Mon, 24 Nov 2025 15:52:02 +0100 Subject: [PATCH 2/2] Add changelog --- changelog/471.improvement.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog/471.improvement.md diff --git a/changelog/471.improvement.md b/changelog/471.improvement.md new file mode 100644 index 000000000..59a0e853d --- /dev/null +++ b/changelog/471.improvement.md @@ -0,0 +1 @@ +Use ESMValTool recipes from the conda environment if it is available.