2121from abc import ABC , abstractmethod
2222from datetime import datetime
2323from functools import singledispatch
24- from typing import TYPE_CHECKING , Annotated , Any , Dict , Generic , List , Literal , Optional , Set , Tuple , TypeVar , Union , cast
24+ from typing import TYPE_CHECKING , Annotated , Any , Dict , Generic , List , Literal , Optional , Tuple , TypeVar , Union , cast
2525
26- from pydantic import Field , field_validator , model_validator
26+ from pydantic import Field , field_serializer , field_validator , model_validator
2727
2828from pyiceberg .exceptions import CommitFailedException
2929from pyiceberg .partitioning import PARTITION_FIELD_ID_START , PartitionSpec
@@ -725,7 +725,17 @@ class AssertRefSnapshotId(ValidatableTableRequirement):
725725
726726 type : Literal ["assert-ref-snapshot-id" ] = Field (default = "assert-ref-snapshot-id" )
727727 ref : str = Field (...)
728- snapshot_id : Optional [int ] = Field (default = None , alias = "snapshot-id" )
728+ snapshot_id : int = Field (default = - 1 , alias = "snapshot-id" )
729+
730+ # serialize -1 to null when serializing to json
731+ # TODO: make more generic Field so this can be used on other models that need
732+ # an explicit null.
733+ @field_serializer ("snapshot_id" , when_used = "json" )
734+ def snapshot_id_can_be_null (self , snapshot_id : int ) -> Optional [int ]:
735+ if snapshot_id == - 1 :
736+ return None
737+ else :
738+ return snapshot_id
729739
730740 def validate (self , base_metadata : Optional [TableMetadata ]) -> None :
731741 if base_metadata is None :
@@ -745,13 +755,6 @@ def validate(self, base_metadata: Optional[TableMetadata]) -> None:
745755 elif self .snapshot_id is not None :
746756 raise CommitFailedException (f"Requirement failed: branch or tag { self .ref } is missing, expected { self .snapshot_id } " )
747757
748- # override the override method, allowing None to serialize to `null` instead of being omitted.
749- def model_dump_json (
750- self , exclude_none : bool = False , exclude : Optional [Set [str ]] = None , by_alias : bool = True , ** kwargs : Any
751- ) -> str :
752- # `snapshot-id` is required in json response, even if null
753- return super ().model_dump_json (exclude_none = False )
754-
755758
756759class AssertLastAssignedFieldId (ValidatableTableRequirement ):
757760 """The table's last assigned column id must match the requirement's `last-assigned-field-id`."""
0 commit comments