From 3417abfe64faf48b25c7ba30270d38969f0b4c62 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 28 Apr 2013 23:21:29 +0200 Subject: [PATCH 1/5] config: Use byte paths in convert code --- mopidy/config/convert.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mopidy/config/convert.py b/mopidy/config/convert.py index f292e302..6cb20fcd 100644 --- a/mopidy/config/convert.py +++ b/mopidy/config/convert.py @@ -9,7 +9,7 @@ from mopidy.utils import path def load(): - settings_file = path.expand_path('$XDG_CONFIG_DIR/mopidy/settings.py') + settings_file = path.expand_path(b'$XDG_CONFIG_DIR/mopidy/settings.py') print 'Checking %s' % settings_file setting_globals = {} @@ -109,7 +109,7 @@ def main(): print b'Converted config:\n' print config_lib.format(config, extensions) - conf_file = path.expand_path('$XDG_CONFIG_DIR/mopidy/mopidy.conf') + conf_file = path.expand_path(b'$XDG_CONFIG_DIR/mopidy/mopidy.conf') if os.path.exists(conf_file): print '%s exists, exiting.' % conf_file sys.exit(1) From 9974f77f1b3d122006c37f6e9b3d1f0e84e4de29 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 28 Apr 2013 23:22:19 +0200 Subject: [PATCH 2/5] config: Serialize unicode to bytes using sys.getfilesystemencoding() --- mopidy/config/types.py | 3 +++ tests/config/types_test.py | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/mopidy/config/types.py b/mopidy/config/types.py index 726d81f7..3451992a 100644 --- a/mopidy/config/types.py +++ b/mopidy/config/types.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import logging import re import socket +import sys from mopidy.utils import path from mopidy.config import validators @@ -254,6 +255,8 @@ class Path(ConfigValue): return ExpandedPath(value, expanded) def serialize(self, value, display=False): + if isinstance(value, unicode): + value = value.encode(sys.getfilesystemencoding()) if isinstance(value, ExpandedPath): return value.original return value diff --git a/tests/config/types_test.py b/tests/config/types_test.py index 65732f56..eee32af1 100644 --- a/tests/config/types_test.py +++ b/tests/config/types_test.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import logging import mock import socket +import sys from mopidy.config import types @@ -364,3 +365,10 @@ class PathTest(unittest.TestCase): def test_serialize_plain_string(self): value = types.Path() self.assertEqual('path', value.serialize(b'path')) + + def test_serialize_unicode_string(self): + value = types.Path() + expected = 'æøå'.encode(sys.getfilesystemencoding()) + result = value.serialize('æøå') + self.assertEqual(expected, result) + self.assertIsInstance(result, bytes) From 64465d318ddb1b10fa13131568d7852558c92ffb Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 28 Apr 2013 23:28:20 +0200 Subject: [PATCH 3/5] config: Ensure that overrides are bytes --- mopidy/config/__init__.py | 4 ++-- tests/config/config_test.py | 26 ++++++++++++++++---------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/mopidy/config/__init__.py b/mopidy/config/__init__.py index 0386eea8..67725461 100644 --- a/mopidy/config/__init__.py +++ b/mopidy/config/__init__.py @@ -141,8 +141,8 @@ def _format(config, comments, schemas, display): def parse_override(override): """Parse ``section/key=value`` command line overrides""" - section, remainder = override.split('/', 1) - key, value = remainder.split('=', 1) + section, remainder = override.split(b'/', 1) + key, value = remainder.split(b'=', 1) return (section.strip(), key.strip(), value.strip()) diff --git a/tests/config/config_test.py b/tests/config/config_test.py index 84079a2e..1fbe07b0 100644 --- a/tests/config/config_test.py +++ b/tests/config/config_test.py @@ -109,18 +109,24 @@ class ValidateTest(unittest.TestCase): class ParseOverrideTest(unittest.TestCase): def test_valid_override(self): - expected = ('section', 'key', 'value') - self.assertEqual(expected, config.parse_override('section/key=value')) - self.assertEqual(expected, config.parse_override('section/key=value ')) - self.assertEqual(expected, config.parse_override('section/key =value')) - self.assertEqual(expected, config.parse_override('section /key=value')) + expected = (b'section', b'key', b'value') + self.assertEqual(expected, config.parse_override(b'section/key=value')) + self.assertEqual(expected, config.parse_override(b'section/key=value ')) + self.assertEqual(expected, config.parse_override(b'section/key =value')) + self.assertEqual(expected, config.parse_override(b'section /key=value')) + + def test_valid_override_is_bytes(self): + section, key, value = config.parse_override(b'section/key=value') + self.assertIsInstance(section, bytes) + self.assertIsInstance(key, bytes) + self.assertIsInstance(value, bytes) def test_empty_override(self): expected = ('section', 'key', '') - self.assertEqual(expected, config.parse_override('section/key=')) - self.assertEqual(expected, config.parse_override('section/key= ')) + self.assertEqual(expected, config.parse_override(b'section/key=')) + self.assertEqual(expected, config.parse_override(b'section/key= ')) def test_invalid_override(self): - self.assertRaises(ValueError, config.parse_override, 'section/key') - self.assertRaises(ValueError, config.parse_override, 'section=') - self.assertRaises(ValueError, config.parse_override, 'section') + self.assertRaises(ValueError, config.parse_override, b'section/key') + self.assertRaises(ValueError, config.parse_override, b'section=') + self.assertRaises(ValueError, config.parse_override, b'section') From a401ecb7693b1133c333e96e21a587b0a2d2ca3c Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 28 Apr 2013 23:45:29 +0200 Subject: [PATCH 4/5] Bump version number to 0.14.1 --- mopidy/__init__.py | 2 +- tests/version_test.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mopidy/__init__.py b/mopidy/__init__.py index 9ebd80a6..14646df6 100644 --- a/mopidy/__init__.py +++ b/mopidy/__init__.py @@ -23,4 +23,4 @@ if (isinstance(pykka.__version__, basestring) warnings.filterwarnings('ignore', 'could not open display') -__version__ = '0.14.0' +__version__ = '0.14.1' diff --git a/tests/version_test.py b/tests/version_test.py index 3b25a38e..ce16d435 100644 --- a/tests/version_test.py +++ b/tests/version_test.py @@ -37,5 +37,6 @@ class VersionTest(unittest.TestCase): self.assertLess(SV('0.11.0'), SV('0.11.1')) self.assertLess(SV('0.11.1'), SV('0.12.0')) self.assertLess(SV('0.12.0'), SV('0.13.0')) - self.assertLess(SV('0.13.0'), SV(__version__)) - self.assertLess(SV(__version__), SV('0.14.1')) + self.assertLess(SV('0.13.0'), SV('0.14.0')) + self.assertLess(SV('0.14.0'), SV(__version__)) + self.assertLess(SV(__version__), SV('0.14.2')) From 0d3e97089080f862566e89dfd14e50dc6ff9a8ea Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 28 Apr 2013 23:45:40 +0200 Subject: [PATCH 5/5] docs: Update changelog for v0.14.1 --- docs/changelog.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index fbfa2471..1dd14fb7 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,15 @@ Changelog This changelog is used to track all major changes to Mopidy. +v0.14.1 (2013-04-28) +==================== + +This release addresses an issue in v0.14.0 where the new +:option:`mopidy-convert-config` tool and the new :option:`mopidy --option` +command line option was broken because some string operations inadvertently +converted some byte strings to unicode. + + v0.14.0 (2013-04-28) ====================