From 6a01a2e90618a78201175f09f4b5a12841bea409 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 7 Aug 2016 21:25:46 +0200 Subject: [PATCH 1/5] models: Test Identifier field type --- tests/models/test_fields.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/tests/models/test_fields.py b/tests/models/test_fields.py index 3374c822..69f4cd91 100644 --- a/tests/models/test_fields.py +++ b/tests/models/test_fields.py @@ -2,7 +2,7 @@ from __future__ import absolute_import, unicode_literals import unittest -from mopidy.models.fields import Collection, Field, Integer, String +from mopidy.models.fields import Collection, Field, Identifier, Integer, String def create_instance(field): @@ -126,6 +126,37 @@ class StringTest(unittest.TestCase): self.assertEqual('', instance.attr) +class IdentifierTest(unittest.TestCase): + def test_default_handling(self): + instance = create_instance(Identifier(default='abc')) + self.assertEqual('abc', instance.attr) + + def test_native_str_allowed(self): + instance = create_instance(Identifier()) + instance.attr = str('abc') + self.assertEqual('abc', instance.attr) + + def test_bytes_allowed(self): + instance = create_instance(Identifier()) + instance.attr = b'abc' + self.assertEqual(b'abc', instance.attr) + + def test_unicode_allowed(self): + instance = create_instance(Identifier()) + instance.attr = u'abc' + self.assertEqual(u'abc', instance.attr) + + def test_other_disallowed(self): + instance = create_instance(Identifier()) + with self.assertRaises(TypeError): + instance.attr = 1234 + + def test_empty_string(self): + instance = create_instance(Identifier()) + instance.attr = '' + self.assertEqual('', instance.attr) + + class IntegerTest(unittest.TestCase): def test_default_handling(self): instance = create_instance(Integer(default=1234)) From 2d4439a03a16766ceaabd0e3deb4e1c07b6b4803 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 7 Aug 2016 21:25:36 +0200 Subject: [PATCH 2/5] audio: Formatting --- mopidy/audio/tags.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mopidy/audio/tags.py b/mopidy/audio/tags.py index 7fabefd6..e4d86dc7 100644 --- a/mopidy/audio/tags.py +++ b/mopidy/audio/tags.py @@ -136,12 +136,11 @@ def convert_tags_to_track(tags): return Track(**track_kwargs) -def _artists( - tags, artist_name, artist_id=None, artist_sortname=None): - +def _artists(tags, artist_name, artist_id=None, artist_sortname=None): # Name missing, don't set artist if not tags.get(artist_name): return None + # One artist name and either id or sortname, include all available fields if len(tags[artist_name]) == 1 and \ (artist_id in tags or artist_sortname in tags): From 4e91f289448b99df62af5b1a890d04d968e3eb02 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 9 Aug 2016 22:37:44 +0200 Subject: [PATCH 3/5] docs: Remove GlobalSign as cert has expired --- docs/sponsors.rst | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/sponsors.rst b/docs/sponsors.rst index 2d8b7f4e..2528247b 100644 --- a/docs/sponsors.rst +++ b/docs/sponsors.rst @@ -31,10 +31,3 @@ accelerate requests to all Mopidy services, including: - https://dl.mopidy.com/pimusicbox/, which is used to distribute Pi Musicbox images. - - -GlobalSign -========== - -`GlobalSign `_ provides Mopidy with a free SSL -certificate for mopidy.com, which we use to secure access to all our web sites. From 3346778c4118f6e6e3f679d4b1280e4b47b50de3 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 7 Aug 2016 21:29:14 +0200 Subject: [PATCH 4/5] models: Fix encoding error in Identifier field Fixes #1508 --- docs/changelog.rst | 4 ++++ mopidy/models/fields.py | 7 +++++-- tests/models/test_fields.py | 7 +++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index d6548865..8a3fd869 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -46,6 +46,10 @@ Bug fix release. one. Particularly relevant for Mopidy-Scrobbler users, as before it was essentially unusable. (Fixes: :issue:`1456`, PR: :issue:`1534`) +- Models: Fix encoding error if :class:`~mopidy.models.fields.Identifier` + fields, like the ``musicbrainz_id`` model fields, contained non-ASCII Unicode + data. (Fixes: :issue:`1508`, PR: :issue:`1546`) + - File: Ensure path comparision is done between bytestrings only. Fixes crash where a :confval:`file/media_dirs` path contained non-ASCII characters. (Fixes: :issue:`1345`, PR: :issue:`1493`) diff --git a/mopidy/models/fields.py b/mopidy/models/fields.py index c686b447..c5800eba 100644 --- a/mopidy/models/fields.py +++ b/mopidy/models/fields.py @@ -88,14 +88,17 @@ class Date(String): class Identifier(String): """ - :class:`Field` for storing ASCII values such as GUIDs or other identifiers. + :class:`Field` for storing values such as GUIDs or other identifiers. Values will be interned. :param default: default value for field """ def validate(self, value): - return compat.intern(str(super(Identifier, self).validate(value))) + value = super(Identifier, self).validate(value) + if isinstance(value, compat.text_type): + value = value.encode('utf-8') + return compat.intern(value) class URI(Identifier): diff --git a/tests/models/test_fields.py b/tests/models/test_fields.py index 69f4cd91..a4788e4d 100644 --- a/tests/models/test_fields.py +++ b/tests/models/test_fields.py @@ -1,3 +1,5 @@ +# encoding: utf-8 + from __future__ import absolute_import, unicode_literals import unittest @@ -146,6 +148,11 @@ class IdentifierTest(unittest.TestCase): instance.attr = u'abc' self.assertEqual(u'abc', instance.attr) + def test_unicode_with_nonascii_allowed(self): + instance = create_instance(Identifier()) + instance.attr = u'æøå' + self.assertEqual(u'æøå'.encode('utf-8'), instance.attr) + def test_other_disallowed(self): instance = create_instance(Identifier()) with self.assertRaises(TypeError): From 4c3309814f61a67c4baa2a92914e030ab3c9240e Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 12 Aug 2016 01:16:53 +0200 Subject: [PATCH 5/5] docs: Fix typos in changelog --- docs/changelog.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 8a3fd869..f3482ea2 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -50,7 +50,7 @@ Bug fix release. fields, like the ``musicbrainz_id`` model fields, contained non-ASCII Unicode data. (Fixes: :issue:`1508`, PR: :issue:`1546`) -- File: Ensure path comparision is done between bytestrings only. Fixes crash +- File: Ensure path comparison is done between bytestrings only. Fixes crash where a :confval:`file/media_dirs` path contained non-ASCII characters. (Fixes: :issue:`1345`, PR: :issue:`1493`) @@ -401,7 +401,7 @@ Bug fix release. proceed startup. (Fixes: :issue:`1248`, PR: :issue:`1254`) - Stream: Fix bug in new playlist parser. A non-ASCII char in an urilist - comment would cause a crash while parsing due to comparision of a non-ASCII + comment would cause a crash while parsing due to comparison of a non-ASCII bytestring with a Unicode string. (Fixes: :issue:`1265`) - File: Adjust log levels when failing to expand ``$XDG_MUSIC_DIR`` into a real