Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use validate_python when a TypeAdapter is given #41

Merged
merged 4 commits into from
Jan 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions noxfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ def typeguard(session: Session) -> None:
"python-multipart",
"flask-wtf",
"a2wsgi",
"requests",
"typeguard",
"pygments",
)
Expand Down
2 changes: 1 addition & 1 deletion src/requestmodel/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from .model import RequestModel
from .model import IteratorRequestModel
from .model import RequestModel


__all__ = ["RequestModel", "IteratorRequestModel"]
4 changes: 3 additions & 1 deletion src/requestmodel/adapters/base.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from typing import Type, Dict, Any
from typing import Any
from typing import Dict
from typing import Type


class BaseAdapter:
Expand Down
3 changes: 2 additions & 1 deletion src/requestmodel/adapters/httpx.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
5 changes: 3 additions & 2 deletions src/requestmodel/adapters/requests.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down
19 changes: 15 additions & 4 deletions src/requestmodel/model.py
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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]):
Expand Down Expand Up @@ -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:
Expand All @@ -109,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

Expand Down
6 changes: 5 additions & 1 deletion src/requestmodel/typing.py
Original file line number Diff line number Diff line change
@@ -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]]
16 changes: 12 additions & 4 deletions src/requestmodel/utils.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down
3 changes: 2 additions & 1 deletion tests/test_locatieserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
Loading