Skip to content

Commit a71f6a9

Browse files
committed
incrementalDelivery: remove singleResult wrapper
Replicates graphql/graphql-js@364cd71
1 parent a046794 commit a71f6a9

File tree

8 files changed

+76
-74
lines changed

8 files changed

+76
-74
lines changed

docs/conf.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@
141141
AsyncPayloadRecord
142142
AwaitableOrValue
143143
EnterLeaveVisitor
144-
ExperimentalExecuteIncrementallyResults
144+
ExperimentalIncrementalExecutionResults
145145
FormattedSourceLocation
146146
GraphQLAbstractType
147147
GraphQLErrorExtensions
@@ -154,8 +154,7 @@
154154
graphql.execution.map_async_iterable.MapAsyncIterable
155155
graphql.execution.Middleware
156156
graphql.execution.execute.DeferredFragmentRecord
157-
graphql.execution.execute.ExperimentalExecuteMultipleResults
158-
graphql.execution.execute.ExperimentalExecuteSingleResult
157+
graphql.execution.execute.ExperimentalIncrementalExecutionResults
159158
graphql.execution.execute.StreamArguments
160159
graphql.execution.execute.StreamRecord
161160
graphql.language.lexer.EscapeSequence

docs/modules/execution.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Execution
2424
.. autoclass:: FormattedExecutionResult
2525
:no-inherited-members:
2626

27-
.. autoclass:: ExperimentalExecuteIncrementallyResults
27+
.. autoclass:: ExperimentalIncrementalExecutionResults
2828

2929
.. autoclass:: InitialIncrementalExecutionResult
3030

src/graphql/__init__.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,18 @@
435435
# Types
436436
ExecutionContext,
437437
ExecutionResult,
438+
ExperimentalIncrementalExecutionResults,
439+
InitialIncrementalExecutionResult,
440+
SubsequentIncrementalExecutionResult,
441+
IncrementalDeferResult,
442+
IncrementalStreamResult,
443+
IncrementalResult,
438444
FormattedExecutionResult,
445+
FormattedInitialIncrementalExecutionResult,
446+
FormattedSubsequentIncrementalExecutionResult,
447+
FormattedIncrementalDeferResult,
448+
FormattedIncrementalStreamResult,
449+
FormattedIncrementalResult,
439450
# Subscription
440451
subscribe,
441452
create_source_event_stream,
@@ -702,7 +713,18 @@
702713
"get_variable_values",
703714
"ExecutionContext",
704715
"ExecutionResult",
716+
"ExperimentalIncrementalExecutionResults",
717+
"InitialIncrementalExecutionResult",
718+
"SubsequentIncrementalExecutionResult",
719+
"IncrementalDeferResult",
720+
"IncrementalStreamResult",
721+
"IncrementalResult",
705722
"FormattedExecutionResult",
723+
"FormattedInitialIncrementalExecutionResult",
724+
"FormattedSubsequentIncrementalExecutionResult",
725+
"FormattedIncrementalDeferResult",
726+
"FormattedIncrementalStreamResult",
727+
"FormattedIncrementalResult",
706728
"Middleware",
707729
"MiddlewareManager",
708730
"subscribe",

src/graphql/execution/__init__.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
experimental_subscribe_incrementally,
1717
ExecutionContext,
1818
ExecutionResult,
19-
ExperimentalExecuteIncrementallyResults,
20-
ExperimentalExecuteMultipleResults,
21-
ExperimentalExecuteSingleResult,
19+
ExperimentalIncrementalExecutionResults,
2220
InitialIncrementalExecutionResult,
2321
SubsequentIncrementalExecutionResult,
2422
IncrementalDeferResult,
@@ -48,9 +46,7 @@
4846
"experimental_subscribe_incrementally",
4947
"ExecutionContext",
5048
"ExecutionResult",
51-
"ExperimentalExecuteIncrementallyResults",
52-
"ExperimentalExecuteMultipleResults",
53-
"ExperimentalExecuteSingleResult",
49+
"ExperimentalIncrementalExecutionResults",
5450
"InitialIncrementalExecutionResult",
5551
"SubsequentIncrementalExecutionResult",
5652
"IncrementalDeferResult",

src/graphql/execution/execute.py

Lines changed: 28 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,7 @@ async def anext(iterator: AsyncIterator) -> Any:
104104
"StreamRecord",
105105
"ExecutionResult",
106106
"ExecutionContext",
107-
"ExperimentalExecuteIncrementallyResults",
108-
"ExperimentalExecuteMultipleResults",
109-
"ExperimentalExecuteSingleResult",
107+
"ExperimentalIncrementalExecutionResults",
110108
"FormattedExecutionResult",
111109
"FormattedIncrementalDeferResult",
112110
"FormattedIncrementalResult",
@@ -600,24 +598,13 @@ class StreamArguments(NamedTuple):
600598
label: Optional[str]
601599

602600

603-
class ExperimentalExecuteSingleResult(NamedTuple):
604-
"""Execution result when retrieved at once."""
605-
606-
single_result: ExecutionResult
607-
608-
609-
class ExperimentalExecuteMultipleResults(NamedTuple):
601+
class ExperimentalIncrementalExecutionResults(NamedTuple):
610602
"""Execution results when retrieved incrementally."""
611603

612604
initial_result: InitialIncrementalExecutionResult
613605
subsequent_results: AsyncGenerator[SubsequentIncrementalExecutionResult, None]
614606

615607

616-
ExperimentalExecuteIncrementallyResults = Union[
617-
ExperimentalExecuteSingleResult, ExperimentalExecuteMultipleResults
618-
]
619-
620-
621608
Middleware: TypeAlias = Optional[Union[Tuple, List, MiddlewareManager]]
622609

623610

@@ -2012,15 +1999,15 @@ def execute(
20121999
execution_context_class,
20132000
is_awaitable,
20142001
)
2015-
if isinstance(result, ExperimentalExecuteSingleResult):
2016-
return result.single_result
2017-
if isinstance(result, ExperimentalExecuteMultipleResults):
2002+
if isinstance(result, ExecutionResult):
2003+
return result
2004+
if isinstance(result, ExperimentalIncrementalExecutionResults):
20182005
raise GraphQLError(UNEXPECTED_MULTIPLE_PAYLOADS)
20192006

20202007
async def await_result() -> Any:
20212008
awaited_result = await result # type: ignore
2022-
if isinstance(awaited_result, ExperimentalExecuteSingleResult):
2023-
return awaited_result.single_result
2009+
if isinstance(awaited_result, ExecutionResult):
2010+
return awaited_result
20242011
return ExecutionResult(
20252012
None, errors=[GraphQLError(UNEXPECTED_MULTIPLE_PAYLOADS)]
20262013
)
@@ -2041,16 +2028,16 @@ def experimental_execute_incrementally(
20412028
middleware: Optional[Middleware] = None,
20422029
execution_context_class: Optional[Type[ExecutionContext]] = None,
20432030
is_awaitable: Optional[Callable[[Any], bool]] = None,
2044-
) -> AwaitableOrValue[ExperimentalExecuteIncrementallyResults]:
2031+
) -> AwaitableOrValue[Union[ExecutionResult, ExperimentalIncrementalExecutionResults]]:
20452032
"""Execute GraphQL operation incrementally (internal implementation).
20462033
20472034
Implements the "Executing requests" section of the GraphQL specification,
20482035
including `@defer` and `@stream` as proposed in
20492036
https://github.com/graphql/graphql-spec/pull/742
20502037
2051-
This function returns an awaitable of an ExperimentalExecuteIncrementallyResults
2052-
object. This object either contains a single ExecutionResult as
2053-
`single_result`, or an `initial_result` and a stream of `subsequent_results`.
2038+
This function returns an awaitable that is either a single ExecutionResult or
2039+
an ExperimentalIncrementalExecutionResults object, containing an `initialResult`
2040+
and a stream of `subsequent_results`.
20542041
"""
20552042
if execution_context_class is None:
20562043
execution_context_class = ExecutionContext
@@ -2073,16 +2060,14 @@ def experimental_execute_incrementally(
20732060

20742061
# Return early errors if execution context failed.
20752062
if isinstance(context, list):
2076-
return ExperimentalExecuteSingleResult(
2077-
single_result=ExecutionResult(None, errors=context)
2078-
)
2063+
return ExecutionResult(None, errors=context)
20792064

20802065
return execute_impl(context)
20812066

20822067

20832068
def execute_impl(
20842069
context: ExecutionContext,
2085-
) -> AwaitableOrValue[ExperimentalExecuteIncrementallyResults]:
2070+
) -> AwaitableOrValue[Union[ExecutionResult, ExperimentalIncrementalExecutionResults]]:
20862071
"""Execute GraphQL operation (internal implementation)."""
20872072
# Return a possible coroutine object that will eventually yield the data described
20882073
# by the "Response" section of the GraphQL specification.
@@ -2108,39 +2093,35 @@ async def await_result() -> Any:
21082093
await result, errors # type: ignore
21092094
)
21102095
if context.subsequent_payloads:
2111-
return ExperimentalExecuteMultipleResults(
2096+
return ExperimentalIncrementalExecutionResults(
21122097
initial_result=InitialIncrementalExecutionResult(
21132098
initial_result.data,
21142099
initial_result.errors,
21152100
has_next=True,
21162101
),
21172102
subsequent_results=context.yield_subsequent_payloads(),
21182103
)
2119-
return ExperimentalExecuteSingleResult(single_result=initial_result)
2104+
return initial_result
21202105
except GraphQLError as error:
21212106
errors.append(error)
2122-
return ExperimentalExecuteSingleResult(
2123-
single_result=build_response(None, errors)
2124-
)
2107+
return build_response(None, errors)
21252108

21262109
return await_result()
21272110

21282111
initial_result = build_response(result, errors) # type: ignore
21292112
if context.subsequent_payloads:
2130-
return ExperimentalExecuteMultipleResults(
2113+
return ExperimentalIncrementalExecutionResults(
21312114
initial_result=InitialIncrementalExecutionResult(
21322115
initial_result.data,
21332116
initial_result.errors,
21342117
has_next=True,
21352118
),
21362119
subsequent_results=context.yield_subsequent_payloads(),
21372120
)
2138-
return ExperimentalExecuteSingleResult(single_result=initial_result)
2121+
return initial_result
21392122
except GraphQLError as error:
21402123
errors.append(error)
2141-
return ExperimentalExecuteSingleResult(
2142-
single_result=build_response(None, errors)
2143-
)
2124+
return build_response(None, errors)
21442125

21452126

21462127
def assume_not_awaitable(_value: Any) -> bool:
@@ -2192,12 +2173,14 @@ def execute_sync(
21922173
)
21932174

21942175
# Assert that the execution was synchronous.
2195-
if isawaitable(result) or isinstance(result, ExperimentalExecuteMultipleResults):
2176+
if isawaitable(result) or isinstance(
2177+
result, ExperimentalIncrementalExecutionResults
2178+
):
21962179
if isawaitable(result):
21972180
ensure_future(cast(Awaitable[ExecutionResult], result)).cancel()
21982181
raise RuntimeError("GraphQL execution failed to complete synchronously.")
21992182

2200-
return cast(ExperimentalExecuteSingleResult, result).single_result
2183+
return cast(ExecutionResult, result)
22012184

22022185

22032186
def handle_field_error(
@@ -2489,7 +2472,9 @@ async def await_result() -> Any:
24892472

24902473

24912474
async def ensure_async_iterable(
2492-
some_execution_result: ExperimentalExecuteIncrementallyResults,
2475+
some_execution_result: Union[
2476+
ExecutionResult, ExperimentalIncrementalExecutionResults
2477+
],
24932478
) -> AsyncGenerator[
24942479
Union[
24952480
ExecutionResult,
@@ -2498,8 +2483,8 @@ async def ensure_async_iterable(
24982483
],
24992484
None,
25002485
]:
2501-
if isinstance(some_execution_result, ExperimentalExecuteSingleResult):
2502-
yield some_execution_result.single_result
2486+
if isinstance(some_execution_result, ExecutionResult):
2487+
yield some_execution_result
25032488
else:
25042489
yield some_execution_result.initial_result
25052490
async for result in some_execution_result.subsequent_results:

tests/execution/test_defer.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from graphql.error import GraphQLError
77
from graphql.execution import (
88
ExecutionContext,
9-
ExperimentalExecuteMultipleResults,
10-
ExperimentalExecuteSingleResult,
9+
ExecutionResult,
10+
ExperimentalIncrementalExecutionResults,
1111
IncrementalDeferResult,
1212
InitialIncrementalExecutionResult,
1313
SubsequentIncrementalExecutionResult,
@@ -93,14 +93,14 @@ async def resolve_null_async(_obj, _info) -> None:
9393
async def complete(document: DocumentNode, root_value: Any = None) -> Any:
9494
result = experimental_execute_incrementally(schema, document, root_value)
9595

96-
if isinstance(result, ExperimentalExecuteMultipleResults):
96+
if isinstance(result, ExperimentalIncrementalExecutionResults):
9797
results: List[Any] = [result.initial_result.formatted]
9898
async for patch in result.subsequent_results:
9999
results.append(patch.formatted)
100100
return results
101101

102-
assert isinstance(result, ExperimentalExecuteSingleResult)
103-
return result.single_result.formatted
102+
assert isinstance(result, ExecutionResult)
103+
return result.formatted
104104

105105

106106
def modified_args(args: Dict[str, Any], **modifications: Any) -> Dict[str, Any]:

tests/execution/test_mutations.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from pytest import mark
55

66
from graphql.execution import (
7-
ExperimentalExecuteMultipleResults,
7+
ExperimentalIncrementalExecutionResults,
88
execute,
99
execute_sync,
1010
experimental_execute_incrementally,
@@ -234,7 +234,7 @@ async def mutation_fields_with_defer_do_not_block_next_mutation():
234234
)
235235

236236
patches: List[Any] = []
237-
assert isinstance(mutation_result, ExperimentalExecuteMultipleResults)
237+
assert isinstance(mutation_result, ExperimentalIncrementalExecutionResults)
238238
patches.append(mutation_result.initial_result.formatted)
239239
async for patch in mutation_result.subsequent_results:
240240
patches.append(patch.formatted)
@@ -305,7 +305,7 @@ async def mutation_with_defer_is_not_executed_serially():
305305
)
306306

307307
patches: List[Any] = []
308-
assert isinstance(mutation_result, ExperimentalExecuteMultipleResults)
308+
assert isinstance(mutation_result, ExperimentalIncrementalExecutionResults)
309309
patches.append(mutation_result.initial_result.formatted)
310310
async for patch in mutation_result.subsequent_results:
311311
patches.append(patch.formatted)

0 commit comments

Comments
 (0)