diff --git a/picard/file.py b/picard/file.py index 5d99a02a1..05cfb0013 100644 --- a/picard/file.py +++ b/picard/file.py @@ -175,7 +175,8 @@ class File(QtCore.QObject, Item): deleted_tags = self.metadata.deleted_tags self.metadata.copy(metadata) if preserve_deleted: - self.metadata.deleted_tags = deleted_tags + for tag in deleted_tags: + self.metadata.delete(tag) for tag, values in saved_metadata.items(): self.metadata.set(tag, values) diff --git a/picard/metadata.py b/picard/metadata.py index 62b45badf..5958967ca 100644 --- a/picard/metadata.py +++ b/picard/metadata.py @@ -301,7 +301,7 @@ class Metadata(dict): values = [string_(value) for value in values if value] if len(values): self.set(name, values) - else: + elif name in self: self.delete(name) def add(self, name, value): diff --git a/test/test_metadata.py b/test/test_metadata.py index 07f67ee01..71f7d6550 100644 --- a/test/test_metadata.py +++ b/test/test_metadata.py @@ -36,7 +36,7 @@ class MetadataTest(unittest.TestCase): def tearDown(self): pass - def test_metadata_set(self): + def test_metadata_setitem(self): self.assertEqual(["single1-value"], dict.get(self.metadata,"single1")) self.assertEqual(["single2-value"], dict.get(self.metadata,"single2")) self.assertEqual(self.multi1, dict.get(self.metadata,"multi1")) @@ -66,10 +66,31 @@ class MetadataTest(unittest.TestCase): self.assertNotIn("single1", self.metadata) self.assertIn("single1", self.metadata.deleted_tags) + def test_metadata_implicit_delete(self): self.metadata["single2"] = "" self.assertNotIn("single2", self.metadata) self.assertIn("single2", self.metadata.deleted_tags) + self.metadata["unknown"] = "" + self.assertNotIn("unknown", self.metadata) + self.assertNotIn("unknown", self.metadata.deleted_tags) + + def test_metadata_set_explicit_empty(self): + self.metadata.delete("single1") + self.metadata.set("single1", []) + self.assertIn("single1", self.metadata) + self.assertNotIn("single1", self.metadata.deleted_tags) + self.assertEqual([], self.metadata.getall("single1")) + + def test_metadata_undelete(self): + self.metadata.delete("single1") + self.assertNotIn("single1", self.metadata) + self.assertIn("single1", self.metadata.deleted_tags) + + self.metadata["single1"] = "value1" + self.assertIn("single1", self.metadata) + self.assertNotIn("single1", self.metadata.deleted_tags) + def test_metadata_update(self): m = Metadata() m["old"] = "old-value"