8000 Refactor using a new complete_awaitable_value() method · graphql-python/graphql-core@9bb0b05 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9bb0b05

Browse files
committed
Refactor using a new complete_awaitable_value() method
Replicates graphql/graphql-js@1564174
1 parent 5feaeeb commit 9bb0b05

File tree

1 file changed

+43
-56
lines changed

1 file changed

+43
-56
lines changed

src/graphql/execution/execute.py

Lines changed: 43 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -969,26 +969,9 @@ def execute_field(
969969
result = resolve_fn(source, info, **args)
970970

971971
if self.is_awaitable(result):
972-
# noinspection PyShadowingNames
973-
async def await_result() -> Any:
974-
try:
975-
completed = self.complete_value(
976-
return_type,
977-
field_nodes,
978-
info,
979-
path,
980-
await result,
981-
async_payload_record,
982-
)
983-
if self.is_awaitable(completed):
984-
return await completed
985-
except Exception as raw_error:
986-
error = located_error(raw_error, field_nodes, path.as_list())
987-
handle_field_error(error, return_type, errors)
988-
return None
989-
return completed
990-
991-
return await_result()
972+
return self.complete_awaitable_value(
973+
return_type, field_nodes, info, path, result, async_payload_record
974+
)
992975

993976
completed = self.complete_value(
994977
return_type, field_nodes, info, path, result, async_payload_record
@@ -1131,6 +1114,37 @@ def complete_value(
11311114
) # pragma: no cover
11321115
raise TypeError(msg) # pragma: no cover
11331116

1117+
async def complete_awaitable_value(
1118+
self,
1119+
return_type: GraphQLOutputType,
1120+
field_nodes: List[FieldNode],
1121+
info: GraphQLResolveInfo,
1122+
path: Path,
1123+
result: Any,
1124+
async_payload_record: Optional[AsyncPayloadRecord] = None,
1125+
) -> Any:
1126+
"""Complete an awaitable value."""
1127+
try:
1128+
resolved = await result
1129+
completed = self.complete_value(
1130+
return_type,
1131+
field_nodes,
1132+
info,
1133+
path,
1134+
resolved,
1135+
async_payload_record,
1136+
)
1137+
if self.is_awaitable(completed):
1138+
completed = await completed
1139+
except Exception as raw_error:
1140+
errors = (
1141+
async_payload_record.errors if async_payload_record else self.errors
1142+
)
1143+
error = located_error(raw_error, field_nodes, path.as_list())
1144+
handle_field_error(error, return_type, errors)
1145+
completed = None
1146+
return completed
1147+
11341148
def get_stream_values(
11351149
self, field_nodes: List[FieldNode], path: Path
11361150
) -> Optional[StreamArguments]:
@@ -1361,25 +1375,11 @@ def complete_list_item_value(
13611375
is_awaitable = self.is_awaitable
13621376

13631377
if is_awaitable(item):
1364-
# noinspection PyShadowingNames
1365-
async def await_completed() -> Any:
1366-
try:
1367-
completed = self.complete_value(
1368-
item_type,
1369-
field_nodes,
1370-
info,
1371-
item_path,
1372-
await item,
1373-
async_payload_record,
1374-
)
1375-
return await completed if is_awaitable(completed) else completed
1376-
except Exception as raw_error:
1377-
error = located_error(raw_error, field_nodes, item_path.as_list())
1378-
handle_field_error(error, item_type, errors)
1379-
self.filter_subsequent_payloads(item_path, async_payload_record)
1380-
return None
1381-
1382-
complete_results.append(await_completed())
1378+
complete_results.append(
1379+
self.complete_awaitable_value(
1380+
item_type, field_nodes, info, item_path, item, async_payload_record
1381+
)
1382+
)
13831383
return True
13841384

13851385
try:
@@ -1745,29 +1745,16 @@ def execute_stream_field(
17451745
# noinspection PyShadowingNames
17461746
async def await_completed_items() -> Optional[List[Any]]:
17471747
try:
1748-
try:
1749-
completed = self.complete_value(
1748+
return [
1749+
await self.complete_awaitable_value(
17501750
item_type,
17511751
field_nodes,
17521752
info,
17531753
item_path,
1754-
await item,
1754+
item,
17551755
async_payload_record,
17561756
)
1757-
return [
1758-
await completed
1759-
if self.is_awaitable(completed)
1760-
else completed
1761-
]
1762-
except Exception as raw_error:
1763-
error = located_error(
1764-
raw_error, field_nodes, item_path.as_list()
1765-
)
1766-
handle_field_error(
1767-
error, item_type, async_payload_record.errors
1768-
)
1769-
self.filter_subsequent_payloads(item_path, async_payload_record)
1770-
return [None]
1757+
]
17711758
except GraphQLError as error:
17721759
async_payload_record.errors.append(error)
17731760
self.filter_subsequent_payloads(path, async_payload_record)

0 commit comments

Comments
 (0)
0