diff --git a/pyiceberg/table/update/__init__.py b/pyiceberg/table/update/__init__.py index 3f7d43f0ef..dc941c34ee 100644 --- a/pyiceberg/table/update/__init__.py +++ b/pyiceberg/table/update/__init__.py @@ -21,7 +21,7 @@ from abc import ABC, abstractmethod from datetime import datetime from functools import singledispatch -from typing import TYPE_CHECKING, Annotated, Any, Dict, Generic, List, Literal, Optional, Tuple, TypeVar, Union, cast +from typing import TYPE_CHECKING, Annotated, Any, Dict, Generic, List, Literal, Optional, Set, Tuple, TypeVar, Union, cast from pydantic import Field, field_validator, model_validator @@ -756,6 +756,13 @@ def validate(self, base_metadata: Optional[TableMetadata]) -> None: elif self.snapshot_id is not None: raise CommitFailedException(f"Requirement failed: branch or tag {self.ref} is missing, expected {self.snapshot_id}") + # override the override method, allowing None to serialize to `null` instead of being omitted. + def model_dump_json( + self, exclude_none: bool = False, exclude: Optional[Set[str]] = None, by_alias: bool = True, **kwargs: Any + ) -> str: + # `snapshot-id` is required in json response, even if null + return super().model_dump_json(exclude_none=False) + class AssertLastAssignedFieldId(ValidatableTableRequirement): """The table's last assigned column id must match the requirement's `last-assigned-field-id`.""" diff --git a/tests/table/test_init.py b/tests/table/test_init.py index 748a77eee0..9d284e77f4 100644 --- a/tests/table/test_init.py +++ b/tests/table/test_init.py @@ -1039,6 +1039,9 @@ def test_assert_ref_snapshot_id(table_v2: Table) -> None: ): AssertRefSnapshotId(ref="test", snapshot_id=3055729675574597004).validate(base_metadata) + expected_json = '{"type":"assert-ref-snapshot-id","ref":"main","snapshot-id":null}' + assert AssertRefSnapshotId(ref="main").model_dump_json() == expected_json + def test_assert_last_assigned_field_id(table_v2: Table) -> None: base_metadata = table_v2.metadata