From a03af412a7b04039c93f605a12b923760c3ce857 Mon Sep 17 00:00:00 2001 From: Dirk-Jan Faber Date: Wed, 30 Sep 2026 19:31:11 +0200 Subject: [PATCH] Build pydantic validators on first use to reduce memory Importing s2python built the validators and serializers of all 126 models, which costs about 10 MB of memory, while applications typically use only a few of them. - Generate the models with an S2BaseModel base class that sets defer_build=True. - The message classes copied config and fields from the generated models by reference, so pydantic modified the generated models when the subclasses were created. That went unnoticed as long as the generated models were built first, but broke with deferred building. Copy them with the new copy_config() and copy_field() helpers instead. The JSON schemas of all public models are unchanged. On an ARM device with pydantic 2.7.4 memory use drops from 10.3 MB to 6.7 MB. --- ci/generate_s2.sh | 2 +- src/s2python/common/handshake.py | 7 +- src/s2python/common/handshake_response.py | 7 +- .../common/instruction_status_update.py | 9 +- src/s2python/common/number_range.py | 4 +- src/s2python/common/power_forecast.py | 9 +- src/s2python/common/power_forecast_element.py | 9 +- src/s2python/common/power_forecast_value.py | 4 +- src/s2python/common/power_measurement.py | 9 +- src/s2python/common/power_range.py | 4 +- src/s2python/common/power_value.py | 4 +- src/s2python/common/reception_status.py | 7 +- .../common/resource_manager_details.py | 15 ++- src/s2python/common/revoke_object.py | 9 +- src/s2python/common/role.py | 4 +- src/s2python/common/select_control_type.py | 7 +- src/s2python/common/session_request.py | 7 +- src/s2python/common/timer.py | 9 +- src/s2python/common/transition.py | 19 +-- .../ddbc/ddbc_actuator_description.py | 17 +-- src/s2python/ddbc/ddbc_actuator_status.py | 17 +-- .../ddbc/ddbc_average_demand_rate_forecast.py | 9 +- ...bc_average_demand_rate_forecast_element.py | 16 ++- src/s2python/ddbc/ddbc_instruction.py | 15 ++- src/s2python/ddbc/ddbc_operation_mode.py | 15 ++- src/s2python/ddbc/ddbc_system_description.py | 19 +-- src/s2python/ddbc/ddbc_timer_status.py | 11 +- .../frbc/frbc_actuator_description.py | 19 +-- src/s2python/frbc/frbc_actuator_status.py | 17 +-- .../frbc/frbc_fill_level_target_profile.py | 11 +- .../frbc_fill_level_target_profile_element.py | 11 +- src/s2python/frbc/frbc_instruction.py | 13 +- src/s2python/frbc/frbc_leakage_behaviour.py | 11 +- .../frbc/frbc_leakage_behaviour_element.py | 9 +- src/s2python/frbc/frbc_operation_mode.py | 9 +- .../frbc/frbc_operation_mode_element.py | 19 +-- src/s2python/frbc/frbc_storage_description.py | 9 +- src/s2python/frbc/frbc_storage_status.py | 7 +- src/s2python/frbc/frbc_system_description.py | 13 +- src/s2python/frbc/frbc_timer_status.py | 11 +- src/s2python/frbc/frbc_usage_forecast.py | 9 +- .../frbc/frbc_usage_forecast_element.py | 7 +- src/s2python/generated/gen_s2.py | 126 +++++++++--------- src/s2python/ombc/ombc_instruction.py | 15 ++- src/s2python/ombc/ombc_operation_mode.py | 15 ++- src/s2python/ombc/ombc_status.py | 9 +- src/s2python/ombc/ombc_system_description.py | 15 ++- src/s2python/ombc/ombc_timer_status.py | 9 +- src/s2python/pebc/pebc_allowed_limit_range.py | 17 +-- src/s2python/pebc/pebc_energy_constraint.py | 15 ++- src/s2python/pebc/pebc_instruction.py | 15 ++- src/s2python/pebc/pebc_power_constraints.py | 17 +-- src/s2python/pebc/pebc_power_envelope.py | 13 +- .../pebc/pebc_power_envelope_element.py | 9 +- .../ppbc/ppbc_end_interruption_instruction.py | 25 ++-- .../ppbc/ppbc_power_profile_definition.py | 11 +- .../ppbc/ppbc_power_profile_status.py | 9 +- src/s2python/ppbc/ppbc_power_sequence.py | 19 +-- .../ppbc/ppbc_power_sequence_container.py | 11 +- .../ppbc_power_sequence_container_status.py | 21 +-- .../ppbc/ppbc_power_sequence_element.py | 11 +- .../ppbc/ppbc_schedule_instruction.py | 21 +-- .../ppbc_start_interruption_instruction.py | 25 ++-- src/s2python/s2_base_model.py | 13 ++ src/s2python/validate_values_mixin.py | 22 +++ tests/unit/copy_config_test.py | 30 +++++ tests/unit/copy_field_test.py | 29 ++++ tests/unit/s2_base_model_test.py | 20 +++ 68 files changed, 578 insertions(+), 403 deletions(-) create mode 100644 src/s2python/s2_base_model.py create mode 100644 tests/unit/copy_config_test.py create mode 100644 tests/unit/copy_field_test.py create mode 100644 tests/unit/s2_base_model_test.py diff --git a/ci/generate_s2.sh b/ci/generate_s2.sh index a6e5142..8de62db 100755 --- a/ci/generate_s2.sh +++ b/ci/generate_s2.sh @@ -2,4 +2,4 @@ . .venv/bin/activate -datamodel-codegen --input specification/openapi.yml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output src/s2python/generated/gen_s2.py --use-one-literal-as-default --use-subclass-enum --output-datetime-class AwareDatetime --use-double-quotes +datamodel-codegen --input specification/openapi.yml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output src/s2python/generated/gen_s2.py --use-one-literal-as-default --use-subclass-enum --output-datetime-class AwareDatetime --use-double-quotes --base-class s2python.s2_base_model.S2BaseModel diff --git a/src/s2python/common/handshake.py b/src/s2python/common/handshake.py index 55e1c7d..7b1ff4b 100644 --- a/src/s2python/common/handshake.py +++ b/src/s2python/common/handshake.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import Handshake as GenHandshake from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,7 +11,6 @@ @catch_and_convert_exceptions class Handshake(GenHandshake, S2MessageComponent): - model_config = GenHandshake.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenHandshake.model_config, validate_assignment=True) - message_id: uuid.UUID = GenHandshake.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenHandshake.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/common/handshake_response.py b/src/s2python/common/handshake_response.py index a451e42..24060df 100644 --- a/src/s2python/common/handshake_response.py +++ b/src/s2python/common/handshake_response.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import HandshakeResponse as GenHandshakeResponse from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,7 +11,6 @@ @catch_and_convert_exceptions class HandshakeResponse(GenHandshakeResponse, S2MessageComponent): - model_config = GenHandshakeResponse.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenHandshakeResponse.model_config, validate_assignment=True) - message_id: uuid.UUID = GenHandshakeResponse.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenHandshakeResponse.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/common/instruction_status_update.py b/src/s2python/common/instruction_status_update.py index 73732e8..0e5495d 100644 --- a/src/s2python/common/instruction_status_update.py +++ b/src/s2python/common/instruction_status_update.py @@ -4,6 +4,8 @@ InstructionStatusUpdate as GenInstructionStatusUpdate, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -11,8 +13,7 @@ @catch_and_convert_exceptions class InstructionStatusUpdate(GenInstructionStatusUpdate, S2MessageComponent): - model_config = GenInstructionStatusUpdate.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenInstructionStatusUpdate.model_config, validate_assignment=True) - message_id: uuid.UUID = GenInstructionStatusUpdate.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - instruction_id: uuid.UUID = GenInstructionStatusUpdate.model_fields["instruction_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenInstructionStatusUpdate.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + instruction_id: uuid.UUID = copy_field(GenInstructionStatusUpdate.model_fields["instruction_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/common/number_range.py b/src/s2python/common/number_range.py index 5b6af75..404b136 100644 --- a/src/s2python/common/number_range.py +++ b/src/s2python/common/number_range.py @@ -1,6 +1,7 @@ from typing import Any from s2python.validate_values_mixin import ( + copy_config, S2MessageComponent, catch_and_convert_exceptions, ) @@ -9,8 +10,7 @@ @catch_and_convert_exceptions class NumberRange(GenNumberRange, S2MessageComponent): - model_config = GenNumberRange.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenNumberRange.model_config, validate_assignment=True) def __hash__(self) -> int: return hash(f"{self.start_of_range}|{self.end_of_range}") diff --git a/src/s2python/common/power_forecast.py b/src/s2python/common/power_forecast.py index 5dac5bb..89d2c63 100644 --- a/src/s2python/common/power_forecast.py +++ b/src/s2python/common/power_forecast.py @@ -4,6 +4,8 @@ from s2python.common.power_forecast_element import PowerForecastElement from s2python.generated.gen_s2 import PowerForecast as GenPowerForecast from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -11,8 +13,7 @@ @catch_and_convert_exceptions class PowerForecast(GenPowerForecast, S2MessageComponent): - model_config = GenPowerForecast.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPowerForecast.model_config, validate_assignment=True) - message_id: uuid.UUID = GenPowerForecast.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - elements: List[PowerForecastElement] = GenPowerForecast.model_fields["elements"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenPowerForecast.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + elements: List[PowerForecastElement] = copy_field(GenPowerForecast.model_fields["elements"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/common/power_forecast_element.py b/src/s2python/common/power_forecast_element.py index 717c05f..ced8ad4 100644 --- a/src/s2python/common/power_forecast_element.py +++ b/src/s2python/common/power_forecast_element.py @@ -8,6 +8,8 @@ PowerForecastElement as GenPowerForecastElement, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -17,12 +19,11 @@ @catch_and_convert_exceptions class PowerForecastElement(GenPowerForecastElement, S2MessageComponent): - model_config = GenPowerForecastElement.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPowerForecastElement.model_config, validate_assignment=True) - duration: Duration = GenPowerForecastElement.model_fields["duration"] # type: ignore[assignment,reportIncompatibleVariableOverride] + duration: Duration = copy_field(GenPowerForecastElement.model_fields["duration"]) # type: ignore[assignment,reportIncompatibleVariableOverride] power_values: List[PowerForecastValue] = ( # type: ignore[reportIncompatibleVariableOverride] - GenPowerForecastElement.model_fields["power_values"] # type: ignore[assignment] + copy_field(GenPowerForecastElement.model_fields["power_values"]) # type: ignore[assignment] ) @model_validator(mode="after") diff --git a/src/s2python/common/power_forecast_value.py b/src/s2python/common/power_forecast_value.py index dbf2896..9e45c25 100644 --- a/src/s2python/common/power_forecast_value.py +++ b/src/s2python/common/power_forecast_value.py @@ -1,5 +1,6 @@ from s2python.generated.gen_s2 import PowerForecastValue as GenPowerForecastValue from s2python.validate_values_mixin import ( + copy_config, catch_and_convert_exceptions, S2MessageComponent, ) @@ -7,5 +8,4 @@ @catch_and_convert_exceptions class PowerForecastValue(GenPowerForecastValue, S2MessageComponent): - model_config = GenPowerForecastValue.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPowerForecastValue.model_config, validate_assignment=True) diff --git a/src/s2python/common/power_measurement.py b/src/s2python/common/power_measurement.py index 4a33e1f..da9e0a3 100644 --- a/src/s2python/common/power_measurement.py +++ b/src/s2python/common/power_measurement.py @@ -9,6 +9,8 @@ CommodityQuantity, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -16,11 +18,10 @@ @catch_and_convert_exceptions class PowerMeasurement(GenPowerMeasurement, S2MessageComponent): - model_config = GenPowerMeasurement.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPowerMeasurement.model_config, validate_assignment=True) - message_id: uuid.UUID = GenPowerMeasurement.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - values: List[PowerValue] = GenPowerMeasurement.model_fields["values"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenPowerMeasurement.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + values: List[PowerValue] = copy_field(GenPowerMeasurement.model_fields["values"]) # type: ignore[assignment,reportIncompatibleVariableOverride] @model_validator(mode="after") def validate_values_at_most_one_per_commodity_quantity(self) -> Self: diff --git a/src/s2python/common/power_range.py b/src/s2python/common/power_range.py index e9c1dd2..9358023 100644 --- a/src/s2python/common/power_range.py +++ b/src/s2python/common/power_range.py @@ -4,6 +4,7 @@ from s2python.generated.gen_s2 import PowerRange as GenPowerRange from s2python.validate_values_mixin import ( + copy_config, S2MessageComponent, catch_and_convert_exceptions, ) @@ -11,8 +12,7 @@ @catch_and_convert_exceptions class PowerRange(GenPowerRange, S2MessageComponent): - model_config = GenPowerRange.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPowerRange.model_config, validate_assignment=True) @model_validator(mode="after") def validate_start_end_order(self) -> Self: diff --git a/src/s2python/common/power_value.py b/src/s2python/common/power_value.py index cb55542..a44e9e9 100644 --- a/src/s2python/common/power_value.py +++ b/src/s2python/common/power_value.py @@ -1,5 +1,6 @@ from s2python.generated.gen_s2 import PowerValue as GenPowerValue from s2python.validate_values_mixin import ( + copy_config, catch_and_convert_exceptions, S2MessageComponent, ) @@ -7,5 +8,4 @@ @catch_and_convert_exceptions class PowerValue(GenPowerValue, S2MessageComponent): - model_config = GenPowerValue.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPowerValue.model_config, validate_assignment=True) diff --git a/src/s2python/common/reception_status.py b/src/s2python/common/reception_status.py index 12bf559..3ccfe94 100644 --- a/src/s2python/common/reception_status.py +++ b/src/s2python/common/reception_status.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import ReceptionStatus as GenReceptionStatus from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,7 +11,6 @@ @catch_and_convert_exceptions class ReceptionStatus(GenReceptionStatus, S2MessageComponent): - model_config = GenReceptionStatus.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenReceptionStatus.model_config, validate_assignment=True) - subject_message_id: uuid.UUID = GenReceptionStatus.model_fields["subject_message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + subject_message_id: uuid.UUID = copy_field(GenReceptionStatus.model_fields["subject_message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/common/resource_manager_details.py b/src/s2python/common/resource_manager_details.py index 9333fba..78753de 100644 --- a/src/s2python/common/resource_manager_details.py +++ b/src/s2python/common/resource_manager_details.py @@ -7,6 +7,8 @@ ResourceManagerDetails as GenResourceManagerDetails, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -14,12 +16,11 @@ @catch_and_convert_exceptions class ResourceManagerDetails(GenResourceManagerDetails, S2MessageComponent): - model_config = GenResourceManagerDetails.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenResourceManagerDetails.model_config, validate_assignment=True) - instruction_processing_delay: Duration = GenResourceManagerDetails.model_fields[ # type: ignore[assignment,reportIncompatibleVariableOverride] + instruction_processing_delay: Duration = copy_field(GenResourceManagerDetails.model_fields[ # type: ignore[assignment,reportIncompatibleVariableOverride] "instruction_processing_delay" - ] - message_id: uuid.UUID = GenResourceManagerDetails.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - resource_id: uuid.UUID = GenResourceManagerDetails.model_fields["resource_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - roles: List[Role] = GenResourceManagerDetails.model_fields["roles"] # type: ignore[assignment,reportIncompatibleVariableOverride] + ]) + message_id: uuid.UUID = copy_field(GenResourceManagerDetails.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + resource_id: uuid.UUID = copy_field(GenResourceManagerDetails.model_fields["resource_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + roles: List[Role] = copy_field(GenResourceManagerDetails.model_fields["roles"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/common/revoke_object.py b/src/s2python/common/revoke_object.py index 7fc6678..4b07908 100644 --- a/src/s2python/common/revoke_object.py +++ b/src/s2python/common/revoke_object.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import RevokeObject as GenRevokeObject from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,8 +11,7 @@ @catch_and_convert_exceptions class RevokeObject(GenRevokeObject, S2MessageComponent): - model_config = GenRevokeObject.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenRevokeObject.model_config, validate_assignment=True) - message_id: uuid.UUID = GenRevokeObject.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - object_id: uuid.UUID = GenRevokeObject.model_fields["object_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenRevokeObject.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + object_id: uuid.UUID = copy_field(GenRevokeObject.model_fields["object_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/common/role.py b/src/s2python/common/role.py index 7f8f253..27744fe 100644 --- a/src/s2python/common/role.py +++ b/src/s2python/common/role.py @@ -1,5 +1,6 @@ from s2python.generated.gen_s2 import Role as GenRole from s2python.validate_values_mixin import ( + copy_config, S2MessageComponent, catch_and_convert_exceptions, ) @@ -7,5 +8,4 @@ @catch_and_convert_exceptions class Role(GenRole, S2MessageComponent): - model_config = GenRole.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenRole.model_config, validate_assignment=True) diff --git a/src/s2python/common/select_control_type.py b/src/s2python/common/select_control_type.py index e8ac142..1bd40bb 100644 --- a/src/s2python/common/select_control_type.py +++ b/src/s2python/common/select_control_type.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import SelectControlType as GenSelectControlType from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,7 +11,6 @@ @catch_and_convert_exceptions class SelectControlType(GenSelectControlType, S2MessageComponent): - model_config = GenSelectControlType.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenSelectControlType.model_config, validate_assignment=True) - message_id: uuid.UUID = GenSelectControlType.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenSelectControlType.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/common/session_request.py b/src/s2python/common/session_request.py index b5a62a5..7a3c7ae 100644 --- a/src/s2python/common/session_request.py +++ b/src/s2python/common/session_request.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import SessionRequest as GenSessionRequest from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,7 +11,6 @@ @catch_and_convert_exceptions class SessionRequest(GenSessionRequest, S2MessageComponent): - model_config = GenSessionRequest.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenSessionRequest.model_config, validate_assignment=True) - message_id: uuid.UUID = GenSessionRequest.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenSessionRequest.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/common/timer.py b/src/s2python/common/timer.py index 67e226b..24e43fb 100644 --- a/src/s2python/common/timer.py +++ b/src/s2python/common/timer.py @@ -3,6 +3,8 @@ from s2python.common.duration import Duration from s2python.generated.gen_s2 import Timer as GenTimer from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -10,8 +12,7 @@ @catch_and_convert_exceptions class Timer(GenTimer, S2MessageComponent): - model_config = GenTimer.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenTimer.model_config, validate_assignment=True) - id: uuid.UUID = GenTimer.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - duration: Duration = GenTimer.model_fields["duration"] # type: ignore[assignment,reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenTimer.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + duration: Duration = copy_field(GenTimer.model_fields["duration"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/common/transition.py b/src/s2python/common/transition.py index b43334f..36a9a7d 100644 --- a/src/s2python/common/transition.py +++ b/src/s2python/common/transition.py @@ -4,6 +4,8 @@ from s2python.common.duration import Duration from s2python.generated.gen_s2 import Transition as GenTransition from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -11,14 +13,13 @@ @catch_and_convert_exceptions class Transition(GenTransition, S2MessageComponent): - model_config = GenTransition.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenTransition.model_config, validate_assignment=True) - id: uuid.UUID = GenTransition.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - from_: uuid.UUID = GenTransition.model_fields["from_"] # type: ignore[assignment,reportIncompatibleVariableOverride] - to: uuid.UUID = GenTransition.model_fields["to"] # type: ignore[assignment,reportIncompatibleVariableOverride] - start_timers: List[uuid.UUID] = GenTransition.model_fields["start_timers"] # type: ignore[assignment,reportIncompatibleVariableOverride] - blocking_timers: List[uuid.UUID] = GenTransition.model_fields["blocking_timers"] # type: ignore[assignment,reportIncompatibleVariableOverride] - transition_duration: Optional[Duration] = GenTransition.model_fields[ # type: ignore[assignment,reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenTransition.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + from_: uuid.UUID = copy_field(GenTransition.model_fields["from_"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + to: uuid.UUID = copy_field(GenTransition.model_fields["to"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + start_timers: List[uuid.UUID] = copy_field(GenTransition.model_fields["start_timers"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + blocking_timers: List[uuid.UUID] = copy_field(GenTransition.model_fields["blocking_timers"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + transition_duration: Optional[Duration] = copy_field(GenTransition.model_fields[ # type: ignore[assignment,reportIncompatibleVariableOverride] "transition_duration" - ] + ]) diff --git a/src/s2python/ddbc/ddbc_actuator_description.py b/src/s2python/ddbc/ddbc_actuator_description.py index a460971..59e132e 100644 --- a/src/s2python/ddbc/ddbc_actuator_description.py +++ b/src/s2python/ddbc/ddbc_actuator_description.py @@ -10,6 +10,8 @@ from s2python.common.timer import Timer from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -17,14 +19,13 @@ @catch_and_convert_exceptions class DDBCActuatorDescription(GenDDBCActuatorDescription, S2MessageComponent): - model_config = GenDDBCActuatorDescription.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenDDBCActuatorDescription.model_config, validate_assignment=True) - id: uuid.UUID = GenDDBCActuatorDescription.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - supported_commodites: List[Commodity] = GenDDBCActuatorDescription.model_fields[ + id: uuid.UUID = copy_field(GenDDBCActuatorDescription.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + supported_commodites: List[Commodity] = copy_field(GenDDBCActuatorDescription.model_fields[ "supported_commodites" - ] # type: ignore[assignment,reportIncompatibleVariableOverride] - timers: List[Timer] = GenDDBCActuatorDescription.model_fields["timers"] # type: ignore[assignment,reportIncompatibleVariableOverride] - operation_modes: List[DDBCOperationMode] = GenDDBCActuatorDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment,reportIncompatibleVariableOverride] + timers: List[Timer] = copy_field(GenDDBCActuatorDescription.model_fields["timers"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + operation_modes: List[DDBCOperationMode] = copy_field(GenDDBCActuatorDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "operation_modes" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/ddbc/ddbc_actuator_status.py b/src/s2python/ddbc/ddbc_actuator_status.py index 57d2ffe..9f6566f 100644 --- a/src/s2python/ddbc/ddbc_actuator_status.py +++ b/src/s2python/ddbc/ddbc_actuator_status.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import DDBCActuatorStatus as GenDDBCActuatorStatus from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,14 +11,13 @@ @catch_and_convert_exceptions class DDBCActuatorStatus(GenDDBCActuatorStatus, S2MessageComponent): - model_config = GenDDBCActuatorStatus.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenDDBCActuatorStatus.model_config, validate_assignment=True) - message_id: uuid.UUID = GenDDBCActuatorStatus.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - actuator_id: uuid.UUID = GenDDBCActuatorStatus.model_fields["actuator_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - active_operation_mode_id: uuid.UUID = GenDDBCActuatorStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenDDBCActuatorStatus.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + actuator_id: uuid.UUID = copy_field(GenDDBCActuatorStatus.model_fields["actuator_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + active_operation_mode_id: uuid.UUID = copy_field(GenDDBCActuatorStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "active_operation_mode_id" - ] # type: ignore[assignment] - operation_mode_factor: float = GenDDBCActuatorStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + operation_mode_factor: float = copy_field(GenDDBCActuatorStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "operation_mode_factor" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/ddbc/ddbc_average_demand_rate_forecast.py b/src/s2python/ddbc/ddbc_average_demand_rate_forecast.py index 313aadd..e693e21 100644 --- a/src/s2python/ddbc/ddbc_average_demand_rate_forecast.py +++ b/src/s2python/ddbc/ddbc_average_demand_rate_forecast.py @@ -9,6 +9,8 @@ ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -19,10 +21,9 @@ class DDBCAverageDemandRateForecast( GenDDBCAverageDemandRateForecast, S2MessageComponent, ): - model_config = GenDDBCAverageDemandRateForecast.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenDDBCAverageDemandRateForecast.model_config, validate_assignment=True) - message_id: uuid.UUID = GenDDBCAverageDemandRateForecast.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenDDBCAverageDemandRateForecast.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] elements: List[DDBCAverageDemandRateForecastElement] = ( # type: ignore[reportIncompatibleVariableOverride] - GenDDBCAverageDemandRateForecast.model_fields["elements"] # type: ignore[assignment] + copy_field(GenDDBCAverageDemandRateForecast.model_fields["elements"]) # type: ignore[assignment] ) diff --git a/src/s2python/ddbc/ddbc_average_demand_rate_forecast_element.py b/src/s2python/ddbc/ddbc_average_demand_rate_forecast_element.py index 8e8bdee..1e3f8d8 100644 --- a/src/s2python/ddbc/ddbc_average_demand_rate_forecast_element.py +++ b/src/s2python/ddbc/ddbc_average_demand_rate_forecast_element.py @@ -4,7 +4,12 @@ DDBCAverageDemandRateForecastElement as GenDDBCAverageDemandRateForecastElement, ) -from s2python.validate_values_mixin import catch_and_convert_exceptions, S2MessageComponent +from s2python.validate_values_mixin import ( + copy_config, + copy_field, + catch_and_convert_exceptions, + S2MessageComponent, +) @catch_and_convert_exceptions @@ -12,10 +17,9 @@ class DDBCAverageDemandRateForecastElement( GenDDBCAverageDemandRateForecastElement, S2MessageComponent, ): - model_config = GenDDBCAverageDemandRateForecastElement.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenDDBCAverageDemandRateForecastElement.model_config, validate_assignment=True) - duration: Duration = GenDDBCAverageDemandRateForecastElement.model_fields["duration"] # type: ignore[assignment,reportIncompatibleVariableOverride] - demand_rate_expected: float = GenDDBCAverageDemandRateForecastElement.model_fields[ + duration: Duration = copy_field(GenDDBCAverageDemandRateForecastElement.model_fields["duration"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + demand_rate_expected: float = copy_field(GenDDBCAverageDemandRateForecastElement.model_fields[ "demand_rate_expected" - ] # type: ignore[assignment,reportIncompatibleVariableOverride] + ]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/ddbc/ddbc_instruction.py b/src/s2python/ddbc/ddbc_instruction.py index 2866a33..9d3ab05 100644 --- a/src/s2python/ddbc/ddbc_instruction.py +++ b/src/s2python/ddbc/ddbc_instruction.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import DDBCInstruction as GenDDBCInstruction from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,11 +11,10 @@ @catch_and_convert_exceptions class DDBCInstruction(GenDDBCInstruction, S2MessageComponent): - model_config = GenDDBCInstruction.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenDDBCInstruction.model_config, validate_assignment=True) - message_id: uuid.UUID = GenDDBCInstruction.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - actuator_id: uuid.UUID = GenDDBCInstruction.model_fields["actuator_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - operation_mode_id: uuid.UUID = GenDDBCInstruction.model_fields["operation_mode_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - operation_mode_factor: float = GenDDBCInstruction.model_fields["operation_mode_factor"] # type: ignore[assignment,reportIncompatibleVariableOverride] - abnormal_condition: bool = GenDDBCInstruction.model_fields["abnormal_condition"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenDDBCInstruction.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + actuator_id: uuid.UUID = copy_field(GenDDBCInstruction.model_fields["actuator_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + operation_mode_id: uuid.UUID = copy_field(GenDDBCInstruction.model_fields["operation_mode_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + operation_mode_factor: float = copy_field(GenDDBCInstruction.model_fields["operation_mode_factor"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + abnormal_condition: bool = copy_field(GenDDBCInstruction.model_fields["abnormal_condition"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/ddbc/ddbc_operation_mode.py b/src/s2python/ddbc/ddbc_operation_mode.py index d3ddfbd..0433908 100644 --- a/src/s2python/ddbc/ddbc_operation_mode.py +++ b/src/s2python/ddbc/ddbc_operation_mode.py @@ -7,6 +7,8 @@ from s2python.common.number_range import NumberRange from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -14,13 +16,12 @@ @catch_and_convert_exceptions class DDBCOperationMode(GenDDBCOperationMode, S2MessageComponent): - model_config = GenDDBCOperationMode.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenDDBCOperationMode.model_config, validate_assignment=True) # ? Id vs id - id: uuid.UUID = GenDDBCOperationMode.model_fields["Id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - power_ranges: List[PowerRange] = GenDDBCOperationMode.model_fields["power_ranges"] # type: ignore[assignment,reportIncompatibleVariableOverride] - supply_range: List[NumberRange] = GenDDBCOperationMode.model_fields["supply_range"] # type: ignore[assignment,reportIncompatibleVariableOverride] - abnormal_condition_only: bool = GenDDBCOperationMode.model_fields[ + id: uuid.UUID = copy_field(GenDDBCOperationMode.model_fields["Id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + power_ranges: List[PowerRange] = copy_field(GenDDBCOperationMode.model_fields["power_ranges"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + supply_range: List[NumberRange] = copy_field(GenDDBCOperationMode.model_fields["supply_range"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + abnormal_condition_only: bool = copy_field(GenDDBCOperationMode.model_fields[ "abnormal_condition_only" - ] # type: ignore[assignment,reportIncompatibleVariableOverride] + ]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/ddbc/ddbc_system_description.py b/src/s2python/ddbc/ddbc_system_description.py index 007488d..c2dbcc5 100644 --- a/src/s2python/ddbc/ddbc_system_description.py +++ b/src/s2python/ddbc/ddbc_system_description.py @@ -7,6 +7,8 @@ from s2python.common.number_range import NumberRange from s2python.ddbc.ddbc_actuator_description import DDBCActuatorDescription from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -14,16 +16,15 @@ @catch_and_convert_exceptions class DDBCSystemDescription(GenDDBCSystemDescription, S2MessageComponent): - model_config = GenDDBCSystemDescription.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenDDBCSystemDescription.model_config, validate_assignment=True) - message_id: uuid.UUID = GenDDBCSystemDescription.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - actuators: List[DDBCActuatorDescription] = GenDDBCSystemDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenDDBCSystemDescription.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + actuators: List[DDBCActuatorDescription] = copy_field(GenDDBCSystemDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "actuators" - ] # type: ignore[assignment] - present_demand_rate: NumberRange = GenDDBCSystemDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + present_demand_rate: NumberRange = copy_field(GenDDBCSystemDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "present_demand_rate" - ] # type: ignore[assignment] - provides_average_demand_rate_forecast: bool = GenDDBCSystemDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + provides_average_demand_rate_forecast: bool = copy_field(GenDDBCSystemDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "provides_average_demand_rate_forecast" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/ddbc/ddbc_timer_status.py b/src/s2python/ddbc/ddbc_timer_status.py index 2c4d95e..f5590df 100644 --- a/src/s2python/ddbc/ddbc_timer_status.py +++ b/src/s2python/ddbc/ddbc_timer_status.py @@ -3,6 +3,8 @@ from s2python.generated.gen_s2 import DDBCTimerStatus as GenDDBCTimerStatus from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -10,9 +12,8 @@ @catch_and_convert_exceptions class DDBCTimerStatus(GenDDBCTimerStatus, S2MessageComponent): - model_config = GenDDBCTimerStatus.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenDDBCTimerStatus.model_config, validate_assignment=True) - message_id: uuid.UUID = GenDDBCTimerStatus.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - timer_id: uuid.UUID = GenDDBCTimerStatus.model_fields["timer_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - actuator_id: uuid.UUID = GenDDBCTimerStatus.model_fields["actuator_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenDDBCTimerStatus.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + timer_id: uuid.UUID = copy_field(GenDDBCTimerStatus.model_fields["timer_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + actuator_id: uuid.UUID = copy_field(GenDDBCTimerStatus.model_fields["actuator_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/frbc/frbc_actuator_description.py b/src/s2python/frbc/frbc_actuator_description.py index f666516..9ef353d 100644 --- a/src/s2python/frbc/frbc_actuator_description.py +++ b/src/s2python/frbc/frbc_actuator_description.py @@ -12,6 +12,8 @@ FRBCActuatorDescription as GenFRBCActuatorDescription, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -19,18 +21,17 @@ @catch_and_convert_exceptions class FRBCActuatorDescription(GenFRBCActuatorDescription, S2MessageComponent): - model_config = GenFRBCActuatorDescription.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCActuatorDescription.model_config, validate_assignment=True) - id: uuid.UUID = GenFRBCActuatorDescription.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - operation_modes: List[FRBCOperationMode] = GenFRBCActuatorDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenFRBCActuatorDescription.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + operation_modes: List[FRBCOperationMode] = copy_field(GenFRBCActuatorDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "operation_modes" - ] # type: ignore[assignment] - transitions: List[Transition] = GenFRBCActuatorDescription.model_fields["transitions"] # type: ignore[assignment,reportIncompatibleVariableOverride] - timers: List[Timer] = GenFRBCActuatorDescription.model_fields["timers"] # type: ignore[assignment,reportIncompatibleVariableOverride] - supported_commodities: List[Commodity] = GenFRBCActuatorDescription.model_fields[ + ]) # type: ignore[assignment] + transitions: List[Transition] = copy_field(GenFRBCActuatorDescription.model_fields["transitions"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + timers: List[Timer] = copy_field(GenFRBCActuatorDescription.model_fields["timers"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + supported_commodities: List[Commodity] = copy_field(GenFRBCActuatorDescription.model_fields[ "supported_commodities" - ] # type: ignore[assignment,reportIncompatibleVariableOverride] + ]) # type: ignore[assignment,reportIncompatibleVariableOverride] @model_validator(mode="after") def validate_timers_in_transitions(self) -> Self: diff --git a/src/s2python/frbc/frbc_actuator_status.py b/src/s2python/frbc/frbc_actuator_status.py index ecf3b15..55e91ba 100644 --- a/src/s2python/frbc/frbc_actuator_status.py +++ b/src/s2python/frbc/frbc_actuator_status.py @@ -3,6 +3,8 @@ from s2python.generated.gen_s2 import FRBCActuatorStatus as GenFRBCActuatorStatus from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -10,14 +12,13 @@ @catch_and_convert_exceptions class FRBCActuatorStatus(GenFRBCActuatorStatus, S2MessageComponent): - model_config = GenFRBCActuatorStatus.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCActuatorStatus.model_config, validate_assignment=True) - active_operation_mode_id: uuid.UUID = GenFRBCActuatorStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + active_operation_mode_id: uuid.UUID = copy_field(GenFRBCActuatorStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "active_operation_mode_id" - ] # type: ignore[assignment] - actuator_id: uuid.UUID = GenFRBCActuatorStatus.model_fields["actuator_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - message_id: uuid.UUID = GenFRBCActuatorStatus.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - previous_operation_mode_id: Optional[uuid.UUID] = GenFRBCActuatorStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + actuator_id: uuid.UUID = copy_field(GenFRBCActuatorStatus.model_fields["actuator_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenFRBCActuatorStatus.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + previous_operation_mode_id: Optional[uuid.UUID] = copy_field(GenFRBCActuatorStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "previous_operation_mode_id" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/frbc/frbc_fill_level_target_profile.py b/src/s2python/frbc/frbc_fill_level_target_profile.py index f98b33a..749395e 100644 --- a/src/s2python/frbc/frbc_fill_level_target_profile.py +++ b/src/s2python/frbc/frbc_fill_level_target_profile.py @@ -8,6 +8,8 @@ FRBCFillLevelTargetProfile as GenFRBCFillLevelTargetProfile, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -15,10 +17,9 @@ @catch_and_convert_exceptions class FRBCFillLevelTargetProfile(GenFRBCFillLevelTargetProfile, S2MessageComponent): - model_config = GenFRBCFillLevelTargetProfile.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCFillLevelTargetProfile.model_config, validate_assignment=True) - elements: List[FRBCFillLevelTargetProfileElement] = GenFRBCFillLevelTargetProfile.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + elements: List[FRBCFillLevelTargetProfileElement] = copy_field(GenFRBCFillLevelTargetProfile.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "elements" - ] # type: ignore[assignment] - message_id: uuid.UUID = GenFRBCFillLevelTargetProfile.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + message_id: uuid.UUID = copy_field(GenFRBCFillLevelTargetProfile.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/frbc/frbc_fill_level_target_profile_element.py b/src/s2python/frbc/frbc_fill_level_target_profile_element.py index 3183745..fa2712c 100644 --- a/src/s2python/frbc/frbc_fill_level_target_profile_element.py +++ b/src/s2python/frbc/frbc_fill_level_target_profile_element.py @@ -9,6 +9,8 @@ FRBCFillLevelTargetProfileElement as GenFRBCFillLevelTargetProfileElement, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -16,13 +18,12 @@ @catch_and_convert_exceptions class FRBCFillLevelTargetProfileElement(GenFRBCFillLevelTargetProfileElement, S2MessageComponent): - model_config = GenFRBCFillLevelTargetProfileElement.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCFillLevelTargetProfileElement.model_config, validate_assignment=True) - duration: Duration = GenFRBCFillLevelTargetProfileElement.model_fields["duration"] # type: ignore[assignment,reportIncompatibleVariableOverride] - fill_level_range: NumberRange = GenFRBCFillLevelTargetProfileElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + duration: Duration = copy_field(GenFRBCFillLevelTargetProfileElement.model_fields["duration"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + fill_level_range: NumberRange = copy_field(GenFRBCFillLevelTargetProfileElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "fill_level_range" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] @model_validator(mode="after") def validate_start_end_order(self) -> Self: diff --git a/src/s2python/frbc/frbc_instruction.py b/src/s2python/frbc/frbc_instruction.py index a7693da..def6d43 100644 --- a/src/s2python/frbc/frbc_instruction.py +++ b/src/s2python/frbc/frbc_instruction.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import FRBCInstruction as GenFRBCInstruction from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,10 +11,9 @@ @catch_and_convert_exceptions class FRBCInstruction(GenFRBCInstruction, S2MessageComponent): - model_config = GenFRBCInstruction.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCInstruction.model_config, validate_assignment=True) - actuator_id: uuid.UUID = GenFRBCInstruction.model_fields["actuator_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - id: uuid.UUID = GenFRBCInstruction.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - message_id: uuid.UUID = GenFRBCInstruction.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - operation_mode: uuid.UUID = GenFRBCInstruction.model_fields["operation_mode"] # type: ignore[assignment,reportIncompatibleVariableOverride] + actuator_id: uuid.UUID = copy_field(GenFRBCInstruction.model_fields["actuator_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenFRBCInstruction.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenFRBCInstruction.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + operation_mode: uuid.UUID = copy_field(GenFRBCInstruction.model_fields["operation_mode"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/frbc/frbc_leakage_behaviour.py b/src/s2python/frbc/frbc_leakage_behaviour.py index 98c44a3..4f7721e 100644 --- a/src/s2python/frbc/frbc_leakage_behaviour.py +++ b/src/s2python/frbc/frbc_leakage_behaviour.py @@ -4,6 +4,8 @@ from s2python.frbc.frbc_leakage_behaviour_element import FRBCLeakageBehaviourElement from s2python.generated.gen_s2 import FRBCLeakageBehaviour as GenFRBCLeakageBehaviour from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -11,10 +13,9 @@ @catch_and_convert_exceptions class FRBCLeakageBehaviour(GenFRBCLeakageBehaviour, S2MessageComponent): - model_config = GenFRBCLeakageBehaviour.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCLeakageBehaviour.model_config, validate_assignment=True) - elements: List[FRBCLeakageBehaviourElement] = GenFRBCLeakageBehaviour.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + elements: List[FRBCLeakageBehaviourElement] = copy_field(GenFRBCLeakageBehaviour.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "elements" - ] # type: ignore[assignment] - message_id: uuid.UUID = GenFRBCLeakageBehaviour.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + message_id: uuid.UUID = copy_field(GenFRBCLeakageBehaviour.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/frbc/frbc_leakage_behaviour_element.py b/src/s2python/frbc/frbc_leakage_behaviour_element.py index 594c594..5f390df 100644 --- a/src/s2python/frbc/frbc_leakage_behaviour_element.py +++ b/src/s2python/frbc/frbc_leakage_behaviour_element.py @@ -8,6 +8,8 @@ FRBCLeakageBehaviourElement as GenFRBCLeakageBehaviourElement, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -15,12 +17,11 @@ @catch_and_convert_exceptions class FRBCLeakageBehaviourElement(GenFRBCLeakageBehaviourElement, S2MessageComponent): - model_config = GenFRBCLeakageBehaviourElement.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCLeakageBehaviourElement.model_config, validate_assignment=True) - fill_level_range: NumberRange = GenFRBCLeakageBehaviourElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + fill_level_range: NumberRange = copy_field(GenFRBCLeakageBehaviourElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "fill_level_range" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] @model_validator(mode="after") def validate_start_end_order(self) -> Self: diff --git a/src/s2python/frbc/frbc_operation_mode.py b/src/s2python/frbc/frbc_operation_mode.py index cbee3d4..ce1c4ec 100644 --- a/src/s2python/frbc/frbc_operation_mode.py +++ b/src/s2python/frbc/frbc_operation_mode.py @@ -9,6 +9,8 @@ from s2python.frbc.frbc_operation_mode_element import FRBCOperationModeElement from s2python.generated.gen_s2 import FRBCOperationMode as GenFRBCOperationMode from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -17,11 +19,10 @@ @catch_and_convert_exceptions class FRBCOperationMode(GenFRBCOperationMode, S2MessageComponent): - model_config = GenFRBCOperationMode.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCOperationMode.model_config, validate_assignment=True) - id: uuid.UUID = GenFRBCOperationMode.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - elements: List[FRBCOperationModeElement] = GenFRBCOperationMode.model_fields["elements"] # type: ignore[assignment,reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenFRBCOperationMode.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + elements: List[FRBCOperationModeElement] = copy_field(GenFRBCOperationMode.model_fields["elements"]) # type: ignore[assignment,reportIncompatibleVariableOverride] @model_validator(mode="after") def validate_contiguous_fill_levels_operation_mode_elements(self) -> Self: diff --git a/src/s2python/frbc/frbc_operation_mode_element.py b/src/s2python/frbc/frbc_operation_mode_element.py index e22ddb7..0cb971f 100644 --- a/src/s2python/frbc/frbc_operation_mode_element.py +++ b/src/s2python/frbc/frbc_operation_mode_element.py @@ -5,6 +5,8 @@ FRBCOperationModeElement as GenFRBCOperationModeElement, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -12,16 +14,15 @@ @catch_and_convert_exceptions class FRBCOperationModeElement(GenFRBCOperationModeElement, S2MessageComponent): - model_config = GenFRBCOperationModeElement.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCOperationModeElement.model_config, validate_assignment=True) - fill_level_range: NumberRange = GenFRBCOperationModeElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + fill_level_range: NumberRange = copy_field(GenFRBCOperationModeElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "fill_level_range" - ] # type: ignore[assignment] - fill_rate: NumberRange = GenFRBCOperationModeElement.model_fields["fill_rate"] # type: ignore[assignment,reportIncompatibleVariableOverride] - power_ranges: List[PowerRange] = GenFRBCOperationModeElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + fill_rate: NumberRange = copy_field(GenFRBCOperationModeElement.model_fields["fill_rate"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + power_ranges: List[PowerRange] = copy_field(GenFRBCOperationModeElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "power_ranges" - ] # type: ignore[assignment] - running_costs: Optional[NumberRange] = GenFRBCOperationModeElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + running_costs: Optional[NumberRange] = copy_field(GenFRBCOperationModeElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "running_costs" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/frbc/frbc_storage_description.py b/src/s2python/frbc/frbc_storage_description.py index 7672d85..00a41d1 100644 --- a/src/s2python/frbc/frbc_storage_description.py +++ b/src/s2python/frbc/frbc_storage_description.py @@ -3,6 +3,8 @@ FRBCStorageDescription as GenFRBCStorageDescription, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -10,9 +12,8 @@ @catch_and_convert_exceptions class FRBCStorageDescription(GenFRBCStorageDescription, S2MessageComponent): - model_config = GenFRBCStorageDescription.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCStorageDescription.model_config, validate_assignment=True) - fill_level_range: NumberRange = GenFRBCStorageDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + fill_level_range: NumberRange = copy_field(GenFRBCStorageDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "fill_level_range" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/frbc/frbc_storage_status.py b/src/s2python/frbc/frbc_storage_status.py index 04ade4c..8e38c52 100644 --- a/src/s2python/frbc/frbc_storage_status.py +++ b/src/s2python/frbc/frbc_storage_status.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import FRBCStorageStatus as GenFRBCStorageStatus from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,7 +11,6 @@ @catch_and_convert_exceptions class FRBCStorageStatus(GenFRBCStorageStatus, S2MessageComponent): - model_config = GenFRBCStorageStatus.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCStorageStatus.model_config, validate_assignment=True) - message_id: uuid.UUID = GenFRBCStorageStatus.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenFRBCStorageStatus.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/frbc/frbc_system_description.py b/src/s2python/frbc/frbc_system_description.py index f1efdf8..cb63b37 100644 --- a/src/s2python/frbc/frbc_system_description.py +++ b/src/s2python/frbc/frbc_system_description.py @@ -3,6 +3,8 @@ from s2python.generated.gen_s2 import FRBCSystemDescription as GenFRBCSystemDescription from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -12,11 +14,10 @@ @catch_and_convert_exceptions class FRBCSystemDescription(GenFRBCSystemDescription, S2MessageComponent): - model_config = GenFRBCSystemDescription.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCSystemDescription.model_config, validate_assignment=True) - actuators: List[FRBCActuatorDescription] = GenFRBCSystemDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + actuators: List[FRBCActuatorDescription] = copy_field(GenFRBCSystemDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "actuators" - ] # type: ignore[assignment] - message_id: uuid.UUID = GenFRBCSystemDescription.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - storage: FRBCStorageDescription = GenFRBCSystemDescription.model_fields["storage"] # type: ignore[assignment,reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + message_id: uuid.UUID = copy_field(GenFRBCSystemDescription.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + storage: FRBCStorageDescription = copy_field(GenFRBCSystemDescription.model_fields["storage"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/frbc/frbc_timer_status.py b/src/s2python/frbc/frbc_timer_status.py index b374750..3596bea 100644 --- a/src/s2python/frbc/frbc_timer_status.py +++ b/src/s2python/frbc/frbc_timer_status.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import FRBCTimerStatus as GenFRBCTimerStatus from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,9 +11,8 @@ @catch_and_convert_exceptions class FRBCTimerStatus(GenFRBCTimerStatus, S2MessageComponent): - model_config = GenFRBCTimerStatus.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCTimerStatus.model_config, validate_assignment=True) - actuator_id: uuid.UUID = GenFRBCTimerStatus.model_fields["actuator_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - message_id: uuid.UUID = GenFRBCTimerStatus.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - timer_id: uuid.UUID = GenFRBCTimerStatus.model_fields["timer_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + actuator_id: uuid.UUID = copy_field(GenFRBCTimerStatus.model_fields["actuator_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenFRBCTimerStatus.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + timer_id: uuid.UUID = copy_field(GenFRBCTimerStatus.model_fields["timer_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/frbc/frbc_usage_forecast.py b/src/s2python/frbc/frbc_usage_forecast.py index 777d7cb..6dbe887 100644 --- a/src/s2python/frbc/frbc_usage_forecast.py +++ b/src/s2python/frbc/frbc_usage_forecast.py @@ -3,6 +3,8 @@ from s2python.generated.gen_s2 import FRBCUsageForecast as GenFRBCUsageForecast from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -11,8 +13,7 @@ @catch_and_convert_exceptions class FRBCUsageForecast(GenFRBCUsageForecast, S2MessageComponent): - model_config = GenFRBCUsageForecast.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCUsageForecast.model_config, validate_assignment=True) - elements: List[FRBCUsageForecastElement] = GenFRBCUsageForecast.model_fields["elements"] # type: ignore[assignment,reportIncompatibleVariableOverride] - message_id: uuid.UUID = GenFRBCUsageForecast.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + elements: List[FRBCUsageForecastElement] = copy_field(GenFRBCUsageForecast.model_fields["elements"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenFRBCUsageForecast.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/frbc/frbc_usage_forecast_element.py b/src/s2python/frbc/frbc_usage_forecast_element.py index c81467a..6c3cba3 100644 --- a/src/s2python/frbc/frbc_usage_forecast_element.py +++ b/src/s2python/frbc/frbc_usage_forecast_element.py @@ -4,6 +4,8 @@ FRBCUsageForecastElement as GenFRBCUsageForecastElement, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -11,7 +13,6 @@ @catch_and_convert_exceptions class FRBCUsageForecastElement(GenFRBCUsageForecastElement, S2MessageComponent): - model_config = GenFRBCUsageForecastElement.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenFRBCUsageForecastElement.model_config, validate_assignment=True) - duration: Duration = GenFRBCUsageForecastElement.model_fields["duration"] # type: ignore[assignment,reportIncompatibleVariableOverride] + duration: Duration = copy_field(GenFRBCUsageForecastElement.model_fields["duration"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/generated/gen_s2.py b/src/s2python/generated/gen_s2.py index 34793f1..4f41ea2 100644 --- a/src/s2python/generated/gen_s2.py +++ b/src/s2python/generated/gen_s2.py @@ -7,7 +7,9 @@ from enum import Enum from typing import List, Literal, Optional -from pydantic import AwareDatetime, BaseModel, ConfigDict, Field, RootModel, conint, constr +from pydantic import AwareDatetime, ConfigDict, Field, RootModel, conint, constr + +from s2python.s2_base_model import S2BaseModel class Duration(RootModel[conint(ge=0)]): @@ -156,7 +158,7 @@ class ReceptionStatusValues(str, Enum): OK = "OK" -class NumberRange(BaseModel): +class NumberRange(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -164,7 +166,7 @@ class NumberRange(BaseModel): end_of_range: float = Field(..., description="Number that defines the end of the range") -class Transition(BaseModel): +class Transition(S2BaseModel): model_config = ConfigDict( extra="forbid", populate_by_name=True @@ -208,7 +210,7 @@ class Transition(BaseModel): ) -class Timer(BaseModel): +class Timer(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -225,7 +227,7 @@ class Timer(BaseModel): ) -class PEBCPowerEnvelopeElement(BaseModel): +class PEBCPowerEnvelopeElement(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -240,7 +242,7 @@ class PEBCPowerEnvelopeElement(BaseModel): ) -class FRBCStorageDescription(BaseModel): +class FRBCStorageDescription(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -270,7 +272,7 @@ class FRBCStorageDescription(BaseModel): ) -class FRBCLeakageBehaviourElement(BaseModel): +class FRBCLeakageBehaviourElement(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -284,7 +286,7 @@ class FRBCLeakageBehaviourElement(BaseModel): ) -class FRBCUsageForecastElement(BaseModel): +class FRBCUsageForecastElement(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -321,7 +323,7 @@ class FRBCUsageForecastElement(BaseModel): ) -class FRBCFillLevelTargetProfileElement(BaseModel): +class FRBCFillLevelTargetProfileElement(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -332,7 +334,7 @@ class FRBCFillLevelTargetProfileElement(BaseModel): ) -class DDBCAverageDemandRateForecastElement(BaseModel): +class DDBCAverageDemandRateForecastElement(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -432,7 +434,7 @@ class PPBCPowerSequenceStatus(str, Enum): ABORTED = "ABORTED" -class OMBCTimerStatus(BaseModel): +class OMBCTimerStatus(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -445,7 +447,7 @@ class OMBCTimerStatus(BaseModel): ) -class FRBCTimerStatus(BaseModel): +class FRBCTimerStatus(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -459,7 +461,7 @@ class FRBCTimerStatus(BaseModel): ) -class DDBCTimerStatus(BaseModel): +class DDBCTimerStatus(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -473,7 +475,7 @@ class DDBCTimerStatus(BaseModel): ) -class SelectControlType(BaseModel): +class SelectControlType(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -485,7 +487,7 @@ class SelectControlType(BaseModel): ) -class SessionRequest(BaseModel): +class SessionRequest(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -497,7 +499,7 @@ class SessionRequest(BaseModel): ) -class RevokeObject(BaseModel): +class RevokeObject(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -509,7 +511,7 @@ class RevokeObject(BaseModel): object_id: ID = Field(..., description="The ID of object that needs to be revoked") -class Handshake(BaseModel): +class Handshake(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -523,7 +525,7 @@ class Handshake(BaseModel): ) -class HandshakeResponse(BaseModel): +class HandshakeResponse(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -534,7 +536,7 @@ class HandshakeResponse(BaseModel): ) -class ReceptionStatus(BaseModel): +class ReceptionStatus(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -547,7 +549,7 @@ class ReceptionStatus(BaseModel): ) -class InstructionStatusUpdate(BaseModel): +class InstructionStatusUpdate(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -560,7 +562,7 @@ class InstructionStatusUpdate(BaseModel): ) -class PEBCEnergyConstraint(BaseModel): +class PEBCEnergyConstraint(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -590,7 +592,7 @@ class PEBCEnergyConstraint(BaseModel): ) -class PPBCScheduleInstruction(BaseModel): +class PPBCScheduleInstruction(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -621,7 +623,7 @@ class PPBCScheduleInstruction(BaseModel): ) -class PPBCStartInterruptionInstruction(BaseModel): +class PPBCStartInterruptionInstruction(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -651,7 +653,7 @@ class PPBCStartInterruptionInstruction(BaseModel): ) -class PPBCEndInterruptionInstruction(BaseModel): +class PPBCEndInterruptionInstruction(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -682,7 +684,7 @@ class PPBCEndInterruptionInstruction(BaseModel): ) -class OMBCStatus(BaseModel): +class OMBCStatus(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -703,7 +705,7 @@ class OMBCStatus(BaseModel): ) -class OMBCInstruction(BaseModel): +class OMBCInstruction(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -729,7 +731,7 @@ class OMBCInstruction(BaseModel): ) -class FRBCActuatorStatus(BaseModel): +class FRBCActuatorStatus(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -753,7 +755,7 @@ class FRBCActuatorStatus(BaseModel): ) -class FRBCStorageStatus(BaseModel): +class FRBCStorageStatus(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -762,7 +764,7 @@ class FRBCStorageStatus(BaseModel): present_fill_level: float = Field(..., description="Present fill level of the Storage") -class FRBCLeakageBehaviour(BaseModel): +class FRBCLeakageBehaviour(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -780,7 +782,7 @@ class FRBCLeakageBehaviour(BaseModel): ) -class FRBCInstruction(BaseModel): +class FRBCInstruction(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -807,7 +809,7 @@ class FRBCInstruction(BaseModel): ) -class FRBCUsageForecast(BaseModel): +class FRBCUsageForecast(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -824,7 +826,7 @@ class FRBCUsageForecast(BaseModel): ) -class FRBCFillLevelTargetProfile(BaseModel): +class FRBCFillLevelTargetProfile(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -841,7 +843,7 @@ class FRBCFillLevelTargetProfile(BaseModel): ) -class DDBCActuatorStatus(BaseModel): +class DDBCActuatorStatus(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -865,7 +867,7 @@ class DDBCActuatorStatus(BaseModel): ) -class DDBCInstruction(BaseModel): +class DDBCInstruction(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -890,7 +892,7 @@ class DDBCInstruction(BaseModel): ) -class DDBCAverageDemandRateForecast(BaseModel): +class DDBCAverageDemandRateForecast(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -905,7 +907,7 @@ class DDBCAverageDemandRateForecast(BaseModel): ) -class PowerValue(BaseModel): +class PowerValue(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -917,7 +919,7 @@ class PowerValue(BaseModel): ) -class PowerForecastValue(BaseModel): +class PowerForecastValue(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -951,7 +953,7 @@ class PowerForecastValue(BaseModel): ) -class PowerRange(BaseModel): +class PowerRange(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -964,7 +966,7 @@ class PowerRange(BaseModel): ) -class Role(BaseModel): +class Role(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -974,7 +976,7 @@ class Role(BaseModel): commodity: Commodity = Field(..., description="Commodity the role refers to.") -class PowerForecastElement(BaseModel): +class PowerForecastElement(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -987,7 +989,7 @@ class PowerForecastElement(BaseModel): ) -class PEBCAllowedLimitRange(BaseModel): +class PEBCAllowedLimitRange(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1007,7 +1009,7 @@ class PEBCAllowedLimitRange(BaseModel): ) -class PEBCPowerEnvelope(BaseModel): +class PEBCPowerEnvelope(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1026,7 +1028,7 @@ class PEBCPowerEnvelope(BaseModel): ) -class PPBCPowerSequenceElement(BaseModel): +class PPBCPowerSequenceElement(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1039,7 +1041,7 @@ class PPBCPowerSequenceElement(BaseModel): ) -class PPBCPowerSequenceContainerStatus(BaseModel): +class PPBCPowerSequenceContainerStatus(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1064,7 +1066,7 @@ class PPBCPowerSequenceContainerStatus(BaseModel): ) -class OMBCOperationMode(BaseModel): +class OMBCOperationMode(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1092,7 +1094,7 @@ class OMBCOperationMode(BaseModel): ) -class FRBCOperationModeElement(BaseModel): +class FRBCOperationModeElement(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1116,7 +1118,7 @@ class FRBCOperationModeElement(BaseModel): ) -class DDBCOperationMode(BaseModel): +class DDBCOperationMode(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1148,7 +1150,7 @@ class DDBCOperationMode(BaseModel): ) -class ResourceManagerDetails(BaseModel): +class ResourceManagerDetails(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1201,7 +1203,7 @@ class ResourceManagerDetails(BaseModel): ) -class PowerMeasurement(BaseModel): +class PowerMeasurement(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1218,7 +1220,7 @@ class PowerMeasurement(BaseModel): ) -class PowerForecast(BaseModel): +class PowerForecast(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1235,7 +1237,7 @@ class PowerForecast(BaseModel): ) -class PEBCPowerConstraints(BaseModel): +class PEBCPowerConstraints(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1263,7 +1265,7 @@ class PEBCPowerConstraints(BaseModel): ) -class PEBCInstruction(BaseModel): +class PEBCInstruction(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1292,7 +1294,7 @@ class PEBCInstruction(BaseModel): ) -class PPBCPowerProfileStatus(BaseModel): +class PPBCPowerProfileStatus(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1306,7 +1308,7 @@ class PPBCPowerProfileStatus(BaseModel): ) -class OMBCSystemDescription(BaseModel): +class OMBCSystemDescription(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1336,7 +1338,7 @@ class OMBCSystemDescription(BaseModel): ) -class PPBCPowerSequence(BaseModel): +class PPBCPowerSequence(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1363,7 +1365,7 @@ class PPBCPowerSequence(BaseModel): ) -class FRBCOperationMode(BaseModel): +class FRBCOperationMode(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1387,7 +1389,7 @@ class FRBCOperationMode(BaseModel): ) -class DDBCActuatorDescription(BaseModel): +class DDBCActuatorDescription(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1425,7 +1427,7 @@ class DDBCActuatorDescription(BaseModel): ) -class DDBCSystemDescription(BaseModel): +class DDBCSystemDescription(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1450,7 +1452,7 @@ class DDBCSystemDescription(BaseModel): ) -class PPBCPowerSequenceContainer(BaseModel): +class PPBCPowerSequenceContainer(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1466,7 +1468,7 @@ class PPBCPowerSequenceContainer(BaseModel): ) -class FRBCActuatorDescription(BaseModel): +class FRBCActuatorDescription(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1501,7 +1503,7 @@ class FRBCActuatorDescription(BaseModel): ) -class PPBCPowerProfileDefinition(BaseModel): +class PPBCPowerProfileDefinition(S2BaseModel): model_config = ConfigDict( extra="forbid", ) @@ -1527,7 +1529,7 @@ class PPBCPowerProfileDefinition(BaseModel): ) -class FRBCSystemDescription(BaseModel): +class FRBCSystemDescription(S2BaseModel): model_config = ConfigDict( extra="forbid", ) diff --git a/src/s2python/ombc/ombc_instruction.py b/src/s2python/ombc/ombc_instruction.py index 6131916..bf66bf6 100644 --- a/src/s2python/ombc/ombc_instruction.py +++ b/src/s2python/ombc/ombc_instruction.py @@ -2,6 +2,8 @@ from s2python.generated.gen_s2 import OMBCInstruction as GenOMBCInstruction from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,11 +11,10 @@ @catch_and_convert_exceptions class OMBCInstruction(GenOMBCInstruction, S2MessageComponent): - model_config = GenOMBCInstruction.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenOMBCInstruction.model_config, validate_assignment=True) - id: uuid.UUID = GenOMBCInstruction.model_fields["id"] # type: ignore[assignment] - message_id: uuid.UUID = GenOMBCInstruction.model_fields["message_id"] # type: ignore[assignment] - abnormal_condition: bool = GenOMBCInstruction.model_fields["abnormal_condition"] # type: ignore[assignment] - operation_mode_factor: float = GenOMBCInstruction.model_fields["operation_mode_factor"] # type: ignore[assignment] - operation_mode_id: uuid.UUID = GenOMBCInstruction.model_fields["operation_mode_id"] # type: ignore[assignment] + id: uuid.UUID = copy_field(GenOMBCInstruction.model_fields["id"]) # type: ignore[assignment] + message_id: uuid.UUID = copy_field(GenOMBCInstruction.model_fields["message_id"]) # type: ignore[assignment] + abnormal_condition: bool = copy_field(GenOMBCInstruction.model_fields["abnormal_condition"]) # type: ignore[assignment] + operation_mode_factor: float = copy_field(GenOMBCInstruction.model_fields["operation_mode_factor"]) # type: ignore[assignment] + operation_mode_id: uuid.UUID = copy_field(GenOMBCInstruction.model_fields["operation_mode_id"]) # type: ignore[assignment] diff --git a/src/s2python/ombc/ombc_operation_mode.py b/src/s2python/ombc/ombc_operation_mode.py index fdc9853..1c3c6c6 100644 --- a/src/s2python/ombc/ombc_operation_mode.py +++ b/src/s2python/ombc/ombc_operation_mode.py @@ -6,6 +6,8 @@ from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -13,13 +15,12 @@ @catch_and_convert_exceptions class OMBCOperationMode(GenOMBCOperationMode, S2MessageComponent): - model_config = GenOMBCOperationMode.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenOMBCOperationMode.model_config, validate_assignment=True) - id: uuid.UUID = GenOMBCOperationMode.model_fields["id"] # type: ignore[assignment] - power_ranges: List[PowerRange] = GenOMBCOperationMode.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenOMBCOperationMode.model_fields["id"]) # type: ignore[assignment] + power_ranges: List[PowerRange] = copy_field(GenOMBCOperationMode.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "power_ranges" - ] # type: ignore[assignment] - abnormal_condition_only: bool = GenOMBCOperationMode.model_fields[ + ]) # type: ignore[assignment] + abnormal_condition_only: bool = copy_field(GenOMBCOperationMode.model_fields[ "abnormal_condition_only" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/ombc/ombc_status.py b/src/s2python/ombc/ombc_status.py index c782c25..b2044fc 100644 --- a/src/s2python/ombc/ombc_status.py +++ b/src/s2python/ombc/ombc_status.py @@ -3,6 +3,8 @@ from s2python.generated.gen_s2 import OMBCStatus as GenOMBCStatus from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -10,8 +12,7 @@ @catch_and_convert_exceptions class OMBCStatus(GenOMBCStatus, S2MessageComponent): - model_config = GenOMBCStatus.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenOMBCStatus.model_config, validate_assignment=True) - message_id: uuid.UUID = GenOMBCStatus.model_fields["message_id"] # type: ignore[assignment] - operation_mode_factor: float = GenOMBCStatus.model_fields["operation_mode_factor"] # type: ignore[assignment] + message_id: uuid.UUID = copy_field(GenOMBCStatus.model_fields["message_id"]) # type: ignore[assignment] + operation_mode_factor: float = copy_field(GenOMBCStatus.model_fields["operation_mode_factor"]) # type: ignore[assignment] diff --git a/src/s2python/ombc/ombc_system_description.py b/src/s2python/ombc/ombc_system_description.py index aa9f457..c44943f 100644 --- a/src/s2python/ombc/ombc_system_description.py +++ b/src/s2python/ombc/ombc_system_description.py @@ -7,6 +7,8 @@ from s2python.common.timer import Timer from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -14,12 +16,11 @@ @catch_and_convert_exceptions class OMBCSystemDescription(GenOMBCSystemDescription, S2MessageComponent): - model_config = GenOMBCSystemDescription.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenOMBCSystemDescription.model_config, validate_assignment=True) - message_id: uuid.UUID = GenOMBCSystemDescription.model_fields["message_id"] # type: ignore[assignment] - operation_modes: List[OMBCOperationMode] = GenOMBCSystemDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenOMBCSystemDescription.model_fields["message_id"]) # type: ignore[assignment] + operation_modes: List[OMBCOperationMode] = copy_field(GenOMBCSystemDescription.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "operation_modes" - ] # type: ignore[assignment] - transitions: List[Transition] = GenOMBCSystemDescription.model_fields["transitions"] # type: ignore[assignment] - timers: List[Timer] = GenOMBCSystemDescription.model_fields["timers"] # type: ignore[assignment] + ]) # type: ignore[assignment] + transitions: List[Transition] = copy_field(GenOMBCSystemDescription.model_fields["transitions"]) # type: ignore[assignment] + timers: List[Timer] = copy_field(GenOMBCSystemDescription.model_fields["timers"]) # type: ignore[assignment] diff --git a/src/s2python/ombc/ombc_timer_status.py b/src/s2python/ombc/ombc_timer_status.py index 906ea7d..7283875 100644 --- a/src/s2python/ombc/ombc_timer_status.py +++ b/src/s2python/ombc/ombc_timer_status.py @@ -3,6 +3,8 @@ from s2python.generated.gen_s2 import OMBCTimerStatus as GenOMBCTimerStatus from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -10,8 +12,7 @@ @catch_and_convert_exceptions class OMBCTimerStatus(GenOMBCTimerStatus, S2MessageComponent): - model_config = GenOMBCTimerStatus.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenOMBCTimerStatus.model_config, validate_assignment=True) - message_id: UUID = GenOMBCTimerStatus.model_fields["message_id"] # type: ignore[assignment] - timer_id: UUID = GenOMBCTimerStatus.model_fields["timer_id"] # type: ignore[assignment] + message_id: UUID = copy_field(GenOMBCTimerStatus.model_fields["message_id"]) # type: ignore[assignment] + timer_id: UUID = copy_field(GenOMBCTimerStatus.model_fields["timer_id"]) # type: ignore[assignment] diff --git a/src/s2python/pebc/pebc_allowed_limit_range.py b/src/s2python/pebc/pebc_allowed_limit_range.py index 31dd3af..2f51fa6 100644 --- a/src/s2python/pebc/pebc_allowed_limit_range.py +++ b/src/s2python/pebc/pebc_allowed_limit_range.py @@ -6,6 +6,8 @@ ) from s2python.common import CommodityQuantity, NumberRange from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -13,18 +15,17 @@ @catch_and_convert_exceptions class PEBCAllowedLimitRange(GenPEBCAllowedLimitRange, S2MessageComponent): - model_config = GenPEBCAllowedLimitRange.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPEBCAllowedLimitRange.model_config, validate_assignment=True) - commodity_quantity: CommodityQuantity = GenPEBCAllowedLimitRange.model_fields[ + commodity_quantity: CommodityQuantity = copy_field(GenPEBCAllowedLimitRange.model_fields[ "commodity_quantity" - ] # type: ignore[assignment,reportIncompatibleVariableOverride] - limit_type: GenPEBCPowerEnvelopeLimitType = GenPEBCAllowedLimitRange.model_fields[ + ]) # type: ignore[assignment,reportIncompatibleVariableOverride] + limit_type: GenPEBCPowerEnvelopeLimitType = copy_field(GenPEBCAllowedLimitRange.model_fields[ "limit_type" - ] # type: ignore[assignment,reportIncompatibleVariableOverride] - range_boundary: NumberRange = GenPEBCAllowedLimitRange.model_fields["range_boundary"] # type: ignore[assignment,reportIncompatibleVariableOverride] + ]) # type: ignore[assignment,reportIncompatibleVariableOverride] + range_boundary: NumberRange = copy_field(GenPEBCAllowedLimitRange.model_fields["range_boundary"]) # type: ignore[assignment,reportIncompatibleVariableOverride] abnormal_condition_only: bool = [ - GenPEBCAllowedLimitRange.model_fields["abnormal_condition_only"] # type: ignore[assignment,reportIncompatibleVariableOverride] + copy_field(GenPEBCAllowedLimitRange.model_fields["abnormal_condition_only"]) # type: ignore[assignment,reportIncompatibleVariableOverride] ] @model_validator(mode="after") diff --git a/src/s2python/pebc/pebc_energy_constraint.py b/src/s2python/pebc/pebc_energy_constraint.py index eaf76fe..12db6f0 100644 --- a/src/s2python/pebc/pebc_energy_constraint.py +++ b/src/s2python/pebc/pebc_energy_constraint.py @@ -5,6 +5,8 @@ ) from s2python.common import CommodityQuantity from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -12,14 +14,13 @@ @catch_and_convert_exceptions class PEBCEnergyConstraint(GenPEBCEnergyConstraint, S2MessageComponent): - model_config = GenPEBCEnergyConstraint.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPEBCEnergyConstraint.model_config, validate_assignment=True) - message_id: uuid.UUID = GenPEBCEnergyConstraint.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - id: uuid.UUID = GenPEBCEnergyConstraint.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenPEBCEnergyConstraint.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenPEBCEnergyConstraint.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] - upper_average_power: float = GenPEBCEnergyConstraint.model_fields["upper_average_power"] # type: ignore[assignment,reportIncompatibleVariableOverride] - lower_average_power: float = GenPEBCEnergyConstraint.model_fields["lower_average_power"] # type: ignore[assignment,reportIncompatibleVariableOverride] + upper_average_power: float = copy_field(GenPEBCEnergyConstraint.model_fields["upper_average_power"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + lower_average_power: float = copy_field(GenPEBCEnergyConstraint.model_fields["lower_average_power"]) # type: ignore[assignment,reportIncompatibleVariableOverride] commodity_quantity: CommodityQuantity = [ - GenPEBCEnergyConstraint.model_fields["commodity_quantity"] # type: ignore[assignment,reportIncompatibleVariableOverride] + copy_field(GenPEBCEnergyConstraint.model_fields["commodity_quantity"]) # type: ignore[assignment,reportIncompatibleVariableOverride] ] diff --git a/src/s2python/pebc/pebc_instruction.py b/src/s2python/pebc/pebc_instruction.py index 320f931..8322737 100644 --- a/src/s2python/pebc/pebc_instruction.py +++ b/src/s2python/pebc/pebc_instruction.py @@ -6,6 +6,8 @@ ) from s2python.pebc.pebc_power_envelope import PEBCPowerEnvelope from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -13,15 +15,14 @@ @catch_and_convert_exceptions class PEBCInstruction(GenPEBCInstruction, S2MessageComponent): - model_config = GenPEBCInstruction.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPEBCInstruction.model_config, validate_assignment=True) - message_id: uuid.UUID = GenPEBCInstruction.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - id: uuid.UUID = GenPEBCInstruction.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenPEBCInstruction.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenPEBCInstruction.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] power_constraints_id: uuid.UUID = [ # type: ignore[reportIncompatibleVariableOverride] - GenPEBCInstruction.model_fields["power_constraints_id"] # type: ignore[assignment] + copy_field(GenPEBCInstruction.model_fields["power_constraints_id"]) # type: ignore[assignment] ] power_envelopes: List[PEBCPowerEnvelope] = [ # type: ignore[reportIncompatibleVariableOverride] - GenPEBCInstruction.model_fields["power_envelopes"] # type: ignore[assignment] + copy_field(GenPEBCInstruction.model_fields["power_envelopes"]) # type: ignore[assignment] ] - abnormal_condition: bool = GenPEBCInstruction.model_fields["abnormal_condition"] # type: ignore[assignment,reportIncompatibleVariableOverride] + abnormal_condition: bool = copy_field(GenPEBCInstruction.model_fields["abnormal_condition"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/pebc/pebc_power_constraints.py b/src/s2python/pebc/pebc_power_constraints.py index 64035e0..ecd26a7 100644 --- a/src/s2python/pebc/pebc_power_constraints.py +++ b/src/s2python/pebc/pebc_power_constraints.py @@ -12,6 +12,8 @@ ) from s2python.pebc.pebc_allowed_limit_range import PEBCAllowedLimitRange from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -19,17 +21,16 @@ @catch_and_convert_exceptions class PEBCPowerConstraints(GenPEBCPowerConstraints, S2MessageComponent): - model_config = GenPEBCPowerConstraints.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPEBCPowerConstraints.model_config, validate_assignment=True) - message_id: uuid.UUID = GenPEBCPowerConstraints.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - id: uuid.UUID = GenPEBCPowerConstraints.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - consequence_type: GenPEBCPowerEnvelopeConsequenceType = GenPEBCPowerConstraints.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenPEBCPowerConstraints.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenPEBCPowerConstraints.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + consequence_type: GenPEBCPowerEnvelopeConsequenceType = copy_field(GenPEBCPowerConstraints.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "consequence_type" - ] # type: ignore[assignment] - allowed_limit_ranges: List[PEBCAllowedLimitRange] = GenPEBCPowerConstraints.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + allowed_limit_ranges: List[PEBCAllowedLimitRange] = copy_field(GenPEBCPowerConstraints.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "allowed_limit_ranges" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] @model_validator(mode="after") def validate_has_one_upper_one_lower_limit_range(self) -> Self: diff --git a/src/s2python/pebc/pebc_power_envelope.py b/src/s2python/pebc/pebc_power_envelope.py index 8ac20e6..c4c6044 100644 --- a/src/s2python/pebc/pebc_power_envelope.py +++ b/src/s2python/pebc/pebc_power_envelope.py @@ -5,6 +5,8 @@ from s2python.pebc.pebc_power_envelope_element import PEBCPowerEnvelopeElement from s2python.common import CommodityQuantity from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -12,12 +14,11 @@ @catch_and_convert_exceptions class PEBCPowerEnvelope(GenPEBCPowerEnvelope, S2MessageComponent): - model_config = GenPEBCPowerEnvelope.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPEBCPowerEnvelope.model_config, validate_assignment=True) - commodity_quantity: CommodityQuantity = GenPEBCPowerEnvelope.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + commodity_quantity: CommodityQuantity = copy_field(GenPEBCPowerEnvelope.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "commodity_quantity" - ] # type: ignore[assignment] - power_envelope_elements: List[PEBCPowerEnvelopeElement] = GenPEBCPowerEnvelope.model_fields[ # type: ignore[assignment,reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + power_envelope_elements: List[PEBCPowerEnvelopeElement] = copy_field(GenPEBCPowerEnvelope.model_fields[ # type: ignore[assignment,reportIncompatibleVariableOverride] "power_envelope_elements" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/pebc/pebc_power_envelope_element.py b/src/s2python/pebc/pebc_power_envelope_element.py index 0e9f53b..ab63015 100644 --- a/src/s2python/pebc/pebc_power_envelope_element.py +++ b/src/s2python/pebc/pebc_power_envelope_element.py @@ -2,6 +2,8 @@ PEBCPowerEnvelopeElement as GenPEBCPowerEnvelopeElement, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -9,8 +11,7 @@ @catch_and_convert_exceptions class PEBCPowerEnvelopeElement(GenPEBCPowerEnvelopeElement, S2MessageComponent): - model_config = GenPEBCPowerEnvelopeElement.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPEBCPowerEnvelopeElement.model_config, validate_assignment=True) - lower_limit: float = GenPEBCPowerEnvelopeElement.model_fields["lower_limit"] # type: ignore[assignment,reportIncompatibleVariableOverride] - upper_limit: float = GenPEBCPowerEnvelopeElement.model_fields["upper_limit"] # type: ignore[assignment,reportIncompatibleVariableOverride] + lower_limit: float = copy_field(GenPEBCPowerEnvelopeElement.model_fields["lower_limit"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + upper_limit: float = copy_field(GenPEBCPowerEnvelopeElement.model_fields["upper_limit"]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/ppbc/ppbc_end_interruption_instruction.py b/src/s2python/ppbc/ppbc_end_interruption_instruction.py index 1a4e3ff..d2b1c1b 100644 --- a/src/s2python/ppbc/ppbc_end_interruption_instruction.py +++ b/src/s2python/ppbc/ppbc_end_interruption_instruction.py @@ -5,6 +5,8 @@ ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -12,20 +14,19 @@ @catch_and_convert_exceptions class PPBCEndInterruptionInstruction(GenPPBCEndInterruptionInstruction, S2MessageComponent): - model_config = GenPPBCEndInterruptionInstruction.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPPBCEndInterruptionInstruction.model_config, validate_assignment=True) - id: uuid.UUID = GenPPBCEndInterruptionInstruction.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - message_id: uuid.UUID = GenPPBCEndInterruptionInstruction.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - power_profile_id: uuid.UUID = GenPPBCEndInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenPPBCEndInterruptionInstruction.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenPPBCEndInterruptionInstruction.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + power_profile_id: uuid.UUID = copy_field(GenPPBCEndInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "power_profile_id" - ] # type: ignore[assignment] - sequence_container_id: uuid.UUID = GenPPBCEndInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + sequence_container_id: uuid.UUID = copy_field(GenPPBCEndInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "sequence_container_id" - ] # type: ignore[assignment] - power_sequence_id: uuid.UUID = GenPPBCEndInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + power_sequence_id: uuid.UUID = copy_field(GenPPBCEndInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "power_sequence_id" - ] # type: ignore[assignment] - abnormal_condition: bool = GenPPBCEndInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + abnormal_condition: bool = copy_field(GenPPBCEndInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "abnormal_condition" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/ppbc/ppbc_power_profile_definition.py b/src/s2python/ppbc/ppbc_power_profile_definition.py index 53c22c8..24121db 100644 --- a/src/s2python/ppbc/ppbc_power_profile_definition.py +++ b/src/s2python/ppbc/ppbc_power_profile_definition.py @@ -6,6 +6,8 @@ ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -15,11 +17,10 @@ @catch_and_convert_exceptions class PPBCPowerProfileDefinition(GenPPBCPowerProfileDefinition, S2MessageComponent): - model_config = GenPPBCPowerProfileDefinition.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPPBCPowerProfileDefinition.model_config, validate_assignment=True) - message_id: uuid.UUID = GenPPBCPowerProfileDefinition.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - id: uuid.UUID = GenPPBCPowerProfileDefinition.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenPPBCPowerProfileDefinition.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenPPBCPowerProfileDefinition.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] power_sequences_containers: List[PPBCPowerSequenceContainer] = ( # type: ignore[reportIncompatibleVariableOverride] - GenPPBCPowerProfileDefinition.model_fields["power_sequences_containers"] # type: ignore[assignment] + copy_field(GenPPBCPowerProfileDefinition.model_fields["power_sequences_containers"]) # type: ignore[assignment] ) diff --git a/src/s2python/ppbc/ppbc_power_profile_status.py b/src/s2python/ppbc/ppbc_power_profile_status.py index 5d7d1be..f542b92 100644 --- a/src/s2python/ppbc/ppbc_power_profile_status.py +++ b/src/s2python/ppbc/ppbc_power_profile_status.py @@ -6,6 +6,8 @@ ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -17,10 +19,9 @@ @catch_and_convert_exceptions class PPBCPowerProfileStatus(GenPPBCPowerProfileStatus, S2MessageComponent): - model_config = GenPPBCPowerProfileStatus.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPPBCPowerProfileStatus.model_config, validate_assignment=True) - message_id: uuid.UUID = GenPPBCPowerProfileStatus.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenPPBCPowerProfileStatus.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] sequence_container_status: List[PPBCPowerSequenceContainerStatus] = ( # type: ignore[reportIncompatibleVariableOverride] - GenPPBCPowerProfileStatus.model_fields["sequence_container_status"] # type: ignore[assignment] + copy_field(GenPPBCPowerProfileStatus.model_fields["sequence_container_status"]) # type: ignore[assignment] ) diff --git a/src/s2python/ppbc/ppbc_power_sequence.py b/src/s2python/ppbc/ppbc_power_sequence.py index 9fc545a..ba14265 100644 --- a/src/s2python/ppbc/ppbc_power_sequence.py +++ b/src/s2python/ppbc/ppbc_power_sequence.py @@ -6,6 +6,8 @@ ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -16,15 +18,14 @@ @catch_and_convert_exceptions class PPBCPowerSequence(GenPPBCPowerSequence, S2MessageComponent): - model_config = GenPPBCPowerSequence.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPPBCPowerSequence.model_config, validate_assignment=True) - id: uuid.UUID = GenPPBCPowerSequence.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - elements: List[PPBCPowerSequenceElement] = GenPPBCPowerSequence.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenPPBCPowerSequence.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + elements: List[PPBCPowerSequenceElement] = copy_field(GenPPBCPowerSequence.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "elements" - ] # type: ignore[assignment] - is_interruptible: bool = GenPPBCPowerSequence.model_fields["is_interruptible"] # type: ignore[assignment,reportIncompatibleVariableOverride] - max_pause_before: Duration = GenPPBCPowerSequence.model_fields["max_pause_before"] # type: ignore[assignment,reportIncompatibleVariableOverride] - abnormal_condition_only: bool = GenPPBCPowerSequence.model_fields[ + ]) # type: ignore[assignment] + is_interruptible: bool = copy_field(GenPPBCPowerSequence.model_fields["is_interruptible"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + max_pause_before: Duration = copy_field(GenPPBCPowerSequence.model_fields["max_pause_before"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + abnormal_condition_only: bool = copy_field(GenPPBCPowerSequence.model_fields[ "abnormal_condition_only" - ] # type: ignore[assignment,reportIncompatibleVariableOverride] + ]) # type: ignore[assignment,reportIncompatibleVariableOverride] diff --git a/src/s2python/ppbc/ppbc_power_sequence_container.py b/src/s2python/ppbc/ppbc_power_sequence_container.py index c5edcf1..1af77f1 100644 --- a/src/s2python/ppbc/ppbc_power_sequence_container.py +++ b/src/s2python/ppbc/ppbc_power_sequence_container.py @@ -7,6 +7,8 @@ ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -16,10 +18,9 @@ @catch_and_convert_exceptions class PPBCPowerSequenceContainer(GenPPBCPowerSequenceContainer, S2MessageComponent): - model_config = GenPPBCPowerSequenceContainer.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPPBCPowerSequenceContainer.model_config, validate_assignment=True) - id: uuid.UUID = GenPPBCPowerSequenceContainer.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - power_sequences: List[PPBCPowerSequence] = GenPPBCPowerSequenceContainer.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenPPBCPowerSequenceContainer.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + power_sequences: List[PPBCPowerSequence] = copy_field(GenPPBCPowerSequenceContainer.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "power_sequences" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/ppbc/ppbc_power_sequence_container_status.py b/src/s2python/ppbc/ppbc_power_sequence_container_status.py index 81fb48a..cc9a393 100644 --- a/src/s2python/ppbc/ppbc_power_sequence_container_status.py +++ b/src/s2python/ppbc/ppbc_power_sequence_container_status.py @@ -6,6 +6,8 @@ ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -13,18 +15,17 @@ @catch_and_convert_exceptions class PPBCPowerSequenceContainerStatus(GenPPBCPowerSequenceContainerStatus, S2MessageComponent): - model_config = GenPPBCPowerSequenceContainerStatus.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPPBCPowerSequenceContainerStatus.model_config, validate_assignment=True) - power_profile_id: uuid.UUID = GenPPBCPowerSequenceContainerStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + power_profile_id: uuid.UUID = copy_field(GenPPBCPowerSequenceContainerStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "power_profile_id" # type: ignore[assignment] - ] - sequence_container_id: uuid.UUID = GenPPBCPowerSequenceContainerStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) + sequence_container_id: uuid.UUID = copy_field(GenPPBCPowerSequenceContainerStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "sequence_container_id" # type: ignore[assignment] - ] - selected_sequence_id: Union[uuid.UUID, None] = GenPPBCPowerSequenceContainerStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) + selected_sequence_id: Union[uuid.UUID, None] = copy_field(GenPPBCPowerSequenceContainerStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "selected_sequence_id" - ] # type: ignore[assignment] - progress: Union[uuid.UUID, None] = GenPPBCPowerSequenceContainerStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + progress: Union[uuid.UUID, None] = copy_field(GenPPBCPowerSequenceContainerStatus.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "progress" # type: ignore[assignment] - ] + ]) diff --git a/src/s2python/ppbc/ppbc_power_sequence_element.py b/src/s2python/ppbc/ppbc_power_sequence_element.py index 444bd08..0b2910d 100644 --- a/src/s2python/ppbc/ppbc_power_sequence_element.py +++ b/src/s2python/ppbc/ppbc_power_sequence_element.py @@ -5,6 +5,8 @@ ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -14,10 +16,9 @@ @catch_and_convert_exceptions class PPBCPowerSequenceElement(GenPPBCPowerSequenceElement, S2MessageComponent): - model_config = GenPPBCPowerSequenceElement.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPPBCPowerSequenceElement.model_config, validate_assignment=True) - duration: Duration = GenPPBCPowerSequenceElement.model_fields["duration"] # type: ignore[assignment,reportIncompatibleVariableOverride] - power_values: List[PowerForecastValue] = GenPPBCPowerSequenceElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + duration: Duration = copy_field(GenPPBCPowerSequenceElement.model_fields["duration"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + power_values: List[PowerForecastValue] = copy_field(GenPPBCPowerSequenceElement.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "power_values" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/ppbc/ppbc_schedule_instruction.py b/src/s2python/ppbc/ppbc_schedule_instruction.py index 2434e93..4f54856 100644 --- a/src/s2python/ppbc/ppbc_schedule_instruction.py +++ b/src/s2python/ppbc/ppbc_schedule_instruction.py @@ -4,6 +4,8 @@ PPBCScheduleInstruction as GenPPBCScheduleInstruction, ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, catch_and_convert_exceptions, S2MessageComponent, ) @@ -11,21 +13,20 @@ @catch_and_convert_exceptions class PPBCScheduleInstruction(GenPPBCScheduleInstruction, S2MessageComponent): - model_config = GenPPBCScheduleInstruction.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPPBCScheduleInstruction.model_config, validate_assignment=True) - id: uuid.UUID = GenPPBCScheduleInstruction.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenPPBCScheduleInstruction.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] - power_profile_id: uuid.UUID = GenPPBCScheduleInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + power_profile_id: uuid.UUID = copy_field(GenPPBCScheduleInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "power_profile_id" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] - message_id: uuid.UUID = GenPPBCScheduleInstruction.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenPPBCScheduleInstruction.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] - sequence_container_id: uuid.UUID = GenPPBCScheduleInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + sequence_container_id: uuid.UUID = copy_field(GenPPBCScheduleInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "sequence_container_id" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] - power_sequence_id: uuid.UUID = GenPPBCScheduleInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + power_sequence_id: uuid.UUID = copy_field(GenPPBCScheduleInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "power_sequence_id" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/ppbc/ppbc_start_interruption_instruction.py b/src/s2python/ppbc/ppbc_start_interruption_instruction.py index 42ccb92..edbae6c 100644 --- a/src/s2python/ppbc/ppbc_start_interruption_instruction.py +++ b/src/s2python/ppbc/ppbc_start_interruption_instruction.py @@ -5,6 +5,8 @@ ) from s2python.validate_values_mixin import ( + copy_config, + copy_field, S2MessageComponent, catch_and_convert_exceptions, ) @@ -12,20 +14,19 @@ @catch_and_convert_exceptions class PPBCStartInterruptionInstruction(GenPPBCStartInterruptionInstruction, S2MessageComponent): - model_config = GenPPBCStartInterruptionInstruction.model_config - model_config["validate_assignment"] = True + model_config = copy_config(GenPPBCStartInterruptionInstruction.model_config, validate_assignment=True) - id: uuid.UUID = GenPPBCStartInterruptionInstruction.model_fields["id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - message_id: uuid.UUID = GenPPBCStartInterruptionInstruction.model_fields["message_id"] # type: ignore[assignment,reportIncompatibleVariableOverride] - power_profile_id: uuid.UUID = GenPPBCStartInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + id: uuid.UUID = copy_field(GenPPBCStartInterruptionInstruction.model_fields["id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + message_id: uuid.UUID = copy_field(GenPPBCStartInterruptionInstruction.model_fields["message_id"]) # type: ignore[assignment,reportIncompatibleVariableOverride] + power_profile_id: uuid.UUID = copy_field(GenPPBCStartInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "power_profile_id" - ] # type: ignore[assignment] - sequence_container_id: uuid.UUID = GenPPBCStartInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + sequence_container_id: uuid.UUID = copy_field(GenPPBCStartInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "sequence_container_id" - ] # type: ignore[assignment] - power_sequence_id: uuid.UUID = GenPPBCStartInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + power_sequence_id: uuid.UUID = copy_field(GenPPBCStartInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "power_sequence_id" - ] # type: ignore[assignment] - abnormal_condition: bool = GenPPBCStartInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] + ]) # type: ignore[assignment] + abnormal_condition: bool = copy_field(GenPPBCStartInterruptionInstruction.model_fields[ # type: ignore[reportIncompatibleVariableOverride] "abnormal_condition" - ] # type: ignore[assignment] + ]) # type: ignore[assignment] diff --git a/src/s2python/s2_base_model.py b/src/s2python/s2_base_model.py new file mode 100644 index 0000000..a2ba497 --- /dev/null +++ b/src/s2python/s2_base_model.py @@ -0,0 +1,13 @@ +from pydantic import BaseModel, ConfigDict + + +class S2BaseModel(BaseModel): + """Base class of the generated S2 models. + + The validators and serializers of a model are built the first time the model + is used, instead of when the class is defined. Most applications use only a + small part of the S2 messages, and building them all costs several MB of + memory. + """ + + model_config = ConfigDict(defer_build=True) diff --git a/src/s2python/validate_values_mixin.py b/src/s2python/validate_values_mixin.py index f140205..9cee54c 100644 --- a/src/s2python/validate_values_mixin.py +++ b/src/s2python/validate_values_mixin.py @@ -1,3 +1,4 @@ +import copy from typing import ( TypeVar, Type, @@ -14,8 +15,10 @@ from pydantic import ( # pylint: disable=no-name-in-module BaseModel, + ConfigDict, ValidationError, ) +from pydantic.fields import FieldInfo from s2python.s2_validation_error import S2ValidationError @@ -115,3 +118,22 @@ def catch_and_convert_exceptions(input_class: Type[S]) -> Type[S]: input_class.__init__ = convert_to_s2exception(input_class.__init__) # type: ignore[method-assign] return input_class + + +def copy_field(field: FieldInfo) -> Any: + """Copy the field of a generated model, to redefine it in a subclass. + + pydantic modifies a FieldInfo that is used as the default of a field. Without + a copy, that would change the field of the generated model as well. + """ + return copy.deepcopy(field) + + +def copy_config(config: ConfigDict, **changes: Any) -> ConfigDict: + """Copy the config of a generated model with some changes, to use in a subclass. + + Changing the config in place would change the config of the generated model as well. + """ + new_config = ConfigDict(**config) + new_config.update(changes) # type: ignore[typeddict-item] + return new_config diff --git a/tests/unit/copy_config_test.py b/tests/unit/copy_config_test.py new file mode 100644 index 0000000..601d014 --- /dev/null +++ b/tests/unit/copy_config_test.py @@ -0,0 +1,30 @@ +import unittest + +from pydantic import ConfigDict + +from s2python.common import Handshake +from s2python.generated.gen_s2 import Handshake as GenHandshake +from s2python.validate_values_mixin import copy_config + + +class CopyConfigTest(unittest.TestCase): + def test__copy_config__returns_changed_copy(self) -> None: + # Arrange + config = ConfigDict(extra="forbid") + + # Act + copied = copy_config(config, validate_assignment=True) + + # Assert + self.assertEqual(copied, {"extra": "forbid", "validate_assignment": True}) + self.assertEqual(config, {"extra": "forbid"}) + + def test__copy_config__generated_config_unchanged_by_subclass(self) -> None: + # Arrange / Act + # Handshake copies the generated config with validate_assignment=True. + wrapper_config = Handshake.model_config + generated_config = GenHandshake.model_config + + # Assert + self.assertTrue(wrapper_config.get("validate_assignment")) + self.assertNotIn("validate_assignment", generated_config) diff --git a/tests/unit/copy_field_test.py b/tests/unit/copy_field_test.py new file mode 100644 index 0000000..4a89022 --- /dev/null +++ b/tests/unit/copy_field_test.py @@ -0,0 +1,29 @@ +import unittest + +from s2python.ddbc import DDBCOperationMode +from s2python.generated.gen_s2 import DDBCOperationMode as GenDDBCOperationMode, ID +from s2python.validate_values_mixin import copy_field + + +class CopyFieldTest(unittest.TestCase): + def test__copy_field__returns_equal_copy(self) -> None: + # Arrange + field = GenDDBCOperationMode.model_fields["diagnostic_label"] + + # Act + copied = copy_field(field) + + # Assert + self.assertIsNot(copied, field) + self.assertEqual(copied.annotation, field.annotation) + self.assertEqual(copied.description, field.description) + + def test__copy_field__generated_field_unchanged_by_subclass(self) -> None: + # Arrange / Act + # DDBCOperationMode redefines the generated field 'Id' as 'id' with type uuid.UUID. + wrapper_field = DDBCOperationMode.model_fields["id"] + generated_field = GenDDBCOperationMode.model_fields["Id"] + + # Assert + self.assertIsNot(wrapper_field, generated_field) + self.assertIs(generated_field.annotation, ID) diff --git a/tests/unit/s2_base_model_test.py b/tests/unit/s2_base_model_test.py new file mode 100644 index 0000000..42341e9 --- /dev/null +++ b/tests/unit/s2_base_model_test.py @@ -0,0 +1,20 @@ +import unittest + +from s2python.s2_base_model import S2BaseModel + + +class S2BaseModelTest(unittest.TestCase): + def test__s2_base_model__validator_built_on_first_use(self) -> None: + # Arrange + class ExampleModel(S2BaseModel): + value: int + + built_before_use = ExampleModel.__pydantic_complete__ + + # Act + example = ExampleModel(value=1) + + # Assert + self.assertFalse(built_before_use) + self.assertTrue(ExampleModel.__pydantic_complete__) + self.assertEqual(example.value, 1)