mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
asyncio: Add gi_{frame,running,code} properties to CoroWrapper (upstream #163).
This commit is contained in:
parent
715ef02ddc
commit
0cbc76880f
2 changed files with 59 additions and 0 deletions
|
@ -63,6 +63,18 @@ class CoroWrapper:
|
||||||
def close(self):
|
def close(self):
|
||||||
return self.gen.close()
|
return self.gen.close()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def gi_frame(self):
|
||||||
|
return self.gen.gi_frame
|
||||||
|
|
||||||
|
@property
|
||||||
|
def gi_running(self):
|
||||||
|
return self.gen.gi_running
|
||||||
|
|
||||||
|
@property
|
||||||
|
def gi_code(self):
|
||||||
|
return self.gen.gi_code
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
frame = self.gen.gi_frame
|
frame = self.gen.gi_frame
|
||||||
if frame is not None and frame.f_lasti == -1:
|
if frame is not None and frame.f_lasti == -1:
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
import gc
|
import gc
|
||||||
import os.path
|
import os.path
|
||||||
|
import types
|
||||||
import unittest
|
import unittest
|
||||||
from test.script_helper import assert_python_ok
|
from test.script_helper import assert_python_ok
|
||||||
|
|
||||||
|
@ -1386,6 +1387,52 @@ class TaskTests(unittest.TestCase):
|
||||||
self.assertRaises(ValueError, self.loop.run_until_complete,
|
self.assertRaises(ValueError, self.loop.run_until_complete,
|
||||||
asyncio.wait([], loop=self.loop))
|
asyncio.wait([], loop=self.loop))
|
||||||
|
|
||||||
|
def test_corowrapper_mocks_generator(self):
|
||||||
|
|
||||||
|
def check():
|
||||||
|
# A function that asserts various things.
|
||||||
|
# Called twice, with different debug flag values.
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def coro():
|
||||||
|
# The actual coroutine.
|
||||||
|
self.assertTrue(gen.gi_running)
|
||||||
|
yield from fut
|
||||||
|
|
||||||
|
# A completed Future used to run the coroutine.
|
||||||
|
fut = asyncio.Future(loop=self.loop)
|
||||||
|
fut.set_result(None)
|
||||||
|
|
||||||
|
# Call the coroutine.
|
||||||
|
gen = coro()
|
||||||
|
|
||||||
|
# Check some properties.
|
||||||
|
self.assertTrue(asyncio.iscoroutine(gen))
|
||||||
|
self.assertIsInstance(gen.gi_frame, types.FrameType)
|
||||||
|
self.assertFalse(gen.gi_running)
|
||||||
|
self.assertIsInstance(gen.gi_code, types.CodeType)
|
||||||
|
|
||||||
|
# Run it.
|
||||||
|
self.loop.run_until_complete(gen)
|
||||||
|
|
||||||
|
# The frame should have changed.
|
||||||
|
self.assertIsNone(gen.gi_frame)
|
||||||
|
|
||||||
|
# Save debug flag.
|
||||||
|
old_debug = asyncio.tasks._DEBUG
|
||||||
|
try:
|
||||||
|
# Test with debug flag cleared.
|
||||||
|
asyncio.tasks._DEBUG = False
|
||||||
|
check()
|
||||||
|
|
||||||
|
# Test with debug flag set.
|
||||||
|
asyncio.tasks._DEBUG = True
|
||||||
|
check()
|
||||||
|
|
||||||
|
finally:
|
||||||
|
# Restore original debug flag.
|
||||||
|
asyncio.tasks._DEBUG = old_debug
|
||||||
|
|
||||||
def test_yield_from_corowrapper(self):
|
def test_yield_from_corowrapper(self):
|
||||||
old_debug = asyncio.tasks._DEBUG
|
old_debug = asyncio.tasks._DEBUG
|
||||||
asyncio.tasks._DEBUG = True
|
asyncio.tasks._DEBUG = True
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue