11from __future__ import annotations
22
3+ from collections .abc import Iterable
4+ from typing import Any
5+
6+ from model_metadata .errors import UnknownKeyError
37from model_metadata .model_setup import FileSystemLoader
48from model_metadata .model_setup import OldFileSystemLoader
59from model_metadata .modelmetadata import ModelMetadata
@@ -52,7 +56,10 @@ def query(model: str, var: str) -> ModelMetadata:
5256
5357
5458def stage (
55- model : str , dest : str = "." , old_style_templates : bool = False
59+ model : str ,
60+ dest : str = "." ,
61+ old_style_templates : bool = False ,
62+ parameters : dict [str , Any ] | None = None ,
5663) -> tuple [str , ...]:
5764 """Stage a model by setting up its input files.
5865
@@ -62,18 +69,39 @@ def stage(
6269 The model is interpreted either as a path to a folder that
6370 contains metadata, the name of a model component, or a
6471 model object.
65- dest : str
72+ dest : str, optional
6673 Path to a folder within which to stage the model.
74+ parameters : dict[str, Any], optional
75+ A dictionary of parameters that overrides the default
76+ values.
6777 """
78+ parameters = {} if parameters is None else parameters
79+
6880 defaults = {}
6981 mmd = ModelMetadata .find (model )
7082 meta = ModelMetadata (mmd )
7183 for param , item in meta .parameters .items ():
7284 defaults [param ] = item ["value" ]["default" ]
7385
86+ try :
87+ _check_for_unknown_keys (defaults .keys (), parameters .keys ())
88+ except UnknownKeyError as e :
89+ e .add_note (
90+ f"valid parameter{ 's' if len (defaults ) > 1 else '' } :"
91+ f" { ', ' .join (sorted (repr (k ) for k in defaults ))} "
92+ )
93+ raise
94+
95+ defaults = {** defaults , ** parameters }
96+
7497 if old_style_templates :
7598 manifest = OldFileSystemLoader (mmd ).stage_all (dest , ** defaults )
7699 else :
77100 manifest = FileSystemLoader (mmd ).stage_all (dest , ** defaults )
78101
79102 return manifest
103+
104+
105+ def _check_for_unknown_keys (allowed : Iterable [str ], user : Iterable [str ]) -> None :
106+ if unknown_keys := (set (user ) - set (allowed )):
107+ raise UnknownKeyError (unknown_keys )
0 commit comments