Skip to content

Commit 07bd6ba

Browse files
authored
Add BlueapiBaseModel config to ApplicationConfig (#794)
1 parent 0dbaf6e commit 07bd6ba

File tree

4 files changed

+30
-7
lines changed

4 files changed

+30
-7
lines changed

dev-requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ bidict==0.23.1
1818
bluesky==1.13
1919
bluesky-kafka==0.10.0
2020
bluesky-live==0.0.8
21-
bluesky-stomp==0.1.2
21+
bluesky-stomp==0.1.3
2222
boltons==24.1.0
2323
cachetools==5.5.0
2424
caproto==1.1.1

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ dependencies = [
3131
"dls-dodal>=1.36.2",
3232
"super-state-machine", # https://github.com/DiamondLightSource/blueapi/issues/553
3333
"GitPython",
34-
"bluesky-stomp>=0.1.2",
34+
"bluesky-stomp>=0.1.3",
3535
"event-model==1.22.1", # https://github.com/DiamondLightSource/blueapi/issues/684
3636
"opentelemetry-distro>=0.48b0",
3737
"opentelemetry-instrumentation-fastapi>=0.48b0",

src/blueapi/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ class SourceKind(str, Enum):
2626
DODAL = "dodal"
2727

2828

29-
class Source(BaseModel):
29+
class Source(BlueapiBaseModel):
3030
kind: SourceKind
3131
module: Path | str
3232

3333

34-
class StompConfig(BaseModel):
34+
class StompConfig(BlueapiBaseModel):
3535
"""
3636
Config for connecting to stomp broker
3737
"""

tests/unit_tests/test_config.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import inspect
12
import json
23
import os
34
import tempfile
4-
from collections.abc import Generator, Mapping
5+
from collections.abc import Generator, Iterable, Mapping
56
from pathlib import Path
67
from typing import Any
78
from unittest import mock
@@ -150,8 +151,6 @@ def test_auth_from_env_throws_when_not_available():
150151
# Eagerly throws an exception, will fail during initial loading
151152
with pytest.raises(KeyError):
152153
BasicAuthentication(username="${BAZ}", password="baz") # type: ignore
153-
with pytest.raises(KeyError):
154-
BasicAuthentication(username="${baz}", passcode="baz") # type: ignore
155154

156155

157156
def is_subset(subset: Mapping[str, Any], superset: Mapping[str, Any]) -> bool:
@@ -364,3 +363,27 @@ def test_oauth_config_model_post_init(
364363
assert oidc_config.issuer == oidc_well_known["issuer"]
365364
assert oidc_config.jwks_uri == oidc_well_known["jwks_uri"]
366365
assert oidc_config.end_session_endpoint == oidc_well_known["end_session_endpoint"]
366+
367+
368+
def test_extra_fields_are_forbidden_for_application_config():
369+
check_no_extra_fields(ApplicationConfig)
370+
371+
372+
def check_no_extra_fields(model_class: Any) -> None:
373+
if not inspect.isclass(model_class):
374+
return
375+
if issubclass(model_class, BaseModel):
376+
assert model_class.model_config.get("extra") == "forbid"
377+
for field in model_class.model_fields.keys():
378+
validate_field_annotations(model_class, field)
379+
380+
381+
def validate_field_annotations(model_class: Any, model_field: str) -> None:
382+
field_annotation = model_class.model_fields[model_field].annotation
383+
extracted_annotations = getattr(field_annotation, "__args__", field_annotation)
384+
385+
if isinstance(extracted_annotations, Iterable):
386+
for annotation in extracted_annotations:
387+
check_no_extra_fields(annotation)
388+
else:
389+
check_no_extra_fields(extracted_annotations)

0 commit comments

Comments
 (0)