diff --git a/picard/metadata.py b/picard/metadata.py index f8fabea4b..a8e20e5d4 100644 --- a/picard/metadata.py +++ b/picard/metadata.py @@ -17,7 +17,10 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. -from collections.abc import MutableMapping +from collections.abc import ( + Iterable, + MutableMapping, +) from PyQt5.QtCore import QObject @@ -346,9 +349,9 @@ class Metadata(MutableMapping): self.deleted_tags.discard(name) def __setitem__(self, name, values): - if not isinstance(values, list): + if isinstance(values, str) or not isinstance(values, Iterable): values = [values] - values = [str(value) for value in values if value] + values = [str(value) for value in values if value or value == 0] if values: self.set(name, values) elif name in self._store: diff --git a/test/test_metadata.py b/test/test_metadata.py index 4424bf6b8..7f91e695a 100644 --- a/test/test_metadata.py +++ b/test/test_metadata.py @@ -200,6 +200,16 @@ class MetadataTest(PicardTestCase): self.assertIn('c', m.deleted_tags) self.assertEqual(m.length, 1234) + def test_metadata_mapping_init_zero(self): + m = Metadata(tag1='a', tag2=0, tag3='', tag4=None) + m['tag5'] = 0 + m['tag1'] = '' + self.assertIn('tag1', m.deleted_tags) + self.assertEqual(m['tag2'], '0') + self.assertNotIn('tag3', m) + self.assertNotIn('tag4', m) + self.assertEqual(m['tag5'], '0') + def test_metadata_mapping_del(self): m = self.metadata_d1 self.assertEqual(m.getraw('a'), ['b']) @@ -342,3 +352,13 @@ class MetadataTest(PicardTestCase): m1.remove_image(0) self.assertEqual(len(m1), 1) # one tag, zero image self.assertFalse(m1.images) + + def test_metadata_mapping_iterable(self): + m = Metadata(tag_tuple=('a', 0)) + m['tag_set'] = {'c', 'd'} + m['tag_dict'] = {'e': 1, 'f': 2} + m['tag_str'] = 'gh' + self.assertIn('0', m.getraw('tag_tuple')) + self.assertIn('c', m.getraw('tag_set')) + self.assertIn('e', m.getraw('tag_dict')) + self.assertIn('gh', m.getraw('tag_str'))