From 96f436b41daf8ab2f810be2d6710391eea0ba01a Mon Sep 17 00:00:00 2001 From: Jeffrey Martin Date: Fri, 21 Feb 2025 12:48:32 -0600 Subject: [PATCH] support `module.classname` config specification for plugins Original config support was intended to maintain this support in a deprecated format. Planned feature functionality suggests this should officially be maintained and is helpful to have aligned with how the cli accepts plugin values. Signed-off-by: Jeffrey Martin --- garak/configurable.py | 11 ++++------- tests/test_configurable.py | 9 +++++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/garak/configurable.py b/garak/configurable.py index efb9f5668..5868be9a9 100644 --- a/garak/configurable.py +++ b/garak/configurable.py @@ -33,6 +33,7 @@ def _load_config(self, config_root=_config): spec_type = namespace_parts[-2] namespace = namespace_parts[-1] classname = self.__class__.__name__ + namespaced_klass = f"{namespace}.{classname}" plugins_config = {} if isinstance(local_root, dict) and spec_type in local_root: plugins_config = local_root[spec_type] @@ -43,16 +44,12 @@ def _load_config(self, config_root=_config): # generators: `nim`/`openai`/`huggingface` # probes: `dan`/`gcg`/`xss`/`tap`/`promptinject` attributes = plugins_config[namespace] - namespaced_klass = f"{namespace}.{classname}" self._apply_config(attributes) if classname in attributes: self._apply_config(attributes[classname]) - elif namespaced_klass in plugins_config: - # for compatibility remove after - logging.warning( - f"Deprecated configuration key found: {namespaced_klass}" - ) - self._apply_config(plugins_config[namespaced_klass]) + elif namespaced_klass in plugins_config: + # maintain support for this as consistent with cli options at this time + self._apply_config(plugins_config[namespaced_klass]) self._apply_missing_instance_defaults() if hasattr(self, "ENV_VAR"): if not hasattr(self, "key_env_var"): diff --git a/tests/test_configurable.py b/tests/test_configurable.py index 7847f65b7..768e48185 100644 --- a/tests/test_configurable.py +++ b/tests/test_configurable.py @@ -50,6 +50,15 @@ def test_config_root_only(generator_sub_config): assert getattr(m, k) == v +# when a parameter is provided in config_root by `module.classname` set on the resulting object +def test_config_root_module_classname(generator_sub_config): + module_config = generator_sub_config.generators.pop("mock") + generator_sub_config.generators["mock.mockConfigurable"] = module_config + m = mockConfigurable(config_root=generator_sub_config) + for k, v in generator_sub_config.generators["mock.mockConfigurable"].items(): + assert getattr(m, k) == v + + # when a parameter is provided in config_root as a dict set on the resulting object def test_config_root_as_dict(generator_sub_config): config = {"generators": generator_sub_config.generators}