From d408e9d9031c9d290585cb3d18ea7f38257f1b1a Mon Sep 17 00:00:00 2001 From: Anthony Marcozzi Date: Tue, 28 Oct 2025 11:09:35 -0600 Subject: [PATCH] Add `mode='json'` to `model_dump` calls for consistent JSON serialization --- .../client_library/models/application.py | 1 + fastfuels_sdk/client_library/models/domain.py | 1 + fastfuels_sdk/client_library/models/export.py | 1 + .../client_library/models/feature_grid.py | 1 + fastfuels_sdk/client_library/models/key.py | 1 + .../client_library/models/road_feature.py | 1 + .../client_library/models/surface_grid.py | 1 + .../client_library/models/topography_grid.py | 1 + .../client_library/models/tree_grid.py | 1 + .../client_library/models/tree_inventory.py | 1 + .../client_library/models/water_feature.py | 1 + tests/test_domains.py | 27 +++++++++++++++++++ 12 files changed, 38 insertions(+) diff --git a/fastfuels_sdk/client_library/models/application.py b/fastfuels_sdk/client_library/models/application.py index 1a31b4d..94dddf0 100644 --- a/fastfuels_sdk/client_library/models/application.py +++ b/fastfuels_sdk/client_library/models/application.py @@ -70,6 +70,7 @@ def to_dict(self) -> Dict[str, Any]: ]) _dict = self.model_dump( + mode='json', by_alias=True, exclude=excluded_fields, exclude_none=True, diff --git a/fastfuels_sdk/client_library/models/domain.py b/fastfuels_sdk/client_library/models/domain.py index e69e8c2..2d2d8ec 100644 --- a/fastfuels_sdk/client_library/models/domain.py +++ b/fastfuels_sdk/client_library/models/domain.py @@ -88,6 +88,7 @@ def to_dict(self) -> Dict[str, Any]: ]) _dict = self.model_dump( + mode='json', by_alias=True, exclude=excluded_fields, exclude_none=True, diff --git a/fastfuels_sdk/client_library/models/export.py b/fastfuels_sdk/client_library/models/export.py index 6d18ea6..5f76d96 100644 --- a/fastfuels_sdk/client_library/models/export.py +++ b/fastfuels_sdk/client_library/models/export.py @@ -75,6 +75,7 @@ def to_dict(self) -> Dict[str, Any]: ]) _dict = self.model_dump( + mode='json', by_alias=True, exclude=excluded_fields, exclude_none=True, diff --git a/fastfuels_sdk/client_library/models/feature_grid.py b/fastfuels_sdk/client_library/models/feature_grid.py index 740b357..ba85dbe 100644 --- a/fastfuels_sdk/client_library/models/feature_grid.py +++ b/fastfuels_sdk/client_library/models/feature_grid.py @@ -71,6 +71,7 @@ def to_dict(self) -> Dict[str, Any]: ]) _dict = self.model_dump( + mode='json', by_alias=True, exclude=excluded_fields, exclude_none=True, diff --git a/fastfuels_sdk/client_library/models/key.py b/fastfuels_sdk/client_library/models/key.py index 3df0c79..82fa44d 100644 --- a/fastfuels_sdk/client_library/models/key.py +++ b/fastfuels_sdk/client_library/models/key.py @@ -76,6 +76,7 @@ def to_dict(self) -> Dict[str, Any]: ]) _dict = self.model_dump( + mode='json', by_alias=True, exclude=excluded_fields, exclude_none=True, diff --git a/fastfuels_sdk/client_library/models/road_feature.py b/fastfuels_sdk/client_library/models/road_feature.py index 6e8be8b..2e341fc 100644 --- a/fastfuels_sdk/client_library/models/road_feature.py +++ b/fastfuels_sdk/client_library/models/road_feature.py @@ -71,6 +71,7 @@ def to_dict(self) -> Dict[str, Any]: ]) _dict = self.model_dump( + mode='json', by_alias=True, exclude=excluded_fields, exclude_none=True, diff --git a/fastfuels_sdk/client_library/models/surface_grid.py b/fastfuels_sdk/client_library/models/surface_grid.py index 459adee..2551060 100644 --- a/fastfuels_sdk/client_library/models/surface_grid.py +++ b/fastfuels_sdk/client_library/models/surface_grid.py @@ -84,6 +84,7 @@ def to_dict(self) -> Dict[str, Any]: ]) _dict = self.model_dump( + mode='json', by_alias=True, exclude=excluded_fields, exclude_none=True, diff --git a/fastfuels_sdk/client_library/models/topography_grid.py b/fastfuels_sdk/client_library/models/topography_grid.py index e32c7b3..27f527c 100644 --- a/fastfuels_sdk/client_library/models/topography_grid.py +++ b/fastfuels_sdk/client_library/models/topography_grid.py @@ -77,6 +77,7 @@ def to_dict(self) -> Dict[str, Any]: ]) _dict = self.model_dump( + mode='json', by_alias=True, exclude=excluded_fields, exclude_none=True, diff --git a/fastfuels_sdk/client_library/models/tree_grid.py b/fastfuels_sdk/client_library/models/tree_grid.py index a4c10ba..f7ecfb9 100644 --- a/fastfuels_sdk/client_library/models/tree_grid.py +++ b/fastfuels_sdk/client_library/models/tree_grid.py @@ -80,6 +80,7 @@ def to_dict(self) -> Dict[str, Any]: ]) _dict = self.model_dump( + mode='json', by_alias=True, exclude=excluded_fields, exclude_none=True, diff --git a/fastfuels_sdk/client_library/models/tree_inventory.py b/fastfuels_sdk/client_library/models/tree_inventory.py index ed88507..702b5ad 100644 --- a/fastfuels_sdk/client_library/models/tree_inventory.py +++ b/fastfuels_sdk/client_library/models/tree_inventory.py @@ -82,6 +82,7 @@ def to_dict(self) -> Dict[str, Any]: ]) _dict = self.model_dump( + mode='json', by_alias=True, exclude=excluded_fields, exclude_none=True, diff --git a/fastfuels_sdk/client_library/models/water_feature.py b/fastfuels_sdk/client_library/models/water_feature.py index 5ea42af..e27e403 100644 --- a/fastfuels_sdk/client_library/models/water_feature.py +++ b/fastfuels_sdk/client_library/models/water_feature.py @@ -71,6 +71,7 @@ def to_dict(self) -> Dict[str, Any]: ]) _dict = self.model_dump( + mode='json', by_alias=True, exclude=excluded_fields, exclude_none=True, diff --git a/tests/test_domains.py b/tests/test_domains.py index cf46a7f..80d1d7c 100644 --- a/tests/test_domains.py +++ b/tests/test_domains.py @@ -591,6 +591,33 @@ def test_to_json_clean_geometry_serialization(self, test_domain): assert "one_of_schemas" not in geometry assert "discriminator_value_class_map" not in geometry + def test_to_json_datetime_serialization(self, test_domain): + """Test that datetime fields are properly serialized as ISO 8601 strings.""" + from datetime import datetime + + result = test_domain.to_json() + parsed = json.loads(result) + + # Verify datetime fields exist and are strings (not datetime objects) + assert "createdOn" in parsed + assert "modifiedOn" in parsed + assert isinstance(parsed["createdOn"], str) + assert isinstance(parsed["modifiedOn"], str) + + # Verify they are valid ISO 8601 format by parsing them back + created_dt = datetime.fromisoformat(parsed["createdOn"].replace("Z", "+00:00")) + modified_dt = datetime.fromisoformat( + parsed["modifiedOn"].replace("Z", "+00:00") + ) + + assert isinstance(created_dt, datetime) + assert isinstance(modified_dt, datetime) + + # Verify the parsed datetime values match the original (accounting for timezone) + # Compare timestamp values to handle timezone differences + assert abs((created_dt.timestamp() - test_domain.created_on.timestamp())) < 1 + assert abs((modified_dt.timestamp() - test_domain.modified_on.timestamp())) < 1 + class TestDomainToGeoDataFrame: """Test suite for Domain.to_geodataframe() method."""