Skip to content

Commit a2fdf68

Browse files
committed
assert missing when empty
1 parent cc9e329 commit a2fdf68

2 files changed

Lines changed: 25 additions & 2 deletions

File tree

‎pyiceberg/table/metadata.py‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
import uuid
2222
from collections.abc import Iterable
2323
from copy import copy
24-
from typing import Annotated, Any, Literal
24+
from typing import TYPE_CHECKING, Annotated, Any, Literal
2525

26-
from pydantic import Field, field_serializer, field_validator, model_validator
26+
from pydantic import Field, field_serializer, field_validator, model_serializer, model_validator
2727
from pydantic import ValidationError as PydanticValidationError
2828

2929
from pyiceberg.exceptions import ValidationError
@@ -49,6 +49,9 @@
4949
from pyiceberg.utils.config import Config
5050
from pyiceberg.utils.datetime import datetime_to_millis
5151

52+
if TYPE_CHECKING:
53+
from pydantic.functional_serializers import ModelWrapSerializerWithoutInfo
54+
5255
CURRENT_SNAPSHOT_ID = "current-snapshot-id"
5356
CURRENT_SCHEMA_ID = "current-schema-id"
5457
SCHEMAS = "schemas"
@@ -618,6 +621,14 @@ def construct_refs(self) -> TableMetadata:
618621
encryption_keys: list[EncryptedKey] = Field(alias="encryption-keys", default_factory=list)
619622
"""An optional list of encryption keys used for table encryption."""
620623

624+
@model_serializer(mode="wrap")
625+
def serialize_model(self, handler: ModelWrapSerializerWithoutInfo) -> dict[str, Any]:
626+
"""Set custom serializer to leave out `encryption-keys` when it is empty."""
627+
serialized: dict[str, Any] = handler(self)
628+
if not self.encryption_keys:
629+
serialized.pop("encryption-keys", None)
630+
return serialized
631+
621632
def model_dump_json(self, exclude_none: bool = True, exclude: Any | None = None, by_alias: bool = True, **kwargs: Any) -> str:
622633
raise NotImplementedError("Writing V3 is not yet supported, see: https://github.com/apache/iceberg-python/issues/1551")
623634

‎tests/table/test_metadata.py‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -980,3 +980,15 @@ def test_v3_metadata_without_encryption_keys(example_table_metadata_v3: dict[str
980980
assert table_metadata.encryption_keys == []
981981
for snapshot in table_metadata.snapshots:
982982
assert snapshot.key_id is None
983+
984+
assert "encryption-keys" not in table_metadata.model_dump(mode="json")
985+
986+
987+
def test_v3_metadata_with_encryption_keys_serializes_them(example_table_metadata_v3: dict[str, Any]) -> None:
988+
table_metadata = TableMetadataUtil.parse_obj(
989+
{**example_table_metadata_v3, "encryption-keys": [{"key-id": "a", "encrypted-key-metadata": "a2V5"}]}
990+
)
991+
992+
assert table_metadata.model_dump(mode="json")["encryption-keys"] == [
993+
{"key-id": "a", "encrypted-key-metadata": "a2V5", "properties": {}}
994+
]

0 commit comments

Comments
 (0)