Skip to content

Commit 43774b7

Browse files
committed
Allow snapshot-id in assert-ref-snapshot-id requirement to serialize to null in json, fix #2342
1 parent 4234879 commit 43774b7

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

pyiceberg/table/update/__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,7 @@ class AssertRefSnapshotId(ValidatableTableRequirement):
736736

737737
type: Literal["assert-ref-snapshot-id"] = Field(default="assert-ref-snapshot-id")
738738
ref: str = Field(...)
739-
snapshot_id: Optional[int] = Field(default=None, alias="snapshot-id")
739+
snapshot_id: Optional[int] = Field(default=None, alias="snapshot-id", exclude=False)
740740

741741
def validate(self, base_metadata: Optional[TableMetadata]) -> None:
742742
if base_metadata is None:
@@ -756,6 +756,13 @@ def validate(self, base_metadata: Optional[TableMetadata]) -> None:
756756
elif self.snapshot_id is not None:
757757
raise CommitFailedException(f"Requirement failed: branch or tag {self.ref} is missing, expected {self.snapshot_id}")
758758

759+
# override the override method, allowing None to serialize to `null` instead of being omitted.
760+
def model_dump_json(
761+
self, exclude_none: bool = False, exclude: Optional[Set[str]] = None, by_alias: bool = True, **kwargs: Any
762+
) -> str:
763+
return super().model_dump_json(
764+
exclude_none=exclude_none, exclude=self._exclude_private_properties(exclude), by_alias=by_alias, **kwargs
765+
)
759766

760767
class AssertLastAssignedFieldId(ValidatableTableRequirement):
761768
"""The table's last assigned column id must match the requirement's `last-assigned-field-id`."""

tests/table/test_init.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,6 +1039,11 @@ def test_assert_ref_snapshot_id(table_v2: Table) -> None:
10391039
):
10401040
AssertRefSnapshotId(ref="test", snapshot_id=3055729675574597004).validate(base_metadata)
10411041

1042+
expected_json = """{"type":"assert-ref-snapshot-id","ref":"main","snapshot-id":null}"""
1043+
assert_json = AssertRefSnapshotId(ref="main").model_dump_json()
1044+
print(assert_json)
1045+
assert assert_json == expected_json
1046+
10421047

10431048
def test_assert_last_assigned_field_id(table_v2: Table) -> None:
10441049
base_metadata = table_v2.metadata

0 commit comments

Comments
 (0)