From: OzGav Date: Mon, 29 Sep 2025 19:38:11 +0000 (+1000) Subject: mypy fixes for webserver helper (#2439) X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=f805882d7a750b1c8476a774d289d0df1861f2ca;p=music-assistant-server.git mypy fixes for webserver helper (#2439) --- diff --git a/music_assistant/helpers/webserver.py b/music_assistant/helpers/webserver.py index 054d2ce7..6be381f8 100644 --- a/music_assistant/helpers/webserver.py +++ b/music_assistant/helpers/webserver.py @@ -2,14 +2,13 @@ from __future__ import annotations -from collections.abc import Coroutine +from collections.abc import Callable, Coroutine from typing import TYPE_CHECKING, Any, Final from aiohttp import web if TYPE_CHECKING: import logging - from collections.abc import Callable from aiohttp.typedefs import Handler @@ -17,6 +16,11 @@ if TYPE_CHECKING: MAX_CLIENT_SIZE: Final = 1024**2 * 16 MAX_LINE_SIZE: Final = 24570 +# Type alias for dynamic route handlers +DynamicRouteHandler = Callable[ + [web.Request], Coroutine[Any, Any, web.Response | web.StreamResponse] +] + class Webserver: """Base Webserver logic for an HTTPServer that can handle dynamic routes.""" @@ -33,7 +37,9 @@ class Webserver: self._webapp: web.Application | None = None self._tcp_site: web.TCPSite | None = None self._static_routes: list[tuple[str, str, Handler]] | None = None - self._dynamic_routes: dict[str, Callable] | None = {} if enable_dynamic_routes else None + self._dynamic_routes: dict[str, DynamicRouteHandler] | None = ( + {} if enable_dynamic_routes else None + ) self._bind_port: int | None = None self._ingress_tcp_site: web.TCPSite | None = None @@ -124,7 +130,7 @@ class Webserver: path: str, handler: Callable[[web.Request], Coroutine[Any, Any, web.Response | web.StreamResponse]], method: str = "*", - ) -> Callable: + ) -> Callable[[], None]: """Register a dynamic route on the webserver, returns handler to unregister.""" if self._dynamic_routes is None: msg = "Dynamic routes are not enabled" @@ -135,9 +141,9 @@ class Webserver: raise RuntimeError(msg) self._dynamic_routes[key] = handler - def _remove(): + def _remove() -> None: assert self._dynamic_routes is not None # for type checking - return self._dynamic_routes.pop(key) + self._dynamic_routes.pop(key, None) return _remove @@ -154,7 +160,7 @@ class Webserver: headers = {"Cache-Control": "no-cache"} return web.FileResponse(file_path, headers=headers) - async def _handle_catch_all(self, request: web.Request) -> web.Response: + async def _handle_catch_all(self, request: web.Request) -> web.Response | web.StreamResponse: """Redirect request to correct destination.""" # find handler for the request # Try exact match first diff --git a/pyproject.toml b/pyproject.toml index a1eff48c..5f5d716a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -132,7 +132,6 @@ enable_error_code = [ exclude = [ '^music_assistant/controllers/.*$', '^music_assistant/helpers/app_vars.py', - '^music_assistant/helpers/webserver.py', '^music_assistant/models/player_provider.py', '^music_assistant/providers/apple_music/.*$', '^music_assistant/providers/bluesound/.*$',