diff --git a/mopidy/models.py b/mopidy/models.py index 934ca8ac..c79eeab6 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -17,6 +17,7 @@ class ImmutableObject(object): return super(ImmutableObject, self).__setattr__(name, value) raise AttributeError('Object is immutable.') + class Artist(ImmutableObject): """ :param uri: artist URI @@ -169,6 +170,11 @@ class Playlist(ImmutableObject): #: The playlist name. Read-only. name = None + #: The playlist modification time. Read-only. + #: + #: :class:`datetime.datetime`, or :class:`None` if unknown. + last_modified = None + def __init__(self, *args, **kwargs): self._tracks = kwargs.pop('tracks', []) super(Playlist, self).__init__(*args, **kwargs) @@ -202,7 +208,7 @@ class Playlist(ImmutableObject): tracks.append(track.mpd_format(position, search_result)) return tracks - def with_(self, uri=None, name=None, tracks=None): + def with_(self, uri=None, name=None, tracks=None, last_modified=None): """ Create a new playlist object with the given values. The values that are not given are taken from the object the method is called on. @@ -223,4 +229,7 @@ class Playlist(ImmutableObject): name = self.name if tracks is None: tracks = self.tracks - return Playlist(uri=uri, name=name, tracks=tracks) + if last_modified is None: + last_modified = self.last_modified + return Playlist(uri=uri, name=name, tracks=tracks, + last_modified=last_modified) diff --git a/tests/modelstest.py b/tests/modelstest.py index 29911dc7..1fe4bcbe 100644 --- a/tests/modelstest.py +++ b/tests/modelstest.py @@ -137,6 +137,7 @@ class TrackTest(unittest.TestCase): track = Track(artists=[Artist(name=u'ABBA'), Artist(name=u'Beatles')]) self.assertEqual(track.mpd_format_artists(), u'ABBA, Beatles') + class PlaylistTest(unittest.TestCase): def test_uri(self): uri = u'an_uri' @@ -161,6 +162,13 @@ class PlaylistTest(unittest.TestCase): playlist = Playlist(tracks=tracks) self.assertEqual(playlist.length, 3) + def test_last_modified(self): + last_modified = dt.datetime.now() + playlist = Playlist(last_modified=last_modified) + self.assertEqual(playlist.last_modified, last_modified) + self.assertRaises(AttributeError, setattr, playlist, 'last_modified', + None) + def test_mpd_format(self): playlist = Playlist(tracks=[ Track(track_no=1), Track(track_no=2), Track(track_no=3)]) @@ -176,25 +184,46 @@ class PlaylistTest(unittest.TestCase): def test_with_new_uri(self): tracks = [Track()] - playlist = Playlist(uri=u'an uri', name=u'a name', tracks=tracks) + last_modified = dt.datetime.now() + playlist = Playlist(uri=u'an uri', name=u'a name', tracks=tracks, + last_modified=last_modified) new_playlist = playlist.with_(uri=u'another uri') self.assertEqual(new_playlist.uri, u'another uri') self.assertEqual(new_playlist.name, u'a name') self.assertEqual(new_playlist.tracks, tracks) + self.assertEqual(new_playlist.last_modified, last_modified) def test_with_new_name(self): tracks = [Track()] - playlist = Playlist(uri=u'an uri', name=u'a name', tracks=tracks) + last_modified = dt.datetime.now() + playlist = Playlist(uri=u'an uri', name=u'a name', tracks=tracks, + last_modified=last_modified) new_playlist = playlist.with_(name=u'another name') self.assertEqual(new_playlist.uri, u'an uri') self.assertEqual(new_playlist.name, u'another name') self.assertEqual(new_playlist.tracks, tracks) + self.assertEqual(new_playlist.last_modified, last_modified) def test_with_new_tracks(self): tracks = [Track()] - playlist = Playlist(uri=u'an uri', name=u'a name', tracks=tracks) + last_modified = dt.datetime.now() + playlist = Playlist(uri=u'an uri', name=u'a name', tracks=tracks, + last_modified=last_modified) new_tracks = [Track(), Track()] new_playlist = playlist.with_(tracks=new_tracks) self.assertEqual(new_playlist.uri, u'an uri') self.assertEqual(new_playlist.name, u'a name') self.assertEqual(new_playlist.tracks, new_tracks) + self.assertEqual(new_playlist.last_modified, last_modified) + + def test_with_new_last_modified(self): + tracks = [Track()] + last_modified = dt.datetime.now() + new_last_modified = last_modified + dt.timedelta(1) + playlist = Playlist(uri=u'an uri', name=u'a name', tracks=tracks, + last_modified=last_modified) + new_playlist = playlist.with_(last_modified=new_last_modified) + self.assertEqual(new_playlist.uri, u'an uri') + self.assertEqual(new_playlist.name, u'a name') + self.assertEqual(new_playlist.tracks, tracks) + self.assertEqual(new_playlist.last_modified, new_last_modified)