From 5353a849697d4d310abe0aff6333ccf7e75a5eca Mon Sep 17 00:00:00 2001 From: Jelmer Draaijer Date: Thu, 25 Jan 2024 08:22:25 +0100 Subject: [PATCH 1/4] Use validate_python when a TypeAdapter is given --- src/requestmodel/model.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/requestmodel/model.py b/src/requestmodel/model.py index 9876157..68bcec3 100644 --- a/src/requestmodel/model.py +++ b/src/requestmodel/model.py @@ -1,6 +1,7 @@ -from typing import ClassVar, Optional +from typing import ClassVar from typing import Generic from typing import Iterator +from typing import Optional from typing import Set from typing import Type @@ -11,13 +12,19 @@ from httpx._client import BaseClient from pydantic import BaseModel from pydantic import ConfigDict +from pydantic import TypeAdapter from typing_extensions import get_type_hints from typing_extensions import override -from requestmodel import params, utils +from requestmodel import params +from requestmodel import utils + from .encoders import jsonable_encoder -from .typing import ResponseType, RequestArgs -from .utils import get_annotated_type, flatten_body, unify_body +from .typing import RequestArgs +from .typing import ResponseType +from .utils import flatten_body +from .utils import get_annotated_type +from .utils import unify_body class BaseRequestModel(BaseModel, Generic[ResponseType]): @@ -90,6 +97,8 @@ def send(self, client: Client) -> ResponseType: r = self.as_request(client) self.response = client.send(r) self.handle_error(self.response) + if isinstance(self.response_model, TypeAdapter): + return self.response_model.validate_python(self.response.json()) return self.response_model.model_validate(self.response.json()) async def asend(self, client: AsyncClient) -> ResponseType: From e1c73caa08135d220695754b7c42e8296883c660 Mon Sep 17 00:00:00 2001 From: Jelmer Draaijer Date: Thu, 25 Jan 2024 08:29:51 +0100 Subject: [PATCH 2/4] Fix mypy error --- src/requestmodel/model.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/requestmodel/model.py b/src/requestmodel/model.py index 68bcec3..531b534 100644 --- a/src/requestmodel/model.py +++ b/src/requestmodel/model.py @@ -118,6 +118,8 @@ def as_request(self, client: BaseClient) -> Request: class IteratorRequestModel(RequestModel[ResponseType]): + response: Optional[Response] = None + def next(self, response: ResponseType) -> bool: # pragma: no cover raise NotImplementedError From 1d4d31ad3195992bf6c67bcef973e239f852f755 Mon Sep 17 00:00:00 2001 From: Jelmer Draaijer Date: Thu, 25 Jan 2024 08:33:54 +0100 Subject: [PATCH 3/4] Fix pre-commit --- src/requestmodel/__init__.py | 2 +- src/requestmodel/adapters/base.py | 4 +++- src/requestmodel/adapters/httpx.py | 3 ++- src/requestmodel/adapters/requests.py | 5 +++-- src/requestmodel/typing.py | 6 +++++- src/requestmodel/utils.py | 16 ++++++++++++---- tests/test_locatieserver.py | 3 ++- 7 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/requestmodel/__init__.py b/src/requestmodel/__init__.py index 638fada..7252b8c 100644 --- a/src/requestmodel/__init__.py +++ b/src/requestmodel/__init__.py @@ -1,5 +1,5 @@ -from .model import RequestModel from .model import IteratorRequestModel +from .model import RequestModel __all__ = ["RequestModel", "IteratorRequestModel"] diff --git a/src/requestmodel/adapters/base.py b/src/requestmodel/adapters/base.py index f66b271..603a664 100644 --- a/src/requestmodel/adapters/base.py +++ b/src/requestmodel/adapters/base.py @@ -1,4 +1,6 @@ -from typing import Type, Dict, Any +from typing import Any +from typing import Dict +from typing import Type class BaseAdapter: diff --git a/src/requestmodel/adapters/httpx.py b/src/requestmodel/adapters/httpx.py index 12163e8..7471238 100644 --- a/src/requestmodel/adapters/httpx.py +++ b/src/requestmodel/adapters/httpx.py @@ -3,8 +3,9 @@ from httpx import Request from httpx._client import BaseClient -from requestmodel.model import RequestModel from requestmodel.adapters.base import BaseAdapter +from requestmodel.model import RequestModel + from .. import params diff --git a/src/requestmodel/adapters/requests.py b/src/requestmodel/adapters/requests.py index 0df878b..6c0e427 100644 --- a/src/requestmodel/adapters/requests.py +++ b/src/requestmodel/adapters/requests.py @@ -1,7 +1,8 @@ from typing import Optional -from pydantic import Field -from requests import Request, Response, Session +from requests import Request +from requests import Response +from requests import Session from requests.adapters import BaseAdapter from requestmodel import params diff --git a/src/requestmodel/typing.py b/src/requestmodel/typing.py index 2333d02..561526b 100644 --- a/src/requestmodel/typing.py +++ b/src/requestmodel/typing.py @@ -1,7 +1,11 @@ -from typing import TypeVar, Dict, Type, Any +from typing import Any +from typing import Dict +from typing import Type +from typing import TypeVar from pydantic import BaseModel from pydantic.fields import FieldInfo + ResponseType = TypeVar("ResponseType", bound=BaseModel) RequestArgs = Dict[Type[FieldInfo], Dict[str, Any]] diff --git a/src/requestmodel/utils.py b/src/requestmodel/utils.py index 43c2053..04d71ee 100644 --- a/src/requestmodel/utils.py +++ b/src/requestmodel/utils.py @@ -1,8 +1,16 @@ -from typing import Union, Type, Any, Set, Optional, Dict -from typing_extensions import get_origin, Annotated, get_args - -from fastapi import _compat, utils +from typing import Any +from typing import Dict +from typing import Optional +from typing import Set +from typing import Type +from typing import Union + +from fastapi import _compat +from fastapi import utils from pydantic.fields import FieldInfo +from typing_extensions import Annotated +from typing_extensions import get_args +from typing_extensions import get_origin from requestmodel import params from requestmodel.typing import RequestArgs diff --git a/tests/test_locatieserver.py b/tests/test_locatieserver.py index 6b297ab..e55f0df 100644 --- a/tests/test_locatieserver.py +++ b/tests/test_locatieserver.py @@ -5,7 +5,8 @@ from requests import Session from tests.locatieserver.models import LookupResponse -from tests.locatieserver.requests import LookupRequest, LookupRequests +from tests.locatieserver.requests import LookupRequest +from tests.locatieserver.requests import LookupRequests def test_lookup_request_sync() -> None: From 9c56cf4eae81c35ff4f2ab91fc85c9c5e7da2bfc Mon Sep 17 00:00:00 2001 From: Jelmer Draaijer Date: Thu, 25 Jan 2024 08:36:32 +0100 Subject: [PATCH 4/4] Add requests dependency for typeguard --- noxfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/noxfile.py b/noxfile.py index 378b718..0947da7 100644 --- a/noxfile.py +++ b/noxfile.py @@ -208,6 +208,7 @@ def typeguard(session: Session) -> None: "python-multipart", "flask-wtf", "a2wsgi", + "requests", "typeguard", "pygments", )