22import logging
33import os
44from collections import defaultdict
5+ from typing import Any , Callable , Coroutine
56
67from pybot .plugins .airtable import endpoints
78from pybot .plugins .airtable .api import AirtableAPI
89
910logger = logging .getLogger (__name__ )
1011
12+ # Type alias for async handlers
13+ AsyncHandler = Callable [..., Coroutine [Any , Any , Any ]]
14+
15+
16+ def _ensure_async (handler : Callable ) -> AsyncHandler :
17+ """Ensure handler is an async function."""
18+ if not asyncio .iscoroutinefunction (handler ):
19+ raise TypeError (
20+ f"Handler { handler .__name__ } must be an async function (defined with 'async def')"
21+ )
22+ return handler
23+
1124
1225class AirtablePlugin :
1326 __name__ = "airtable"
@@ -21,7 +34,13 @@ def __init__(self):
2134
2235 self .routers = {"request" : RequestRouter ()}
2336
24- def load (self , sirbot , api_key = None , base_key = None , verify = None ):
37+ def load (
38+ self ,
39+ sirbot : Any ,
40+ api_key : str | None = None ,
41+ base_key : str | None = None ,
42+ verify : str | None = None
43+ ) -> None :
2544 self .session = sirbot .http_session
2645 self .api_key = api_key or os .environ .get ("AIRTABLE_API_KEY" , "" )
2746 self .base_key = base_key or os .environ .get ("AIRTABLE_BASE_KEY" , "" )
@@ -31,9 +50,8 @@ def load(self, sirbot, api_key=None, base_key=None, verify=None):
3150
3251 sirbot .router .add_route ("POST" , "/airtable/request" , endpoints .incoming_request )
3352
34- def on_request (self , request , handler , ** kwargs ):
35- if not asyncio .iscoroutinefunction (handler ):
36- handler = asyncio .coroutine (handler )
53+ def on_request (self , request : str , handler : AsyncHandler , ** kwargs : Any ) -> None :
54+ handler = _ensure_async (handler )
3755 options = {** kwargs , "wait" : False }
3856 self .routers ["request" ].register (request , (handler , options ))
3957
0 commit comments