Skip to content

Commit a921dd6

Browse files
authored
Merge pull request #25 from community-of-python/vrslev-patch-6
Add env-var aliases to improve compatibility with existing internal services and pipelines
2 parents cc1edab + 9120ab7 commit a921dd6

File tree

6 files changed

+77
-22
lines changed

6 files changed

+77
-22
lines changed

.pre-commit-config.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
repos:
22
- repo: https://github.com/pre-commit/mirrors-mypy
3-
rev: v1.10.1
3+
rev: v1.11.2
44
hooks:
55
- id: mypy
66
name: mypy
77
always_run: true
8+
additional_dependencies: [pydantic>=2.3.4]
89
- repo: https://github.com/astral-sh/ruff-pre-commit
9-
rev: v0.5.0
10+
rev: v0.6.9
1011
hooks:
1112
- id: ruff
1213
name: ruff-check

microbootstrap/instruments/prometheus_instrument.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,5 @@ def is_ready(self) -> bool:
3636
)
3737

3838
@classmethod
39-
def get_config_type(cls) -> type[BasePrometheusConfig]:
40-
return BasePrometheusConfig
39+
def get_config_type(cls) -> type[PrometheusConfigT]:
40+
return BasePrometheusConfig # type: ignore[return-value]

microbootstrap/settings.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import os
33
import typing
44

5+
import pydantic
56
import pydantic_settings
67

78
from microbootstrap import (
@@ -16,7 +17,8 @@
1617

1718

1819
SettingsT = typing.TypeVar("SettingsT", bound="BaseServiceSettings")
19-
ENVIRONMENT_PREFIX: typing.Final = "ENVIRONMENT_PREFIX"
20+
ENV_PREFIX_VAR_NAME: typing.Final = "ENVIRONMENT_PREFIX"
21+
ENV_PREFIX: typing.Final = os.getenv(ENV_PREFIX_VAR_NAME, "")
2022

2123

2224
# TODO: add offline docs and cors support # noqa: TD002
@@ -25,9 +27,13 @@ class BaseServiceSettings(
2527
):
2628
service_debug: bool = True
2729
service_environment: str | None = None
28-
service_name: str = "micro-service"
30+
service_name: str = pydantic.Field(
31+
"micro-service", validation_alias=pydantic.AliasChoices("SERVICE_NAME", f"{ENV_PREFIX}SERVICE_NAME")
32+
)
2933
service_description: str = "Micro service description"
30-
service_version: str = "1.0.0"
34+
service_version: str = pydantic.Field(
35+
"1.0.0", validation_alias=pydantic.AliasChoices("CI_COMMIT_TAG", f"{ENV_PREFIX}SERVICE_VERSION")
36+
)
3137
service_static_path: str = "/static"
3238

3339
server_host: str = "0.0.0.0" # noqa: S104
@@ -37,7 +43,7 @@ class BaseServiceSettings(
3743

3844
model_config = pydantic_settings.SettingsConfigDict(
3945
env_file=".env",
40-
env_prefix=os.getenv(ENVIRONMENT_PREFIX, ""),
46+
env_prefix=ENV_PREFIX,
4147
env_file_encoding="utf-8",
4248
populate_by_name=True,
4349
)

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ requires = ["poetry-core"]
9696
build-backend = "poetry.core.masonry.api"
9797

9898
[tool.mypy]
99+
plugins = ["pydantic.mypy"]
99100
files = ["microbootstrap", "tests"]
100101
python_version = "3.9"
101102
strict = true

tests/conftest.py

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
from __future__ import annotations
2+
import importlib
3+
import typing
24
from unittest.mock import AsyncMock, MagicMock
35

46
import litestar
57
import pytest
68

9+
import microbootstrap.settings
710
from microbootstrap import (
811
FastApiPrometheusConfig,
912
LitestarPrometheusConfig,
@@ -26,47 +29,47 @@ def anyio_backend() -> str:
2629
return "asyncio"
2730

2831

29-
@pytest.fixture()
32+
@pytest.fixture
3033
def default_litestar_app() -> litestar.Litestar:
3134
return litestar.Litestar()
3235

3336

34-
@pytest.fixture()
37+
@pytest.fixture
3538
def minimal_sentry_config() -> SentryConfig:
3639
return SentryConfig(sentry_dsn="https://[email protected]/0")
3740

3841

39-
@pytest.fixture()
42+
@pytest.fixture
4043
def minimal_logging_config() -> LoggingConfig:
4144
return LoggingConfig(service_debug=False)
4245

4346

44-
@pytest.fixture()
47+
@pytest.fixture
4548
def minimal_base_prometheus_config() -> BasePrometheusConfig:
4649
return BasePrometheusConfig()
4750

4851

49-
@pytest.fixture()
52+
@pytest.fixture
5053
def minimal_fastapi_prometheus_config() -> FastApiPrometheusConfig:
5154
return FastApiPrometheusConfig()
5255

5356

54-
@pytest.fixture()
57+
@pytest.fixture
5558
def minimal_litestar_prometheus_config() -> LitestarPrometheusConfig:
5659
return LitestarPrometheusConfig()
5760

5861

59-
@pytest.fixture()
62+
@pytest.fixture
6063
def minimal_swagger_config() -> SwaggerConfig:
6164
return SwaggerConfig()
6265

6366

64-
@pytest.fixture()
65-
def minimal_cors_config() -> SwaggerConfig:
67+
@pytest.fixture
68+
def minimal_cors_config() -> CorsConfig:
6669
return CorsConfig(cors_allowed_origins=["*"])
6770

6871

69-
@pytest.fixture()
72+
@pytest.fixture
7073
def minimal_opentelemetry_config() -> OpentelemetryConfig:
7174
return OpentelemetryConfig(
7275
service_name="test-micro-service",
@@ -77,21 +80,27 @@ def minimal_opentelemetry_config() -> OpentelemetryConfig:
7780
)
7881

7982

80-
@pytest.fixture()
83+
@pytest.fixture
8184
def base_settings() -> BaseServiceSettings:
8285
return BaseServiceSettings()
8386

8487

85-
@pytest.fixture()
88+
@pytest.fixture
8689
def magic_mock() -> MagicMock:
8790
return MagicMock()
8891

8992

90-
@pytest.fixture()
93+
@pytest.fixture
9194
def async_mock() -> AsyncMock:
9295
return AsyncMock()
9396

9497

95-
@pytest.fixture()
98+
@pytest.fixture
9699
def console_writer() -> ConsoleWriter:
97100
return ConsoleWriter(writer_enabled=False)
101+
102+
103+
@pytest.fixture
104+
def reset_reloaded_settings_module() -> typing.Iterator[None]:
105+
yield
106+
importlib.reload(microbootstrap.settings)

tests/test_settings.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import importlib
2+
3+
import pytest
4+
5+
import microbootstrap.settings
6+
7+
8+
pytestmark = [pytest.mark.usefixtures("reset_reloaded_settings_module")]
9+
10+
11+
@pytest.mark.parametrize("alias", ["SERVICE_NAME", "MY_SERVICE_SERVICE_NAME"])
12+
def test_settings_service_name_aliases(monkeypatch: pytest.MonkeyPatch, alias: str) -> None:
13+
monkeypatch.setenv("ENVIRONMENT_PREFIX", "MY_SERVICE_")
14+
monkeypatch.setenv(alias, "my service")
15+
importlib.reload(microbootstrap.settings)
16+
17+
settings = microbootstrap.settings.BaseServiceSettings()
18+
assert settings.service_name == "my service"
19+
20+
21+
def test_settings_service_name_default() -> None:
22+
settings = microbootstrap.settings.BaseServiceSettings()
23+
assert settings.service_name == "micro-service"
24+
25+
26+
@pytest.mark.parametrize("alias", ["CI_COMMIT_TAG", "MY_SERVICE_SERVICE_VERSION"])
27+
def test_settings_service_version_aliases(monkeypatch: pytest.MonkeyPatch, alias: str) -> None:
28+
monkeypatch.setenv("ENVIRONMENT_PREFIX", "MY_SERVICE_")
29+
monkeypatch.setenv(alias, "1.2.3")
30+
importlib.reload(microbootstrap.settings)
31+
32+
settings = microbootstrap.settings.BaseServiceSettings()
33+
assert settings.service_version == "1.2.3"
34+
35+
36+
def test_settings_service_version_default() -> None:
37+
settings = microbootstrap.settings.BaseServiceSettings()
38+
assert settings.service_version == "1.0.0"

0 commit comments

Comments
 (0)