Skip to content

Commit 117e04b

Browse files
nickovsseratch
authored andcommitted
Fixed fetching of names for callable objects (#215)
Added new function name_for_callable() in util.utils. Fixed name properties for CustomMiddleware and AsyncCustomMiddleware to use the new function. Modified listener/thread_runner.py and listener/asyncio_runner.py to use the new function to name lazy functions. Added test cases for middleware and lazy function cases.
1 parent 03a0ad4 commit 117e04b

File tree

8 files changed

+81
-11
lines changed

8 files changed

+81
-11
lines changed

slack_bolt/listener/asyncio_runner.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
)
1616
from slack_bolt.request.async_request import AsyncBoltRequest
1717
from slack_bolt.response import BoltResponse
18-
from slack_bolt.util.utils import create_copy
18+
from slack_bolt.util.utils import create_copy, name_for_callable
1919

2020

2121
class AsyncioListenerRunner:
@@ -71,7 +71,7 @@ async def run(
7171

7272
for lazy_func in listener.lazy_functions:
7373
if request.lazy_function_name:
74-
func_name = lazy_func.__name__
74+
func_name = name_for_callable(lazy_func)
7575
if func_name == request.lazy_function_name:
7676
await self.lazy_listener_runner.run(
7777
function=lazy_func, request=request
@@ -128,7 +128,7 @@ async def run_ack_function_asynchronously(
128128

129129
for lazy_func in listener.lazy_functions:
130130
if request.lazy_function_name:
131-
func_name = lazy_func.__name__
131+
func_name = name_for_callable(lazy_func)
132132
if func_name == request.lazy_function_name:
133133
await self.lazy_listener_runner.run(
134134
function=lazy_func, request=request
@@ -163,7 +163,7 @@ def _start_lazy_function(
163163
self, lazy_func: Callable[..., Awaitable[None]], request: AsyncBoltRequest
164164
) -> None:
165165
# Start a lazy function asynchronously
166-
func_name: str = lazy_func.__name__
166+
func_name: str = name_for_callable(lazy_func)
167167
self.logger.debug(debug_running_lazy_listener(func_name))
168168
copied_request = self._build_lazy_request(request, func_name)
169169
self.lazy_listener_runner.start(function=lazy_func, request=copied_request)

slack_bolt/listener/thread_runner.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
)
1414
from slack_bolt.request import BoltRequest
1515
from slack_bolt.response import BoltResponse
16-
from slack_bolt.util.utils import create_copy
16+
from slack_bolt.util.utils import create_copy, name_for_callable
1717

1818

1919
class ThreadListenerRunner:
@@ -72,7 +72,7 @@ def run( # type: ignore
7272

7373
for lazy_func in listener.lazy_functions:
7474
if request.lazy_function_name:
75-
func_name = lazy_func.__name__
75+
func_name = name_for_callable(lazy_func)
7676
if func_name == request.lazy_function_name:
7777
self.lazy_listener_runner.run(
7878
function=lazy_func, request=request
@@ -127,7 +127,7 @@ def run_ack_function_asynchronously():
127127

128128
for lazy_func in listener.lazy_functions:
129129
if request.lazy_function_name:
130-
func_name = lazy_func.__name__
130+
func_name = name_for_callable(lazy_func)
131131
if func_name == request.lazy_function_name:
132132
self.lazy_listener_runner.run(
133133
function=lazy_func, request=request
@@ -162,7 +162,7 @@ def _start_lazy_function(
162162
self, lazy_func: Callable[..., None], request: BoltRequest
163163
) -> None:
164164
# Start a lazy function asynchronously
165-
func_name: str = lazy_func.__name__
165+
func_name: str = name_for_callable(lazy_func)
166166
self.logger.debug(debug_running_lazy_listener(func_name))
167167
copied_request = self._build_lazy_request(request, func_name)
168168
self.lazy_listener_runner.start(function=lazy_func, request=copied_request)

slack_bolt/middleware/async_custom_middleware.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from slack_bolt.request.async_request import AsyncBoltRequest
88
from slack_bolt.response import BoltResponse
99
from .async_middleware import AsyncMiddleware
10+
from slack_bolt.util.utils import name_for_callable
1011

1112

1213
class AsyncCustomMiddleware(AsyncMiddleware):
@@ -45,4 +46,4 @@ async def async_process(
4546

4647
@property
4748
def name(self) -> str:
48-
return f"AsyncCustomMiddleware(func={self.func.__name__})"
49+
return f"AsyncCustomMiddleware(func={name_for_callable(self.func)})"

slack_bolt/middleware/custom_middleware.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from slack_bolt.request import BoltRequest
88
from slack_bolt.response import BoltResponse
99
from .middleware import Middleware
10-
10+
from slack_bolt.util.utils import name_for_callable
1111

1212
class CustomMiddleware(Middleware):
1313
app_name: str
@@ -41,4 +41,4 @@ def process(
4141

4242
@property
4343
def name(self) -> str:
44-
return f"CustomMiddleware(func={self.func.__name__})"
44+
return f"CustomMiddleware(func={name_for_callable(self.func)})"

slack_bolt/util/utils.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,10 @@ def get_boot_message(development_server: bool = False) -> str:
5757
return "⚡️ Bolt app is running! (development server)"
5858
else:
5959
return "⚡️ Bolt app is running!"
60+
61+
62+
def name_for_callable(func):
63+
if hasattr(func, "__name__"):
64+
func_name = func.__name__
65+
else:
66+
func_name = f"{func.__class__.__module__}.{func.__class__.__name__}"

tests/scenario_tests/test_lazy.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,31 @@ def async2(say):
110110
assert response.status == 200
111111
time.sleep(1) # wait a bit
112112
assert self.mock_received_requests["/chat.postMessage"] == 2
113+
114+
def test_lazy_class(self):
115+
def just_ack(ack):
116+
ack()
117+
118+
class LazyClass:
119+
def __call__(self, say):
120+
time.sleep(0.3)
121+
say(text="lazy function 1")
122+
123+
def async2(say):
124+
time.sleep(0.5)
125+
say(text="lazy function 2")
126+
127+
app = App(
128+
client=self.web_client,
129+
signing_secret=self.signing_secret,
130+
)
131+
app.action("a")(
132+
ack=just_ack,
133+
lazy=[LazyClass(), async2],
134+
)
135+
136+
request = self.build_valid_request()
137+
response = app.dispatch(request)
138+
assert response.status == 200
139+
time.sleep(1) # wait a bit
140+
assert self.mock_received_requests["/chat.postMessage"] == 2

tests/scenario_tests/test_listener_middleware.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,23 @@ def handle(ack):
9393
response = app.dispatch(self.build_request())
9494
assert response.status == 200
9595

96+
def test_class_next(self):
97+
class NextClass:
98+
def __call__(self, next):
99+
next()
100+
101+
app = App(
102+
client=self.web_client,
103+
signing_secret=self.signing_secret,
104+
)
105+
106+
@app.shortcut(constraints="test-shortcut", middleware=[NextClass()])
107+
def handle(ack):
108+
ack()
109+
110+
response = app.dispatch(self.build_request())
111+
assert response.status == 200
112+
96113

97114
def listener_middleware_returning_response():
98115
return BoltResponse(status=200, body="listener middleware")

tests/scenario_tests/test_middleware.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,23 @@ def test_next_call(self):
8686
assert response.body == "acknowledged!"
8787
assert self.mock_received_requests["/auth.test"] == 1
8888

89+
def test_class_call(self):
90+
class NextClass:
91+
def __call__(self, next):
92+
next()
93+
94+
app = App(
95+
client=self.web_client,
96+
signing_secret=self.signing_secret,
97+
)
98+
app.use(NextClass())
99+
app.shortcut("test-shortcut")(just_ack)
100+
101+
response = app.dispatch(self.build_request())
102+
assert response.status == 200
103+
assert response.body == "acknowledged!"
104+
assert self.mock_received_requests["/auth.test"] == 1
105+
89106

90107
def just_ack(ack):
91108
ack("acknowledged!")

0 commit comments

Comments
 (0)