66 CancelledError ,
77 TimeoutError , # only needed for Python < 3.11 # noqa: A004
88 ensure_future ,
9+ sleep ,
910)
1011from contextlib import suppress
1112from copy import copy
4041)
4142from ..pyutils import (
4243 AwaitableOrValue ,
44+ BoxedAwaitableOrValue ,
4345 Path ,
4446 RefMap ,
4547 Undefined ,
@@ -1627,7 +1629,8 @@ def execute_deferred_grouped_field_sets(
16271629 )
16281630
16291631 deferred_grouped_field_set_record = DeferredGroupedFieldSetRecord (
1630- deferred_fragment_records , cast ("DeferredGroupedFieldSetResult" , None )
1632+ deferred_fragment_records ,
1633+ cast ("BoxedAwaitableOrValue[DeferredGroupedFieldSetResult]" , None ),
16311634 )
16321635
16331636 if should_defer (parent_defer_usages , defer_usage_set ):
@@ -1650,10 +1653,12 @@ async def executor(
16501653 return await result
16511654 return cast ("DeferredGroupedFieldSetResult" , result )
16521655
1653- deferred_grouped_field_set_record .result = executor (
1654- deferred_grouped_field_set_record ,
1655- grouped_field_set ,
1656- defer_usage_set ,
1656+ deferred_grouped_field_set_record .result = BoxedAwaitableOrValue (
1657+ executor (
1658+ deferred_grouped_field_set_record ,
1659+ grouped_field_set ,
1660+ defer_usage_set ,
1661+ )
16571662 )
16581663 else :
16591664 executed = self .execute_deferred_grouped_field_set (
@@ -1665,7 +1670,9 @@ async def executor(
16651670 IncrementalContext (defer_usage_set ),
16661671 defer_map ,
16671672 )
1668- deferred_grouped_field_set_record .result = executed
1673+ deferred_grouped_field_set_record .result = BoxedAwaitableOrValue (
1674+ executed
1675+ )
16691676
16701677 append_record (deferred_grouped_field_set_record )
16711678
@@ -1743,59 +1750,71 @@ async def await_result() -> StreamItemsResult:
17431750 path = stream_record .path
17441751 initial_path = Path (path , initial_index , None )
17451752
1746- result = self .complete_stream_items (
1747- stream_record ,
1748- initial_path ,
1749- initial_item ,
1750- IncrementalContext (),
1751- field_group ,
1752- info ,
1753- item_type ,
1753+ result : BoxedAwaitableOrValue [StreamItemsResult ] = BoxedAwaitableOrValue (
1754+ self .complete_stream_items (
1755+ stream_record ,
1756+ initial_path ,
1757+ initial_item ,
1758+ IncrementalContext (),
1759+ field_group ,
1760+ info ,
1761+ item_type ,
1762+ )
17541763 )
17551764 first_stream_items = StreamItemsRecord (stream_record , result )
17561765 current_stream_items = first_stream_items
17571766 current_index = initial_index
17581767 errored_synchronously = False
17591768 for item in iterator :
1760- if not is_awaitable (result ) and not is_reconcilable_stream_items_result (
1761- result # type: ignore
1769+ value = result .value
1770+ if not is_awaitable (value ) and not is_reconcilable_stream_items_result (
1771+ value
17621772 ):
17631773 errored_synchronously = True
17641774 break
17651775 current_index += 1
17661776 current_path = Path (path , current_index , None )
1767- result = self .complete_stream_items (
1768- stream_record ,
1769- current_path ,
1770- item ,
1771- IncrementalContext (),
1772- field_group ,
1773- info ,
1774- item_type ,
1777+ result = BoxedAwaitableOrValue (
1778+ self .complete_stream_items (
1779+ stream_record ,
1780+ current_path ,
1781+ item ,
1782+ IncrementalContext (),
1783+ field_group ,
1784+ info ,
1785+ item_type ,
1786+ )
17751787 )
17761788
17771789 next_stream_items = StreamItemsRecord (stream_record , result )
1778- current_stream_items .result = prepend_next_stream_items (
1779- current_stream_items .result , next_stream_items
1790+ current_stream_items .result = BoxedAwaitableOrValue (
1791+ prepend_next_stream_items (
1792+ current_stream_items .result .value , next_stream_items
1793+ )
17801794 )
17811795 current_stream_items = next_stream_items
17821796
17831797 # If a non-reconcilable stream items result was encountered,
17841798 # then the stream terminates in error. Otherwise, add a stream terminator.
17851799 if not errored_synchronously :
1786- current_stream_items .result = prepend_next_stream_items (
1787- current_stream_items .result ,
1788- StreamItemsRecord (
1789- stream_record , TerminatingStreamItemsResult (stream_record )
1790- ),
1800+ current_stream_items .result = BoxedAwaitableOrValue (
1801+ prepend_next_stream_items (
1802+ current_stream_items .result .value ,
1803+ StreamItemsRecord (
1804+ stream_record ,
1805+ BoxedAwaitableOrValue (
1806+ TerminatingStreamItemsResult (stream_record ),
1807+ ),
1808+ ),
1809+ )
17911810 )
17921811
1793- result = first_stream_items .result
1794- if is_awaitable (result ):
1795- return await result
1796- return cast ( "StreamItemsResult" , result )
1812+ value = first_stream_items .result . value
1813+ if is_awaitable (value ):
1814+ return await value
1815+ return value
17971816
1798- return StreamItemsRecord (stream_record , await_result ())
1817+ return StreamItemsRecord (stream_record , BoxedAwaitableOrValue ( await_result () ))
17991818
18001819 def first_async_stream_items (
18011820 self ,
@@ -1810,14 +1829,16 @@ def first_async_stream_items(
18101829 """Get the first async stream items."""
18111830 return StreamItemsRecord (
18121831 stream_record ,
1813- self .get_next_async_stream_items_result (
1814- stream_record ,
1815- path ,
1816- initial_index ,
1817- async_iterator ,
1818- field_group ,
1819- info ,
1820- item_type ,
1832+ BoxedAwaitableOrValue (
1833+ self .get_next_async_stream_items_result (
1834+ stream_record ,
1835+ path ,
1836+ initial_index ,
1837+ async_iterator ,
1838+ field_group ,
1839+ info ,
1840+ item_type ,
1841+ )
18211842 ),
18221843 )
18231844
@@ -1856,14 +1877,23 @@ async def get_next_async_stream_items_result(
18561877
18571878 next_stream_items_record = StreamItemsRecord (
18581879 stream_record ,
1859- self .get_next_async_stream_items_result (
1860- stream_record , path , index , async_iterator , field_group , info , item_type
1880+ BoxedAwaitableOrValue (
1881+ self .get_next_async_stream_items_result (
1882+ stream_record ,
1883+ path ,
1884+ index ,
1885+ async_iterator ,
1886+ field_group ,
1887+ info ,
1888+ item_type ,
1889+ )
18611890 ),
18621891 )
18631892
18641893 result = self .prepend_next_stream_items (result , next_stream_items_record )
18651894
18661895 if self .is_awaitable (result ):
1896+ await sleep (0 )
18671897 return await result
18681898 return cast ("StreamItemsResult" , result )
18691899
0 commit comments