Skip to content

Commit

Permalink
Merge pull request #41 from foarsitter/typeadapter
Browse files Browse the repository at this point in the history
Use validate_python when a TypeAdapter is given
  • Loading branch information
foarsitter authored Jan 25, 2024
2 parents f49ab18 + 9c56cf4 commit 426c831
Show file tree
Hide file tree
Showing 9 changed files with 44 additions and 15 deletions.
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

0 comments on commit 426c831

Please sign in to comment.