diff --git a/beets/mediafile.py b/beets/mediafile.py index 301e0f370..3ef7d16f8 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -1256,6 +1256,14 @@ class MediaFile(object): for tag in self.mgfile.keys(): del self.mgfile[tag] + @classmethod + def fields(cls): + """Yield the names of all properties that are MediaFields. + """ + for property, descriptor in cls.__dict__.items(): + if isinstance(descriptor, MediaField): + yield property + # Field definitions. diff --git a/test/test_mediafile.py b/test/test_mediafile.py index 19d2ceda8..c710bde1f 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -692,6 +692,20 @@ class OpusTest(ReadWriteTestBase, unittest.TestCase): } +class MediaFieldTest(unittest.TestCase): + + def test_properties_from_fields(self): + path = os.path.join(_common.RSRC, 'full.mp3') + mediafile = MediaFile(path) + for field in MediaFile.fields(): + self.assertTrue(hasattr(mediafile, field)) + + def test_known_fields(self): + fields = ReadWriteTestBase.empty_tags.keys() + fields.extend(('encoder', 'images', 'genres', 'albumtype')) + self.assertItemsEqual(MediaFile.fields(), fields) + + def suite(): return unittest.TestLoader().loadTestsFromName(__name__)