From fa932b5dfecf7851150a819287016cf78cd7acc6 Mon Sep 17 00:00:00 2001 From: Vinicius Guedes Date: Fri, 8 May 2020 13:56:40 -0300 Subject: [PATCH] feat: Webhook listener --- docs/examples/main.py | 18 ------------------ onany/__init__.py | 25 ++++++++++++++++++------- onany/manager.py | 6 +++++- onany/web.py | 15 +++++++++++++++ requirements.txt | 1 + tests/test_onany.py | 18 +++++++++++++++++- 6 files changed, 56 insertions(+), 27 deletions(-) delete mode 100644 docs/examples/main.py create mode 100644 onany/web.py create mode 100644 requirements.txt diff --git a/docs/examples/main.py b/docs/examples/main.py deleted file mode 100644 index 7a3d363..0000000 --- a/docs/examples/main.py +++ /dev/null @@ -1,18 +0,0 @@ -from onany import dispatch, listener - - -@listener("event.name") -def on_event_name(*args, **kwargs): - print("I've been called with {} and {}".format( - args, - kwargs - )) - -dispatch( - "event.name", - "first_param", - "second_param", - "third_param", - first="param", - second="param", - third="param") \ No newline at end of file diff --git a/onany/__init__.py b/onany/__init__.py index 657bcdc..726f120 100644 --- a/onany/__init__.py +++ b/onany/__init__.py @@ -1,14 +1,20 @@ from threading import Thread -from onany.manager import OnAny +from typing import Any, Dict, Union +from onany.manager import EventManager +from onany.web import webhook_callback + + +def clear_listeners(): + EventManager.clear() def dispatch(event: str, *args, **kwargs) -> None: - return OnAny.emit(event, *args, **kwargs) + return EventManager.emit(event, *args, **kwargs) def disthread(event: str, *args, **kwargs) -> Thread: thread: Thread = Thread( - target=OnAny.emit, + target=EventManager.emit, args=(event, *args,), kwargs=kwargs) thread.start() @@ -16,11 +22,16 @@ def disthread(event: str, *args, **kwargs) -> Thread: return thread -def listener(event: str, callback: callable = None) -> callable: - if callback: - return OnAny.listen(event, callback) +def listener(event: str, callback: Union[callable, Dict[str, Any]] = None) -> callable: + if callable(callback): + return EventManager.listen(event, callback) + + if callback and isinstance(callback, dict): + return EventManager.listen( + event, + webhook_callback(callback)) def wrapper(callback: callable) -> None: - return OnAny.listen(event, callback) + return EventManager.listen(event, callback) return wrapper diff --git a/onany/manager.py b/onany/manager.py index d026358..f66ad94 100644 --- a/onany/manager.py +++ b/onany/manager.py @@ -1,9 +1,13 @@ from typing import Dict, List -class OnAny: +class EventManager: _events_pool: Dict[str, List[callable]] = {} + @classmethod + def clear(cls): + cls._events_pool = {} + @classmethod def listen(cls, event: str, callback: callable): cls._register_event(event) diff --git a/onany/web.py b/onany/web.py new file mode 100644 index 0000000..7eca574 --- /dev/null +++ b/onany/web.py @@ -0,0 +1,15 @@ +from typing import Any, Dict +import requests + + +def webhook_callback(rules: Dict[str, Any]) -> callable: + def wrapper(*args, **kwargs): + response = requests.post( + rules.get("route"), + json=kwargs.get("data"), + headers=kwargs.get("headers")) + + if rules.get("callback"): + rules.get("callback")(response) + + return wrapper diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..822be75 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +requests==2.23.0 \ No newline at end of file diff --git a/tests/test_onany.py b/tests/test_onany.py index 5dfae75..96d7a94 100644 --- a/tests/test_onany.py +++ b/tests/test_onany.py @@ -1,11 +1,14 @@ from typing import Any, Dict from unittest import TestCase from tests.generators import sprint, get_last_sprint -from onany import dispatch, disthread, listener +from onany import clear_listeners, dispatch, disthread, listener class TestOnAny(TestCase): + def setUp(self): + clear_listeners() + def test_dispatch_listen(self): callback = self.get_listener() params = { @@ -26,6 +29,19 @@ def test_dispatch_listen_registering_simple_callback(self): self.assertEqual(get_last_sprint(), "Hello Clark Kent. Welcome to OnAny!") + def test_dispatch_listen_webhook_callback(self): + listener("event.name", { + "route": "http://demo2158329.mockable.io/callback", + "callback": lambda response: + sprint("API Answered with {}".format(response.status_code)) + }) + + dispatch("event.name", data={ + "name": "Bruce Wayne" + }) + + self.assertEqual(get_last_sprint(), "API Answered with 200") + def test_thread_dispatch_listen(self): callback = self.get_listener() params = {