From 41da98c0e2a36c5a0dd50f048137afc48f408cb3 Mon Sep 17 00:00:00 2001 From: Jeroen Dekkers Date: Mon, 8 Jan 2024 21:27:15 +0100 Subject: [PATCH] Add support for env_prefix config setting --- src/settings_doc/main.py | 2 +- tests/fixtures/valid_settings.py | 8 +++++++- tests/integration/generate/test_import_module_path.py | 3 +++ tests/unit/test_markdown.py | 6 ++++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/settings_doc/main.py b/src/settings_doc/main.py index aafb011..9deddc9 100644 --- a/src/settings_doc/main.py +++ b/src/settings_doc/main.py @@ -68,7 +68,7 @@ def _model_fields(settings: Set[Type[BaseSettings]]) -> Iterator[Tuple[str, Fiel else: LOGGER.error(f"Unsupported validation alias type '{type(model_field.validation_alias)}'.") else: - yield field_name, model_field + yield cls.model_config["env_prefix"] + field_name, model_field @app.command() diff --git a/tests/fixtures/valid_settings.py b/tests/fixtures/valid_settings.py index e6ff515..3aeca02 100644 --- a/tests/fixtures/valid_settings.py +++ b/tests/fixtures/valid_settings.py @@ -1,7 +1,7 @@ from typing import Literal from pydantic import AliasChoices, AliasPath, Field -from pydantic_settings import BaseSettings +from pydantic_settings import BaseSettings, SettingsConfigDict SETTINGS_ATTR = "logging_level" SETTINGS_MARKDOWN_FIRST_LINE = f"# `{SETTINGS_ATTR}`\n" @@ -64,3 +64,9 @@ class ValidationAliasPathSettings(BaseSettings): class ValidationAliasChoicesSettings(BaseSettings): logging_level: str = Field(..., validation_alias=AliasChoices("logging", "level")) + + +class EnvPrefixSettings(BaseSettings): + logging_level: str + + model_config = SettingsConfigDict(env_prefix="PREFIX_") diff --git a/tests/integration/generate/test_import_module_path.py b/tests/integration/generate/test_import_module_path.py index 9ba408e..97c0890 100644 --- a/tests/integration/generate/test_import_module_path.py +++ b/tests/integration/generate/test_import_module_path.py @@ -9,6 +9,7 @@ from tests.fixtures.module_with_single_settings_class import SingleSettingsInModule from tests.fixtures.valid_settings import ( EmptySettings, + EnvPrefixSettings, ExamplesSettings, FullSettings, MultipleSettings, @@ -44,6 +45,7 @@ class TestImportModulePath: ValidationAliasPathSettings, ValidationAliasChoicesSettings, ExamplesSettings, + EnvPrefixSettings, }, id="for a module with multiple matching classes", ), @@ -60,6 +62,7 @@ class TestImportModulePath: ValidationAliasPathSettings, ValidationAliasChoicesSettings, ExamplesSettings, + EnvPrefixSettings, }, id="for multiple modules with multiple matching classes", ), diff --git a/tests/unit/test_markdown.py b/tests/unit/test_markdown.py index 15e0898..517e570 100644 --- a/tests/unit/test_markdown.py +++ b/tests/unit/test_markdown.py @@ -11,6 +11,7 @@ from tests.fixtures.valid_settings import ( SETTINGS_MARKDOWN_FIRST_LINE, EmptySettings, + EnvPrefixSettings, ExamplesSettings, FullSettings, MultipleSettings, @@ -199,3 +200,8 @@ def should_put_empty_line_before_second_header(runner: CliRunner, mocker: Mocker def should_end_with_a_single_empty_line(runner: CliRunner, mocker: MockerFixture): stdout = run_app_with_settings(mocker, runner, MultipleSettings) assert not stdout.endswith("`\n\n"), f"'{stdout}' ends with empty line" + + @staticmethod + def should_include_env_prefix(runner: CliRunner, mocker: MockerFixture): + expected_string = "# `prefix_logging_level`\n\n**required**\n\n" + assert run_app_with_settings(mocker, runner, EnvPrefixSettings) == expected_string