From 9358211031e102c18692e6991ce5e4b8f51091b3 Mon Sep 17 00:00:00 2001 From: Jacob Callahan Date: Wed, 18 Sep 2024 15:54:54 -0400 Subject: [PATCH] Move provider validator registration to class construction This change simplifies the way we add provider validators to dynaconf. Instead of attempting to add new validators when a class instance is created, we instead add it when the class itself is created. This means that it will happen once immediately when broker is loaded. --- broker/providers/__init__.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/broker/providers/__init__.py b/broker/providers/__init__.py index 5f3ad5de..ae264038 100644 --- a/broker/providers/__init__.py +++ b/broker/providers/__init__.py @@ -65,18 +65,22 @@ def __new__(cls, name, bases, attrs): for attr, obj in attrs.items(): if attr == "provider_help": # register the help options based on the function arguments - for name, param in inspect.signature(obj).parameters.items(): - if name not in ("self", "kwargs"): - # {name: (cls, is_flag)} - PROVIDER_HELP[name] = ( + for _name, param in inspect.signature(obj).parameters.items(): + if _name not in ("self", "kwargs"): + # {_name: (cls, is_flag)} + PROVIDER_HELP[_name] = ( new_cls, isinstance(param.default, bool), ) - logger.debug(f"Registered help option {name} for provider {name}") + logger.debug(f"Registered help option {_name} for provider {_name}") elif hasattr(obj, "_as_action"): for action in obj._as_action: PROVIDER_ACTIONS[action] = (new_cls, attr) logger.debug(f"Registered action {action} for provider {name}") + # register provider settings validators + if validators := attrs.get("_validators"): + logger.debug(f"Adding {len(validators)} validators for {name}") + settings.validators.extend(validators) return new_cls @@ -143,9 +147,6 @@ def _validate_settings(self, instance_name=None): if not inst_vals.get("override_envars"): # if a provider instance doesn't want to override envars, load them settings.execute_loaders(loaders=[dynaconf.loaders.env_loader]) - new_validators = [v for v in self._validators if v not in settings.validators] - logger.debug(f"Adding new validators: {[v.names[0] for v in new_validators]}") - settings.validators.extend(new_validators) # use selective validation to only validate the instance settings try: settings.validators.validate(only=section_name)