Skip to content

Commit 28e44cb

Browse files
committed
Add type hints
1 parent 149c100 commit 28e44cb

File tree

4 files changed

+150
-110
lines changed

4 files changed

+150
-110
lines changed

mautrix_appservice/appservice.py

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,24 @@
1717
#
1818
# Partly based on github.com/Cadair/python-appservice-framework (MIT license)
1919
from contextlib import contextmanager
20+
from typing import Optional, Callable, Awaitable
2021
from aiohttp import web
2122
import aiohttp
2223
import asyncio
2324
import logging
2425

25-
from .intent_api import HTTPAPI
26+
from .intent_api import HTTPAPI, IntentAPI
2627
from .state_store import StateStore
2728

29+
QueryFunc = Callable[[web.Request], Awaitable[Optional[web.Response]]]
30+
HandlerFunc = Callable[[dict], Awaitable]
31+
2832

2933
class AppService:
30-
def __init__(self, server, domain, as_token, hs_token, bot_localpart, loop=None, log=None,
31-
verify_ssl=True, query_user=None, query_alias=None):
34+
def __init__(self, server: str, domain: str, as_token: str, hs_token: str, bot_localpart: str,
35+
loop: Optional[asyncio.AbstractEventLoop] = None,
36+
log: Optional[logging.Logger] = None, verify_ssl: bool = True,
37+
query_user: QueryFunc = None, query_alias: QueryFunc = None):
3238
self.server = server
3339
self.domain = domain
3440
self.verify_ssl = verify_ssl
@@ -64,23 +70,23 @@ async def default_query_handler(_):
6470
self.matrix_event_handler(self.update_state_store)
6571

6672
@property
67-
def http_session(self):
73+
def http_session(self) -> aiohttp.ClientSession:
6874
if self._http_session is None:
6975
raise AttributeError("the http_session attribute can only be used "
7076
"from within the `AppService.run` context manager")
7177
else:
7278
return self._http_session
7379

7480
@property
75-
def intent(self):
81+
def intent(self) -> IntentAPI:
7682
if self._intent is None:
7783
raise AttributeError("the intent attribute can only be used from "
7884
"within the `AppService.run` context manager")
7985
else:
8086
return self._intent
8187

8288
@contextmanager
83-
def run(self, host="127.0.0.1", port=8080):
89+
def run(self, host: str = "127.0.0.1", port: int = 8080):
8490
connector = None
8591
if self.server.startswith("https://") and not self.verify_ssl:
8692
connector = aiohttp.TCPConnector(verify_ssl=False)
@@ -95,7 +101,7 @@ def run(self, host="127.0.0.1", port=8080):
95101
self._http_session.close()
96102
self._http_session = None
97103

98-
def _check_token(self, request):
104+
def _check_token(self, request: web.Request) -> bool:
99105
try:
100106
token = request.rel_url.query["access_token"]
101107
except KeyError:
@@ -106,7 +112,7 @@ def _check_token(self, request):
106112

107113
return True
108114

109-
async def _http_query_user(self, request):
115+
async def _http_query_user(self, request: web.Request) -> web.Response:
110116
if not self._check_token(request):
111117
return web.Response(status=401)
112118

@@ -122,7 +128,7 @@ async def _http_query_user(self, request):
122128
return web.Response(status=404)
123129
return web.json_response(response)
124130

125-
async def _http_query_alias(self, request):
131+
async def _http_query_alias(self, request: web.Request) -> web.Response:
126132
if not self._check_token(request):
127133
return web.Response(status=401)
128134

@@ -138,7 +144,7 @@ async def _http_query_alias(self, request):
138144
return web.Response(status=404)
139145
return web.json_response(response)
140146

141-
async def _http_handle_transaction(self, request):
147+
async def _http_handle_transaction(self, request: web.Request) -> web.Response:
142148
if not self._check_token(request):
143149
return web.Response(status=401)
144150

@@ -160,24 +166,24 @@ async def _http_handle_transaction(self, request):
160166

161167
return web.json_response({})
162168

163-
async def update_state_store(self, event):
169+
async def update_state_store(self, event: dict):
164170
event_type = event["type"]
165171
if event_type == "m.room.power_levels":
166172
self.state_store.set_power_levels(event["room_id"], event["content"])
167173
elif event_type == "m.room.member":
168174
self.state_store.set_membership(event["room_id"], event["state_key"],
169175
event["content"]["membership"])
170176

171-
def handle_matrix_event(self, event):
172-
async def try_handle(handler):
177+
def handle_matrix_event(self, event: dict):
178+
async def try_handle(handler_func: HandlerFunc):
173179
try:
174-
await handler(event)
180+
await handler_func(event)
175181
except Exception:
176182
self.log.exception("Exception in Matrix event handler")
177183

178184
for handler in self.event_handlers:
179185
asyncio.ensure_future(try_handle(handler), loop=self.loop)
180186

181-
def matrix_event_handler(self, func):
187+
def matrix_event_handler(self, func: HandlerFunc) -> HandlerFunc:
182188
self.event_handlers.append(func)
183189
return func

mautrix_appservice/errors.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#
1515
# You should have received a copy of the GNU General Public License
1616
# along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
from typing import Optional
1718

1819

1920
class MatrixError(Exception):
@@ -22,15 +23,16 @@ class MatrixError(Exception):
2223

2324

2425
class IntentError(MatrixError):
25-
def __init__(self, message, source):
26+
def __init__(self, message: str, source: Exception):
2627
super().__init__(message)
2728
self.source = source
2829

2930

3031
class MatrixRequestError(MatrixError):
3132
""" The home server returned an error response. """
3233

33-
def __init__(self, code=0, text="", errcode=None, message=None):
34+
def __init__(self, code: int = 0, text: str = "", errcode: Optional[str] = None,
35+
message: Optional[str] = None):
3436
super().__init__(f"{code}: {text}")
3537
self.code = code
3638
self.text = text

0 commit comments

Comments
 (0)