Skip to content

danields761/pydantic-settings

Repository files navigation

Pydantic settings

image

image

image

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:

  1. Overriding settings values by environment variables even for nested fields
  2. Providing detailed information about value location inside a loaded file or environment variable, which helps to point user mistake
  3. Documenting model fields isn’t feels comfortable, but it’s really essential to write comprehensive documentation for application settings

Installation

Using pip:

pip install pydantic-settings

Usage example

Override values by env variables

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'
)

Point exact error location inside file

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')

Extracts fields documentation

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'
)

Online docs

Read more detailed documentation on the project Read The Docs page.

Development setup

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.

About

Hipster-orgazmic tool to mange application settings

Resources

Stars

Watchers

Forks

Packages

No packages published