models: Add Identifer type which interns values.

This gives some moderate memory saving since the values are used in multiple
places.
This commit is contained in:
Thomas Adamcik 2015-04-08 00:11:23 +02:00
parent 168c10448b
commit 08fd99ffdb
2 changed files with 25 additions and 20 deletions

View File

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

View File

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