Skip to content

Commit eceff33

Browse files
committed
rebase and test fixes
1 parent 5e1dfb7 commit eceff33

File tree

3 files changed

+29
-9
lines changed

3 files changed

+29
-9
lines changed

pyiceberg/table/update/__init__.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,21 @@ def _(update: AddEncryptedKeyUpdate, base_metadata: TableMetadata, context: _Tab
620620

621621
return base_metadata.model_copy(update={"encryption_keys": base_metadata.encryption_keys + [update.key]})
622622

623+
624+
@_apply_table_update.register(RemoveEncryptedKeyUpdate)
625+
def _(update: RemoveEncryptedKeyUpdate, base_metadata: TableMetadata, context: _TableMetadataUpdateContext) -> TableMetadata:
626+
context.add_update(update)
627+
628+
if base_metadata.format_version <= 2:
629+
raise ValueError("Cannot add encryption keys to Iceberg v1 or v2 tables")
630+
631+
encryption_keys = [key for key in base_metadata.encryption_keys if key.key_id != update.key_id]
632+
if len(encryption_keys) == len(base_metadata.encryption_keys):
633+
raise ValueError(f"Encryption key {update.key_id} not found")
634+
635+
return base_metadata.model_copy(update={"encryption_keys": encryption_keys})
636+
637+
623638
@_apply_table_update.register(SetPartitionStatisticsUpdate)
624639
def _(update: SetPartitionStatisticsUpdate, base_metadata: TableMetadata, context: _TableMetadataUpdateContext) -> TableMetadata:
625640
partition_statistics = filter_statistics_by_snapshot_id(

tests/table/test_init.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@
7979
AssertLastAssignedPartitionId,
8080
AssertRefSnapshotId,
8181
AssertTableUUID,
82-
RemovePartitionStatisticsUpdate,
8382
RemoveEncryptedKeyUpdate,
83+
RemovePartitionStatisticsUpdate,
8484
RemovePropertiesUpdate,
8585
RemoveSnapshotRefUpdate,
8686
RemoveSnapshotsUpdate,
@@ -1383,9 +1383,7 @@ def test_set_partition_statistics_update(table_v2_with_statistics: Table) -> Non
13831383
new_metadata = update_table_metadata(
13841384
table_v2_with_statistics.metadata,
13851385
(update,),
1386-
1387-
def test_add_encryption_key(table_v3: Table) -> None:
1388-
update = AddEncryptedKeyUpdate(key=EncryptedKey(key_id="test", encrypted_key_metadata=base64.b64encode(b"hello")))
1386+
)
13891387

13901388
expected = """
13911389
{
@@ -1443,6 +1441,13 @@ def test_remove_partition_statistics_update_with_invalid_snapshot_id(table_v2_wi
14431441
table_v2_with_statistics.metadata,
14441442
(RemovePartitionStatisticsUpdate(snapshot_id=123456789),),
14451443
)
1444+
1445+
1446+
def test_add_encryption_key(table_v3: Table) -> None:
1447+
update = AddEncryptedKeyUpdate(key=EncryptedKey(key_id="test", encrypted_key_metadata=base64.b64encode(b"hello")))
1448+
1449+
expected = """
1450+
{
14461451
"key-id": "test",
14471452
"encrypted-key-metadata": "aGVsbG8="
14481453
}"""
@@ -1470,11 +1475,11 @@ def test_remove_non_existent_encryption_key(table_v3: Table) -> None:
14701475
assert len(add_metadata.encryption_keys) == 1
14711476

14721477
update_remove = RemoveEncryptedKeyUpdate(key_id="non_existent_key")
1473-
remove_metadata = update_table_metadata(add_metadata, (update_remove,))
1474-
assert len(remove_metadata.encryption_keys) == 1 # Should be a no-op
1478+
with pytest.raises(ValueError, match=r"Encryption key non_existent_key not found"):
1479+
update_table_metadata(add_metadata, (update_remove,))
14751480

14761481

14771482
def test_add_remove_encryption_key_v2_table(table_v2: Table) -> None:
14781483
update_add = AddEncryptedKeyUpdate(key=EncryptedKey(key_id="test_v2", encrypted_key_metadata=base64.b64encode(b"hello_v2")))
1479-
with pytest.raises(ValueError, match=r"Cannot add encryption keys from Iceberg v1 or v2 table"):
1484+
with pytest.raises(ValueError, match=r"Cannot add encryption keys to Iceberg v1 or v2 table"):
14801485
update_table_metadata(table_v2.metadata, (update_add,))

tests/table/test_snapshots.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,15 +139,15 @@ def test_deserialize_snapshot_with_properties(snapshot_with_properties: Snapshot
139139
def test_snapshot_repr(snapshot: Snapshot) -> None:
140140
assert (
141141
repr(snapshot)
142-
== """Snapshot(snapshot_id=25, parent_snapshot_id=19, sequence_number=200, timestamp_ms=1602638573590, manifest_list='s3:/a/b/c.avro', summary=Summary(Operation.APPEND), schema_id=3)"""
142+
== """Snapshot(snapshot_id=25, parent_snapshot_id=19, sequence_number=200, timestamp_ms=1602638573590, manifest_list='s3:/a/b/c.avro', summary=Summary(Operation.APPEND), schema_id=3, key_id=None)"""
143143
)
144144
assert snapshot == eval(repr(snapshot))
145145

146146

147147
def test_snapshot_with_properties_repr(snapshot_with_properties: Snapshot) -> None:
148148
assert (
149149
repr(snapshot_with_properties)
150-
== """Snapshot(snapshot_id=25, parent_snapshot_id=19, sequence_number=200, timestamp_ms=1602638573590, manifest_list='s3:/a/b/c.avro', summary=Summary(Operation.APPEND, **{'foo': 'bar'}), schema_id=3)"""
150+
== """Snapshot(snapshot_id=25, parent_snapshot_id=19, sequence_number=200, timestamp_ms=1602638573590, manifest_list='s3:/a/b/c.avro', summary=Summary(Operation.APPEND, **{'foo': 'bar'}), schema_id=3, key_id=None)"""
151151
)
152152
assert snapshot_with_properties == eval(repr(snapshot_with_properties))
153153

0 commit comments

Comments
 (0)