Skip to content

Commit 6e5b67c

Browse files
Use lia instead of our own adapters (#3967)
* Use lia instead of our own adapters * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add release notes * Bump lia * Lint * Remove bad code --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 1bbe8db commit 6e5b67c

File tree

17 files changed

+111
-484
lines changed

17 files changed

+111
-484
lines changed

RELEASE.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Release type: patch
2+
3+
This release removes some internal code in favour of using an external dependency,
4+
this will help us with maintaining the codebase in the future 😊

poetry.lock

Lines changed: 31 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ dependencies = [
1919
"typing-extensions>=4.5.0",
2020
"python-dateutil~=2.7",
2121
"packaging>=23",
22+
"lia-web (>=0.2.1)",
2223
]
2324

2425
[project.urls]

strawberry/aiohttp/views.py

Lines changed: 2 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,27 @@
33
import asyncio
44
import warnings
55
from datetime import timedelta
6-
from io import BytesIO
76
from json.decoder import JSONDecodeError
87
from typing import (
98
TYPE_CHECKING,
10-
Any,
119
Callable,
1210
Optional,
1311
Union,
14-
cast,
1512
)
1613
from typing_extensions import TypeGuard
1714

15+
from lia import AiohttpHTTPRequestAdapter, HTTPException
16+
1817
from aiohttp import ClientConnectionResetError, http, web
19-
from aiohttp.multipart import BodyPartReader
2018
from strawberry.http.async_base_view import (
2119
AsyncBaseHTTPView,
22-
AsyncHTTPRequestAdapter,
2320
AsyncWebSocketAdapter,
2421
)
2522
from strawberry.http.exceptions import (
26-
HTTPException,
2723
NonJsonMessageReceived,
2824
NonTextMessageReceived,
2925
WebSocketDisconnected,
3026
)
31-
from strawberry.http.types import FormData, HTTPMethod, QueryParams
3227
from strawberry.http.typevars import (
3328
Context,
3429
RootValue,
@@ -43,47 +38,6 @@
4338
from strawberry.schema import BaseSchema
4439

4540

46-
class AiohttpHTTPRequestAdapter(AsyncHTTPRequestAdapter):
47-
def __init__(self, request: web.Request) -> None:
48-
self.request = request
49-
50-
@property
51-
def query_params(self) -> QueryParams:
52-
return self.request.query.copy() # type: ignore[attr-defined]
53-
54-
async def get_body(self) -> str:
55-
return (await self.request.content.read()).decode()
56-
57-
@property
58-
def method(self) -> HTTPMethod:
59-
return cast("HTTPMethod", self.request.method.upper())
60-
61-
@property
62-
def headers(self) -> Mapping[str, str]:
63-
return self.request.headers
64-
65-
async def get_form_data(self) -> FormData:
66-
reader = await self.request.multipart()
67-
68-
data: dict[str, Any] = {}
69-
files: dict[str, Any] = {}
70-
71-
while field := await reader.next():
72-
assert isinstance(field, BodyPartReader)
73-
assert field.name
74-
75-
if field.filename:
76-
files[field.name] = BytesIO(await field.read(decode=False))
77-
else:
78-
data[field.name] = await field.text()
79-
80-
return FormData(files=files, form=data)
81-
82-
@property
83-
def content_type(self) -> Optional[str]:
84-
return self.headers.get("content-type")
85-
86-
8741
class AiohttpWebSocketAdapter(AsyncWebSocketAdapter):
8842
def __init__(
8943
self, view: AsyncBaseHTTPView, request: web.Request, ws: web.WebSocketResponse

strawberry/asgi/__init__.py

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
Callable,
99
Optional,
1010
Union,
11-
cast,
1211
)
1312
from typing_extensions import TypeGuard
1413

14+
from lia import HTTPException, StarletteRequestAdapter
1515
from starlette import status
1616
from starlette.requests import Request
1717
from starlette.responses import (
@@ -24,16 +24,13 @@
2424

2525
from strawberry.http.async_base_view import (
2626
AsyncBaseHTTPView,
27-
AsyncHTTPRequestAdapter,
2827
AsyncWebSocketAdapter,
2928
)
3029
from strawberry.http.exceptions import (
31-
HTTPException,
3230
NonJsonMessageReceived,
3331
NonTextMessageReceived,
3432
WebSocketDisconnected,
3533
)
36-
from strawberry.http.types import FormData, HTTPMethod, QueryParams
3734
from strawberry.http.typevars import (
3835
Context,
3936
RootValue,
@@ -50,38 +47,6 @@
5047
from strawberry.schema import BaseSchema
5148

5249

53-
class ASGIRequestAdapter(AsyncHTTPRequestAdapter):
54-
def __init__(self, request: Request) -> None:
55-
self.request = request
56-
57-
@property
58-
def query_params(self) -> QueryParams:
59-
return self.request.query_params
60-
61-
@property
62-
def method(self) -> HTTPMethod:
63-
return cast("HTTPMethod", self.request.method.upper())
64-
65-
@property
66-
def headers(self) -> Mapping[str, str]:
67-
return self.request.headers
68-
69-
@property
70-
def content_type(self) -> Optional[str]:
71-
return self.request.headers.get("content-type")
72-
73-
async def get_body(self) -> bytes:
74-
return await self.request.body()
75-
76-
async def get_form_data(self) -> FormData:
77-
multipart_data = await self.request.form()
78-
79-
return FormData(
80-
files=multipart_data,
81-
form=multipart_data,
82-
)
83-
84-
8550
class ASGIWebSocketAdapter(AsyncWebSocketAdapter):
8651
def __init__(
8752
self, view: AsyncBaseHTTPView, request: WebSocket, response: WebSocket
@@ -127,7 +92,7 @@ class GraphQL(
12792
]
12893
):
12994
allow_queries_via_get = True
130-
request_adapter_class = ASGIRequestAdapter
95+
request_adapter_class = StarletteRequestAdapter
13196
websocket_adapter_class = ASGIWebSocketAdapter
13297

13398
def __init__(

strawberry/chalice/views.py

Lines changed: 4 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,21 @@
11
from __future__ import annotations
22

33
import warnings
4-
from typing import TYPE_CHECKING, Any, Optional, Union, cast
4+
from typing import TYPE_CHECKING, Optional, Union
5+
6+
from lia import ChaliceHTTPRequestAdapter, HTTPException
57

68
from chalice.app import Request, Response
7-
from strawberry.http.exceptions import HTTPException
8-
from strawberry.http.sync_base_view import SyncBaseHTTPView, SyncHTTPRequestAdapter
9+
from strawberry.http.sync_base_view import SyncBaseHTTPView
910
from strawberry.http.temporal_response import TemporalResponse
1011
from strawberry.http.typevars import Context, RootValue
1112

1213
if TYPE_CHECKING:
13-
from collections.abc import Mapping
14-
1514
from strawberry.http import GraphQLHTTPResponse
1615
from strawberry.http.ides import GraphQL_IDE
17-
from strawberry.http.types import HTTPMethod, QueryParams
1816
from strawberry.schema import BaseSchema
1917

2018

21-
class ChaliceHTTPRequestAdapter(SyncHTTPRequestAdapter):
22-
def __init__(self, request: Request) -> None:
23-
self.request = request
24-
25-
@property
26-
def query_params(self) -> QueryParams:
27-
return self.request.query_params or {}
28-
29-
@property
30-
def body(self) -> Union[str, bytes]:
31-
return self.request.raw_body
32-
33-
@property
34-
def method(self) -> HTTPMethod:
35-
return cast("HTTPMethod", self.request.method.upper())
36-
37-
@property
38-
def headers(self) -> Mapping[str, str]:
39-
return self.request.headers
40-
41-
@property
42-
def post_data(self) -> Mapping[str, Union[str, bytes]]:
43-
raise NotImplementedError
44-
45-
@property
46-
def files(self) -> Mapping[str, Any]:
47-
raise NotImplementedError
48-
49-
@property
50-
def content_type(self) -> Optional[str]:
51-
return self.request.headers.get("Content-Type", None)
52-
53-
5419
class GraphQLView(
5520
SyncBaseHTTPView[Request, Response, TemporalResponse, Context, RootValue]
5621
):

0 commit comments

Comments
 (0)