pydantic: SecretStr with defaults seems broken
Hello again,
I just ran into an issue with the newly added SecretStr
support.
consider the following code:
import click
import typed_settings
from pydantic import BaseModel, Field, SecretStr
class Settings(BaseModel):
secret: SecretStr = Field(default="my secret")
@click.command()
@typed_settings.click_options(Settings, "myapp")
def cli(settings: Settings) -> None:
print(settings)
print(settings.secret.get_secret_value())
default_settings = Settings()
print(default_settings)
print(default_settings.secret.get_secret_value())
if __name__ == "__main__":
cli()
this will lead to:
secret=SecretStr('**********')
my secret
secret='my secret'
Traceback (most recent call last):
File "/src/foo.py", line 22, in <module>
cli()
File "/src/.venv/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/src/.venv/lib/python3.11/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/src/.venv/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/src/.venv/lib/python3.11/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/src/.venv/lib/python3.11/site-packages/typed_settings/cli_click.py", line 247, in new_func
return f(*args, **kwargs)
^^^^^^^^^^^^^^^^^^
File "/src/foo.py", line 18, in cli
print(default_settings.secret.get_secret_value())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'get_secret_value'
whereas:
class Settings(BaseModel):
secret: SecretStr = Field(default=SecretStr("my secret"))
will lead to:
secret=SecretStr('**********')
**********
secret=SecretStr('**********')
my secret
even tho pydantics documentation is somewhat thin on SecretStr
, I'm assuming Field(default=SecretStr("..."))
is the intended usage.
Searching through pydantics issues seems to indicate the same.
Edited by Stefan Scherfke