From 9ba168e9b90e92d65fb0a757b3458d0cebe42fa1 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 19 Jan 2014 22:21:02 +0100 Subject: [PATCH 01/19] local: Update browse cache code to add all directories Tests have been updated to make sure multiple folders are added. We had forgotten to add child folders to the ones that had already been created. --- mopidy/local/json.py | 3 +++ tests/local/test_json.py | 26 +++++++++++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/mopidy/local/json.py b/mopidy/local/json.py index ad6be5d3..10611f6f 100644 --- a/mopidy/local/json.py +++ b/mopidy/local/json.py @@ -66,12 +66,15 @@ class _BrowseCache(object): for i in reversed(range(len(parts))): directory = '/'.join(parts[:i+1]) uri = translator.path_to_local_directory_uri(directory) + # First dir we process is our parent if not parent_uri: parent_uri = uri # We found ourselves and we exist, done. if uri in self._cache: + if child: + self._cache[uri][child.uri] = child break # Initialize ourselves, store child if present, and add diff --git a/tests/local/test_json.py b/tests/local/test_json.py index 9c8686e9..3ccb6e6d 100644 --- a/tests/local/test_json.py +++ b/tests/local/test_json.py @@ -7,26 +7,34 @@ from mopidy.models import Ref class BrowseCacheTest(unittest.TestCase): + maxDiff = None + def setUp(self): - self.uris = [b'local:track:foo/bar/song1', - b'local:track:foo/bar/song2', - b'local:track:foo/song3'] + self.uris = ['local:track:foo/bar/song1', + 'local:track:foo/bar/song2', + 'local:track:foo/baz/song3', + 'local:track:foo/song4', + 'local:track:song5'] self.cache = json._BrowseCache(self.uris) def test_lookup_root(self): - expected = [Ref.directory(uri='local:directory:foo', name='foo')] - self.assertEqual(expected, self.cache.lookup('local:directory')) + expected = [Ref.directory(uri='local:directory:foo', name='foo'), + Ref.track(uri='local:track:song5', name='song5')] + self.assertItemsEqual(expected, self.cache.lookup('local:directory')) def test_lookup_foo(self): expected = [Ref.directory(uri='local:directory:foo/bar', name='bar'), - Ref.track(uri=self.uris[2], name='song3')] - self.assertEqual(expected, self.cache.lookup('local:directory:foo')) + Ref.directory(uri='local:directory:foo/baz', name='baz'), + Ref.track(uri=self.uris[3], name='song4')] + result = self.cache.lookup('local:directory:foo') + self.assertItemsEqual(expected, result) def test_lookup_foo_bar(self): expected = [Ref.track(uri=self.uris[0], name='song1'), Ref.track(uri=self.uris[1], name='song2')] - self.assertEqual( + self.assertItemsEqual( expected, self.cache.lookup('local:directory:foo/bar')) def test_lookup_foo_baz(self): - self.assertEqual([], self.cache.lookup('local:directory:foo/baz')) + result = self.cache.lookup('local:directory:foo/unknown') + self.assertItemsEqual([], result) From 54beea9ead19f5b71c203285c9747b0ecf90937b Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 19 Jan 2014 22:28:03 +0100 Subject: [PATCH 02/19] docs: Update changelog for v0.18.0 --- docs/changelog.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 61234f6d..dcab214b 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,7 +4,7 @@ Changelog This changelog is used to track all major changes to Mopidy. -v0.18.0 (UNRELEASED) +v0.18.0 (2014-01-19) ==================== The focus of 0.18 have been on two fronts: the local library and browsing. @@ -21,8 +21,8 @@ the local and Spotify backends. It is also used by the new Mopidy-Dirble extension to provide you with a directory of Internet radio stations from all over the world. -Since the release of 0.17, we've closed or merged 47 issues and pull requests -through about 270 commits by :ref:`11 people `, including six new +Since the release of 0.17, we've closed or merged 49 issues and pull requests +through about 285 commits by :ref:`11 people `, including six new guys. Thanks to everyone that has contributed! **Core API** From 81825dfa0dbad5bbdfd4baa57771bb6ee3678f3e Mon Sep 17 00:00:00 2001 From: Arnaud Barisain-Monrose Date: Sun, 19 Jan 2014 23:04:43 +0100 Subject: [PATCH 03/19] Do not listen for SIGUSR1 since Windows does not have it --- mopidy/__main__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mopidy/__main__.py b/mopidy/__main__.py index ac5e2102..87179270 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -36,8 +36,11 @@ def main(): log.bootstrap_delayed_logging() logger.info('Starting Mopidy %s', versioning.get_version()) + signal.signal(signal.SIGTERM, process.exit_handler) - signal.signal(signal.SIGUSR1, pykka.debug.log_thread_tracebacks) + # Windows does not have signal.SIGUSR1 + if hasattr(signal, 'SIGUSR1'): + signal.signal(signal.SIGUSR1, pykka.debug.log_thread_tracebacks) try: registry = ext.Registry() From fe3c27cf18dd2a21e0d43a0df7535695e80700ef Mon Sep 17 00:00:00 2001 From: Arnaud Barisain-Monrose Date: Sun, 19 Jan 2014 23:05:00 +0100 Subject: [PATCH 04/19] Add windows workaround for IPv6 sockets to also listen on IPv4 --- mopidy/utils/network.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mopidy/utils/network.py b/mopidy/utils/network.py index bb1edbc4..adfe3b5f 100644 --- a/mopidy/utils/network.py +++ b/mopidy/utils/network.py @@ -43,7 +43,12 @@ def create_socket(): if has_ipv6: sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) # Explicitly configure socket to work for both IPv4 and IPv6 - sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) + if (hasattr(socket, 'IPPROTO_IPV6')): + sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) + else: + # Python 2.7 on windows does not have the IPPROTO_IPV6 constant + # Use values extracted from Windows Vista/7/8's header + sock.setsockopt(41, 27, 0) else: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) From 9b1b6943a8a71b91d237b12a128b9cc5cd210d6b Mon Sep 17 00:00:00 2001 From: Arnaud Barisain-Monrose Date: Sun, 19 Jan 2014 23:57:58 +0100 Subject: [PATCH 05/19] Fix flake8's whitespace error --- mopidy/__main__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mopidy/__main__.py b/mopidy/__main__.py index 87179270..bacc9552 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -36,7 +36,6 @@ def main(): log.bootstrap_delayed_logging() logger.info('Starting Mopidy %s', versioning.get_version()) - signal.signal(signal.SIGTERM, process.exit_handler) # Windows does not have signal.SIGUSR1 if hasattr(signal, 'SIGUSR1'): From 4c7b6ccfc40c48f3e323a85ae1df14c1da791585 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 20 Jan 2014 22:05:21 +0100 Subject: [PATCH 06/19] docs: Remove broken link --- docs/changelog.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index dcab214b..f04c4b3f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1831,9 +1831,8 @@ to this problem. - MPD frontend: - Add support for password authentication. See - :attr:`mopidy.settings.MPD_SERVER_PASSWORD` and - :ref:`use-mpd-on-a-network` for details on how to use it. (Fixes: - :issue:`41`) + :attr:`mopidy.settings.MPD_SERVER_PASSWORD` for details on how to use it. + (Fixes: :issue:`41`) - Support ``setvol 50`` without quotes around the argument. Fixes volume control in Droid MPD. From 3c0cc1564ce6b32616f6682fd99b0e7b8c302679 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Mon, 20 Jan 2014 23:22:15 +0100 Subject: [PATCH 07/19] local: Make browse test check ordering again --- tests/local/test_json.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/local/test_json.py b/tests/local/test_json.py index 3ccb6e6d..54afefe7 100644 --- a/tests/local/test_json.py +++ b/tests/local/test_json.py @@ -20,21 +20,21 @@ class BrowseCacheTest(unittest.TestCase): def test_lookup_root(self): expected = [Ref.directory(uri='local:directory:foo', name='foo'), Ref.track(uri='local:track:song5', name='song5')] - self.assertItemsEqual(expected, self.cache.lookup('local:directory')) + self.assertEqual(expected, self.cache.lookup('local:directory')) def test_lookup_foo(self): expected = [Ref.directory(uri='local:directory:foo/bar', name='bar'), Ref.directory(uri='local:directory:foo/baz', name='baz'), Ref.track(uri=self.uris[3], name='song4')] result = self.cache.lookup('local:directory:foo') - self.assertItemsEqual(expected, result) + self.assertEqual(expected, result) def test_lookup_foo_bar(self): expected = [Ref.track(uri=self.uris[0], name='song1'), Ref.track(uri=self.uris[1], name='song2')] - self.assertItemsEqual( + self.assertEqual( expected, self.cache.lookup('local:directory:foo/bar')) def test_lookup_foo_baz(self): result = self.cache.lookup('local:directory:foo/unknown') - self.assertItemsEqual([], result) + self.assertEqual([], result) From 7ce38de351712dc92312a1fd6109e4af644adbff Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 21 Jan 2014 14:46:27 +0100 Subject: [PATCH 08/19] ext: Disable extension if a dependency isn't of the correct version Fixes #657 --- docs/changelog.rst | 8 ++++++++ mopidy/ext.py | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index f04c4b3f..2862d6de 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,14 @@ Changelog This changelog is used to track all major changes to Mopidy. + +v0.18.1 (UNRELEASED) +==================== + +- Disable extension instead of crashing if a dependency has the wrong + version. (Fixes: :issue:`657`) + + v0.18.0 (2014-01-19) ==================== diff --git a/mopidy/ext.py b/mopidy/ext.py index a58090cc..4887f295 100644 --- a/mopidy/ext.py +++ b/mopidy/ext.py @@ -222,6 +222,12 @@ def validate_extension(extension): 'Disabled extension %s: Dependency %s not found', extension.ext_name, ex) return False + except pkg_resources.VersionConflict as ex: + found, required = ex.args + logger.info( + 'Disabled extension %s: %s required, but found %s at %s', + extension.ext_name, required, found, found.location) + return False try: extension.validate_environment() From 039fc4b6816835bed2fe99ea6a90977edc9b6685 Mon Sep 17 00:00:00 2001 From: nathanharper Date: Wed, 22 Jan 2014 04:09:25 -0500 Subject: [PATCH 09/19] refactored mpd.protocol.music_db regex got quote backreference working, eliminated need for the non-capturing pattern, fixed problem with quoted fields. --- mopidy/mpd/protocol/music_db.py | 35 +++++++++-------------------- tests/mpd/protocol/test_music_db.py | 2 +- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/mopidy/mpd/protocol/music_db.py b/mopidy/mpd/protocol/music_db.py index 58681557..e821af6b 100644 --- a/mopidy/mpd/protocol/music_db.py +++ b/mopidy/mpd/protocol/music_db.py @@ -62,30 +62,15 @@ SEARCH_QUERY = r""" $ """ -# TODO Would be nice to get ("?)...\1 working for the quotes here -SEARCH_PAIR_WITHOUT_GROUPS = r""" +SEARCH_PAIR_WITH_GROUPS = r""" + ("?) # Optional quote around the field type \b # Only begin matching at word bundaries - "? # Optional quote around the field type - (?: # A non-capturing group for the field type + ( # A capturing group for the field type """ + SEARCH_FIELDS + """ ) - "? # End of optional quote around the field type + \\1 # End of optional quote around the field type \ # A single space - "[^"]+" # Matching a quoted search string -""" -SEARCH_PAIR_WITHOUT_GROUPS_RE = re.compile( - SEARCH_PAIR_WITHOUT_GROUPS, flags=(re.UNICODE | re.VERBOSE)) - -# TODO Would be nice to get ("?)...\1 working for the quotes here -SEARCH_PAIR_WITH_GROUPS = r""" - \b # Only begin matching at word bundaries - "? # Optional quote around the field type - (?P( # A capturing group for the field type -""" + SEARCH_FIELDS + """ - )) - "? # End of optional quote around the field type - \ # A single space - "(?P[^"]+)" # Capturing a quoted search string + "([^"]+)" # Capturing a quoted search string """ SEARCH_PAIR_WITH_GROUPS_RE = re.compile( SEARCH_PAIR_WITH_GROUPS, flags=(re.UNICODE | re.VERBOSE)) @@ -99,18 +84,18 @@ def _query_from_mpd_search_format(mpd_query): :param mpd_query: the MPD search query :type mpd_query: string """ - pairs = SEARCH_PAIR_WITHOUT_GROUPS_RE.findall(mpd_query) + matches = SEARCH_PAIR_WITH_GROUPS_RE.findall(mpd_query) query = {} - for pair in pairs: - m = SEARCH_PAIR_WITH_GROUPS_RE.match(pair) - field = m.groupdict()['field'].lower() + # discard first field, which just captures optional quote + for _, field, what in matches: + field = field.lower() if field == 'title': field = 'track_name' elif field == 'track': field = 'track_no' elif field in ('file', 'filename'): field = 'uri' - what = m.groupdict()['what'] + if not what: raise ValueError if field in query: diff --git a/tests/mpd/protocol/test_music_db.py b/tests/mpd/protocol/test_music_db.py index 8d74fb95..bb36f3e2 100644 --- a/tests/mpd/protocol/test_music_db.py +++ b/tests/mpd/protocol/test_music_db.py @@ -12,7 +12,7 @@ from tests.mpd import protocol class QueryFromMpdSearchFormatTest(unittest.TestCase): def test_dates_are_extracted(self): result = music_db._query_from_mpd_search_format( - 'Date "1974-01-02" Date "1975"') + 'Date "1974-01-02" "Date" "1975"') self.assertEqual(result['date'][0], '1974-01-02') self.assertEqual(result['date'][1], '1975') From 3a184f9ddd55816b1c9d3bfa72b429d1e8ecbf77 Mon Sep 17 00:00:00 2001 From: nathanharper Date: Wed, 22 Jan 2014 04:30:27 -0500 Subject: [PATCH 10/19] decouple mpd.protocol module from config structure removed reference to password from protocol, moved it to Context class. --- mopidy/mpd/dispatcher.py | 7 ++++--- mopidy/mpd/protocol/connection.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mopidy/mpd/dispatcher.py b/mopidy/mpd/dispatcher.py index 6aeace9d..0a916408 100644 --- a/mopidy/mpd/dispatcher.py +++ b/mopidy/mpd/dispatcher.py @@ -229,8 +229,8 @@ class MpdContext(object): #: The current :class:`mopidy.mpd.MpdSession`. session = None - #: The Mopidy configuration. - config = None + #: The MPD password + password = None #: The Mopidy core API. An instance of :class:`mopidy.core.Core`. core = None @@ -246,7 +246,8 @@ class MpdContext(object): def __init__(self, dispatcher, session=None, config=None, core=None): self.dispatcher = dispatcher self.session = session - self.config = config + if config is not None: + self.password = config['mpd']['password'] self.core = core self.events = set() self.subscriptions = set() diff --git a/mopidy/mpd/protocol/connection.py b/mopidy/mpd/protocol/connection.py index a6f9ffcb..41ee9e6a 100644 --- a/mopidy/mpd/protocol/connection.py +++ b/mopidy/mpd/protocol/connection.py @@ -39,7 +39,7 @@ def password(context, password): This is used for authentication with the server. ``PASSWORD`` is simply the plaintext password. """ - if password == context.config['mpd']['password']: + if password == context.password: context.dispatcher.authenticated = True else: raise MpdPasswordError('incorrect password') From bb66cd106571bb156ca04659501e876cec7f7f8b Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 23 Jan 2014 22:34:23 +0100 Subject: [PATCH 11/19] log: Don't filter anything at all on the root logger itself --- mopidy/utils/log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mopidy/utils/log.py b/mopidy/utils/log.py index 9c88b368..867a2efa 100644 --- a/mopidy/utils/log.py +++ b/mopidy/utils/log.py @@ -27,7 +27,7 @@ _delayed_handler = DelayedHandler() def bootstrap_delayed_logging(): root = logging.getLogger('') - root.setLevel(logging.DEBUG) + root.setLevel(logging.NOTSET) root.addHandler(_delayed_handler) From 06640f1f0cb351b6732162c8edd3e81cead41ee7 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 23 Jan 2014 22:35:24 +0100 Subject: [PATCH 12/19] log: Use custom filter to implement verbosity levels ...instead of hooking handlers onto multiple loggers with disabled propagation from those loggers to parent loggers, breaking alternative log methods, like custom setups through the the logging/config_file config value. Fixes #661 --- mopidy/__main__.py | 3 +-- mopidy/utils/log.py | 57 +++++++++++++++++++++------------------------ 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/mopidy/__main__.py b/mopidy/__main__.py index ac5e2102..1ddd76a4 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -70,8 +70,7 @@ def main(): if args.verbosity_level: verbosity_level += args.verbosity_level - log.setup_logging( - config, installed_extensions, verbosity_level, args.save_debug_log) + log.setup_logging(config, verbosity_level, args.save_debug_log) enabled_extensions = [] for extension in installed_extensions: diff --git a/mopidy/utils/log.py b/mopidy/utils/log.py index 867a2efa..c4045232 100644 --- a/mopidy/utils/log.py +++ b/mopidy/utils/log.py @@ -31,16 +31,14 @@ def bootstrap_delayed_logging(): root.addHandler(_delayed_handler) -def setup_logging(config, extensions, verbosity_level, save_debug_log): - setup_log_levels(config) - - setup_console_logging(config, extensions, verbosity_level) - - if save_debug_log: - setup_debug_logging_to_file(config, extensions) - +def setup_logging(config, verbosity_level, save_debug_log): logging.captureWarnings(True) + setup_log_levels(config) + setup_console_logging(config, verbosity_level) + if save_debug_log: + setup_debug_logging_to_file(config) + if config['logging']['config_file']: logging.config.fileConfig(config['logging']['config_file']) @@ -61,46 +59,43 @@ LOG_LEVELS = { } -def setup_console_logging(config, extensions, verbosity_level): +class VerbosityFilter(logging.Filter): + def __init__(self, verbosity_level): + self.verbosity_level = verbosity_level + + def filter(self, record): + if record.name.startswith('mopidy'): + required_log_level = LOG_LEVELS[self.verbosity_level]['mopidy'] + else: + required_log_level = LOG_LEVELS[self.verbosity_level]['root'] + return record.levelno >= required_log_level + + +def setup_console_logging(config, verbosity_level): if verbosity_level < min(LOG_LEVELS.keys()): verbosity_level = min(LOG_LEVELS.keys()) if verbosity_level > max(LOG_LEVELS.keys()): verbosity_level = max(LOG_LEVELS.keys()) + verbosity_filter = VerbosityFilter(verbosity_level) + if verbosity_level < 1: log_format = config['logging']['console_format'] else: log_format = config['logging']['debug_format'] formatter = logging.Formatter(log_format) - root_handler = logging.StreamHandler() - root_handler.setFormatter(formatter) - root_handler.setLevel(LOG_LEVELS[verbosity_level]['root']) - logging.getLogger('').addHandler(root_handler) + handler = logging.StreamHandler() + handler.addFilter(verbosity_filter) + handler.setFormatter(formatter) - mopidy_handler = logging.StreamHandler() - mopidy_handler.setFormatter(formatter) - mopidy_handler.setLevel(LOG_LEVELS[verbosity_level]['mopidy']) - add_mopidy_handler(extensions, mopidy_handler) + logging.getLogger('').addHandler(handler) -def setup_debug_logging_to_file(config, extensions): +def setup_debug_logging_to_file(config): formatter = logging.Formatter(config['logging']['debug_format']) handler = logging.handlers.RotatingFileHandler( config['logging']['debug_file'], maxBytes=10485760, backupCount=3) handler.setFormatter(formatter) logging.getLogger('').addHandler(handler) - - # We must add our handler explicitly, since the mopidy* handlers don't - # propagate to the root handler. - add_mopidy_handler(extensions, handler) - - -def add_mopidy_handler(extensions, handler): - names = ['mopidy_%s' % ext.ext_name for ext in extensions] - names.append('mopidy') - for name in names: - logger = logging.getLogger(name) - logger.propagate = False - logger.addHandler(handler) From 7d2906d58db373f5f7326c140e8cb191bc3d0059 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 23 Jan 2014 22:49:29 +0100 Subject: [PATCH 13/19] log: Make other logging work when logging/config_file is in use --- mopidy/utils/log.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mopidy/utils/log.py b/mopidy/utils/log.py index c4045232..6004b9f9 100644 --- a/mopidy/utils/log.py +++ b/mopidy/utils/log.py @@ -34,14 +34,16 @@ def bootstrap_delayed_logging(): def setup_logging(config, verbosity_level, save_debug_log): logging.captureWarnings(True) + if config['logging']['config_file']: + # Logging config from file must be read before other handlers are + # added. If not, the other handlers will have no effect. + logging.config.fileConfig(config['logging']['config_file']) + setup_log_levels(config) setup_console_logging(config, verbosity_level) if save_debug_log: setup_debug_logging_to_file(config) - if config['logging']['config_file']: - logging.config.fileConfig(config['logging']['config_file']) - _delayed_handler.release() From b4f17d692edc8c859c82ac9bd5acbf2a55bb7a02 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 23 Jan 2014 22:53:10 +0100 Subject: [PATCH 14/19] docs: Update changelog --- docs/changelog.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 2862d6de..015e1743 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -11,6 +11,10 @@ v0.18.1 (UNRELEASED) - Disable extension instead of crashing if a dependency has the wrong version. (Fixes: :issue:`657`) +- Make logging work to both console, debug log file, and any custom logging + setup from :confval:`logging/config_file` at the same time. (Fixes: + :issue:`661`) + v0.18.0 (2014-01-19) ==================== From bf9499131a385cb4365abd56dfb45f202bda5d16 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 23 Jan 2014 23:19:51 +0100 Subject: [PATCH 15/19] Bump version number to 0.18.1 --- mopidy/__init__.py | 2 +- tests/test_version.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mopidy/__init__.py b/mopidy/__init__.py index 623e202e..1367a219 100644 --- a/mopidy/__init__.py +++ b/mopidy/__init__.py @@ -21,4 +21,4 @@ if (isinstance(pykka.__version__, basestring) warnings.filterwarnings('ignore', 'could not open display') -__version__ = '0.18.0' +__version__ = '0.18.1' diff --git a/tests/test_version.py b/tests/test_version.py index 5fb1a60d..23c93f01 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -42,5 +42,6 @@ class VersionTest(unittest.TestCase): self.assertLess(SV('0.14.2'), SV('0.15.0')) self.assertLess(SV('0.15.0'), SV('0.16.0')) self.assertLess(SV('0.16.0'), SV('0.17.0')) - self.assertLess(SV('0.17.0'), SV(__version__)) - self.assertLess(SV(__version__), SV('0.18.1')) + self.assertLess(SV('0.17.0'), SV('0.18.0')) + self.assertLess(SV('0.18.0'), SV(__version__)) + self.assertLess(SV(__version__), SV('0.18.2')) From f6de8c4c29e12cc2f9e11377030db5e1d2ba8ccb Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Thu, 23 Jan 2014 23:21:35 +0100 Subject: [PATCH 16/19] docs: Update changelog for v0.18.1 --- docs/changelog.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 015e1743..d7d53eb1 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,9 +5,11 @@ Changelog This changelog is used to track all major changes to Mopidy. -v0.18.1 (UNRELEASED) +v0.18.1 (2014-01-23) ==================== +Bug fix release. + - Disable extension instead of crashing if a dependency has the wrong version. (Fixes: :issue:`657`) From 4453df7594244af66b81c733f8134f99e2cd9088 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Fri, 24 Jan 2014 19:13:39 +0100 Subject: [PATCH 17/19] network: Check for windows platform match --- mopidy/utils/network.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mopidy/utils/network.py b/mopidy/utils/network.py index adfe3b5f..20587eac 100644 --- a/mopidy/utils/network.py +++ b/mopidy/utils/network.py @@ -5,6 +5,7 @@ import gobject import logging import re import socket +import sys import threading import pykka @@ -43,9 +44,9 @@ def create_socket(): if has_ipv6: sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) # Explicitly configure socket to work for both IPv4 and IPv6 - if (hasattr(socket, 'IPPROTO_IPV6')): + if hasattr(socket, 'IPPROTO_IPV6'): sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) - else: + elif sys.platform == 'win32': # also match 64bit windows. # Python 2.7 on windows does not have the IPPROTO_IPV6 constant # Use values extracted from Windows Vista/7/8's header sock.setsockopt(41, 27, 0) From 9cef7208c91498609797020f4e4a8f0c27f454c7 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Fri, 24 Jan 2014 19:13:57 +0100 Subject: [PATCH 18/19] docs: Update changelog and author for windows fixes --- AUTHORS | 1 + docs/changelog.rst | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/AUTHORS b/AUTHORS index e51a1966..97fc5b9c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -35,3 +35,4 @@ - Luke Giuliani - Colin Montgomerie - Simon de Bakker +- Arnaud Barisain-Monrose diff --git a/docs/changelog.rst b/docs/changelog.rst index d7d53eb1..bfd7c45d 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,6 +5,14 @@ Changelog This changelog is used to track all major changes to Mopidy. +v0.19.0 (unreleased) +==================== + +**Windows** + +- Network and signal handling has been updated to play nice on windows systems. + + v0.18.1 (2014-01-23) ==================== From 981c4e4b81d0a71869968d83393904c3acc1492d Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Fri, 24 Jan 2014 19:35:26 +0100 Subject: [PATCH 19/19] docs: Update changelog and authors --- AUTHORS | 1 + docs/changelog.rst | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/AUTHORS b/AUTHORS index 97fc5b9c..6853d5ab 100644 --- a/AUTHORS +++ b/AUTHORS @@ -36,3 +36,4 @@ - Colin Montgomerie - Simon de Bakker - Arnaud Barisain-Monrose +- nathanharper diff --git a/docs/changelog.rst b/docs/changelog.rst index bfd7c45d..df7de99a 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -8,6 +8,11 @@ This changelog is used to track all major changes to Mopidy. v0.19.0 (unreleased) ==================== +**MPD** + +- Minor refactor of context such that it stores password instead of config. + (Fixes: :issue:`646`) + **Windows** - Network and signal handling has been updated to play nice on windows systems.