From 6805c16b1a1801715363b9b755d6a9e3324380d7 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 Sep 2012 23:54:37 +0200 Subject: [PATCH] Add .serialize() method to ImutableObjects. Should be useful for things like dumping to json. --- mopidy/models.py | 15 +++++++++++++++ tests/models_test.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/mopidy/models.py b/mopidy/models.py index 9a508ba7..3363a429 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -74,6 +74,19 @@ class ImmutableObject(object): % key) return self.__class__(**data) + def serialize(self): + data = {} + for key in self.__dict__.keys(): + public_key = key.lstrip('_') + value = self.__dict__[key] + if isinstance(value, (set, frozenset, list, tuple)): + value = [o.serialize() for o in value] + elif isinstance(value, ImmutableObject): + value = value.serialize() + if value: + data[public_key] = value + return data + class Artist(ImmutableObject): """ @@ -216,6 +229,8 @@ class Playlist(ImmutableObject): self.__dict__['tracks'] = tuple(kwargs.pop('tracks', [])) super(Playlist, self).__init__(*args, **kwargs) + # TODO: def insert(self, pos, track): ... ? + @property def length(self): """The number of tracks in the playlist. Read-only.""" diff --git a/tests/models_test.py b/tests/models_test.py index 978f35b6..231587e4 100644 --- a/tests/models_test.py +++ b/tests/models_test.py @@ -79,6 +79,11 @@ class ArtistTest(unittest.TestCase): "Artist(name='name', uri='uri')", repr(Artist(uri='uri', name='name'))) + def test_serialize(self): + self.assertDictEqual( + {'uri': 'uri', 'name': 'name'}, + Artist(uri='uri', name='name').serialize()) + def test_eq_name(self): artist1 = Artist(name=u'name') artist2 = Artist(name=u'name') @@ -180,6 +185,17 @@ class AlbumTest(unittest.TestCase): "Album(artists=[Artist(name='foo')], name='name', uri='uri')", repr(Album(uri='uri', name='name', artists=[Artist(name='foo')]))) + def test_serialize_without_artists(self): + self.assertDictEqual( + {'uri': 'uri', 'name': 'name'}, + Album(uri='uri', name='name').serialize()) + + def test_serialize_with_artists(self): + artist = Artist(name='foo') + self.assertDictEqual( + {'uri': 'uri', 'name': 'name', 'artists': [artist.serialize()]}, + Album(uri='uri', name='name', artists=[artist]).serialize()) + def test_eq_name(self): album1 = Album(name=u'name') album2 = Album(name=u'name') @@ -360,6 +376,23 @@ class TrackTest(unittest.TestCase): "Track(artists=[Artist(name='foo')], name='name', uri='uri')", repr(Track(uri='uri', name='name', artists=[Artist(name='foo')]))) + def test_serialize_without_artists(self): + self.assertDictEqual( + {'uri': 'uri', 'name': 'name'}, + Track(uri='uri', name='name').serialize()) + + def test_serialize_with_artists(self): + artist = Artist(name='foo') + self.assertDictEqual( + {'uri': 'uri', 'name': 'name', 'artists': [artist.serialize()]}, + Track(uri='uri', name='name', artists=[artist]).serialize()) + + def test_serialize_with_album(self): + album = Album(name='foo') + self.assertDictEqual( + {'uri': 'uri', 'name': 'name', 'album': album.serialize()}, + Track(uri='uri', name='name', album=album).serialize()) + def test_eq_uri(self): track1 = Track(uri=u'uri1') track2 = Track(uri=u'uri1') @@ -603,6 +636,17 @@ class PlaylistTest(unittest.TestCase): "uri='uri')", repr(Playlist(uri='uri', name='name', tracks=[Track(name='foo')]))) + def test_serialize_without_tracks(self): + self.assertDictEqual( + {'uri': 'uri', 'name': 'name'}, + Playlist(uri='uri', name='name').serialize()) + + def test_serialize_with_tracks(self): + track = Track(name='foo') + self.assertDictEqual( + {'uri': 'uri', 'name': 'name', 'tracks': [track.serialize()]}, + Playlist(uri='uri', name='name', tracks=[track]).serialize()) + def test_eq_name(self): playlist1 = Playlist(name=u'name') playlist2 = Playlist(name=u'name')