Skip to content

Commit 70a74d3

Browse files
committed
@sanderegg review: test origin of UserWarning, fixes issue in log validator and undos all warning
1 parent 52138b2 commit 70a74d3

File tree

33 files changed

+72
-52
lines changed

33 files changed

+72
-52
lines changed

packages/settings-library/setup.cfg

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ universal = 1
1414
# Define setup.py command aliases here
1515
test = pytest
1616

17-
# NOTE: uncomment when pytest-asyncio is added in requirements
18-
# [tool:pytest]
19-
# asyncio_mode = auto
17+
[tool:pytest]
18+
# SEE https://docs.pytest.org/en/stable/how-to/capture-warnings.html
19+
filterwarnings =
20+
error

packages/settings-library/src/settings_library/utils_logging.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
import logging
22
from functools import cached_property
33

4+
from common_library.basic_types import LogLevel
5+
46

57
class MixinLoggingSettings:
68
"""
79
USAGE example in packages/settings-library/tests/test_utils_logging.py::test_mixin_logging
810
"""
911

1012
@classmethod
11-
def validate_log_level(cls, value: str) -> str:
13+
def validate_log_level(cls, value: str) -> LogLevel:
1214
"""Standard implementation for @validator("LOG_LEVEL")"""
1315
try:
1416
getattr(logging, value.upper())
1517
except AttributeError as err:
1618
msg = f"{value.upper()} is not a valid level"
1719
raise ValueError(msg) from err
18-
return value.upper()
20+
return LogLevel(value.upper())
1921

2022
@cached_property
2123
def log_level(self) -> int:

packages/settings-library/tests/test__pydantic_settings.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,16 @@
1212
1313
"""
1414

15+
from typing import Annotated
16+
17+
import pytest
18+
from common_library.basic_types import LogLevel
1519
from common_library.pydantic_fields_extension import is_nullable
16-
from pydantic import ValidationInfo, field_validator
20+
from pydantic import AliasChoices, Field, ValidationInfo, field_validator
1721
from pydantic_core import PydanticUndefined
1822
from pydantic_settings import BaseSettings
1923
from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict
24+
from settings_library.application import BaseApplicationSettings
2025

2126

2227
def assert_field_specs(
@@ -168,3 +173,28 @@ def test_construct(monkeypatch):
168173
assert settings_from_both == settings_from_init.model_copy(
169174
update={"VALUE_NULLABLE_REQUIRED": 3}
170175
)
176+
177+
178+
class _TestSettings(BaseApplicationSettings):
179+
APP_LOGLEVEL: Annotated[
180+
LogLevel,
181+
Field(
182+
validation_alias=AliasChoices("APP_LOGLEVEL", "LOG_LEVEL"),
183+
),
184+
] = LogLevel.WARNING
185+
186+
187+
@pytest.mark.filterwarnings("error")
188+
def test_pydantic_serialization_user_warning(monkeypatch: pytest.MonkeyPatch):
189+
# This test is exploring the reason for `UserWarning`
190+
#
191+
# /python3.11/site-packages/pydantic/main.py:477: UserWarning: Pydantic serializer warnings:
192+
# Expected `enum` but got `str` with value `'WARNING'` - serialized value may not be as expected
193+
# return self.__pydantic_serializer__.to_json(
194+
#
195+
# NOTE: it seems settings.model_dump_json(warnings='none') is not the cause here of `UserWarning`
196+
monkeypatch.setenv("LOG_LEVEL", "DEBUG")
197+
198+
settings = _TestSettings.create_from_envs()
199+
assert settings.APP_LOGLEVEL == LogLevel.DEBUG
200+
assert settings.model_dump_json(indent=2)

packages/settings-library/tests/test_twilio.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def test_twilio_settings_within_envdevel(
2020
},
2121
)
2222
settings = TwilioSettings.create_from_envs()
23-
print(settings.model_dump_json(indent=2, warnings="none"))
23+
print(settings.model_dump_json(indent=2))
2424
assert settings
2525

2626

packages/settings-library/tests/test_utils_logging.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def _v(cls, value: str) -> str:
4242
assert settings.LOG_LEVEL == "DEBUG"
4343

4444
assert (
45-
settings.model_dump_json(warnings="none")
45+
settings.model_dump_json()
4646
== '{"SC_BOOT_MODE":null,"LOG_LEVEL":"DEBUG","APPNAME_DEBUG":false}'
4747
)
4848

scripts/maintenance/migrate_project/src/cli.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@
1414
def main(config: Path = typer.Option(..., exists=True)):
1515
assert config.exists() # nosec
1616
settings = Settings.load_from_file(config)
17-
typer.echo(
18-
f"Detected settings:\n{settings.model_dump_json(indent=2,warnings='none')}\n"
19-
)
17+
typer.echo(f"Detected settings:\n{settings.model_dump_json(indent=2)}\n")
2018

2119
r_clone_config_path = assemble_config_file(
2220
# source

services/agent/src/simcore_service_agent/core/application.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def _setup_logger(settings: ApplicationSettings):
4141
def create_app() -> FastAPI:
4242
settings = ApplicationSettings.create_from_envs()
4343
_setup_logger(settings)
44-
logger.debug(settings.model_dump_json(indent=2, warnings="none"))
44+
logger.debug(settings.model_dump_json(indent=2))
4545

4646
assert settings.SC_BOOT_MODE # nosec
4747
app = FastAPI(

services/api-server/src/simcore_service_api_server/core/application.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ def init_app(settings: ApplicationSettings | None = None) -> FastAPI:
5656
logger_filter_mapping=settings.API_SERVER_LOG_FILTER_MAPPING,
5757
tracing_settings=settings.API_SERVER_TRACING,
5858
)
59-
_logger.debug(
60-
"App settings:\n%s", settings.model_dump_json(indent=2, warnings="none")
61-
)
59+
_logger.debug("App settings:\n%s", settings.model_dump_json(indent=2))
6260

6361
# Labeling
6462
title = "osparc.io public API"

services/api-server/tests/unit/_with_db/test_core_settings__with_db.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
def test_unit_with_db_app_environment(app_environment: EnvVarsDict):
1414
settings = ApplicationSettings.create_from_envs()
15-
print("captured settings: \n", settings.model_dump_json(indent=2, warnings="none"))
15+
print("captured settings: \n", settings.model_dump_json(indent=2))
1616

1717
assert settings.SC_BOOT_MODE == BootModeEnum.PRODUCTION
1818
assert settings.log_level == logging.DEBUG

services/api-server/tests/unit/test_core_settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,4 @@ def app_environment(
3737
def test_unit_app_environment(app_environment: EnvVarsDict):
3838
assert app_environment
3939
settings = ApplicationSettings.create_from_envs()
40-
print("captured settings: \n", settings.model_dump_json(indent=2, warnings="none"))
40+
print("captured settings: \n", settings.model_dump_json(indent=2))

0 commit comments

Comments
 (0)