diff --git a/mopidy/models.py b/mopidy/models.py index 4f8ae6fe..e936e22c 100644 --- a/mopidy/models.py +++ b/mopidy/models.py @@ -75,6 +75,11 @@ class String(Field): super(String, self).__init__(type=basestring, default=default) +class Identifier(String): + def validate(self, value): + return intern(str(super(Identifier, self).validate(value))) + + class Integer(Field): """ @@ -290,7 +295,7 @@ class Ref(ImmutableObject): """ #: The object URI. Read-only. - uri = String() + uri = Identifier() #: The object name. Read-only. name = String() @@ -354,7 +359,7 @@ class Image(ImmutableObject): """ #: The image URI. Read-only. - uri = String() + uri = Identifier() #: Optional width of the image or :class:`None`. Read-only. width = Integer(min=0) @@ -375,13 +380,13 @@ class Artist(ImmutableObject): """ #: The artist URI. Read-only. - uri = String() + uri = Identifier() #: The artist name. Read-only. name = String() #: The MusicBrainz ID of the artist. Read-only. - musicbrainz_id = String() + musicbrainz_id = Identifier() class Album(ImmutableObject): @@ -406,7 +411,7 @@ class Album(ImmutableObject): """ #: The album URI. Read-only. - uri = String() + uri = Identifier() #: The album name. Read-only. name = String() @@ -424,7 +429,7 @@ class Album(ImmutableObject): date = String() # TODO: add date type #: The MusicBrainz ID of the album. Read-only. - musicbrainz_id = String() + musicbrainz_id = Identifier() #: The album image URIs. Read-only. images = Collection(type=basestring, container=frozenset) @@ -469,7 +474,7 @@ class Track(ImmutableObject): """ #: The track URI. Read-only. - uri = String() + uri = Identifier() #: The track name. Read-only. name = String() @@ -508,7 +513,7 @@ class Track(ImmutableObject): comment = String() #: The MusicBrainz ID of the track. Read-only. - musicbrainz_id = String() + musicbrainz_id = Identifier() #: Integer representing when the track was last modified. Exact meaning #: depends on source of track. For local files this is the modification @@ -571,7 +576,7 @@ class Playlist(ImmutableObject): """ #: The playlist URI. Read-only. - uri = String() + uri = Identifier() #: The playlist name. Read-only. name = String() @@ -607,7 +612,7 @@ class SearchResult(ImmutableObject): """ # The search result URI. Read-only. - uri = String() + uri = Identifier() # The tracks matching the search query. Read-only. tracks = Collection(type=Track, container=tuple) diff --git a/tests/models/test_models.py b/tests/models/test_models.py index 77383a6e..7e0d6bb9 100644 --- a/tests/models/test_models.py +++ b/tests/models/test_models.py @@ -86,7 +86,7 @@ class RefTest(unittest.TestCase): def test_repr_without_results(self): self.assertEqual( - "Ref(name=u'foo', type=u'artist', uri=u'uri')", + "Ref(name=u'foo', type=u'artist', uri='uri')", repr(Ref(uri='uri', name='foo', type='artist'))) def test_serialize_without_results(self): @@ -200,7 +200,7 @@ class ArtistTest(unittest.TestCase): def test_repr(self): self.assertEqual( - "Artist(name=u'name', uri=u'uri')", + "Artist(name=u'name', uri='uri')", repr(Artist(uri='uri', name='name'))) def test_serialize(self): @@ -365,12 +365,12 @@ class AlbumTest(unittest.TestCase): def test_repr_without_artists(self): self.assertEqual( - "Album(name=u'name', uri=u'uri')", + "Album(name=u'name', uri='uri')", repr(Album(uri='uri', name='name'))) def test_repr_with_artists(self): self.assertEqual( - "Album(artists=[Artist(name=u'foo')], name=u'name', uri=u'uri')", + "Album(artists=[Artist(name=u'foo')], name=u'name', uri='uri')", repr(Album(uri='uri', name='name', artists=[Artist(name='foo')]))) def test_serialize_without_artists(self): @@ -609,12 +609,12 @@ class TrackTest(unittest.TestCase): def test_repr_without_artists(self): self.assertEqual( - "Track(name=u'name', uri=u'uri')", + "Track(name=u'name', uri='uri')", repr(Track(uri='uri', name='name'))) def test_repr_with_artists(self): self.assertEqual( - "Track(artists=[Artist(name=u'foo')], name=u'name', uri=u'uri')", + "Track(artists=[Artist(name=u'foo')], name=u'name', uri='uri')", repr(Track(uri='uri', name='name', artists=[Artist(name='foo')]))) def test_serialize_without_artists(self): @@ -844,7 +844,7 @@ class TlTrackTest(unittest.TestCase): def test_repr(self): self.assertEqual( - "TlTrack(tlid=123, track=Track(uri=u'uri'))", + "TlTrack(tlid=123, track=Track(uri='uri'))", repr(TlTrack(tlid=123, track=Track(uri='uri')))) def test_serialize(self): @@ -977,12 +977,12 @@ class PlaylistTest(unittest.TestCase): def test_repr_without_tracks(self): self.assertEqual( - "Playlist(name=u'name', uri=u'uri')", + "Playlist(name=u'name', uri='uri')", repr(Playlist(uri='uri', name='name'))) def test_repr_with_tracks(self): self.assertEqual( - "Playlist(name=u'name', tracks=[Track(name=u'foo')], uri=u'uri')", + "Playlist(name=u'name', tracks=[Track(name=u'foo')], uri='uri')", repr(Playlist(uri='uri', name='name', tracks=[Track(name='foo')]))) def test_serialize_without_tracks(self): @@ -1114,7 +1114,7 @@ class SearchResultTest(unittest.TestCase): def test_repr_without_results(self): self.assertEqual( - "SearchResult(uri=u'uri')", + "SearchResult(uri='uri')", repr(SearchResult(uri='uri'))) def test_serialize_without_results(self):