From 7cdca4d95d106caf9555857f8a87fc41b0f7fa02 Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Thu, 4 Dec 2025 13:52:29 +0000 Subject: [PATCH 1/2] Get the code ready for ty --- .../mock_web_query_api.py | 22 +++++++++++++++--- .../mock_web_services_api.py | 23 +++++++++++++++---- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/mock_vws/_requests_mock_server/mock_web_query_api.py b/src/mock_vws/_requests_mock_server/mock_web_query_api.py index f22cd9c69..d9fbe9b8c 100644 --- a/src/mock_vws/_requests_mock_server/mock_web_query_api.py +++ b/src/mock_vws/_requests_mock_server/mock_web_query_api.py @@ -7,6 +7,7 @@ import email.utils from collections.abc import Callable, Iterable, Mapping from http import HTTPMethod, HTTPStatus +from typing import ParamSpec, Protocol from beartype import beartype from requests.models import PreparedRequest @@ -25,13 +26,28 @@ _ROUTES: set[Route] = set() _ResponseType = tuple[int, Mapping[str, str], str] +_P = ParamSpec("_P") + + +class _RouteMethod(Protocol[_P]): + """ + Callable used for routing which also exposes ``__name__``. + """ + + __name__: str + + def __call__(self, *args: _P.args, **kwargs: _P.kwargs) -> _ResponseType: + """ + Return a mock response. + """ + ... # pylint: disable=unnecessary-ellipsis @beartype def route( path_pattern: str, http_methods: Iterable[str], -) -> Callable[[Callable[..., _ResponseType]], Callable[..., _ResponseType]]: +) -> Callable[[_RouteMethod[_P]], _RouteMethod[_P]]: """Register a decorated method so that it can be recognized as a route. Args: @@ -44,8 +60,8 @@ def route( """ def decorator( - method: Callable[..., _ResponseType], - ) -> Callable[..., _ResponseType]: + method: _RouteMethod[_P], + ) -> _RouteMethod[_P]: """Register a decorated method so that it can be recognized as a route. Returns: diff --git a/src/mock_vws/_requests_mock_server/mock_web_services_api.py b/src/mock_vws/_requests_mock_server/mock_web_services_api.py index 9a6b30a8d..d5cfdfc1b 100644 --- a/src/mock_vws/_requests_mock_server/mock_web_services_api.py +++ b/src/mock_vws/_requests_mock_server/mock_web_services_api.py @@ -12,7 +12,7 @@ import uuid from collections.abc import Callable, Iterable, Mapping from http import HTTPMethod, HTTPStatus -from typing import Any +from typing import Any, ParamSpec, Protocol from zoneinfo import ZoneInfo from beartype import BeartypeConf, beartype @@ -39,13 +39,28 @@ _ROUTES: set[Route] = set() _ResponseType = tuple[int, Mapping[str, str], str] +_P = ParamSpec("_P") + + +class _RouteMethod(Protocol[_P]): + """ + Callable used for routing which also exposes ``__name__``. + """ + + __name__: str + + def __call__(self, *args: _P.args, **kwargs: _P.kwargs) -> _ResponseType: + """ + Return a mock response. + """ + ... # pylint: disable=unnecessary-ellipsis @beartype def route( path_pattern: str, http_methods: Iterable[HTTPMethod], -) -> Callable[[Callable[..., _ResponseType]], Callable[..., _ResponseType]]: +) -> Callable[[_RouteMethod[_P]], _RouteMethod[_P]]: """Register a decorated method so that it can be recognized as a route. Args: @@ -59,8 +74,8 @@ def route( @beartype def decorator( - method: Callable[..., _ResponseType], - ) -> Callable[..., _ResponseType]: + method: _RouteMethod[_P], + ) -> _RouteMethod[_P]: """Register a decorated method so that it can be recognized as a route. Returns: From a9da08cd21e2ed97ab67357480658eb5dd46c69e Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Thu, 4 Dec 2025 14:43:12 +0000 Subject: [PATCH 2/2] Make new protocols runtime_checkable --- src/mock_vws/_requests_mock_server/mock_web_query_api.py | 3 ++- src/mock_vws/_requests_mock_server/mock_web_services_api.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mock_vws/_requests_mock_server/mock_web_query_api.py b/src/mock_vws/_requests_mock_server/mock_web_query_api.py index d9fbe9b8c..545ecfe03 100644 --- a/src/mock_vws/_requests_mock_server/mock_web_query_api.py +++ b/src/mock_vws/_requests_mock_server/mock_web_query_api.py @@ -7,7 +7,7 @@ import email.utils from collections.abc import Callable, Iterable, Mapping from http import HTTPMethod, HTTPStatus -from typing import ParamSpec, Protocol +from typing import ParamSpec, Protocol, runtime_checkable from beartype import beartype from requests.models import PreparedRequest @@ -29,6 +29,7 @@ _P = ParamSpec("_P") +@runtime_checkable class _RouteMethod(Protocol[_P]): """ Callable used for routing which also exposes ``__name__``. diff --git a/src/mock_vws/_requests_mock_server/mock_web_services_api.py b/src/mock_vws/_requests_mock_server/mock_web_services_api.py index d5cfdfc1b..13570ed9b 100644 --- a/src/mock_vws/_requests_mock_server/mock_web_services_api.py +++ b/src/mock_vws/_requests_mock_server/mock_web_services_api.py @@ -12,7 +12,7 @@ import uuid from collections.abc import Callable, Iterable, Mapping from http import HTTPMethod, HTTPStatus -from typing import Any, ParamSpec, Protocol +from typing import Any, ParamSpec, Protocol, runtime_checkable from zoneinfo import ZoneInfo from beartype import BeartypeConf, beartype @@ -42,6 +42,7 @@ _P = ParamSpec("_P") +@runtime_checkable class _RouteMethod(Protocol[_P]): """ Callable used for routing which also exposes ``__name__``.