Skip to content

Commit

Permalink
Move provider validator registration to class construction
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
JacobCallahan committed Sep 20, 2024
1 parent 0bf360c commit 9358211
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions broker/providers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 9358211

Please sign in to comment.