Skip to content

Commit 736f764

Browse files
committed
Enable WorkflowStep to have lazy listeners
1 parent a1f1ca1 commit 736f764

File tree

6 files changed

+322
-75
lines changed

6 files changed

+322
-75
lines changed

slack_bolt/app/app.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
from http.server import SimpleHTTPRequestHandler, HTTPServer
77
from typing import List, Union, Pattern, Callable, Dict, Optional
88

9-
from slack_bolt.listener.thread_runner import ThreadListenerRunner
10-
from slack_bolt.workflows.step import WorkflowStep, WorkflowStepMiddleware
119
from slack_sdk.errors import SlackApiError
1210
from slack_sdk.oauth.installation_store import InstallationStore
1311
from slack_sdk.web import WebClient
@@ -26,6 +24,7 @@
2624
DefaultListenerErrorHandler,
2725
CustomListenerErrorHandler,
2826
)
27+
from slack_bolt.listener.thread_runner import ThreadListenerRunner
2928
from slack_bolt.listener_matcher import CustomListenerMatcher
3029
from slack_bolt.listener_matcher import builtins as builtin_matchers
3130
from slack_bolt.listener_matcher.listener_matcher import ListenerMatcher
@@ -59,6 +58,7 @@
5958
from slack_bolt.request import BoltRequest
6059
from slack_bolt.response import BoltResponse
6160
from slack_bolt.util.utils import create_web_client
61+
from slack_bolt.workflows.step import WorkflowStep, WorkflowStepMiddleware
6262

6363

6464
class App:
@@ -358,10 +358,14 @@ def middleware(self, *args) -> Optional[Callable]:
358358
def step(
359359
self,
360360
callback_id: Union[str, Pattern, WorkflowStep],
361-
edit: Optional[Union[Callable[..., Optional[BoltResponse]], Listener]] = None,
362-
save: Optional[Union[Callable[..., Optional[BoltResponse]], Listener]] = None,
361+
edit: Optional[
362+
Union[Callable[..., Optional[BoltResponse]], Listener, List[Callable]]
363+
] = None,
364+
save: Optional[
365+
Union[Callable[..., Optional[BoltResponse]], Listener, List[Callable]]
366+
] = None,
363367
execute: Optional[
364-
Union[Callable[..., Optional[BoltResponse]], Listener]
368+
Union[Callable[..., Optional[BoltResponse]], Listener, List[Callable]]
365369
] = None,
366370
):
367371
"""Registers a new Workflow Step listener"""

slack_bolt/app/async_app.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -371,13 +371,13 @@ def step(
371371
self,
372372
callback_id: Union[str, Pattern, AsyncWorkflowStep],
373373
edit: Optional[
374-
Union[Callable[..., Optional[BoltResponse]], AsyncListener]
374+
Union[Callable[..., Optional[BoltResponse]], AsyncListener, List[Callable]]
375375
] = None,
376376
save: Optional[
377-
Union[Callable[..., Optional[BoltResponse]], AsyncListener]
377+
Union[Callable[..., Optional[BoltResponse]], AsyncListener, List[Callable]]
378378
] = None,
379379
execute: Optional[
380-
Union[Callable[..., Optional[BoltResponse]], AsyncListener]
380+
Union[Callable[..., Optional[BoltResponse]], AsyncListener, List[Callable]]
381381
] = None,
382382
):
383383
"""Registers a new Workflow Step listener"""

slack_bolt/workflows/step/async_step.py

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Callable, Union, Optional, Awaitable
1+
from typing import Callable, Union, Optional, Awaitable, List
22

33
from slack_bolt.context.async_context import AsyncBoltContext
44
from slack_bolt.listener.async_listener import AsyncListener, AsyncCustomListener
@@ -14,6 +14,8 @@
1414
from .utilities.async_fail import AsyncFail
1515
from .utilities.async_complete import AsyncComplete
1616
from .utilities.async_update import AsyncUpdate
17+
from ...listener_matcher.async_listener_matcher import AsyncListenerMatcher
18+
from ...middleware.async_middleware import AsyncMiddleware
1719

1820

1921
class AsyncWorkflowStep:
@@ -26,9 +28,15 @@ def __init__(
2628
self,
2729
*,
2830
callback_id: str,
29-
edit: Union[Callable[..., Awaitable[BoltResponse]], AsyncListener],
30-
save: Union[Callable[..., Awaitable[BoltResponse]], AsyncListener],
31-
execute: Union[Callable[..., Awaitable[BoltResponse]], AsyncListener],
31+
edit: Union[
32+
Callable[..., Awaitable[BoltResponse]], AsyncListener, List[Callable]
33+
],
34+
save: Union[
35+
Callable[..., Awaitable[BoltResponse]], AsyncListener, List[Callable]
36+
],
37+
execute: Union[
38+
Callable[..., Awaitable[BoltResponse]], AsyncListener, List[Callable]
39+
],
3240
app_name: Optional[str] = None,
3341
):
3442
self.callback_id = callback_id
@@ -40,7 +48,7 @@ def __init__(
4048
@classmethod
4149
def _build_listener(
4250
cls, callback_id: str, app_name: str, listener: AsyncListener, name: str,
43-
):
51+
) -> AsyncListener:
4452
if isinstance(listener, AsyncListener):
4553
return listener
4654
elif isinstance(listener, Callable):
@@ -52,11 +60,22 @@ def _build_listener(
5260
lazy_functions=[],
5361
auto_acknowledgement=name == "execute",
5462
)
63+
elif isinstance(listener, list) and len(listener) > 0:
64+
ack = listener.pop(0)
65+
lazy = listener
66+
return AsyncCustomListener(
67+
app_name=app_name,
68+
matchers=cls._build_matchers(name, callback_id),
69+
middleware=cls._build_middleware(name, callback_id),
70+
ack_function=ack,
71+
lazy_functions=lazy,
72+
auto_acknowledgement=name == "execute",
73+
)
5574
else:
5675
raise ValueError(f"Invalid `{name}` listener")
5776

5877
@classmethod
59-
def _build_matchers(cls, name: str, callback_id: str):
78+
def _build_matchers(cls, name: str, callback_id: str) -> List[AsyncListenerMatcher]:
6079
if name == "edit":
6180
return [workflow_step_edit(callback_id, asyncio=True)]
6281
elif name == "save":
@@ -67,7 +86,7 @@ def _build_matchers(cls, name: str, callback_id: str):
6786
raise ValueError(f"Invalid name {name}")
6887

6988
@classmethod
70-
def _build_middleware(cls, name: str, callback_id: str):
89+
def _build_middleware(cls, name: str, callback_id: str) -> List[AsyncMiddleware]:
7190
if name == "edit":
7291
return [_build_edit_listener_middleware(callback_id)]
7392
elif name == "save":
@@ -83,7 +102,7 @@ def _build_middleware(cls, name: str, callback_id: str):
83102
#######################
84103

85104

86-
def _build_edit_listener_middleware(callback_id: str):
105+
def _build_edit_listener_middleware(callback_id: str) -> AsyncMiddleware:
87106
async def edit_listener_middleware(
88107
context: AsyncBoltContext,
89108
client: AsyncWebClient,
@@ -103,7 +122,7 @@ async def edit_listener_middleware(
103122
#######################
104123

105124

106-
def _build_save_listener_middleware():
125+
def _build_save_listener_middleware() -> AsyncMiddleware:
107126
async def save_listener_middleware(
108127
context: AsyncBoltContext,
109128
client: AsyncWebClient,
@@ -121,7 +140,7 @@ async def save_listener_middleware(
121140
#######################
122141

123142

124-
def _build_execute_listener_middleware():
143+
def _build_execute_listener_middleware() -> AsyncMiddleware:
125144
async def execute_listener_middleware(
126145
context: AsyncBoltContext,
127146
client: AsyncWebClient,

slack_bolt/workflows/step/step.py

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
from typing import Callable, Union, Optional
1+
from typing import Callable, Union, Optional, List
22

33
from slack_bolt.context import BoltContext
44
from slack_bolt.listener import Listener, CustomListener
5+
from slack_bolt.listener_matcher import ListenerMatcher
56
from slack_bolt.listener_matcher.builtins import (
67
workflow_step_edit,
78
workflow_step_save,
89
workflow_step_execute,
910
)
10-
from slack_bolt.middleware import CustomMiddleware
11+
from slack_bolt.middleware import CustomMiddleware, Middleware
1112
from slack_bolt.response import BoltResponse
1213
from slack_bolt.workflows.step.utilities.complete import Complete
1314
from slack_bolt.workflows.step.utilities.configure import Configure
@@ -26,9 +27,9 @@ def __init__(
2627
self,
2728
*,
2829
callback_id: str,
29-
edit: Union[Callable[..., Optional[BoltResponse]], Listener],
30-
save: Union[Callable[..., Optional[BoltResponse]], Listener],
31-
execute: Union[Callable[..., Optional[BoltResponse]], Listener],
30+
edit: Union[Callable[..., Optional[BoltResponse]], Listener, List[Callable]],
31+
save: Union[Callable[..., Optional[BoltResponse]], Listener, List[Callable]],
32+
execute: Union[Callable[..., Optional[BoltResponse]], Listener, List[Callable]],
3233
app_name: Optional[str] = None,
3334
):
3435
self.callback_id = callback_id
@@ -38,7 +39,15 @@ def __init__(
3839
self.execute = self._build_listener(callback_id, app_name, execute, "execute")
3940

4041
@classmethod
41-
def _build_listener(cls, callback_id, app_name, listener, name):
42+
def _build_listener(
43+
cls,
44+
callback_id: str,
45+
app_name: str,
46+
listener: Union[
47+
Callable[..., Optional[BoltResponse]], Listener, List[Callable]
48+
],
49+
name: str,
50+
) -> Listener:
4251
if isinstance(listener, Listener):
4352
return listener
4453
elif isinstance(listener, Callable):
@@ -50,11 +59,22 @@ def _build_listener(cls, callback_id, app_name, listener, name):
5059
lazy_functions=[],
5160
auto_acknowledgement=name == "execute",
5261
)
62+
elif isinstance(listener, list) and len(listener) > 0:
63+
ack = listener.pop(0)
64+
lazy = listener
65+
return CustomListener(
66+
app_name=app_name,
67+
matchers=cls._build_matchers(name, callback_id),
68+
middleware=cls._build_middleware(name, callback_id),
69+
ack_function=ack,
70+
lazy_functions=lazy,
71+
auto_acknowledgement=name == "execute",
72+
)
5373
else:
5474
raise ValueError(f"Invalid `{name}` listener")
5575

5676
@classmethod
57-
def _build_matchers(cls, name, callback_id):
77+
def _build_matchers(cls, name: str, callback_id: str) -> List[ListenerMatcher]:
5878
if name == "edit":
5979
return [workflow_step_edit(callback_id)]
6080
elif name == "save":
@@ -65,7 +85,7 @@ def _build_matchers(cls, name, callback_id):
6585
raise ValueError(f"Invalid name {name}")
6686

6787
@classmethod
68-
def _build_middleware(cls, name, callback_id):
88+
def _build_middleware(cls, name: str, callback_id: str) -> List[Middleware]:
6989
if name == "edit":
7090
return [_build_edit_listener_middleware(callback_id)]
7191
elif name == "save":
@@ -81,7 +101,7 @@ def _build_middleware(cls, name, callback_id):
81101
#######################
82102

83103

84-
def _build_edit_listener_middleware(callback_id):
104+
def _build_edit_listener_middleware(callback_id: str) -> Middleware:
85105
def edit_listener_middleware(
86106
context: BoltContext,
87107
client: WebClient,
@@ -101,7 +121,7 @@ def edit_listener_middleware(
101121
#######################
102122

103123

104-
def _build_save_listener_middleware():
124+
def _build_save_listener_middleware() -> Middleware:
105125
def save_listener_middleware(
106126
context: BoltContext,
107127
client: WebClient,
@@ -119,7 +139,7 @@ def save_listener_middleware(
119139
#######################
120140

121141

122-
def _build_execute_listener_middleware():
142+
def _build_execute_listener_middleware() -> Middleware:
123143
def execute_listener_middleware(
124144
context: BoltContext,
125145
client: WebClient,

0 commit comments

Comments
 (0)