strawberry-graphql 0.214.0.dev1699441271__py3-none-any.whl → 0.214.0.dev1701082152__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,13 +7,10 @@ from io import BytesIO
7
7
  from typing import (
8
8
  TYPE_CHECKING,
9
9
  Any,
10
- AsyncGenerator,
11
- Callable,
12
10
  Dict,
13
11
  Iterable,
14
12
  Mapping,
15
13
  Optional,
16
- Union,
17
14
  cast,
18
15
  )
19
16
 
@@ -78,13 +75,7 @@ class AioHTTPRequestAdapter(AsyncHTTPRequestAdapter):
78
75
 
79
76
 
80
77
  class GraphQLView(
81
- AsyncBaseHTTPView[
82
- web.Request,
83
- Union[web.Response, web.StreamResponse],
84
- web.Response,
85
- Context,
86
- RootValue,
87
- ]
78
+ AsyncBaseHTTPView[web.Request, web.Response, web.Response, Context, RootValue]
88
79
  ):
89
80
  # Mark the view as coroutine so that AIOHTTP does not confuse it with a deprecated
90
81
  # bare handler function.
@@ -140,8 +131,6 @@ class GraphQLView(
140
131
 
141
132
  if not ws_test.ok:
142
133
  try:
143
- # TODO: pass this down from run to multipart thingy
144
- self.request = request
145
134
  return await self.run(request=request)
146
135
  except HTTPException as e:
147
136
  return web.Response(
@@ -188,26 +177,3 @@ class GraphQLView(
188
177
  sub_response.content_type = "application/json"
189
178
 
190
179
  return sub_response
191
-
192
- async def create_multipart_response(
193
- self,
194
- stream: Callable[[], AsyncGenerator[str, None]],
195
- sub_response: web.Response,
196
- ) -> web.StreamResponse:
197
- # TODO: use sub response
198
- response = web.StreamResponse(
199
- status=200,
200
- headers={
201
- "Transfer-Encoding": "chunked",
202
- "Content-type": "multipart/mixed;boundary=graphql;subscriptionSpec=1.0,application/json",
203
- },
204
- reason="OK",
205
- )
206
-
207
- await response.prepare(self.request)
208
-
209
- async for data in stream():
210
- await response.write(data.encode())
211
-
212
- await response.write_eof()
213
- return response
@@ -5,8 +5,6 @@ from datetime import timedelta
5
5
  from typing import (
6
6
  TYPE_CHECKING,
7
7
  Any,
8
- AsyncIterator,
9
- Callable,
10
8
  Mapping,
11
9
  Optional,
12
10
  Sequence,
@@ -16,12 +14,7 @@ from typing import (
16
14
 
17
15
  from starlette import status
18
16
  from starlette.requests import Request
19
- from starlette.responses import (
20
- HTMLResponse,
21
- PlainTextResponse,
22
- Response,
23
- StreamingResponse,
24
- )
17
+ from starlette.responses import HTMLResponse, PlainTextResponse, Response
25
18
  from starlette.websockets import WebSocket
26
19
 
27
20
  from strawberry.asgi.handlers import (
@@ -220,14 +213,3 @@ class GraphQL(
220
213
  response.status_code = sub_response.status_code
221
214
 
222
215
  return response
223
-
224
- async def create_multipart_response(
225
- self, stream: Callable[[], AsyncIterator[str]], sub_response: Response
226
- ) -> Response:
227
- return StreamingResponse(
228
- stream(),
229
- headers={
230
- "Transfer-Encoding": "chunked",
231
- "Content-type": "multipart/mixed;boundary=graphql;subscriptionSpec=1.0,application/json",
232
- },
233
- )
@@ -9,16 +9,7 @@ import json
9
9
  import warnings
10
10
  from functools import cached_property
11
11
  from io import BytesIO
12
- from typing import (
13
- TYPE_CHECKING,
14
- Any,
15
- AsyncGenerator,
16
- Callable,
17
- Dict,
18
- Mapping,
19
- Optional,
20
- Union,
21
- )
12
+ from typing import TYPE_CHECKING, Any, Dict, Mapping, Optional, Union
22
13
  from urllib.parse import parse_qs
23
14
 
24
15
  from django.conf import settings
@@ -52,14 +43,6 @@ class ChannelsResponse:
52
43
  headers: Dict[bytes, bytes] = dataclasses.field(default_factory=dict)
53
44
 
54
45
 
55
- @dataclasses.dataclass
56
- class MultipartChannelsResponse:
57
- stream: Callable[[], AsyncGenerator[str, None]]
58
- status: int = 200
59
- content_type: str = "multipart/mixed;boundary=graphql;subscriptionSpec=1.0"
60
- headers: Dict[bytes, bytes] = dataclasses.field(default_factory=dict)
61
-
62
-
63
46
  @dataclasses.dataclass
64
47
  class ChannelsRequest:
65
48
  consumer: ChannelsConsumer
@@ -202,25 +185,16 @@ class BaseGraphQLHTTPConsumer(ChannelsConsumer, AsyncHttpConsumer):
202
185
  async def handle(self, body: bytes) -> None:
203
186
  request = ChannelsRequest(consumer=self, body=body)
204
187
  try:
205
- response = await self.run(request)
188
+ response: ChannelsResponse = await self.run(request)
206
189
 
207
190
  if b"Content-Type" not in response.headers:
208
191
  response.headers[b"Content-Type"] = response.content_type.encode()
209
192
 
210
- if isinstance(response, MultipartChannelsResponse):
211
- response.headers[b"Transfer-Encoding"] = b"chunked"
212
- await self.send_headers(headers=response.headers)
213
-
214
- async for chunk in response.stream():
215
- # TODO: we should change more body
216
- await self.send_body(chunk.encode("utf-8"), more_body=True)
217
-
218
- else:
219
- await self.send_response(
220
- response.status,
221
- response.content,
222
- headers=response.headers,
223
- )
193
+ await self.send_response(
194
+ response.status,
195
+ response.content,
196
+ headers=response.headers,
197
+ )
224
198
  except HTTPException as e:
225
199
  await self.send_response(e.status_code, e.reason.encode())
226
200
 
@@ -229,7 +203,7 @@ class GraphQLHTTPConsumer(
229
203
  BaseGraphQLHTTPConsumer,
230
204
  AsyncBaseHTTPView[
231
205
  ChannelsRequest,
232
- Union[ChannelsResponse, MultipartChannelsResponse],
206
+ ChannelsResponse,
233
207
  TemporalResponse,
234
208
  Context,
235
209
  RootValue,
@@ -273,14 +247,6 @@ class GraphQLHTTPConsumer(
273
247
  async def get_sub_response(self, request: ChannelsRequest) -> TemporalResponse:
274
248
  return TemporalResponse()
275
249
 
276
- async def create_multipart_response(
277
- self,
278
- stream: Callable[[], AsyncGenerator[str, None]],
279
- sub_response: TemporalResponse,
280
- ) -> MultipartChannelsResponse:
281
- # TODO: sub response
282
- return MultipartChannelsResponse(stream=stream)
283
-
284
250
  async def render_graphql_ide(self, request: ChannelsRequest) -> ChannelsResponse:
285
251
  return ChannelsResponse(
286
252
  content=self.graphql_ide_html.encode(), content_type="text/html"
@@ -335,5 +301,5 @@ class SyncGraphQLHTTPConsumer(
335
301
  request: ChannelsRequest,
336
302
  context: Optional[Context] = UNSET,
337
303
  root_value: Optional[RootValue] = UNSET,
338
- ) -> ChannelsResponse: # pyright: ignore
304
+ ) -> ChannelsResponse:
339
305
  return super().run(request, context, root_value)
@@ -5,7 +5,6 @@ import warnings
5
5
  from typing import (
6
6
  TYPE_CHECKING,
7
7
  Any,
8
- AsyncIterator,
9
8
  Callable,
10
9
  Mapping,
11
10
  Optional,
@@ -14,14 +13,8 @@ from typing import (
14
13
  )
15
14
 
16
15
  from asgiref.sync import markcoroutinefunction
17
- from django.http import (
18
- HttpRequest,
19
- HttpResponse,
20
- HttpResponseNotAllowed,
21
- JsonResponse,
22
- StreamingHttpResponse,
23
- )
24
- from django.http.response import HttpResponseBase
16
+ from django.http import HttpRequest, HttpResponseNotAllowed, JsonResponse
17
+ from django.http.response import HttpResponse
25
18
  from django.template import RequestContext, Template
26
19
  from django.template.exceptions import TemplateDoesNotExist
27
20
  from django.template.loader import render_to_string
@@ -165,7 +158,7 @@ class BaseView:
165
158
 
166
159
  def create_response(
167
160
  self, response_data: GraphQLHTTPResponse, sub_response: HttpResponse
168
- ) -> HttpResponseBase:
161
+ ) -> HttpResponse:
169
162
  data = self.encode_json(response_data) # type: ignore
170
163
 
171
164
  response = HttpResponse(
@@ -184,22 +177,11 @@ class BaseView:
184
177
 
185
178
  return response
186
179
 
187
- async def create_multipart_response(
188
- self, stream: Callable[[], AsyncIterator[Any]], sub_response: HttpResponse
189
- ) -> HttpResponseBase:
190
- return StreamingHttpResponse(
191
- streaming_content=stream(),
192
- headers={
193
- "Transfer-Encoding": "chunked",
194
- "Content-type": "multipart/mixed;boundary=graphql;subscriptionSpec=1.0,application/json",
195
- },
196
- )
197
-
198
180
 
199
181
  class GraphQLView(
200
182
  BaseView,
201
183
  SyncBaseHTTPView[
202
- HttpRequest, HttpResponseBase, TemporalHttpResponse, Context, RootValue
184
+ HttpRequest, HttpResponse, TemporalHttpResponse, Context, RootValue
203
185
  ],
204
186
  View,
205
187
  ):
@@ -222,7 +204,7 @@ class GraphQLView(
222
204
  @method_decorator(csrf_exempt)
223
205
  def dispatch(
224
206
  self, request: HttpRequest, *args: Any, **kwargs: Any
225
- ) -> Union[HttpResponseNotAllowed, TemplateResponse, HttpResponseBase]:
207
+ ) -> Union[HttpResponseNotAllowed, TemplateResponse, HttpResponse]:
226
208
  try:
227
209
  return self.run(request=request)
228
210
  except HTTPException as e:
@@ -248,7 +230,7 @@ class GraphQLView(
248
230
  class AsyncGraphQLView(
249
231
  BaseView,
250
232
  AsyncBaseHTTPView[
251
- HttpRequest, HttpResponseBase, TemporalHttpResponse, Context, RootValue
233
+ HttpRequest, HttpResponse, TemporalHttpResponse, Context, RootValue
252
234
  ],
253
235
  View,
254
236
  ):
@@ -281,7 +263,7 @@ class AsyncGraphQLView(
281
263
  @method_decorator(csrf_exempt)
282
264
  async def dispatch( # pyright: ignore
283
265
  self, request: HttpRequest, *args: Any, **kwargs: Any
284
- ) -> Union[HttpResponseNotAllowed, TemplateResponse, HttpResponseBase]:
266
+ ) -> Union[HttpResponseNotAllowed, TemplateResponse, HttpResponse]:
285
267
  try:
286
268
  return await self.run(request=request)
287
269
  except HTTPException as e:
@@ -6,7 +6,6 @@ from inspect import signature
6
6
  from typing import (
7
7
  TYPE_CHECKING,
8
8
  Any,
9
- AsyncIterator,
10
9
  Awaitable,
11
10
  Callable,
12
11
  Mapping,
@@ -23,7 +22,6 @@ from starlette.responses import (
23
22
  HTMLResponse,
24
23
  PlainTextResponse,
25
24
  Response,
26
- StreamingResponse,
27
25
  )
28
26
  from starlette.websockets import WebSocket
29
27
 
@@ -324,14 +322,3 @@ class GraphQLRouter(
324
322
  response.headers.raw.extend(sub_response.headers.raw)
325
323
 
326
324
  return response
327
-
328
- async def create_multipart_response(
329
- self, stream: Callable[[], AsyncIterator[str]], sub_response: Response
330
- ) -> Response:
331
- return StreamingResponse(
332
- stream(),
333
- headers={
334
- "Transfer-Encoding": "chunked",
335
- "Content-type": "multipart/mixed;boundary=graphql;subscriptionSpec=1.0,application/json",
336
- },
337
- )
strawberry/flask/views.py CHANGED
@@ -1,15 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import warnings
4
- from typing import (
5
- TYPE_CHECKING,
6
- Any,
7
- List,
8
- Mapping,
9
- Optional,
10
- Union,
11
- cast,
12
- )
4
+ from typing import TYPE_CHECKING, Any, List, Mapping, Optional, Union, cast
13
5
 
14
6
  from flask import Request, Response, render_template_string, request
15
7
  from flask.views import View
@@ -1,16 +1,12 @@
1
1
  import abc
2
- import asyncio
3
2
  import json
4
3
  from typing import (
5
- Any,
6
- AsyncGenerator,
7
4
  Callable,
8
5
  Dict,
9
6
  Generic,
10
7
  List,
11
8
  Mapping,
12
9
  Optional,
13
- Tuple,
14
10
  Union,
15
11
  )
16
12
 
@@ -23,7 +19,7 @@ from strawberry.http import GraphQLHTTPResponse, GraphQLRequestData, process_res
23
19
  from strawberry.http.ides import GraphQL_IDE
24
20
  from strawberry.schema.base import BaseSchema
25
21
  from strawberry.schema.exceptions import InvalidOperationTypeError
26
- from strawberry.types import ExecutionResult, SubscriptionExecutionResult
22
+ from strawberry.types import ExecutionResult
27
23
  from strawberry.types.graphql import OperationType
28
24
 
29
25
  from .base import BaseView
@@ -98,14 +94,9 @@ class AsyncBaseHTTPView(
98
94
  async def render_graphql_ide(self, request: Request) -> Response:
99
95
  ...
100
96
 
101
- async def create_multipart_response(
102
- self, stream: Callable[[], AsyncGenerator[str, None]], sub_response: SubResponse
103
- ) -> Response:
104
- raise ValueError("Multipart responses are not supported")
105
-
106
97
  async def execute_operation(
107
98
  self, request: Request, context: Context, root_value: Optional[RootValue]
108
- ) -> Union[ExecutionResult, SubscriptionExecutionResult]:
99
+ ) -> ExecutionResult:
109
100
  request_adapter = self.request_adapter_class(request)
110
101
 
111
102
  try:
@@ -201,11 +192,6 @@ class AsyncBaseHTTPView(
201
192
  except MissingQueryError as e:
202
193
  raise HTTPException(400, "No GraphQL query found in the request") from e
203
194
 
204
- if isinstance(result, SubscriptionExecutionResult):
205
- stream = self._get_stream(request, result)
206
-
207
- return await self.create_multipart_response(stream, sub_response)
208
-
209
195
  response_data = await self.process_result(request=request, result=result)
210
196
 
211
197
  if result.errors:
@@ -215,88 +201,6 @@ class AsyncBaseHTTPView(
215
201
  response_data=response_data, sub_response=sub_response
216
202
  )
217
203
 
218
- def encode_multipart_data(self, data: Any, separator: str) -> str:
219
- return "".join(
220
- [
221
- f"\r\n--{separator}\r\n",
222
- "Content-Type: application/json\r\n\r\n",
223
- self.encode_json(data),
224
- "\n",
225
- ]
226
- )
227
-
228
- def _stream_with_heartbeat(
229
- self, stream: Callable[[], AsyncGenerator[str, None]]
230
- ) -> Callable[[], AsyncGenerator[str, None]]:
231
- """Adds a heartbeat to the stream, to prevent the connection from closing
232
- when there are no messages being sent."""
233
- # TODO: handle errors
234
- # TODO: should we do this more efficiently? and only send the heartbeat when
235
- # 5 seconds have passed after the last message? (apollo router doesn't seem to do this)
236
- queue = asyncio.Queue[Tuple[bool, Any]](1)
237
-
238
- cancelling = False
239
-
240
- async def drain():
241
- try:
242
- async for item in stream():
243
- await queue.put((False, item))
244
- except Exception as e:
245
- if not cancelling:
246
- await queue.put((True, e))
247
- else:
248
- raise
249
-
250
- async def heartbeat():
251
- while True:
252
- await queue.put((False, self.encode_multipart_data({}, "graphql")))
253
-
254
- await asyncio.sleep(5)
255
-
256
- async def merged() -> AsyncGenerator[str, None]:
257
- heartbeat_task = asyncio.create_task(heartbeat())
258
- task = asyncio.create_task(drain())
259
-
260
- def cancel_tasks():
261
- nonlocal cancelling
262
- cancelling = True
263
- task.cancel()
264
- heartbeat_task.cancel()
265
-
266
- try:
267
- while not task.done():
268
- raised, data = await queue.get()
269
-
270
- if raised:
271
- cancel_tasks()
272
- raise data
273
-
274
- yield data
275
- finally:
276
- cancel_tasks()
277
-
278
- return merged
279
-
280
- def _get_stream(
281
- self,
282
- request: Request,
283
- result: SubscriptionExecutionResult,
284
- separator: str = "graphql",
285
- ) -> Callable[[], AsyncGenerator[str, None]]:
286
- async def stream():
287
- async for value in result:
288
- response = await self.process_result(request, value)
289
- yield self.encode_multipart_data({"payload": response}, separator)
290
-
291
- yield f"\r\n--{separator}--\r\n"
292
-
293
- return self._stream_with_heartbeat(stream)
294
-
295
- async def parse_multipart_subscriptions(
296
- self, request: AsyncHTTPRequestAdapter
297
- ) -> Dict[str, str]:
298
- return self.parse_json(await request.get_body())
299
-
300
204
  async def parse_http_body(
301
205
  self, request: AsyncHTTPRequestAdapter
302
206
  ) -> GraphQLRequestData:
@@ -306,9 +210,6 @@ class AsyncBaseHTTPView(
306
210
  data = self.parse_json(await request.get_body())
307
211
  elif content_type.startswith("multipart/form-data"):
308
212
  data = await self.parse_multipart(request)
309
- elif content_type.startswith("multipart/mixed"):
310
- # TODO: do a check that checks if this is a multipart subscription
311
- data = await self.parse_multipart_subscriptions(request)
312
213
  elif request.method == "GET":
313
214
  data = self.parse_query_params(request.query_params)
314
215
  else:
strawberry/sanic/views.py CHANGED
@@ -5,8 +5,6 @@ import warnings
5
5
  from typing import (
6
6
  TYPE_CHECKING,
7
7
  Any,
8
- AsyncGenerator,
9
- Callable,
10
8
  Dict,
11
9
  List,
12
10
  Mapping,
@@ -170,35 +168,13 @@ class GraphQLView(
170
168
  )
171
169
 
172
170
  async def post(self, request: Request) -> HTTPResponse:
173
- self.request = request
174
-
175
171
  try:
176
172
  return await self.run(request)
177
173
  except HTTPException as e:
178
174
  return HTTPResponse(e.reason, status=e.status_code)
179
175
 
180
176
  async def get(self, request: Request) -> HTTPResponse:
181
- self.request = request
182
177
  try:
183
178
  return await self.run(request)
184
179
  except HTTPException as e:
185
180
  return HTTPResponse(e.reason, status=e.status_code)
186
-
187
- async def create_multipart_response(
188
- self,
189
- stream: Callable[[], AsyncGenerator[str, None]],
190
- sub_response: TemporalResponse,
191
- ) -> HTTPResponse:
192
- response = await self.request.respond(
193
- content_type="multipart/mixed;boundary=graphql;subscriptionSpec=1.0,application/json",
194
- headers={
195
- "Transfer-Encoding": "chunked",
196
- },
197
- )
198
-
199
- async for chunk in stream():
200
- await response.send(chunk)
201
-
202
- await response.eof()
203
-
204
- return response
strawberry/schema/base.py CHANGED
@@ -14,11 +14,7 @@ if TYPE_CHECKING:
14
14
  from strawberry.directive import StrawberryDirective
15
15
  from strawberry.enum import EnumDefinition
16
16
  from strawberry.schema.schema_converter import GraphQLCoreConverter
17
- from strawberry.types import (
18
- ExecutionContext,
19
- ExecutionResult,
20
- SubscriptionExecutionResult,
21
- )
17
+ from strawberry.types import ExecutionContext, ExecutionResult
22
18
  from strawberry.types.graphql import OperationType
23
19
  from strawberry.types.types import StrawberryObjectDefinition
24
20
  from strawberry.union import StrawberryUnion
@@ -43,7 +39,7 @@ class BaseSchema(Protocol):
43
39
  root_value: Optional[Any] = None,
44
40
  operation_name: Optional[str] = None,
45
41
  allowed_operation_types: Optional[Iterable[OperationType]] = None,
46
- ) -> Union[ExecutionResult, SubscriptionExecutionResult]:
42
+ ) -> ExecutionResult:
47
43
  raise NotImplementedError
48
44
 
49
45
  @abstractmethod
@@ -17,14 +17,13 @@ from typing import (
17
17
  cast,
18
18
  )
19
19
 
20
- from graphql import GraphQLError, parse, subscribe
20
+ from graphql import GraphQLError, parse
21
21
  from graphql import execute as original_execute
22
22
  from graphql.validation import validate
23
23
 
24
24
  from strawberry.exceptions import MissingQueryError
25
25
  from strawberry.extensions.runner import SchemaExtensionsRunner
26
26
  from strawberry.types import ExecutionResult
27
- from strawberry.types.graphql import OperationType
28
27
 
29
28
  from .exceptions import InvalidOperationTypeError
30
29
 
@@ -38,7 +37,8 @@ if TYPE_CHECKING:
38
37
  from graphql.validation import ASTValidationRule
39
38
 
40
39
  from strawberry.extensions import SchemaExtension
41
- from strawberry.types import ExecutionContext, SubscriptionExecutionResult
40
+ from strawberry.types import ExecutionContext
41
+ from strawberry.types.graphql import OperationType
42
42
 
43
43
 
44
44
  # duplicated because of https://github.com/mkdocstrings/griffe-typingdoc/issues/7
@@ -82,69 +82,46 @@ async def execute(
82
82
  execution_context: ExecutionContext,
83
83
  execution_context_class: Optional[Type[GraphQLExecutionContext]] = None,
84
84
  process_errors: Callable[[List[GraphQLError], Optional[ExecutionContext]], None],
85
- ) -> Union[ExecutionResult, SubscriptionExecutionResult]:
85
+ ) -> ExecutionResult:
86
86
  extensions_runner = SchemaExtensionsRunner(
87
87
  execution_context=execution_context,
88
88
  extensions=list(extensions),
89
89
  )
90
90
 
91
- async with extensions_runner.operation():
92
- # Note: In graphql-core the schema would be validated here but in
93
- # Strawberry we are validating it at initialisation time instead
94
- if not execution_context.query:
95
- raise MissingQueryError()
96
-
97
- async with extensions_runner.parsing():
98
- try:
99
- if not execution_context.graphql_document:
100
- execution_context.graphql_document = parse_document(
101
- execution_context.query, **execution_context.parse_options
91
+ try:
92
+ async with extensions_runner.operation():
93
+ # Note: In graphql-core the schema would be validated here but in
94
+ # Strawberry we are validating it at initialisation time instead
95
+ if not execution_context.query:
96
+ raise MissingQueryError()
97
+
98
+ async with extensions_runner.parsing():
99
+ try:
100
+ if not execution_context.graphql_document:
101
+ execution_context.graphql_document = parse_document(
102
+ execution_context.query, **execution_context.parse_options
103
+ )
104
+
105
+ except GraphQLError as exc:
106
+ execution_context.errors = [exc]
107
+ process_errors([exc], execution_context)
108
+ return ExecutionResult(
109
+ data=None,
110
+ errors=[exc],
111
+ extensions=await extensions_runner.get_extensions_results(),
102
112
  )
103
113
 
104
- except GraphQLError as error:
105
- execution_context.errors = [error]
106
- process_errors([error], execution_context)
107
- return ExecutionResult(
108
- data=None,
109
- errors=[error],
110
- extensions=await extensions_runner.get_extensions_results(),
111
- )
112
-
113
- except Exception as error: # pragma: no cover
114
- error = GraphQLError(str(error), original_error=error)
115
-
116
- execution_context.errors = [error]
117
- process_errors([error], execution_context)
118
-
119
- return ExecutionResult(
120
- data=None,
121
- errors=[error],
122
- extensions=await extensions_runner.get_extensions_results(),
123
- )
124
-
125
- if execution_context.operation_type not in allowed_operation_types:
126
- raise InvalidOperationTypeError(execution_context.operation_type)
127
-
128
- async with extensions_runner.validation():
129
- _run_validation(execution_context)
130
- if execution_context.errors:
131
- process_errors(execution_context.errors, execution_context)
132
- return ExecutionResult(data=None, errors=execution_context.errors)
133
-
134
- async with extensions_runner.executing():
135
- if not execution_context.result:
136
- if execution_context.operation_type == OperationType.SUBSCRIPTION:
137
- # TODO: should we process errors here?
138
- # TODO: make our own wrapper?
139
- return await subscribe( # type: ignore
140
- schema,
141
- execution_context.graphql_document,
142
- root_value=execution_context.root_value,
143
- context_value=execution_context.context,
144
- variable_values=execution_context.variables,
145
- operation_name=execution_context.operation_name,
146
- )
147
- else:
114
+ if execution_context.operation_type not in allowed_operation_types:
115
+ raise InvalidOperationTypeError(execution_context.operation_type)
116
+
117
+ async with extensions_runner.validation():
118
+ _run_validation(execution_context)
119
+ if execution_context.errors:
120
+ process_errors(execution_context.errors, execution_context)
121
+ return ExecutionResult(data=None, errors=execution_context.errors)
122
+
123
+ async with extensions_runner.executing():
124
+ if not execution_context.result:
148
125
  result = original_execute(
149
126
  schema,
150
127
  execution_context.graphql_document,
@@ -156,21 +133,33 @@ async def execute(
156
133
  execution_context_class=execution_context_class,
157
134
  )
158
135
 
159
- if isawaitable(result):
160
- result = await cast(Awaitable["GraphQLExecutionResult"], result)
161
-
162
- result = cast("GraphQLExecutionResult", result)
163
- execution_context.result = result
164
- # Also set errors on the execution_context so that it's easier
165
- # to access in extensions
166
- if result.errors:
167
- execution_context.errors = result.errors
168
-
169
- # Run the `Schema.process_errors` function here before
170
- # extensions have a chance to modify them (see the MaskErrors
171
- # extension). That way we can log the original errors but
172
- # only return a sanitised version to the client.
173
- process_errors(result.errors, execution_context)
136
+ if isawaitable(result):
137
+ result = await cast(Awaitable["GraphQLExecutionResult"], result)
138
+
139
+ result = cast("GraphQLExecutionResult", result)
140
+ execution_context.result = result
141
+ # Also set errors on the execution_context so that it's easier
142
+ # to access in extensions
143
+ if result.errors:
144
+ execution_context.errors = result.errors
145
+
146
+ # Run the `Schema.process_errors` function here before
147
+ # extensions have a chance to modify them (see the MaskErrors
148
+ # extension). That way we can log the original errors but
149
+ # only return a sanitised version to the client.
150
+ process_errors(result.errors, execution_context)
151
+
152
+ except (MissingQueryError, InvalidOperationTypeError) as e:
153
+ raise e
154
+ except Exception as exc:
155
+ error = GraphQLError(str(exc), original_error=exc)
156
+ execution_context.errors = [error]
157
+ process_errors([error], execution_context)
158
+ return ExecutionResult(
159
+ data=None,
160
+ errors=[error],
161
+ extensions=await extensions_runner.get_extensions_results(),
162
+ )
174
163
 
175
164
  return ExecutionResult(
176
165
  data=execution_context.result.data,
@@ -193,80 +182,82 @@ def execute_sync(
193
182
  extensions=list(extensions),
194
183
  )
195
184
 
196
- with extensions_runner.operation():
197
- # Note: In graphql-core the schema would be validated here but in
198
- # Strawberry we are validating it at initialisation time instead
199
- if not execution_context.query:
200
- raise MissingQueryError()
201
-
202
- with extensions_runner.parsing():
203
- try:
204
- if not execution_context.graphql_document:
205
- execution_context.graphql_document = parse_document(
206
- execution_context.query, **execution_context.parse_options
185
+ try:
186
+ with extensions_runner.operation():
187
+ # Note: In graphql-core the schema would be validated here but in
188
+ # Strawberry we are validating it at initialisation time instead
189
+ if not execution_context.query:
190
+ raise MissingQueryError()
191
+
192
+ with extensions_runner.parsing():
193
+ try:
194
+ if not execution_context.graphql_document:
195
+ execution_context.graphql_document = parse_document(
196
+ execution_context.query, **execution_context.parse_options
197
+ )
198
+
199
+ except GraphQLError as exc:
200
+ execution_context.errors = [exc]
201
+ process_errors([exc], execution_context)
202
+ return ExecutionResult(
203
+ data=None,
204
+ errors=[exc],
205
+ extensions=extensions_runner.get_extensions_results_sync(),
207
206
  )
208
207
 
209
- except GraphQLError as error:
210
- execution_context.errors = [error]
211
- process_errors([error], execution_context)
212
- return ExecutionResult(
213
- data=None,
214
- errors=[error],
215
- extensions=extensions_runner.get_extensions_results_sync(),
216
- )
217
-
218
- except Exception as error: # pragma: no cover
219
- error = GraphQLError(str(error), original_error=error)
220
-
221
- execution_context.errors = [error]
222
- process_errors([error], execution_context)
223
- return ExecutionResult(
224
- data=None,
225
- errors=[error],
226
- extensions=extensions_runner.get_extensions_results_sync(),
227
- )
228
-
229
- if execution_context.operation_type not in allowed_operation_types:
230
- raise InvalidOperationTypeError(execution_context.operation_type)
231
-
232
- with extensions_runner.validation():
233
- _run_validation(execution_context)
234
- if execution_context.errors:
235
- process_errors(execution_context.errors, execution_context)
236
- return ExecutionResult(data=None, errors=execution_context.errors)
237
-
238
- with extensions_runner.executing():
239
- if not execution_context.result:
240
- result = original_execute(
241
- schema,
242
- execution_context.graphql_document,
243
- root_value=execution_context.root_value,
244
- middleware=extensions_runner.as_middleware_manager(),
245
- variable_values=execution_context.variables,
246
- operation_name=execution_context.operation_name,
247
- context_value=execution_context.context,
248
- execution_context_class=execution_context_class,
249
- )
250
-
251
- if isawaitable(result):
252
- result = cast(Awaitable["GraphQLExecutionResult"], result)
253
- ensure_future(result).cancel()
254
- raise RuntimeError(
255
- "GraphQL execution failed to complete synchronously."
208
+ if execution_context.operation_type not in allowed_operation_types:
209
+ raise InvalidOperationTypeError(execution_context.operation_type)
210
+
211
+ with extensions_runner.validation():
212
+ _run_validation(execution_context)
213
+ if execution_context.errors:
214
+ process_errors(execution_context.errors, execution_context)
215
+ return ExecutionResult(data=None, errors=execution_context.errors)
216
+
217
+ with extensions_runner.executing():
218
+ if not execution_context.result:
219
+ result = original_execute(
220
+ schema,
221
+ execution_context.graphql_document,
222
+ root_value=execution_context.root_value,
223
+ middleware=extensions_runner.as_middleware_manager(),
224
+ variable_values=execution_context.variables,
225
+ operation_name=execution_context.operation_name,
226
+ context_value=execution_context.context,
227
+ execution_context_class=execution_context_class,
256
228
  )
257
229
 
258
- result = cast("GraphQLExecutionResult", result)
259
- execution_context.result = result
260
- # Also set errors on the execution_context so that it's easier
261
- # to access in extensions
262
- if result.errors:
263
- execution_context.errors = result.errors
264
-
265
- # Run the `Schema.process_errors` function here before
266
- # extensions have a chance to modify them (see the MaskErrors
267
- # extension). That way we can log the original errors but
268
- # only return a sanitised version to the client.
269
- process_errors(result.errors, execution_context)
230
+ if isawaitable(result):
231
+ result = cast(Awaitable["GraphQLExecutionResult"], result)
232
+ ensure_future(result).cancel()
233
+ raise RuntimeError(
234
+ "GraphQL execution failed to complete synchronously."
235
+ )
236
+
237
+ result = cast("GraphQLExecutionResult", result)
238
+ execution_context.result = result
239
+ # Also set errors on the execution_context so that it's easier
240
+ # to access in extensions
241
+ if result.errors:
242
+ execution_context.errors = result.errors
243
+
244
+ # Run the `Schema.process_errors` function here before
245
+ # extensions have a chance to modify them (see the MaskErrors
246
+ # extension). That way we can log the original errors but
247
+ # only return a sanitised version to the client.
248
+ process_errors(result.errors, execution_context)
249
+
250
+ except (MissingQueryError, InvalidOperationTypeError) as e:
251
+ raise e
252
+ except Exception as exc:
253
+ error = GraphQLError(str(exc), original_error=exc)
254
+ execution_context.errors = [error]
255
+ process_errors([error], execution_context)
256
+ return ExecutionResult(
257
+ data=None,
258
+ errors=[error],
259
+ extensions=extensions_runner.get_extensions_results_sync(),
260
+ )
270
261
 
271
262
  return ExecutionResult(
272
263
  data=execution_context.result.data,
@@ -55,7 +55,7 @@ if TYPE_CHECKING:
55
55
  from strawberry.extensions import SchemaExtension
56
56
  from strawberry.field import StrawberryField
57
57
  from strawberry.type import StrawberryType
58
- from strawberry.types import ExecutionResult, SubscriptionExecutionResult
58
+ from strawberry.types import ExecutionResult
59
59
  from strawberry.union import StrawberryUnion
60
60
 
61
61
  DEFAULT_ALLOWED_OPERATION_TYPES = {
@@ -239,7 +239,7 @@ class Schema(BaseSchema):
239
239
  root_value: Optional[Any] = None,
240
240
  operation_name: Optional[str] = None,
241
241
  allowed_operation_types: Optional[Iterable[OperationType]] = None,
242
- ) -> Union[ExecutionResult, SubscriptionExecutionResult]:
242
+ ) -> ExecutionResult:
243
243
  if allowed_operation_types is None:
244
244
  allowed_operation_types = DEFAULT_ALLOWED_OPERATION_TYPES
245
245
 
@@ -1,9 +1,4 @@
1
- from .execution import ExecutionContext, ExecutionResult, SubscriptionExecutionResult
1
+ from .execution import ExecutionContext, ExecutionResult
2
2
  from .info import Info
3
3
 
4
- __all__ = [
5
- "ExecutionContext",
6
- "ExecutionResult",
7
- "SubscriptionExecutionResult",
8
- "Info",
9
- ]
4
+ __all__ = ["ExecutionContext", "ExecutionResult", "Info"]
@@ -9,9 +9,8 @@ from typing import (
9
9
  Optional,
10
10
  Tuple,
11
11
  Type,
12
- runtime_checkable,
13
12
  )
14
- from typing_extensions import Protocol, TypedDict
13
+ from typing_extensions import TypedDict
15
14
 
16
15
  from graphql import specified_rules
17
16
 
@@ -95,12 +94,3 @@ class ExecutionResult:
95
94
 
96
95
  class ParseOptions(TypedDict):
97
96
  max_tokens: NotRequired[int]
98
-
99
-
100
- @runtime_checkable
101
- class SubscriptionExecutionResult(Protocol):
102
- def __aiter__(self) -> SubscriptionExecutionResult: # pragma: no cover
103
- ...
104
-
105
- async def __anext__(self) -> Any: # pragma: no cover
106
- ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: strawberry-graphql
3
- Version: 0.214.0.dev1699441271
3
+ Version: 0.214.0.dev1701082152
4
4
  Summary: A library for creating GraphQL APIs
5
5
  Home-page: https://strawberry.rocks/
6
6
  License: MIT
@@ -6,10 +6,10 @@ strawberry/aiohttp/handlers/graphql_transport_ws_handler.py,sha256=Czzss3Gt9Rdhb
6
6
  strawberry/aiohttp/handlers/graphql_ws_handler.py,sha256=0wy0IjBapHwlkfMhVk6frgpOxviNLDbuIn6Q8k5M_2E,2234
7
7
  strawberry/aiohttp/test/__init__.py,sha256=4xxdUZtIISSOwjrcnmox7AvT4WWjowCm5bUuPdQneMg,71
8
8
  strawberry/aiohttp/test/client.py,sha256=tlpHymSWqhiQbLmKwodcaX2vdc8BW1IaNTFTHlWKlOY,1323
9
- strawberry/aiohttp/views.py,sha256=vwJpWl_UqEqFwKF412MXR4LwONzyrpyAnKHS0cQyoKk,6934
9
+ strawberry/aiohttp/views.py,sha256=XzIwfXrLGMIVnqU0qqtBtksjue_ng_6LbDgoN_Wyxhs,6017
10
10
  strawberry/annotation.py,sha256=HoArlanqDZbV2HftN0lAkEMNOFzEs2AmVJQEpbaF3oE,12879
11
11
  strawberry/arguments.py,sha256=6Ke0vVrAKeEj46CPEEWBK3LuZGTeBxeD6wJZFtJWqH8,8432
12
- strawberry/asgi/__init__.py,sha256=C1KXaF-mZdGz_hTA_I7Q9iG8E_KxDSYKCTwW1mobGWM,7447
12
+ strawberry/asgi/__init__.py,sha256=IJXwXcAx0AGGszZDfEy_n00dXtgL77GKiUYJMvcgA50,6977
13
13
  strawberry/asgi/handlers/__init__.py,sha256=rz5Gth2eJUn7tDq2--99KSNFeMdDPpLFCkfA7vge0cI,235
14
14
  strawberry/asgi/handlers/graphql_transport_ws_handler.py,sha256=g4OFtFzUfONnypeN6qBg2edwQRHnebLy0pyyFbHZpnE,2097
15
15
  strawberry/asgi/handlers/graphql_ws_handler.py,sha256=Yktyks4xQ4KHIByAU-AC2kxrbzDCC5YBCgf3ngqT_GU,2338
@@ -22,7 +22,7 @@ strawberry/channels/__init__.py,sha256=9oRdAT7uIYETF-23gZ5NteOXSjwkUtwRmwu3YCFv1
22
22
  strawberry/channels/handlers/base.py,sha256=tgXLjKCHrP-8yOJV-qo9iOMJUgDe2wW6rGs_nDZFi80,7869
23
23
  strawberry/channels/handlers/graphql_transport_ws_handler.py,sha256=UKfxRoo1pEv1CBHhkhSTkbztJlfU-OoksFwyLktj8xc,1945
24
24
  strawberry/channels/handlers/graphql_ws_handler.py,sha256=PHRkwnXt3tY4E0XBVHh4hpTyFBt9jQfTreBUmEo9vhI,2497
25
- strawberry/channels/handlers/http_handler.py,sha256=OJ6eTz7EWF6R3wakhB93Yb15gq__Ma8dGq5SVWy2ypo,10645
25
+ strawberry/channels/handlers/http_handler.py,sha256=9pW978XaeF-aFWM9WMaSHCOWmcWoIJCNkW8X3lKJcws,9560
26
26
  strawberry/channels/handlers/ws_handler.py,sha256=sHL44eay4tNoKzkrRn3WewSYH-3ZSJzxJpmBJ-aTkeM,4650
27
27
  strawberry/channels/router.py,sha256=dyOBbSF8nFiygP0zz6MM14mhkvFQAEbbLBXzcpubSHM,1927
28
28
  strawberry/channels/testing.py,sha256=he9cdsu5KxoPfpR8z2E6kwr2hwUjVhACTrTIoIbsSkQ,5519
@@ -58,7 +58,7 @@ strawberry/django/apps.py,sha256=ZWw3Mzv1Cgy0T9xT8Jr2_dkCTZjT5WQABb34iqnu5pc,135
58
58
  strawberry/django/context.py,sha256=KHZ-u9tc2ip3FAEj4mXoFPeKVyq3KyVjHqCZM9uFc7c,607
59
59
  strawberry/django/test/__init__.py,sha256=4xxdUZtIISSOwjrcnmox7AvT4WWjowCm5bUuPdQneMg,71
60
60
  strawberry/django/test/client.py,sha256=lPEbe_4lNL1pSgtywq4O-b6n7ALCW3U9_uvoWz3EaSM,592
61
- strawberry/django/views.py,sha256=viG1uapkHacQdmfqj__aodMGkOxXxegu4uq5SBBIcSA,9507
61
+ strawberry/django/views.py,sha256=vKUmfxvs75v8eZVM8eJ9KyBP6fFNmrbzwaEejIfE-4g,8971
62
62
  strawberry/enum.py,sha256=H1KQdDATMaba-yqdfdek-YHFkqEoq-Kt5yUE57oUXNg,4263
63
63
  strawberry/exceptions/__init__.py,sha256=DMnNx3f2km02dchxkKgf5e9akS7LW3vRhUPOLApHXk4,6173
64
64
  strawberry/exceptions/conflicting_arguments.py,sha256=b4IFgdHMc44MW00NAUNf0W-NUD7p3s1t8cjyS32fsu4,1579
@@ -123,7 +123,7 @@ strawberry/fastapi/context.py,sha256=hxLoihS9TM16iyUPiAGQf-0i4wv975CJYHHI6EwOewA
123
123
  strawberry/fastapi/handlers/__init__.py,sha256=TziBHyibYBOGiidjpCkjNThYbVY7K_nt0hnRLVHVh3I,241
124
124
  strawberry/fastapi/handlers/graphql_transport_ws_handler.py,sha256=k8BhP1xQAFc1GnbQoFhi8KQSWwY1x-ngR9qIDVJW_ic,549
125
125
  strawberry/fastapi/handlers/graphql_ws_handler.py,sha256=U84lpd7Lxl2bEnFr9QroswmEaMO5ipLCZTeYRAaZH-g,504
126
- strawberry/fastapi/router.py,sha256=Kht9qrxG3JNjcWnYIIH5fdMsHGrUDkvSJSqLeXAJ9rk,12012
126
+ strawberry/fastapi/router.py,sha256=o55NLbL7n-LoKM30eUCJgzyPlRYPsybWb07L8-fcZZo,11573
127
127
  strawberry/federation/__init__.py,sha256=FeUxLiBVuk9TKBmJJi51SeUaI8c80rS8hbl9No-hjII,535
128
128
  strawberry/federation/argument.py,sha256=5qyJYlQGEZd6iXWseQ7dnnejCYj5HyglfK10jOCIJBg,802
129
129
  strawberry/federation/enum.py,sha256=KpcQfL_efoaNBbb2gl-CYO5PtyVsuyz1LcluTMuRcks,2185
@@ -143,9 +143,9 @@ strawberry/file_uploads/__init__.py,sha256=v2-6FGBqnTnMPSUTFOiXpIutDMl-ga0PFtw5t
143
143
  strawberry/file_uploads/scalars.py,sha256=jccJh-h7t4naRiDzrszGoYsp95zdF30c7y5Ht0Zrk_s,131
144
144
  strawberry/file_uploads/utils.py,sha256=U8gk1aHjWOBa_Opyvc47h6OpYToGq1QiSnEkI2kphdo,1112
145
145
  strawberry/flask/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
- strawberry/flask/views.py,sha256=6RkFA-VP5ZFqWePOBsgUweHKwfzrkpBvRsf1XscGLDc,5617
146
+ strawberry/flask/views.py,sha256=t3G7hYqYJXsVuvkVVVjfqaQ2SlNB-uvvWQ0uBlc6iJA,5584
147
147
  strawberry/http/__init__.py,sha256=t-Inc7JHEr1Tr_Afu9uAb042ujpYx-jEbe_gqCfuOlc,1403
148
- strawberry/http/async_base_view.py,sha256=PniDgx0fR2XP_fPkWV8X4Ec2LZnoEjZ9G5sui7WKGgo,10682
148
+ strawberry/http/async_base_view.py,sha256=IOuM3_6DIjz3eNGz8-2YDK3SQS3ThU4Bhr2xXHmi58A,7249
149
149
  strawberry/http/base.py,sha256=4W46QvgenE3-Wf8IfxDyPx2hrA-EJ3k6THyUZc19TVw,2372
150
150
  strawberry/http/exceptions.py,sha256=4lgbMQ-UF2HHu2PczqkS1vGAcU08cEGY03FMrVvjqeA,155
151
151
  strawberry/http/ides.py,sha256=f8sjynd4hCPJIaZaALRfJ2HM9_ghyymuCrBViAH2M34,822
@@ -174,16 +174,16 @@ strawberry/resolvers.py,sha256=g7_g3jmXszziGydY1UG6IItf9s6B1lGLUCnwW1kb8U0,224
174
174
  strawberry/sanic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
175
  strawberry/sanic/context.py,sha256=qfoj8QMaAiWbCQFAdm2KPPJGNc7ilXeKAl5z0XJ2nzo,805
176
176
  strawberry/sanic/utils.py,sha256=eDiJPJYpELj4hFsx8CCAHomqe7dDEpStDPm6OfkstJ0,998
177
- strawberry/sanic/views.py,sha256=rM1diPchUnvRRHRoyuxbrtAHkw8Rx2BNW8xsaUuCYYo,6188
177
+ strawberry/sanic/views.py,sha256=hxEu_pXw2keaZSiNiJxpqY-5nGrkeLL-2MRqWdsTwdU,5542
178
178
  strawberry/scalars.py,sha256=CSxTGSvpFyT9H83NxZeiBerl_WPGe43TlSxcrn60960,2076
179
179
  strawberry/schema/__init__.py,sha256=u1QCyDVQExUVDA20kyosKPz3TS5HMCN2NrXclhiFAL4,92
180
- strawberry/schema/base.py,sha256=_DytGAC_uJvAjMbT6Y8EwUg9Gd1JzJrwJghfOWrawy8,3074
180
+ strawberry/schema/base.py,sha256=lQBJyzG2ZhKc544oLbXEbpYOPOjaXBop3lxp68h_lfI,2976
181
181
  strawberry/schema/compat.py,sha256=n0r3UPUcGemMqK8vklgtCkkuCA1p6tWAYbc6Vl4iNOw,1684
182
182
  strawberry/schema/config.py,sha256=N9KsqkSTnm5snizoBZAVneaWQprhaTd8PFyMuR-jfUs,632
183
183
  strawberry/schema/exceptions.py,sha256=_9Ua-lLRCJfbtd8B6MXILNKGI2SwHkcBNkAHYM7ITp8,534
184
- strawberry/schema/execute.py,sha256=7V4LaBJVPqddwPMIKwMUmfAAVlVFpeb2KQCyk28G1fU,11187
184
+ strawberry/schema/execute.py,sha256=aqLZkqb_cK2OVxfkagP6hS9_XADTpRIkY8I5J75ZhHY,10802
185
185
  strawberry/schema/name_converter.py,sha256=UdNyd-QtqF2HsDCQK-nsOcLGxDTj4hJwYFNvMtZnpq4,6533
186
- strawberry/schema/schema.py,sha256=20vPcUQ7zH4HDJaZvYznGbZ8L1Y8yYKtF42PRCh6FfI,13252
186
+ strawberry/schema/schema.py,sha256=0FlMPIeMwRo2OEUG9lD-OmMFbnpKDACZgBNaCoTVxok,13187
187
187
  strawberry/schema/schema_converter.py,sha256=pxUgK5VEI2Puc_zk2lwDPknb3rg-SuFOManl4fSDZ9s,35601
188
188
  strawberry/schema/types/__init__.py,sha256=oHO3COWhL3L1KLYCJNY1XFf5xt2GGtHiMC-UaYbFfnA,68
189
189
  strawberry/schema/types/base_scalars.py,sha256=Z_BmgwLicNexLipGyw6MmZ7OBnkGJU3ySgaY9SwBWrw,1837
@@ -212,8 +212,8 @@ strawberry/tools/__init__.py,sha256=pdGpZx8wpq03VfUZJyF9JtYxZhGqzzxCiipsalWxJX4,
212
212
  strawberry/tools/create_type.py,sha256=QxLRT9-DrSgo6vsu_L818wtlbO3wRtI0dOos0gmn1xk,1593
213
213
  strawberry/tools/merge_types.py,sha256=YZ2GSMoDD82bfuvCT0COpN6SLFVRZpTXFFm9LHUyi10,1014
214
214
  strawberry/type.py,sha256=KDztUFxVju4CEPPRzZYcyHtDNRrkFYxK-mI99GcqCgU,6511
215
- strawberry/types/__init__.py,sha256=BgyD5scKfR1cN7SQMVsRMPr5Mb9PzElaHhKe3A_smog,218
216
- strawberry/types/execution.py,sha256=NYdbKK17jQc8Itmx58M45X8TJk78-8jgpns6_B2uH1Y,3033
215
+ strawberry/types/__init__.py,sha256=APb1Cjy6bxqFxIfDfempP6eb9NE3LYDwQ3gX7r07lXI,139
216
+ strawberry/types/execution.py,sha256=qCqDMJgdAFwdc3uPzVTAKsZlu6fgxPLrFwkoX_PFBq8,2775
217
217
  strawberry/types/fields/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
218
218
  strawberry/types/fields/resolver.py,sha256=7-fzFfQdf0uWuYyWiSIsGbt2qvpLpGPy6w1T_57cYL8,14140
219
219
  strawberry/types/graphql.py,sha256=3SWZEsa0Zy1eVW6vy75BnB7t9_lJVi6TBV3_1j3RNBs,687
@@ -236,8 +236,8 @@ strawberry/utils/logging.py,sha256=flS7hV0JiIOEdXcrIjda4WyIWix86cpHHFNJL8gl1y4,7
236
236
  strawberry/utils/operation.py,sha256=Um-tBCPl3_bVFN2Ph7o1mnrxfxBes4HFCj6T0x4kZxE,1135
237
237
  strawberry/utils/str_converters.py,sha256=avIgPVLg98vZH9mA2lhzVdyyjqzLsK2NdBw9mJQ02Xk,813
238
238
  strawberry/utils/typing.py,sha256=xkRDUaSJH669jtmdUvWIqrj66Vx4tsbrXSuuYy0FPxU,13490
239
- strawberry_graphql-0.214.0.dev1699441271.dist-info/LICENSE,sha256=m-XnIVUKqlG_AWnfi9NReh9JfKhYOB-gJfKE45WM1W8,1072
240
- strawberry_graphql-0.214.0.dev1699441271.dist-info/METADATA,sha256=o4XvmMZUg8SWPBGAKC3kOWbgPxBn7DDGffFn_4dai7A,7655
241
- strawberry_graphql-0.214.0.dev1699441271.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
242
- strawberry_graphql-0.214.0.dev1699441271.dist-info/entry_points.txt,sha256=Nk7-aT3_uEwCgyqtHESV9H6Mc31cK-VAvhnQNTzTb4k,49
243
- strawberry_graphql-0.214.0.dev1699441271.dist-info/RECORD,,
239
+ strawberry_graphql-0.214.0.dev1701082152.dist-info/LICENSE,sha256=m-XnIVUKqlG_AWnfi9NReh9JfKhYOB-gJfKE45WM1W8,1072
240
+ strawberry_graphql-0.214.0.dev1701082152.dist-info/METADATA,sha256=bfOftMog_QTzzrbp_oDGaFKUGNu3gfcXACVRL4efgdg,7655
241
+ strawberry_graphql-0.214.0.dev1701082152.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
242
+ strawberry_graphql-0.214.0.dev1701082152.dist-info/entry_points.txt,sha256=Nk7-aT3_uEwCgyqtHESV9H6Mc31cK-VAvhnQNTzTb4k,49
243
+ strawberry_graphql-0.214.0.dev1701082152.dist-info/RECORD,,