-
Notifications
You must be signed in to change notification settings - Fork 17
Allow passing a base_schema
to load_config()
#1103
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
src/frequenz/sdk/config/_util.py
Outdated
dictionary using [`marshmallow.Schema.load`][] (which in turn uses the | ||
[`marshmallow.Schema.load`][] method to do the validation and deserialization). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
using [
marshmallow.Schema.load
][] (which in turn uses the [marshmallow.Schema.load
]
Wrong name?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, the first one should be class_schema
. Will update.
e89fa91
to
13ab089
Compare
Make it more explicit that this is just a wrapper to external libraries so users should read their documentation in full and which functions are used exactly. Signed-off-by: Leandro Lucarella <[email protected]>
`marshmallow_dataclass.dataclass` is intended to be used only when using `my_dataclass.Schema` to get the schema. But using this is not very convenient when using type hints as they are not well supported by `marshmallow`, as the `load()` function can't have hints. This is actually why `load_config()` exists in the first place, so we are using `class_schema()` instead, so we don't really need that our types are decorated with `marshmallow_dataclass`, we can use the built-in `dataclass` instead, we just need to add the appropriate metadata if we want more complex validation. Using `class_shema()` is also necessary to be able to pass a `base_schema`, which we'll need when we want to use schemas with custom fields, like the ones provided by `frequenz.quantities`. Because of this, we just drop support for `marshmallow_dataclass.dataclass` and we'll require that built-in dataclasses are used in the future. Signed-off-by: Leandro Lucarella <[email protected]>
This is necessary to use custom fields when loading configurations. Signed-off-by: Leandro Lucarella <[email protected]>
This is just the last step to be able to enforce via the type system that only built-in dataclasses are used. Signed-off-by: Leandro Lucarella <[email protected]>
13ab089
to
1be3d2c
Compare
Updated. |
This PR adds a new argument to
load_config()
to allow passing abase_schema
to be used when loading the configuration. This is necessary to be able to use custom fields in the schema, like the ones provided byfrequenz.quantities
.It also drops support for using
marshmallow_dataclas.dataclass
directly.marshmallow_dataclass.dataclass
is intended to be used only when usingmy_dataclass.Schema
to get the schema. But using this is not very convenient when using type hints as they are not well-supported bymarshmallow
, as theload()
function can't have hints.This is actually why
load_config()
exists in the first place, so we are usingclass_schema()
instead, so we don't really need that our types are decorated withmarshmallow_dataclass
, we can use the built-indataclass
instead, we just need to add the appropriate metadata if we want more complex validation.Using
class_shema()
is also necessary to be able to pass abase_schema
, which we'll need when we want to use schemas with custom fields, like the ones provided byfrequenz.quantities
.Finally, it improves
load_config
documentation to make it more explicit that this is just a wrapper to external libraries, so users should read their documentation in full and which functions are used exactly.