From d14d64cb7d3668a287f4b9dc3f7dff0d066561e4 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 9 Feb 2015 00:07:35 +0100 Subject: [PATCH 1/4] listener: Speed up event emitting and improve error reporting (cherry picked from commit 655b7badf4963558a6c519c5620886374147bac7) --- mopidy/listener.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/mopidy/listener.py b/mopidy/listener.py index c8ecfa53..c32960c7 100644 --- a/mopidy/listener.py +++ b/mopidy/listener.py @@ -17,7 +17,21 @@ def send(cls, event, **kwargs): listeners = pykka.ActorRegistry.get_by_class(cls) logger.debug('Sending %s to %s: %s', event, cls.__name__, kwargs) for listener in listeners: - listener.proxy().on_event(event, **kwargs) + # Save time by calling methods on Pykka actor without creating a + # throwaway actor proxy. + # + # Because we use `.tell()` there is no return channel for any errors, + # so Pykka logs them immediately. The alternative would be to use + # `.ask()` and `.get()` the returned futures to block for the listeners + # to react and return their exceptions to us. Since emitting events in + # practise is making calls upwards in the stack, blocking here would + # quickly deadlock. + listener.tell({ + 'command': 'pykka_call', + 'attr_path': ('on_event',), + 'args': (event,), + 'kwargs': kwargs, + }) class Listener(object): From faa5e01e0a7b19b5b6db1feb87c041d6c770bc90 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Mon, 9 Feb 2015 00:37:41 +0100 Subject: [PATCH 2/4] docs: Update changelog --- docs/changelog.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 40d5cedc..c7594aa3 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -12,6 +12,8 @@ Bug fix release. - Audio: Support UTF-8 in M3U playlists. (Fixes: :issue:`853`) +- Events: Speed up event emitting. + v0.19.5 (2014-12-23) ==================== From efd48d864f6f175a7941b15ee0211f7362729656 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 7 Feb 2015 17:09:33 +0100 Subject: [PATCH 3/4] flake8: Fix new warnings after flake8 upgrade (cherry picked from commit a693993905b66a63601cf5765da1788829b0f798) Conflicts: mopidy/audio/actor.py mopidy/audio/playlists.py --- mopidy/audio/actor.py | 4 ++-- mopidy/audio/playlists.py | 2 +- mopidy/local/__init__.py | 2 +- mopidy/local/json.py | 2 +- mopidy/local/translator.py | 2 +- setup.cfg | 4 ++++ tests/__init__.py | 2 +- tests/utils/test_jsonrpc.py | 2 +- 8 files changed, 12 insertions(+), 8 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 0d90394d..d2701784 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -109,8 +109,8 @@ class Audio(pykka.ThreadingActor): playbin = gst.element_factory_make('playbin2') playbin.set_property('flags', PLAYBIN_FLAGS) - playbin.set_property('buffer-size', 2*1024*1024) - playbin.set_property('buffer-duration', 2*gst.SECOND) + playbin.set_property('buffer-size', 2 * 1024 * 1024) + playbin.set_property('buffer-duration', 2 * gst.SECOND) self._connect(playbin, 'about-to-finish', self._on_about_to_finish) self._connect(playbin, 'notify::source', self._on_new_source) diff --git a/mopidy/audio/playlists.py b/mopidy/audio/playlists.py index ec5fd63a..8f8232b2 100644 --- a/mopidy/audio/playlists.py +++ b/mopidy/audio/playlists.py @@ -77,7 +77,7 @@ def parse_pls(data): if section.lower() != 'playlist': continue for i in xrange(cp.getint(section, 'numberofentries')): - yield cp.get(section, 'file%d' % (i+1)) + yield cp.get(section, 'file%d' % (i + 1)) def parse_xspf(data): diff --git a/mopidy/local/__init__.py b/mopidy/local/__init__.py index 104c43af..9b485f19 100644 --- a/mopidy/local/__init__.py +++ b/mopidy/local/__init__.py @@ -27,7 +27,7 @@ class Extension(ext.Extension): schema['playlists_dir'] = config.Path() schema['tag_cache_file'] = config.Deprecated() schema['scan_timeout'] = config.Integer( - minimum=1000, maximum=1000*60*60) + minimum=1000, maximum=1000 * 60 * 60) schema['scan_flush_threshold'] = config.Integer(minimum=0) schema['excluded_file_extensions'] = config.List(optional=True) return schema diff --git a/mopidy/local/json.py b/mopidy/local/json.py index 5ae04592..b3a2ff39 100644 --- a/mopidy/local/json.py +++ b/mopidy/local/json.py @@ -75,7 +75,7 @@ class _BrowseCache(object): parent_uri = None child = None for i in reversed(range(len(parts))): - directory = '/'.join(parts[:i+1]) + directory = '/'.join(parts[:i + 1]) uri = translator.path_to_local_directory_uri(directory) # First dir we process is our parent diff --git a/mopidy/local/translator.py b/mopidy/local/translator.py index 33b67775..3c1d38ae 100644 --- a/mopidy/local/translator.py +++ b/mopidy/local/translator.py @@ -49,7 +49,7 @@ def m3u_extinf_to_track(line): return Track() (runtime, title) = m.groups() if int(runtime) > 0: - return Track(name=title, length=1000*int(runtime)) + return Track(name=title, length=1000 * int(runtime)) else: return Track(name=title) diff --git a/setup.cfg b/setup.cfg index 80ab9645..0d6c1486 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,10 @@ [flake8] application-import-names = mopidy,tests exclude = .git,.tox,build,js +# Ignored flake8 warnings: +# - E402 module level import not at top of file +# - E731 do not assign a lambda expression, use a def +ignore = E402,E731 [wheel] universal = 1 diff --git a/tests/__init__.py b/tests/__init__.py index a384669e..327ca5a8 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -20,7 +20,7 @@ class IsA(object): try: return isinstance(rhs, self.klass) except TypeError: - return type(rhs) == type(self.klass) + return type(rhs) == type(self.klass) # flake8: noqa def __ne__(self, rhs): return not self.__eq__(rhs) diff --git a/tests/utils/test_jsonrpc.py b/tests/utils/test_jsonrpc.py index e6f94fb3..c8d37d04 100644 --- a/tests/utils/test_jsonrpc.py +++ b/tests/utils/test_jsonrpc.py @@ -614,7 +614,7 @@ class JsonRpcInspectorTest(JsonRpcTestBase): 'core.library': core.LibraryController, 'core.playback': core.PlaybackController, 'core.playlists': core.PlaylistsController, - 'core.tracklist': core.TracklistController, + 'core.tracklist': core.TracklistController, }) methods = inspector.describe() From 77128e4b689f538b2fd290db403af807c3cbbc02 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 7 Feb 2015 17:09:33 +0100 Subject: [PATCH 4/4] flake8: Fix new warnings after flake8 upgrade (cherry picked from commit a693993905b66a63601cf5765da1788829b0f798) Conflicts: mopidy/audio/actor.py mopidy/audio/playlists.py --- mopidy/audio/actor.py | 4 ++-- mopidy/audio/playlists.py | 4 ++-- mopidy/local/__init__.py | 2 +- mopidy/local/json.py | 2 +- mopidy/local/translator.py | 2 +- setup.cfg | 4 ++++ tests/__init__.py | 2 +- tests/utils/test_jsonrpc.py | 2 +- 8 files changed, 13 insertions(+), 9 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 0d90394d..d2701784 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -109,8 +109,8 @@ class Audio(pykka.ThreadingActor): playbin = gst.element_factory_make('playbin2') playbin.set_property('flags', PLAYBIN_FLAGS) - playbin.set_property('buffer-size', 2*1024*1024) - playbin.set_property('buffer-duration', 2*gst.SECOND) + playbin.set_property('buffer-size', 2 * 1024 * 1024) + playbin.set_property('buffer-duration', 2 * gst.SECOND) self._connect(playbin, 'about-to-finish', self._on_about_to_finish) self._connect(playbin, 'notify::source', self._on_new_source) diff --git a/mopidy/audio/playlists.py b/mopidy/audio/playlists.py index 35e0800d..1f161773 100644 --- a/mopidy/audio/playlists.py +++ b/mopidy/audio/playlists.py @@ -76,8 +76,8 @@ def parse_pls(data): for section in cp.sections(): if section.lower() != 'playlist': continue - for i in xrange(cp.getint(section, 'numberofentries')): - yield cp.get(section, 'file%d' % (i+1)) + for i in range(cp.getint(section, 'numberofentries')): + yield cp.get(section, 'file%d' % (i + 1)) def parse_xspf(data): diff --git a/mopidy/local/__init__.py b/mopidy/local/__init__.py index 104c43af..9b485f19 100644 --- a/mopidy/local/__init__.py +++ b/mopidy/local/__init__.py @@ -27,7 +27,7 @@ class Extension(ext.Extension): schema['playlists_dir'] = config.Path() schema['tag_cache_file'] = config.Deprecated() schema['scan_timeout'] = config.Integer( - minimum=1000, maximum=1000*60*60) + minimum=1000, maximum=1000 * 60 * 60) schema['scan_flush_threshold'] = config.Integer(minimum=0) schema['excluded_file_extensions'] = config.List(optional=True) return schema diff --git a/mopidy/local/json.py b/mopidy/local/json.py index 5ae04592..b3a2ff39 100644 --- a/mopidy/local/json.py +++ b/mopidy/local/json.py @@ -75,7 +75,7 @@ class _BrowseCache(object): parent_uri = None child = None for i in reversed(range(len(parts))): - directory = '/'.join(parts[:i+1]) + directory = '/'.join(parts[:i + 1]) uri = translator.path_to_local_directory_uri(directory) # First dir we process is our parent diff --git a/mopidy/local/translator.py b/mopidy/local/translator.py index 33b67775..3c1d38ae 100644 --- a/mopidy/local/translator.py +++ b/mopidy/local/translator.py @@ -49,7 +49,7 @@ def m3u_extinf_to_track(line): return Track() (runtime, title) = m.groups() if int(runtime) > 0: - return Track(name=title, length=1000*int(runtime)) + return Track(name=title, length=1000 * int(runtime)) else: return Track(name=title) diff --git a/setup.cfg b/setup.cfg index 80ab9645..0d6c1486 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,10 @@ [flake8] application-import-names = mopidy,tests exclude = .git,.tox,build,js +# Ignored flake8 warnings: +# - E402 module level import not at top of file +# - E731 do not assign a lambda expression, use a def +ignore = E402,E731 [wheel] universal = 1 diff --git a/tests/__init__.py b/tests/__init__.py index a384669e..327ca5a8 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -20,7 +20,7 @@ class IsA(object): try: return isinstance(rhs, self.klass) except TypeError: - return type(rhs) == type(self.klass) + return type(rhs) == type(self.klass) # flake8: noqa def __ne__(self, rhs): return not self.__eq__(rhs) diff --git a/tests/utils/test_jsonrpc.py b/tests/utils/test_jsonrpc.py index e6f94fb3..c8d37d04 100644 --- a/tests/utils/test_jsonrpc.py +++ b/tests/utils/test_jsonrpc.py @@ -614,7 +614,7 @@ class JsonRpcInspectorTest(JsonRpcTestBase): 'core.library': core.LibraryController, 'core.playback': core.PlaybackController, 'core.playlists': core.PlaylistsController, - 'core.tracklist': core.TracklistController, + 'core.tracklist': core.TracklistController, }) methods = inspector.describe()