Merge pull request #178 from adamcik/feature/serialize

Imutable object serialization support
This commit is contained in:
Stein Magnus Jodal 2012-09-05 16:57:24 -07:00
commit 21a85c0898
2 changed files with 59 additions and 0 deletions

View File

@ -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."""

View File

@ -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')