From 0f6c9a1673738b72db21f3ca4b8e856700aa35cc Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 17 Nov 2012 00:53:45 +0100 Subject: [PATCH] backends: Add BackendListener interface with playlists_loaded() event --- docs/api/backends.rst | 7 +++++++ mopidy/backends/listener.py | 32 ++++++++++++++++++++++++++++++++ tests/backends/listener_test.py | 13 +++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 mopidy/backends/listener.py create mode 100644 tests/backends/listener_test.py diff --git a/docs/api/backends.rst b/docs/api/backends.rst index 0dc4900d..f0aadd53 100644 --- a/docs/api/backends.rst +++ b/docs/api/backends.rst @@ -33,6 +33,13 @@ Library provider :members: +Backend listener +================ + +.. autoclass:: mopidy.backends.listener.BackendListener + :members: + + .. _backend-implementations: Backend implementations diff --git a/mopidy/backends/listener.py b/mopidy/backends/listener.py new file mode 100644 index 00000000..30b3291d --- /dev/null +++ b/mopidy/backends/listener.py @@ -0,0 +1,32 @@ +from __future__ import unicode_literals + +import pykka + + +class BackendListener(object): + """ + Marker interface for recipients of events sent by the backend actors. + + Any Pykka actor that mixes in this class will receive calls to the methods + defined here when the corresponding events happen in the core actor. This + interface is used both for looking up what actors to notify of the events, + and for providing default implementations for those listeners that are not + interested in all events. + + Normally, only the Core actor should mix in this class. + """ + + @staticmethod + def send(event, **kwargs): + """Helper to allow calling of backend listener events""" + listeners = pykka.ActorRegistry.get_by_class(BackendListener) + for listener in listeners: + getattr(listener.proxy(), event)(**kwargs) + + def playlists_loaded(self): + """ + Called when playlists are loaded or refreshed. + + *MAY* be implemented by actor. + """ + pass diff --git a/tests/backends/listener_test.py b/tests/backends/listener_test.py new file mode 100644 index 00000000..a4df513c --- /dev/null +++ b/tests/backends/listener_test.py @@ -0,0 +1,13 @@ +from __future__ import unicode_literals + +from mopidy.backends.listener import BackendListener + +from tests import unittest + + +class CoreListenerTest(unittest.TestCase): + def setUp(self): + self.listener = BackendListener() + + def test_listener_has_default_impl_for_playlists_loaded(self): + self.listener.playlists_loaded()