From 987ccc2b6f0ebe511b0258f3d98a2ca56799703f Mon Sep 17 00:00:00 2001 From: Taegyun Ha Date: Mon, 12 Jan 2026 18:07:17 +0000 Subject: [PATCH 1/3] fix typegen raising exception --- packages/open_vp_cal/src/open_vp_cal/led_wall_settings.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/open_vp_cal/src/open_vp_cal/led_wall_settings.py b/packages/open_vp_cal/src/open_vp_cal/led_wall_settings.py index d46402f..56e403f 100644 --- a/packages/open_vp_cal/src/open_vp_cal/led_wall_settings.py +++ b/packages/open_vp_cal/src/open_vp_cal/led_wall_settings.py @@ -21,6 +21,7 @@ from typing import List, Union, Any, Optional from typing import TYPE_CHECKING from pydantic import BaseModel, Field, field_validator, PrivateAttr, ConfigDict +from pydantic.json_schema import SkipJsonSchema from open_vp_cal.core import constants from open_vp_cal.core.structures import ProcessingResults @@ -81,11 +82,11 @@ class LedWallSettings(BaseModel): verification_wall: str = Field(default="") # ===== Runtime Fields (excluded from serialization) ===== - processing_results: ProcessingResults = Field( + processing_results: SkipJsonSchema[ProcessingResults] = Field( default_factory=ProcessingResults, exclude=True ) - separation_results: Optional[SeparationResults] = Field( + separation_results: SkipJsonSchema[Optional[SeparationResults]] = Field( default=None, exclude=True ) From 4f04344005c79ecbe7741aeedcb95a7e2d5ebc2d Mon Sep 17 00:00:00 2001 From: Taegyun Ha Date: Tue, 13 Jan 2026 09:30:09 +0000 Subject: [PATCH 2/3] remove serialize_nested serialize_nested cause a differece between generated datastructure and actual json serialised datastructure. Removing to resolve it. --- .../open_vp_cal/src/open_vp_cal/project_settings.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/packages/open_vp_cal/src/open_vp_cal/project_settings.py b/packages/open_vp_cal/src/open_vp_cal/project_settings.py index 8f3c7c4..d9364c1 100644 --- a/packages/open_vp_cal/src/open_vp_cal/project_settings.py +++ b/packages/open_vp_cal/src/open_vp_cal/project_settings.py @@ -28,7 +28,6 @@ field_validator, field_serializer, model_validator, - model_serializer, PrivateAttr, ConfigDict, ) @@ -128,16 +127,6 @@ def handle_nested_format(cls, data: Any) -> Any: return inner return data - @model_serializer(mode='wrap') - def serialize_nested(self, handler) -> dict: - """Output backwards-compatible nested JSON format.""" - data = handler(self) - version = data.pop('openvp_cal_version', open_vp_cal.__version__) - return { - constants.OpenVPCalSettingsKeys.VERSION: version, - constants.OpenVPCalSettingsKeys.PROJECT_SETTINGS: data - } - def __init__(self, led_wall_class: Optional[Type[LedWallSettings]] = None, **data): """Initialize a ProjectSettings object. From b37559a484b8aed04a88f94acff8228a122c9e90 Mon Sep 17 00:00:00 2001 From: Taegyun Ha Date: Wed, 14 Jan 2026 18:27:07 +0000 Subject: [PATCH 3/3] change processing_results and separation_results to PrivateAttr --- .../src/open_vp_cal/led_wall_settings.py | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/open_vp_cal/src/open_vp_cal/led_wall_settings.py b/packages/open_vp_cal/src/open_vp_cal/led_wall_settings.py index 56e403f..6384f6b 100644 --- a/packages/open_vp_cal/src/open_vp_cal/led_wall_settings.py +++ b/packages/open_vp_cal/src/open_vp_cal/led_wall_settings.py @@ -21,7 +21,6 @@ from typing import List, Union, Any, Optional from typing import TYPE_CHECKING from pydantic import BaseModel, Field, field_validator, PrivateAttr, ConfigDict -from pydantic.json_schema import SkipJsonSchema from open_vp_cal.core import constants from open_vp_cal.core.structures import ProcessingResults @@ -82,20 +81,35 @@ class LedWallSettings(BaseModel): verification_wall: str = Field(default="") # ===== Runtime Fields (excluded from serialization) ===== - processing_results: SkipJsonSchema[ProcessingResults] = Field( - default_factory=ProcessingResults, - exclude=True + _processing_results: ProcessingResults = PrivateAttr( + default_factory=ProcessingResults ) - separation_results: SkipJsonSchema[Optional[SeparationResults]] = Field( + _separation_results: Optional[SeparationResults] = PrivateAttr( default=None, - exclude=True ) + @property + def processing_results(self) -> ProcessingResults: + return self._processing_results + + @processing_results.setter + def processing_results(self, value: ProcessingResults): + self.processing_results = value + + @property + def separation_results(self) -> Optional[SeparationResults]: + return self._separation_results + + @separation_results.setter + def separation_results(self, value: SeparationResults): + self._separation_results = value + # ===== Private Attributes (not in schema at all) ===== _sequence_loader: Optional[SequenceLoader] = PrivateAttr(default=None) _sequence_loader_class: type = PrivateAttr(default=SequenceLoader) _project_settings: Optional["ProjectSettings"] = PrivateAttr(default=None) + @field_validator( "roi", mode="before",