diff --git a/app.py b/app.py index ed1b002..56a26c4 100644 --- a/app.py +++ b/app.py @@ -4,15 +4,15 @@ from slack_bolt import App from slack_bolt.adapter.socket_mode import SocketModeHandler -from listeners import register_listeners +from listeners import load_listeners logging.basicConfig(level=logging.DEBUG) # Initialization app = App(token=os.environ.get("SLACK_BOT_TOKEN")) -# Register Listeners -register_listeners(app) +# Load Listeners +load_listeners(app) # Start Bolt app if __name__ == "__main__": diff --git a/app_oauth.py b/app_oauth.py index c48fab8..c898833 100644 --- a/app_oauth.py +++ b/app_oauth.py @@ -7,7 +7,7 @@ from slack_sdk.oauth.installation_store import FileInstallationStore from slack_sdk.oauth.state_store import FileOAuthStateStore -from listeners import register_listeners +from listeners import load_listeners logging.basicConfig(level=logging.DEBUG) @@ -42,8 +42,8 @@ def failure(args: FailureArgs) -> BoltResponse: ), ) -# Register Listeners -register_listeners(app) +# Load Listeners +load_listeners(app) # Start Bolt app if __name__ == "__main__": diff --git a/listeners/__init__.py b/listeners/__init__.py index 465e1f2..4f5580f 100644 --- a/listeners/__init__.py +++ b/listeners/__init__.py @@ -1,10 +1,13 @@ -from listeners import actions, commands, events, messages, shortcuts, views +from importlib import import_module +from pkgutil import walk_packages +from slack_bolt import App -def register_listeners(app): - actions.register(app) - commands.register(app) - events.register(app) - messages.register(app) - shortcuts.register(app) - views.register(app) +app: App + + +def load_listeners(bolt_app: App) -> None: + global app + app = bolt_app + for module_info in walk_packages(__path__, f"{__name__}."): + import_module(module_info.name) diff --git a/listeners/actions/__init__.py b/listeners/actions/__init__.py index 4a85b1f..e69de29 100644 --- a/listeners/actions/__init__.py +++ b/listeners/actions/__init__.py @@ -1,7 +0,0 @@ -from slack_bolt import App - -from .sample_action import sample_action_callback - - -def register(app: App): - app.action("sample_action_id")(sample_action_callback) diff --git a/listeners/actions/sample_action.py b/listeners/actions/sample_action.py index 57d92f5..d361e1d 100644 --- a/listeners/actions/sample_action.py +++ b/listeners/actions/sample_action.py @@ -3,7 +3,10 @@ from slack_bolt import Ack from slack_sdk import WebClient +from listeners import app + +@app.action("sample_action_id") def sample_action_callback(ack: Ack, client: WebClient, body: dict, logger: Logger): try: ack() diff --git a/listeners/commands/__init__.py b/listeners/commands/__init__.py index e4da248..e69de29 100644 --- a/listeners/commands/__init__.py +++ b/listeners/commands/__init__.py @@ -1,7 +0,0 @@ -from slack_bolt import App - -from .sample_command import sample_command_callback - - -def register(app: App): - app.command("/sample-command")(sample_command_callback) diff --git a/listeners/commands/sample_command.py b/listeners/commands/sample_command.py index a3d47b9..3e5964e 100644 --- a/listeners/commands/sample_command.py +++ b/listeners/commands/sample_command.py @@ -2,7 +2,10 @@ from slack_bolt import Ack, Respond +from listeners import app + +@app.command("/sample-command") def sample_command_callback(command, ack: Ack, respond: Respond, logger: Logger): try: ack() diff --git a/listeners/events/__init__.py b/listeners/events/__init__.py index d638683..e69de29 100644 --- a/listeners/events/__init__.py +++ b/listeners/events/__init__.py @@ -1,7 +0,0 @@ -from slack_bolt import App - -from .app_home_opened import app_home_opened_callback - - -def register(app: App): - app.event("app_home_opened")(app_home_opened_callback) diff --git a/listeners/events/app_home_opened.py b/listeners/events/app_home_opened.py index 9f8bae9..f62a06f 100644 --- a/listeners/events/app_home_opened.py +++ b/listeners/events/app_home_opened.py @@ -2,7 +2,10 @@ from slack_sdk import WebClient +from listeners import app + +@app.event("app_home_opened") def app_home_opened_callback(client: WebClient, event: dict, logger: Logger): # ignore the app_home_opened event for anything but the Home tab if event["tab"] != "home": diff --git a/listeners/messages/__init__.py b/listeners/messages/__init__.py index 734945a..e69de29 100644 --- a/listeners/messages/__init__.py +++ b/listeners/messages/__init__.py @@ -1,10 +0,0 @@ -import re - -from slack_bolt import App - -from .sample_message import sample_message_callback - - -# To receive messages from a channel or dm your app must be a member! -def register(app: App): - app.message(re.compile("(hi|hello|hey)"))(sample_message_callback) diff --git a/listeners/messages/sample_message.py b/listeners/messages/sample_message.py index 1855d36..092ff21 100644 --- a/listeners/messages/sample_message.py +++ b/listeners/messages/sample_message.py @@ -1,8 +1,13 @@ +import re from logging import Logger from slack_bolt import BoltContext, Say +from listeners import app + +# To receive messages from a channel or dm your app must be a member! +@app.message(re.compile("(hi|hello|hey)")) def sample_message_callback(context: BoltContext, say: Say, logger: Logger): try: greeting = context["matches"][0] diff --git a/listeners/shortcuts/__init__.py b/listeners/shortcuts/__init__.py index 1397414..e69de29 100644 --- a/listeners/shortcuts/__init__.py +++ b/listeners/shortcuts/__init__.py @@ -1,7 +0,0 @@ -from slack_bolt import App - -from .sample_shortcut import sample_shortcut_callback - - -def register(app: App): - app.shortcut("sample_shortcut_id")(sample_shortcut_callback) diff --git a/listeners/shortcuts/sample_shortcut.py b/listeners/shortcuts/sample_shortcut.py index ccb6a49..879a1b2 100644 --- a/listeners/shortcuts/sample_shortcut.py +++ b/listeners/shortcuts/sample_shortcut.py @@ -3,7 +3,10 @@ from slack_bolt import Ack from slack_sdk import WebClient +from listeners import app + +@app.shortcut("sample_shortcut_id") def sample_shortcut_callback(body: dict, ack: Ack, client: WebClient, logger: Logger): try: ack() diff --git a/listeners/views/__init__.py b/listeners/views/__init__.py index 7b2d4b3..e69de29 100644 --- a/listeners/views/__init__.py +++ b/listeners/views/__init__.py @@ -1,7 +0,0 @@ -from slack_bolt import App - -from .sample_view import sample_view_callback - - -def register(app: App): - app.view("sample_view_id")(sample_view_callback) diff --git a/listeners/views/sample_view.py b/listeners/views/sample_view.py index e2e8c25..0a5cd01 100644 --- a/listeners/views/sample_view.py +++ b/listeners/views/sample_view.py @@ -3,7 +3,10 @@ from slack_bolt import Ack from slack_sdk import WebClient +from listeners import app + +@app.view("sample_view_id") def sample_view_callback(view, ack: Ack, body: dict, client: WebClient, logger: Logger): try: ack() diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..100b4df --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,9 @@ +from unittest.mock import patch + +from slack_bolt import App +from slack_sdk import WebClient + +from listeners import load_listeners + +with patch.object(WebClient, "auth_test"): + load_listeners(App(token="test-bot-token")) diff --git a/tests/listeners/test_load_listeners.py b/tests/listeners/test_load_listeners.py new file mode 100644 index 0000000..e8a0bbc --- /dev/null +++ b/tests/listeners/test_load_listeners.py @@ -0,0 +1,13 @@ +import sys +from pkgutil import walk_packages + +import listeners + + +class TestLoadListeners: + def test_imports_every_listener_module(self): + for module_info in walk_packages(listeners.__path__, f"{listeners.__name__}."): + assert module_info.name in sys.modules + + def test_registers_every_listener_on_the_app(self): + assert len(listeners.app._listeners) == 6