diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 61ee6f2ad..412c6f25e 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -6,6 +6,8 @@ ## Upgrading +- Custom validators passed through a configuration dataclass field's `metadata` (as used by `load_config()` and `ConfigManager.new_receiver()`) must now raise a `marshmallow.ValidationError` to reject a value. `marshmallow` 4 removed support for validators that signal failure by returning `False`, so such validators are now ignored and the invalid value is accepted silently. This affects you as soon as `marshmallow` 4 is installed, which `frequenz-quantities` 1.0.2 and later require. + ## New Features diff --git a/tests/config/test_manager.py b/tests/config/test_manager.py index 7805eef5a..3a4341015 100644 --- a/tests/config/test_manager.py +++ b/tests/config/test_manager.py @@ -20,11 +20,24 @@ from frequenz.sdk.config._manager import _get_key +def _validate_name(value: str) -> None: + """Validate that a name starts with `test`. + + Args: + value: The name to validate. + + Raises: + marshmallow.ValidationError: If the name doesn't start with `test`. + """ + if not value.startswith("test"): + raise marshmallow.ValidationError("Invalid value.") + + @dataclass class SimpleConfig: """A simple configuration class for testing.""" - name: str = dataclasses.field(metadata={"validate": lambda s: s.startswith("test")}) + name: str = dataclasses.field(metadata={"validate": _validate_name}) value: int diff --git a/tests/config/test_util.py b/tests/config/test_util.py index 13283c165..c5beaa962 100644 --- a/tests/config/test_util.py +++ b/tests/config/test_util.py @@ -14,11 +14,24 @@ from frequenz.sdk.config._util import load_config +def _validate_name(value: str) -> None: + """Validate that a name starts with `test`. + + Args: + value: The name to validate. + + Raises: + marshmallow.ValidationError: If the name doesn't start with `test`. + """ + if not value.startswith("test"): + raise marshmallow.ValidationError("Invalid value.") + + @dataclasses.dataclass class SimpleConfig: """A simple configuration class for testing.""" - name: str = dataclasses.field(metadata={"validate": lambda s: s.startswith("test")}) + name: str = dataclasses.field(metadata={"validate": _validate_name}) value: int @@ -26,7 +39,7 @@ class SimpleConfig: class MmSimpleConfig: """A simple marshmallow_dataclass configuration class for testing.""" - name: str = dataclasses.field(metadata={"validate": lambda s: s.startswith("test")}) + name: str = dataclasses.field(metadata={"validate": _validate_name}) value: int