pydantic-settings icon indicating copy to clipboard operation
pydantic-settings copied to clipboard

Create default templates (feature request)

Open A-Telfer opened this issue 1 year ago • 6 comments

Since a big part of pydantic-settings is accepting options from different sources (secrets, env, dotenv, json, yaml...) it would be nice if there were a way to also generate template files for them

Use example

There should be a way to separate Secret, SecretStr, and SecretBytes

from pydantic import Field, SecretStr, BaseModel
from pydantic_settings import BaseSettings
from typing import List

# Using a nested BaseSettings as there's no way to pass env variables to list items with BaseModels
class NestedSetting(BaseSettings):
    url: str
    password: SecretStr

class NestedModel(BaseModel):
    password: SecretStr 

class Sources(BaseSettings):
    whatever: int
    nested_settings: List[NestedSetting] = Field(default_factory=list)
    nested_model: NestedModel

config = Sources(
    whatever=1, 
    nested_settings =[
        {'url': 'a', 'password': 'b'}, 
        {'url': 'c', 'password': 'd'}
    ],
    nested_model = {'password': 'abc'}
)

then

config.template(secrets=False, format='dict')
{'whatever': 1, 'nested_settings': [{'url': 'a'}, {'url': 'a'}]

For secrets

config.template(only_secrets=True, format='env')
{"password": "*********", "nested_model__pasword": "***********"}

A-Telfer avatar May 11 '24 15:05 A-Telfer

Thanks @A-Telfer for this feature request. Agree, this would be a great addition. I am thinking about implementing a method on each sources like get_template, and the method returns data structure for that specific source.

hramezani avatar May 26 '24 14:05 hramezani

I just closed https://github.com/pydantic/pydantic-settings/issues/292 as duplicate of this ticket.

Knowing the name of a field (in #292 I was mostly interested in the representation as env var, but the same holds for any other representation) is quite useful. No more reading all the models and options to mentally compile / reconstruct the name of the field I'm interested in.

(I personal don't think of this feature as "templates", but naming is hard :shrug: )

Thinking out loud: template() should probably be a class method so that I don't need an instance of a config but can just get the structure/template based on the root class.

sotte avatar May 26 '24 15:05 sotte

Just curious any updates on this @hramezani ? I might take a crack at the get_template idea

A-Telfer avatar Jul 15 '24 15:07 A-Telfer

@A-Telfer it would be great!

hramezani avatar Jul 15 '24 15:07 hramezani

For format that supports it, we could have comments that include the type and the docstring

from pydantic import Field, SecretStr, BaseModel
from pydantic_settings import BaseSettings, SettingsConfigDict
from typing import List

class NestedSetting(BaseSettings):
    model_config = SettingsConfigDict(env_prefix="foo_")

    url: str
    """the nested setting URL."""

    password: SecretStr

# I think a class method would make more sense
template = NestedSetting.template(format="env")
print(template)
# FOO_URL: str
# the nested setting URL.
FOO_URL=

# FOO_PASSWORD: secret str
FOO_PASSWORD=

MarcBresson avatar Sep 20 '24 10:09 MarcBresson