Skip to content

Commit

Permalink
feat: Webhook listener
Browse files Browse the repository at this point in the history
  • Loading branch information
vinyguedess committed May 8, 2020
1 parent 82080ef commit fa932b5
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 27 deletions.
18 changes: 0 additions & 18 deletions docs/examples/main.py

This file was deleted.

25 changes: 18 additions & 7 deletions onany/__init__.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,37 @@
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()

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
6 changes: 5 additions & 1 deletion onany/manager.py
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
15 changes: 15 additions & 0 deletions onany/web.py
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
requests==2.23.0
18 changes: 17 additions & 1 deletion tests/test_onany.py
Original file line number Diff line number Diff line change
@@ -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 = {
Expand All @@ -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 = {
Expand Down

0 comments on commit fa932b5

Please sign in to comment.