Merge pull request #178 from adamcik/feature/serialize
Imutable object serialization support
This commit is contained in:
commit
21a85c0898
@ -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."""
|
||||
|
||||
@ -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')
|
||||
|
||||
Loading…
Reference in New Issue
Block a user