Skip to content

Commit 88d0162

Browse files
committed
rebase and test fixes
1 parent e11be88 commit 88d0162

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
@@ -617,6 +617,21 @@ def _(update: AddEncryptedKeyUpdate, base_metadata: TableMetadata, context: _Tab
617617

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

620+
621+
@_apply_table_update.register(RemoveEncryptedKeyUpdate)
622+
def _(update: RemoveEncryptedKeyUpdate, base_metadata: TableMetadata, context: _TableMetadataUpdateContext) -> TableMetadata:
623+
context.add_update(update)
624+
625+
if base_metadata.format_version <= 2:
626+
raise ValueError("Cannot add encryption keys to Iceberg v1 or v2 tables")
627+
628+
encryption_keys = [key for key in base_metadata.encryption_keys if key.key_id != update.key_id]
629+
if len(encryption_keys) == len(base_metadata.encryption_keys):
630+
raise ValueError(f"Encryption key {update.key_id} not found")
631+
632+
return base_metadata.model_copy(update={"encryption_keys": encryption_keys})
633+
634+
620635
@_apply_table_update.register(RemoveSchemasUpdate)
621636
def _(update: RemoveSchemasUpdate, base_metadata: TableMetadata, context: _TableMetadataUpdateContext) -> TableMetadata:
622637
# This method should error if any schemas do not exist.

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
RemoveSchemasUpdate,
8686
RemoveSnapshotRefUpdate,
@@ -1423,9 +1423,7 @@ def test_set_partition_statistics_update(table_v2_with_statistics: Table) -> Non
14231423
new_metadata = update_table_metadata(
14241424
table_v2_with_statistics.metadata,
14251425
(update,),
1426-
1427-
def test_add_encryption_key(table_v3: Table) -> None:
1428-
update = AddEncryptedKeyUpdate(key=EncryptedKey(key_id="test", encrypted_key_metadata=base64.b64encode(b"hello")))
1426+
)
14291427

14301428
expected = """
14311429
{
@@ -1483,6 +1481,13 @@ def test_remove_partition_statistics_update_with_invalid_snapshot_id(table_v2_wi
14831481
table_v2_with_statistics.metadata,
14841482
(RemovePartitionStatisticsUpdate(snapshot_id=123456789),),
14851483
)
1484+
1485+
1486+
def test_add_encryption_key(table_v3: Table) -> None:
1487+
update = AddEncryptedKeyUpdate(key=EncryptedKey(key_id="test", encrypted_key_metadata=base64.b64encode(b"hello")))
1488+
1489+
expected = """
1490+
{
14861491
"key-id": "test",
14871492
"encrypted-key-metadata": "aGVsbG8="
14881493
}"""
@@ -1510,11 +1515,11 @@ def test_remove_non_existent_encryption_key(table_v3: Table) -> None:
15101515
assert len(add_metadata.encryption_keys) == 1
15111516

15121517
update_remove = RemoveEncryptedKeyUpdate(key_id="non_existent_key")
1513-
remove_metadata = update_table_metadata(add_metadata, (update_remove,))
1514-
assert len(remove_metadata.encryption_keys) == 1 # Should be a no-op
1518+
with pytest.raises(ValueError, match=r"Encryption key non_existent_key not found"):
1519+
update_table_metadata(add_metadata, (update_remove,))
15151520

15161521

15171522
def test_add_remove_encryption_key_v2_table(table_v2: Table) -> None:
15181523
update_add = AddEncryptedKeyUpdate(key=EncryptedKey(key_id="test_v2", encrypted_key_metadata=base64.b64encode(b"hello_v2")))
1519-
with pytest.raises(ValueError, match=r"Cannot add encryption keys from Iceberg v1 or v2 table"):
1524+
with pytest.raises(ValueError, match=r"Cannot add encryption keys to Iceberg v1 or v2 table"):
15201525
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)