Library which extends pydantic functionality in scope of application settings. Pydantic already have settings implementation, e.g. pydantic.BaseSettings
, but from my point it’s missing some useful features:
- Overriding settings values by environment variables even for nested fields
- Providing detailed information about value location inside a loaded file or environment variable, which helps to point user mistake
- Documenting model fields isn’t feels comfortable, but it’s really essential to write comprehensive documentation for application settings
Using pip:
pip install pydantic-settings
Allows to override values for nested fields if they are represented as pydantic model.
Here is example:
from pydantic import BaseModel
from pydantic_settings import BaseSettingsModel, load_settings
class ComponentOptions(BaseModel):
val: str
class AppSettings(BaseSettingsModel):
class Config:
env_prefix = 'FOO'
component: ComponentOptions
assert (
load_settings(
AppSettings,
'{}',
load_env=True,
type_hint='json',
environ={'FOO_COMPONENT_VAL': 'SOME VALUE'},
).component.val
== 'SOME VALUE'
)
from pydantic import ValidationError, IntegerError
from pydantic_settings import BaseSettingsModel, load_settings, TextLocation
from pydantic_settings.errors import ExtendedErrorWrapper
class Foo(BaseSettingsModel):
val: int
try:
load_settings(Foo, '{"val": "NOT AN INT"}', type_hint='json')
except ValidationError as e:
err_wrapper, *_ = e.raw_errors
assert isinstance(err_wrapper, ExtendedErrorWrapper)
assert isinstance(err_wrapper.exc, IntegerError)
assert err_wrapper.source_loc == TextLocation(
line=1, col=9, end_line=1, end_col=21, pos=9, end_pos=20
)
else:
raise Exception('must rise error')
Allows to extract Sphinx style attributes documentation by processing AST tree of class definition
from pydantic import BaseModel
from pydantic_settings import with_attrs_docs
@with_attrs_docs
class Foo(BaseModel):
bar: str
"""here is docs"""
#: docs for baz
baz: int
#: yes
#: of course
is_there_multiline: bool = True
assert Foo.__fields__['bar'].field_info.description == 'here is docs'
assert Foo.__fields__['baz'].field_info.description == 'docs for baz'
assert Foo.__fields__['is_there_multiline'].field_info.description == (
'yes\nof course'
)
Read more detailed documentation on the project Read The Docs page.
Project requires poetry for development setup.
- If you aren’t have it already
pip install poetry
- Install project dependencies
poetry install
- Run tests
poetry run pytest .
- Great, all works! Expect one optional step:
- Install pre-commit for pre-commit hooks
pip install pre-commit
pre-commit install
That will install pre-commit hooks, which will check code with flake8 and black.