Back to report index

Step 5 linebitmapinference 2b22449: AI3D-379 Review fixes: null vectorization section falls back to defaults

Miroslav Simko <ms@iolabs.ch> 2026-09-02T08:58:33+02:00

Commit #30 ยท 4 snippets

 src/iolabs_image_analyzer_line_bitmap_inference/_config.py | 9 ++++++++-
 tests/test_config.py                                       | 6 ++++++
 2 files changed, 14 insertions(+), 1 deletion(-)
Importance #1: src/iolabs_image_analyzer_line_bitmap_inference/_config.py @@ -14,8 +14,9 @@
14import os14import os
15from pathlib import Path15from pathlib import Path
16from typing import Any16from typing import Any
1717
18import pydantic
18from iolabs.common import config_loader19from iolabs.common import config_loader
1920
20logger = logging.getLogger(__name__)21logger = logging.getLogger(__name__)
2122
Importance #2: src/iolabs_image_analyzer_line_bitmap_inference/_config.py @@ -46,11 +47,17 @@
46 write_overlay: bool = False47 write_overlay: bool = False
47 probabilities_dtype: str = "float16"48 probabilities_dtype: str = "float16"
48 vectorization: VectorizationConfig = VectorizationConfig()49 vectorization: VectorizationConfig = VectorizationConfig()
4950
51 @pydantic.field_validator("vectorization", mode="before")
52 @classmethod
53 def _none_section_is_default(cls, value: Any) -> Any:
54 """Treat an explicit ``null`` section as "use the defaults"."""
55 return {} if value is None else value
56
5057
51class LineBitmapInferenceConfigError(config_loader.ConfigError):58class LineBitmapInferenceConfigError(config_loader.ConfigError):
52 """Raised when the inference config contains unsupported keys."""59 """Raised when the inference config contains unsupported keys or values."""
5360
5461
55def _config_path_for_load(config_path: str | Path | None) -> str | Path | None:62def _config_path_for_load(config_path: str | Path | None) -> str | Path | None:
56 """Return *config_path*, or the sibling JSON when this module is loaded loose."""63 """Return *config_path*, or the sibling JSON when this module is loaded loose."""
Importance #3: tests/test_config.py @@ -64,4 +64,10 @@
6464
65def test_bool_is_rejected_for_int_field() -> None:65def test_bool_is_rejected_for_int_field() -> None:
66 with pytest.raises(MODULE.LineBitmapInferenceConfigError, match="tile_size"):66 with pytest.raises(MODULE.LineBitmapInferenceConfigError, match="tile_size"):
67 MODULE.build_line_bitmap_inference_config(overrides={"tile_size": True})67 MODULE.build_line_bitmap_inference_config(overrides={"tile_size": True})
68
69
70def test_null_vectorization_section_falls_back_to_defaults() -> None:
71 config = MODULE.build_line_bitmap_inference_config(overrides={"vectorization": None})
72 assert config["vectorization"]["min_component_pixels"] == 16
73 assert config["vectorization"]["dash_max_gap_px"] == 40.0
Importance #4: tests/test_config.py @@ -64,4 +64,10 @@
6464
65def test_bool_is_rejected_for_int_field() -> None:65def test_bool_is_rejected_for_int_field() -> None:
66 with pytest.raises(MODULE.LineBitmapInferenceConfigError, match="tile_size"):66 with pytest.raises(MODULE.LineBitmapInferenceConfigError, match="tile_size"):
67 MODULE.build_line_bitmap_inference_config(overrides={"tile_size": True})67 MODULE.build_line_bitmap_inference_config(overrides={"tile_size": True})
68
69
70def test_null_vectorization_section_falls_back_to_defaults() -> None:
71 config = MODULE.build_line_bitmap_inference_config(overrides={"vectorization": None})
72 assert config["vectorization"]["min_component_pixels"] == 16
73 assert config["vectorization"]["dash_max_gap_px"] == 40.0