From fef6f81e1a7bda5a6735fb0873fae28faa47316e Mon Sep 17 00:00:00 2001 From: Jacob Tomlinson Date: Mon, 28 Jan 2019 13:14:20 +0000 Subject: [PATCH] Call skills correctly depending on function or class skills (#820) * Call skills correctly depending on function or class skills * Remove unused import * Better argument inspection * Remove deprecated method * Add test for class based skills --- opsdroid/core.py | 6 +++++- tests/test_core.py | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/opsdroid/core.py b/opsdroid/core.py index 6cf741998..6593d2b30 100644 --- a/opsdroid/core.py +++ b/opsdroid/core.py @@ -8,6 +8,7 @@ import weakref import asyncio import contextlib +import inspect from opsdroid.const import DEFAULT_CONFIG_PATH from opsdroid.memory import Memory @@ -312,7 +313,10 @@ async def run_skill(self, skill, config, message): # halt the application. If a skill throws an exception it just doesn't # give a response to the user, so an error response should be given. try: - await skill(self, config, message) + if len(inspect.signature(skill).parameters.keys()) > 1: + await skill(self, config, message) + else: + await skill(message) except Exception: if message: await message.respond(_("Whoops there has been an error")) diff --git a/tests/test_core.py b/tests/test_core.py index 89f9bb733..0e3a709d2 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -224,6 +224,12 @@ async def mockedskill(opsdroid, config, message): mockedskill.config = {} return mockedskill + async def getMockMethodSkill(self): + async def mockedskill(message): + await message.respond("Test") + mockedskill.config = {} + return mockedskill + async def test_handle_signal(self): with OpsDroid() as opsdroid: opsdroid._running = True @@ -293,6 +299,19 @@ async def test_parse_regex(self): await task self.assertTrue(mock_connector.respond.called) + async def test_parse_regex_method_skill(self): + with OpsDroid() as opsdroid: + regex = r"Hello .*" + mock_connector = Connector({}, opsdroid=opsdroid) + mock_connector.respond = amock.CoroutineMock() + skill = await self.getMockMethodSkill() + opsdroid.skills.append(match_regex(regex)(skill)) + message = Message("user", "default", mock_connector, "Hello world") + tasks = await opsdroid.parse(message) + for task in tasks: + await task + self.assertTrue(mock_connector.respond.called) + async def test_parse_regex_insensitive(self): with OpsDroid() as opsdroid: regex = r"Hello .*"