From e6460b69457db35c44da27015e20b2580a1c74fb Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 30 Mar 2013 21:01:01 +0100 Subject: [PATCH] jsonrpc: Handle Pykka's CallableProxy objects as regular methods --- mopidy/utils/jsonrpc.py | 2 +- tests/utils/jsonrpc_test.py | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/mopidy/utils/jsonrpc.py b/mopidy/utils/jsonrpc.py index 8230aada..503921dc 100644 --- a/mopidy/utils/jsonrpc.py +++ b/mopidy/utils/jsonrpc.py @@ -181,7 +181,7 @@ class JsonRpcWrapper(object): data='"params", if given, must be an array or an object') def _get_method(self, method_path): - if inspect.isroutine(self.objects.get(method_path, None)): + if callable(self.objects.get(method_path, None)): # The mounted object is the callable return self.objects[method_path] diff --git a/tests/utils/jsonrpc_test.py b/tests/utils/jsonrpc_test.py index 44ec1b09..226d4614 100644 --- a/tests/utils/jsonrpc_test.py +++ b/tests/utils/jsonrpc_test.py @@ -48,6 +48,7 @@ class JsonRpcTestBase(unittest.TestCase): 'core': self.core, 'core.playback': self.core.playback, 'core.tracklist': self.core.tracklist, + 'get_uri_schemes': self.core.get_uri_schemes, }, encoders=[models.ModelJSONEncoder], decoders=[models.model_json_decoder]) @@ -188,6 +189,23 @@ class JsonRpcSingleCommandTest(JsonRpcTestBase): self.assertEqual(response['result'], None) + def test_call_method_which_is_a_directly_mounted_actor_member(self): + # 'get_uri_schemes' isn't a regular callable, but a Pykka + # CallableProxy. This test checks that CallableProxy objects are + # threated by JsonRpcWrapper like any other callable. + + request = { + 'jsonrpc': '2.0', + 'method': 'get_uri_schemes', + 'id': 1, + } + response = self.jrw.handle_data(request) + + self.assertEqual(response['jsonrpc'], '2.0') + self.assertEqual(response['id'], 1) + self.assertNotIn('error', response) + self.assertEqual(response['result'], ['dummy']) + def test_call_method_with_positional_params(self): request = { 'jsonrpc': '2.0', @@ -588,6 +606,7 @@ class JsonRpcInspectorTest(JsonRpcTestBase): def test_inspector_can_describe_a_bunch_of_large_classes(self): inspector = jsonrpc.JsonRpcInspector({ + 'core.get_uri_schemes': core.Core.get_uri_schemes, 'core.library': core.LibraryController, 'core.playback': core.PlaybackController, 'core.playlists': core.PlaylistsController, @@ -596,6 +615,9 @@ class JsonRpcInspectorTest(JsonRpcTestBase): methods = inspector.describe() + self.assertIn('core.get_uri_schemes', methods) + self.assertEquals(len(methods['core.get_uri_schemes']['params']), 0) + self.assertIn('core.library.lookup', methods.keys()) self.assertEquals( methods['core.library.lookup']['params'][0]['name'], 'uri')