Skip to content
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
4 changes: 4 additions & 0 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Release type: patch

This release removes some internal code in favour of using an external dependency,
this will help us with maintaining the codebase in the future 😊
46 changes: 31 additions & 15 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ dependencies = [
"typing-extensions>=4.5.0",
"python-dateutil~=2.7",
"packaging>=23",
"lia-web (>=0.2.1)",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: The dependency syntax uses parentheses instead of standard quotes. While this works, the standard format would be 'lia-web>=0.2.1' for consistency with other dependencies.

]

[project.urls]
Expand Down
50 changes: 2 additions & 48 deletions strawberry/aiohttp/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,27 @@
import asyncio
import warnings
from datetime import timedelta
from io import BytesIO
from json.decoder import JSONDecodeError
from typing import (
TYPE_CHECKING,
Any,
Callable,
Optional,
Union,
cast,
)
from typing_extensions import TypeGuard

from lia import AiohttpHTTPRequestAdapter, HTTPException

from aiohttp import ClientConnectionResetError, http, web
from aiohttp.multipart import BodyPartReader
from strawberry.http.async_base_view import (
AsyncBaseHTTPView,
AsyncHTTPRequestAdapter,
AsyncWebSocketAdapter,
)
from strawberry.http.exceptions import (
HTTPException,
NonJsonMessageReceived,
NonTextMessageReceived,
WebSocketDisconnected,
)
from strawberry.http.types import FormData, HTTPMethod, QueryParams
from strawberry.http.typevars import (
Context,
RootValue,
Expand All @@ -43,47 +38,6 @@
from strawberry.schema import BaseSchema


class AiohttpHTTPRequestAdapter(AsyncHTTPRequestAdapter):
def __init__(self, request: web.Request) -> None:
self.request = request

@property
def query_params(self) -> QueryParams:
return self.request.query.copy() # type: ignore[attr-defined]

async def get_body(self) -> str:
return (await self.request.content.read()).decode()

@property
def method(self) -> HTTPMethod:
return cast("HTTPMethod", self.request.method.upper())

@property
def headers(self) -> Mapping[str, str]:
return self.request.headers

async def get_form_data(self) -> FormData:
reader = await self.request.multipart()

data: dict[str, Any] = {}
files: dict[str, Any] = {}

while field := await reader.next():
assert isinstance(field, BodyPartReader)
assert field.name

if field.filename:
files[field.name] = BytesIO(await field.read(decode=False))
else:
data[field.name] = await field.text()

return FormData(files=files, form=data)

@property
def content_type(self) -> Optional[str]:
return self.headers.get("content-type")


class AiohttpWebSocketAdapter(AsyncWebSocketAdapter):
def __init__(
self, view: AsyncBaseHTTPView, request: web.Request, ws: web.WebSocketResponse
Expand Down
39 changes: 2 additions & 37 deletions strawberry/asgi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
Callable,
Optional,
Union,
cast,
)
from typing_extensions import TypeGuard

from lia import HTTPException, StarletteRequestAdapter
from starlette import status
from starlette.requests import Request
from starlette.responses import (
Expand All @@ -24,16 +24,13 @@

from strawberry.http.async_base_view import (
AsyncBaseHTTPView,
AsyncHTTPRequestAdapter,
AsyncWebSocketAdapter,
)
from strawberry.http.exceptions import (
HTTPException,
NonJsonMessageReceived,
NonTextMessageReceived,
WebSocketDisconnected,
)
from strawberry.http.types import FormData, HTTPMethod, QueryParams
from strawberry.http.typevars import (
Context,
RootValue,
Expand All @@ -50,38 +47,6 @@
from strawberry.schema import BaseSchema


class ASGIRequestAdapter(AsyncHTTPRequestAdapter):
def __init__(self, request: Request) -> None:
self.request = request

@property
def query_params(self) -> QueryParams:
return self.request.query_params

@property
def method(self) -> HTTPMethod:
return cast("HTTPMethod", self.request.method.upper())

@property
def headers(self) -> Mapping[str, str]:
return self.request.headers

@property
def content_type(self) -> Optional[str]:
return self.request.headers.get("content-type")

async def get_body(self) -> bytes:
return await self.request.body()

async def get_form_data(self) -> FormData:
multipart_data = await self.request.form()

return FormData(
files=multipart_data,
form=multipart_data,
)


class ASGIWebSocketAdapter(AsyncWebSocketAdapter):
def __init__(
self, view: AsyncBaseHTTPView, request: WebSocket, response: WebSocket
Expand Down Expand Up @@ -127,7 +92,7 @@ class GraphQL(
]
):
allow_queries_via_get = True
request_adapter_class = ASGIRequestAdapter
request_adapter_class = StarletteRequestAdapter
websocket_adapter_class = ASGIWebSocketAdapter

def __init__(
Expand Down
43 changes: 4 additions & 39 deletions strawberry/chalice/views.py
Original file line number Diff line number Diff line change
@@ -1,56 +1,21 @@
from __future__ import annotations

import warnings
from typing import TYPE_CHECKING, Any, Optional, Union, cast
from typing import TYPE_CHECKING, Optional, Union

from lia import ChaliceHTTPRequestAdapter, HTTPException

from chalice.app import Request, Response
from strawberry.http.exceptions import HTTPException
from strawberry.http.sync_base_view import SyncBaseHTTPView, SyncHTTPRequestAdapter
from strawberry.http.sync_base_view import SyncBaseHTTPView
from strawberry.http.temporal_response import TemporalResponse
from strawberry.http.typevars import Context, RootValue

if TYPE_CHECKING:
from collections.abc import Mapping

from strawberry.http import GraphQLHTTPResponse
from strawberry.http.ides import GraphQL_IDE
from strawberry.http.types import HTTPMethod, QueryParams
from strawberry.schema import BaseSchema


class ChaliceHTTPRequestAdapter(SyncHTTPRequestAdapter):
def __init__(self, request: Request) -> None:
self.request = request

@property
def query_params(self) -> QueryParams:
return self.request.query_params or {}

@property
def body(self) -> Union[str, bytes]:
return self.request.raw_body

@property
def method(self) -> HTTPMethod:
return cast("HTTPMethod", self.request.method.upper())

@property
def headers(self) -> Mapping[str, str]:
return self.request.headers

@property
def post_data(self) -> Mapping[str, Union[str, bytes]]:
raise NotImplementedError

@property
def files(self) -> Mapping[str, Any]:
raise NotImplementedError

@property
def content_type(self) -> Optional[str]:
return self.request.headers.get("Content-Type", None)


class GraphQLView(
SyncBaseHTTPView[Request, Response, TemporalResponse, Context, RootValue]
):
Expand Down
Loading
Loading