mirror of
https://github.com/python/cpython.git
synced 2025-08-27 20:25:18 +00:00
[3.9] bpo-45097: Remove incorrect deprecation warnings in asyncio. (GH-28153)
Deprecation warnings about the loop argument were incorrectly emitted in cases when the loop argument was used inside the asyncio library, not from user code.
This commit is contained in:
parent
ce83e42437
commit
c967bd523c
11 changed files with 234 additions and 181 deletions
|
@ -350,7 +350,7 @@ class Server(events.AbstractServer):
|
||||||
self._start_serving()
|
self._start_serving()
|
||||||
# Skip one loop iteration so that all 'loop.add_reader'
|
# Skip one loop iteration so that all 'loop.add_reader'
|
||||||
# go through.
|
# go through.
|
||||||
await tasks.sleep(0, loop=self._loop)
|
await tasks.sleep(0)
|
||||||
|
|
||||||
async def serve_forever(self):
|
async def serve_forever(self):
|
||||||
if self._serving_forever_fut is not None:
|
if self._serving_forever_fut is not None:
|
||||||
|
@ -539,7 +539,7 @@ class BaseEventLoop(events.AbstractEventLoop):
|
||||||
closing_agens = list(self._asyncgens)
|
closing_agens = list(self._asyncgens)
|
||||||
self._asyncgens.clear()
|
self._asyncgens.clear()
|
||||||
|
|
||||||
results = await tasks.gather(
|
results = await tasks._gather(
|
||||||
*[ag.aclose() for ag in closing_agens],
|
*[ag.aclose() for ag in closing_agens],
|
||||||
return_exceptions=True,
|
return_exceptions=True,
|
||||||
loop=self)
|
loop=self)
|
||||||
|
@ -1457,7 +1457,7 @@ class BaseEventLoop(events.AbstractEventLoop):
|
||||||
fs = [self._create_server_getaddrinfo(host, port, family=family,
|
fs = [self._create_server_getaddrinfo(host, port, family=family,
|
||||||
flags=flags)
|
flags=flags)
|
||||||
for host in hosts]
|
for host in hosts]
|
||||||
infos = await tasks.gather(*fs, loop=self)
|
infos = await tasks._gather(*fs, loop=self)
|
||||||
infos = set(itertools.chain.from_iterable(infos))
|
infos = set(itertools.chain.from_iterable(infos))
|
||||||
|
|
||||||
completed = False
|
completed = False
|
||||||
|
@ -1515,7 +1515,7 @@ class BaseEventLoop(events.AbstractEventLoop):
|
||||||
server._start_serving()
|
server._start_serving()
|
||||||
# Skip one loop iteration so that all 'loop.add_reader'
|
# Skip one loop iteration so that all 'loop.add_reader'
|
||||||
# go through.
|
# go through.
|
||||||
await tasks.sleep(0, loop=self)
|
await tasks.sleep(0)
|
||||||
|
|
||||||
if self._debug:
|
if self._debug:
|
||||||
logger.info("%r is serving", server)
|
logger.info("%r is serving", server)
|
||||||
|
|
|
@ -61,7 +61,7 @@ def _cancel_all_tasks(loop):
|
||||||
task.cancel()
|
task.cancel()
|
||||||
|
|
||||||
loop.run_until_complete(
|
loop.run_until_complete(
|
||||||
tasks.gather(*to_cancel, loop=loop, return_exceptions=True))
|
tasks._gather(*to_cancel, loop=loop, return_exceptions=True))
|
||||||
|
|
||||||
for task in to_cancel:
|
for task in to_cancel:
|
||||||
if task.cancelled():
|
if task.cancelled():
|
||||||
|
|
|
@ -193,8 +193,8 @@ class Process:
|
||||||
stderr = self._read_stream(2)
|
stderr = self._read_stream(2)
|
||||||
else:
|
else:
|
||||||
stderr = self._noop()
|
stderr = self._noop()
|
||||||
stdin, stdout, stderr = await tasks.gather(stdin, stdout, stderr,
|
stdin, stdout, stderr = await tasks._gather(stdin, stdout, stderr,
|
||||||
loop=self._loop)
|
loop=self._loop)
|
||||||
await self.wait()
|
await self.wait()
|
||||||
return (stdout, stderr)
|
return (stdout, stderr)
|
||||||
|
|
||||||
|
|
|
@ -580,15 +580,16 @@ def as_completed(fs, *, loop=None, timeout=None):
|
||||||
if futures.isfuture(fs) or coroutines.iscoroutine(fs):
|
if futures.isfuture(fs) or coroutines.iscoroutine(fs):
|
||||||
raise TypeError(f"expect an iterable of futures, not {type(fs).__name__}")
|
raise TypeError(f"expect an iterable of futures, not {type(fs).__name__}")
|
||||||
|
|
||||||
|
if loop is not None:
|
||||||
|
warnings.warn("The loop argument is deprecated since Python 3.8, "
|
||||||
|
"and scheduled for removal in Python 3.10.",
|
||||||
|
DeprecationWarning, stacklevel=2)
|
||||||
|
|
||||||
from .queues import Queue # Import here to avoid circular import problem.
|
from .queues import Queue # Import here to avoid circular import problem.
|
||||||
done = Queue(loop=loop)
|
done = Queue(loop=loop)
|
||||||
|
|
||||||
if loop is None:
|
if loop is None:
|
||||||
loop = events.get_event_loop()
|
loop = events.get_event_loop()
|
||||||
else:
|
|
||||||
warnings.warn("The loop argument is deprecated since Python 3.8, "
|
|
||||||
"and scheduled for removal in Python 3.10.",
|
|
||||||
DeprecationWarning, stacklevel=2)
|
|
||||||
todo = {ensure_future(f, loop=loop) for f in set(fs)}
|
todo = {ensure_future(f, loop=loop) for f in set(fs)}
|
||||||
timeout_handle = None
|
timeout_handle = None
|
||||||
|
|
||||||
|
@ -756,6 +757,10 @@ def gather(*coros_or_futures, loop=None, return_exceptions=False):
|
||||||
"and scheduled for removal in Python 3.10.",
|
"and scheduled for removal in Python 3.10.",
|
||||||
DeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2)
|
||||||
|
|
||||||
|
return _gather(*coros_or_futures, loop=loop, return_exceptions=return_exceptions)
|
||||||
|
|
||||||
|
|
||||||
|
def _gather(*coros_or_futures, loop=None, return_exceptions=False):
|
||||||
if not coros_or_futures:
|
if not coros_or_futures:
|
||||||
if loop is None:
|
if loop is None:
|
||||||
loop = events.get_event_loop()
|
loop = events.get_event_loop()
|
||||||
|
|
|
@ -323,7 +323,7 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
|
||||||
server._start_serving()
|
server._start_serving()
|
||||||
# Skip one loop iteration so that all 'loop.add_reader'
|
# Skip one loop iteration so that all 'loop.add_reader'
|
||||||
# go through.
|
# go through.
|
||||||
await tasks.sleep(0, loop=self)
|
await tasks.sleep(0)
|
||||||
|
|
||||||
return server
|
return server
|
||||||
|
|
||||||
|
|
|
@ -1077,6 +1077,84 @@ class AsyncGenAsyncioTest(unittest.TestCase):
|
||||||
|
|
||||||
self.assertEqual(finalized, 2)
|
self.assertEqual(finalized, 2)
|
||||||
|
|
||||||
|
def test_async_gen_asyncio_shutdown_02(self):
|
||||||
|
messages = []
|
||||||
|
|
||||||
|
def exception_handler(loop, context):
|
||||||
|
messages.append(context)
|
||||||
|
|
||||||
|
async def async_iterate():
|
||||||
|
yield 1
|
||||||
|
yield 2
|
||||||
|
|
||||||
|
it = async_iterate()
|
||||||
|
async def main():
|
||||||
|
loop = asyncio.get_running_loop()
|
||||||
|
loop.set_exception_handler(exception_handler)
|
||||||
|
|
||||||
|
async for i in it:
|
||||||
|
break
|
||||||
|
|
||||||
|
asyncio.run(main())
|
||||||
|
|
||||||
|
self.assertEqual(messages, [])
|
||||||
|
|
||||||
|
def test_async_gen_asyncio_shutdown_exception_01(self):
|
||||||
|
messages = []
|
||||||
|
|
||||||
|
def exception_handler(loop, context):
|
||||||
|
messages.append(context)
|
||||||
|
|
||||||
|
async def async_iterate():
|
||||||
|
try:
|
||||||
|
yield 1
|
||||||
|
yield 2
|
||||||
|
finally:
|
||||||
|
1/0
|
||||||
|
|
||||||
|
it = async_iterate()
|
||||||
|
async def main():
|
||||||
|
loop = asyncio.get_running_loop()
|
||||||
|
loop.set_exception_handler(exception_handler)
|
||||||
|
|
||||||
|
async for i in it:
|
||||||
|
break
|
||||||
|
|
||||||
|
asyncio.run(main())
|
||||||
|
|
||||||
|
message, = messages
|
||||||
|
self.assertEqual(message['asyncgen'], it)
|
||||||
|
self.assertIsInstance(message['exception'], ZeroDivisionError)
|
||||||
|
self.assertIn('an error occurred during closing of asynchronous generator',
|
||||||
|
message['message'])
|
||||||
|
|
||||||
|
def test_async_gen_asyncio_shutdown_exception_02(self):
|
||||||
|
messages = []
|
||||||
|
|
||||||
|
def exception_handler(loop, context):
|
||||||
|
messages.append(context)
|
||||||
|
|
||||||
|
async def async_iterate():
|
||||||
|
try:
|
||||||
|
yield 1
|
||||||
|
yield 2
|
||||||
|
finally:
|
||||||
|
1/0
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
loop = asyncio.get_running_loop()
|
||||||
|
loop.set_exception_handler(exception_handler)
|
||||||
|
|
||||||
|
async for i in async_iterate():
|
||||||
|
break
|
||||||
|
|
||||||
|
asyncio.run(main())
|
||||||
|
|
||||||
|
message, = messages
|
||||||
|
self.assertIsInstance(message['exception'], ZeroDivisionError)
|
||||||
|
self.assertIn('unhandled exception during asyncio.run() shutdown',
|
||||||
|
message['message'])
|
||||||
|
|
||||||
def test_async_gen_expression_01(self):
|
def test_async_gen_expression_01(self):
|
||||||
async def arange(n):
|
async def arange(n):
|
||||||
for i in range(n):
|
for i in range(n):
|
||||||
|
|
|
@ -1,38 +1,10 @@
|
||||||
import os
|
import os
|
||||||
from test import support
|
from test import support
|
||||||
import unittest
|
|
||||||
|
|
||||||
# Skip tests if we don't have concurrent.futures.
|
# Skip tests if we don't have concurrent.futures.
|
||||||
support.import_module('concurrent.futures')
|
support.import_module('concurrent.futures')
|
||||||
|
|
||||||
|
|
||||||
def load_tests(loader, _, pattern):
|
def load_tests(*args):
|
||||||
pkg_dir = os.path.dirname(__file__)
|
pkg_dir = os.path.dirname(__file__)
|
||||||
suite = AsyncioTestSuite()
|
return support.load_package_tests(pkg_dir, *args)
|
||||||
return support.load_package_tests(pkg_dir, loader, suite, pattern)
|
|
||||||
|
|
||||||
|
|
||||||
class AsyncioTestSuite(unittest.TestSuite):
|
|
||||||
"""A custom test suite that also runs setup/teardown for the whole package.
|
|
||||||
|
|
||||||
Normally unittest only runs setUpModule() and tearDownModule() within each
|
|
||||||
test module part of the test suite. Copying those functions to each file
|
|
||||||
would be tedious, let's run this once and for all.
|
|
||||||
"""
|
|
||||||
def run(self, result, debug=False):
|
|
||||||
ignore = support.ignore_deprecations_from
|
|
||||||
tokens = {
|
|
||||||
ignore("asyncio.base_events", like=r".*loop argument.*"),
|
|
||||||
ignore("asyncio.unix_events", like=r".*loop argument.*"),
|
|
||||||
ignore("asyncio.futures", like=r".*loop argument.*"),
|
|
||||||
ignore("asyncio.runners", like=r".*loop argument.*"),
|
|
||||||
ignore("asyncio.subprocess", like=r".*loop argument.*"),
|
|
||||||
ignore("asyncio.tasks", like=r".*loop argument.*"),
|
|
||||||
ignore("test.test_asyncio.test_events", like=r".*loop argument.*"),
|
|
||||||
ignore("test.test_asyncio.test_queues", like=r".*loop argument.*"),
|
|
||||||
ignore("test.test_asyncio.test_tasks", like=r".*loop argument.*"),
|
|
||||||
}
|
|
||||||
try:
|
|
||||||
super().run(result, debug=debug)
|
|
||||||
finally:
|
|
||||||
support.clear_ignored_deprecations(*tokens)
|
|
||||||
|
|
|
@ -205,8 +205,8 @@ class MySubprocessProtocol(asyncio.SubprocessProtocol):
|
||||||
self.disconnects = {fd: loop.create_future() for fd in range(3)}
|
self.disconnects = {fd: loop.create_future() for fd in range(3)}
|
||||||
self.data = {1: b'', 2: b''}
|
self.data = {1: b'', 2: b''}
|
||||||
self.returncode = None
|
self.returncode = None
|
||||||
self.got_data = {1: asyncio.Event(loop=loop),
|
self.got_data = {1: asyncio.Event(),
|
||||||
2: asyncio.Event(loop=loop)}
|
2: asyncio.Event()}
|
||||||
|
|
||||||
def connection_made(self, transport):
|
def connection_made(self, transport):
|
||||||
self.transport = transport
|
self.transport = transport
|
||||||
|
@ -1736,20 +1736,19 @@ class SubprocessTestsMixin:
|
||||||
connect = self.loop.subprocess_exec(
|
connect = self.loop.subprocess_exec(
|
||||||
functools.partial(MySubprocessProtocol, self.loop),
|
functools.partial(MySubprocessProtocol, self.loop),
|
||||||
sys.executable, prog)
|
sys.executable, prog)
|
||||||
with self.assertWarns(DeprecationWarning):
|
transp, proto = self.loop.run_until_complete(connect)
|
||||||
transp, proto = self.loop.run_until_complete(connect)
|
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
self.loop.run_until_complete(proto.connected)
|
||||||
self.loop.run_until_complete(proto.connected)
|
self.assertEqual('CONNECTED', proto.state)
|
||||||
self.assertEqual('CONNECTED', proto.state)
|
|
||||||
|
|
||||||
stdin = transp.get_pipe_transport(0)
|
stdin = transp.get_pipe_transport(0)
|
||||||
stdin.write(b'Python The Winner')
|
stdin.write(b'Python The Winner')
|
||||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||||
with test_utils.disable_logger():
|
with test_utils.disable_logger():
|
||||||
transp.close()
|
transp.close()
|
||||||
self.loop.run_until_complete(proto.completed)
|
self.loop.run_until_complete(proto.completed)
|
||||||
self.check_killed(proto.returncode)
|
self.check_killed(proto.returncode)
|
||||||
self.assertEqual(b'Python The Winner', proto.data[1])
|
self.assertEqual(b'Python The Winner', proto.data[1])
|
||||||
|
|
||||||
def test_subprocess_interactive(self):
|
def test_subprocess_interactive(self):
|
||||||
prog = os.path.join(os.path.dirname(__file__), 'echo.py')
|
prog = os.path.join(os.path.dirname(__file__), 'echo.py')
|
||||||
|
@ -1758,51 +1757,48 @@ class SubprocessTestsMixin:
|
||||||
functools.partial(MySubprocessProtocol, self.loop),
|
functools.partial(MySubprocessProtocol, self.loop),
|
||||||
sys.executable, prog)
|
sys.executable, prog)
|
||||||
|
|
||||||
with self.assertWarns(DeprecationWarning):
|
transp, proto = self.loop.run_until_complete(connect)
|
||||||
transp, proto = self.loop.run_until_complete(connect)
|
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
self.loop.run_until_complete(proto.connected)
|
||||||
self.loop.run_until_complete(proto.connected)
|
self.assertEqual('CONNECTED', proto.state)
|
||||||
self.assertEqual('CONNECTED', proto.state)
|
|
||||||
|
|
||||||
stdin = transp.get_pipe_transport(0)
|
stdin = transp.get_pipe_transport(0)
|
||||||
stdin.write(b'Python ')
|
stdin.write(b'Python ')
|
||||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||||
proto.got_data[1].clear()
|
proto.got_data[1].clear()
|
||||||
self.assertEqual(b'Python ', proto.data[1])
|
self.assertEqual(b'Python ', proto.data[1])
|
||||||
|
|
||||||
stdin.write(b'The Winner')
|
stdin.write(b'The Winner')
|
||||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||||
self.assertEqual(b'Python The Winner', proto.data[1])
|
self.assertEqual(b'Python The Winner', proto.data[1])
|
||||||
|
|
||||||
with test_utils.disable_logger():
|
with test_utils.disable_logger():
|
||||||
transp.close()
|
transp.close()
|
||||||
self.loop.run_until_complete(proto.completed)
|
self.loop.run_until_complete(proto.completed)
|
||||||
self.check_killed(proto.returncode)
|
self.check_killed(proto.returncode)
|
||||||
|
|
||||||
def test_subprocess_shell(self):
|
def test_subprocess_shell(self):
|
||||||
with self.assertWarns(DeprecationWarning):
|
connect = self.loop.subprocess_shell(
|
||||||
connect = self.loop.subprocess_shell(
|
functools.partial(MySubprocessProtocol, self.loop),
|
||||||
functools.partial(MySubprocessProtocol, self.loop),
|
'echo Python')
|
||||||
'echo Python')
|
transp, proto = self.loop.run_until_complete(connect)
|
||||||
transp, proto = self.loop.run_until_complete(connect)
|
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
self.loop.run_until_complete(proto.connected)
|
||||||
self.loop.run_until_complete(proto.connected)
|
|
||||||
|
|
||||||
transp.get_pipe_transport(0).close()
|
transp.get_pipe_transport(0).close()
|
||||||
self.loop.run_until_complete(proto.completed)
|
self.loop.run_until_complete(proto.completed)
|
||||||
self.assertEqual(0, proto.returncode)
|
self.assertEqual(0, proto.returncode)
|
||||||
self.assertTrue(all(f.done() for f in proto.disconnects.values()))
|
self.assertTrue(all(f.done() for f in proto.disconnects.values()))
|
||||||
self.assertEqual(proto.data[1].rstrip(b'\r\n'), b'Python')
|
self.assertEqual(proto.data[1].rstrip(b'\r\n'), b'Python')
|
||||||
self.assertEqual(proto.data[2], b'')
|
self.assertEqual(proto.data[2], b'')
|
||||||
transp.close()
|
transp.close()
|
||||||
|
|
||||||
def test_subprocess_exitcode(self):
|
def test_subprocess_exitcode(self):
|
||||||
connect = self.loop.subprocess_shell(
|
connect = self.loop.subprocess_shell(
|
||||||
functools.partial(MySubprocessProtocol, self.loop),
|
functools.partial(MySubprocessProtocol, self.loop),
|
||||||
'exit 7', stdin=None, stdout=None, stderr=None)
|
'exit 7', stdin=None, stdout=None, stderr=None)
|
||||||
|
|
||||||
with self.assertWarns(DeprecationWarning):
|
transp, proto = self.loop.run_until_complete(connect)
|
||||||
transp, proto = self.loop.run_until_complete(connect)
|
|
||||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||||
self.loop.run_until_complete(proto.completed)
|
self.loop.run_until_complete(proto.completed)
|
||||||
self.assertEqual(7, proto.returncode)
|
self.assertEqual(7, proto.returncode)
|
||||||
|
@ -1812,8 +1808,7 @@ class SubprocessTestsMixin:
|
||||||
connect = self.loop.subprocess_shell(
|
connect = self.loop.subprocess_shell(
|
||||||
functools.partial(MySubprocessProtocol, self.loop),
|
functools.partial(MySubprocessProtocol, self.loop),
|
||||||
'exit 7', stdin=None, stdout=None, stderr=None)
|
'exit 7', stdin=None, stdout=None, stderr=None)
|
||||||
with self.assertWarns(DeprecationWarning):
|
transp, proto = self.loop.run_until_complete(connect)
|
||||||
transp, proto = self.loop.run_until_complete(connect)
|
|
||||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||||
self.assertIsNone(transp.get_pipe_transport(0))
|
self.assertIsNone(transp.get_pipe_transport(0))
|
||||||
self.assertIsNone(transp.get_pipe_transport(1))
|
self.assertIsNone(transp.get_pipe_transport(1))
|
||||||
|
@ -1829,15 +1824,14 @@ class SubprocessTestsMixin:
|
||||||
functools.partial(MySubprocessProtocol, self.loop),
|
functools.partial(MySubprocessProtocol, self.loop),
|
||||||
sys.executable, prog)
|
sys.executable, prog)
|
||||||
|
|
||||||
with self.assertWarns(DeprecationWarning):
|
transp, proto = self.loop.run_until_complete(connect)
|
||||||
transp, proto = self.loop.run_until_complete(connect)
|
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
self.loop.run_until_complete(proto.connected)
|
||||||
self.loop.run_until_complete(proto.connected)
|
|
||||||
|
|
||||||
transp.kill()
|
transp.kill()
|
||||||
self.loop.run_until_complete(proto.completed)
|
self.loop.run_until_complete(proto.completed)
|
||||||
self.check_killed(proto.returncode)
|
self.check_killed(proto.returncode)
|
||||||
transp.close()
|
transp.close()
|
||||||
|
|
||||||
def test_subprocess_terminate(self):
|
def test_subprocess_terminate(self):
|
||||||
prog = os.path.join(os.path.dirname(__file__), 'echo.py')
|
prog = os.path.join(os.path.dirname(__file__), 'echo.py')
|
||||||
|
@ -1846,15 +1840,14 @@ class SubprocessTestsMixin:
|
||||||
functools.partial(MySubprocessProtocol, self.loop),
|
functools.partial(MySubprocessProtocol, self.loop),
|
||||||
sys.executable, prog)
|
sys.executable, prog)
|
||||||
|
|
||||||
with self.assertWarns(DeprecationWarning):
|
transp, proto = self.loop.run_until_complete(connect)
|
||||||
transp, proto = self.loop.run_until_complete(connect)
|
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
self.loop.run_until_complete(proto.connected)
|
||||||
self.loop.run_until_complete(proto.connected)
|
|
||||||
|
|
||||||
transp.terminate()
|
transp.terminate()
|
||||||
self.loop.run_until_complete(proto.completed)
|
self.loop.run_until_complete(proto.completed)
|
||||||
self.check_terminated(proto.returncode)
|
self.check_terminated(proto.returncode)
|
||||||
transp.close()
|
transp.close()
|
||||||
|
|
||||||
@unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP")
|
@unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP")
|
||||||
def test_subprocess_send_signal(self):
|
def test_subprocess_send_signal(self):
|
||||||
|
@ -1869,15 +1862,14 @@ class SubprocessTestsMixin:
|
||||||
functools.partial(MySubprocessProtocol, self.loop),
|
functools.partial(MySubprocessProtocol, self.loop),
|
||||||
sys.executable, prog)
|
sys.executable, prog)
|
||||||
|
|
||||||
with self.assertWarns(DeprecationWarning):
|
transp, proto = self.loop.run_until_complete(connect)
|
||||||
transp, proto = self.loop.run_until_complete(connect)
|
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
self.loop.run_until_complete(proto.connected)
|
||||||
self.loop.run_until_complete(proto.connected)
|
|
||||||
|
|
||||||
transp.send_signal(signal.SIGHUP)
|
transp.send_signal(signal.SIGHUP)
|
||||||
self.loop.run_until_complete(proto.completed)
|
self.loop.run_until_complete(proto.completed)
|
||||||
self.assertEqual(-signal.SIGHUP, proto.returncode)
|
self.assertEqual(-signal.SIGHUP, proto.returncode)
|
||||||
transp.close()
|
transp.close()
|
||||||
finally:
|
finally:
|
||||||
signal.signal(signal.SIGHUP, old_handler)
|
signal.signal(signal.SIGHUP, old_handler)
|
||||||
|
|
||||||
|
@ -1888,20 +1880,19 @@ class SubprocessTestsMixin:
|
||||||
functools.partial(MySubprocessProtocol, self.loop),
|
functools.partial(MySubprocessProtocol, self.loop),
|
||||||
sys.executable, prog)
|
sys.executable, prog)
|
||||||
|
|
||||||
with self.assertWarns(DeprecationWarning):
|
transp, proto = self.loop.run_until_complete(connect)
|
||||||
transp, proto = self.loop.run_until_complete(connect)
|
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
self.loop.run_until_complete(proto.connected)
|
||||||
self.loop.run_until_complete(proto.connected)
|
|
||||||
|
|
||||||
stdin = transp.get_pipe_transport(0)
|
stdin = transp.get_pipe_transport(0)
|
||||||
stdin.write(b'test')
|
stdin.write(b'test')
|
||||||
|
|
||||||
self.loop.run_until_complete(proto.completed)
|
self.loop.run_until_complete(proto.completed)
|
||||||
|
|
||||||
transp.close()
|
transp.close()
|
||||||
self.assertEqual(b'OUT:test', proto.data[1])
|
self.assertEqual(b'OUT:test', proto.data[1])
|
||||||
self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2])
|
self.assertTrue(proto.data[2].startswith(b'ERR:test'), proto.data[2])
|
||||||
self.assertEqual(0, proto.returncode)
|
self.assertEqual(0, proto.returncode)
|
||||||
|
|
||||||
def test_subprocess_stderr_redirect_to_stdout(self):
|
def test_subprocess_stderr_redirect_to_stdout(self):
|
||||||
prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
|
prog = os.path.join(os.path.dirname(__file__), 'echo2.py')
|
||||||
|
@ -1910,23 +1901,22 @@ class SubprocessTestsMixin:
|
||||||
functools.partial(MySubprocessProtocol, self.loop),
|
functools.partial(MySubprocessProtocol, self.loop),
|
||||||
sys.executable, prog, stderr=subprocess.STDOUT)
|
sys.executable, prog, stderr=subprocess.STDOUT)
|
||||||
|
|
||||||
with self.assertWarns(DeprecationWarning):
|
transp, proto = self.loop.run_until_complete(connect)
|
||||||
transp, proto = self.loop.run_until_complete(connect)
|
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
self.loop.run_until_complete(proto.connected)
|
||||||
self.loop.run_until_complete(proto.connected)
|
|
||||||
|
|
||||||
stdin = transp.get_pipe_transport(0)
|
stdin = transp.get_pipe_transport(0)
|
||||||
self.assertIsNotNone(transp.get_pipe_transport(1))
|
self.assertIsNotNone(transp.get_pipe_transport(1))
|
||||||
self.assertIsNone(transp.get_pipe_transport(2))
|
self.assertIsNone(transp.get_pipe_transport(2))
|
||||||
|
|
||||||
stdin.write(b'test')
|
stdin.write(b'test')
|
||||||
self.loop.run_until_complete(proto.completed)
|
self.loop.run_until_complete(proto.completed)
|
||||||
self.assertTrue(proto.data[1].startswith(b'OUT:testERR:test'),
|
self.assertTrue(proto.data[1].startswith(b'OUT:testERR:test'),
|
||||||
proto.data[1])
|
proto.data[1])
|
||||||
self.assertEqual(b'', proto.data[2])
|
self.assertEqual(b'', proto.data[2])
|
||||||
|
|
||||||
transp.close()
|
transp.close()
|
||||||
self.assertEqual(0, proto.returncode)
|
self.assertEqual(0, proto.returncode)
|
||||||
|
|
||||||
def test_subprocess_close_client_stream(self):
|
def test_subprocess_close_client_stream(self):
|
||||||
prog = os.path.join(os.path.dirname(__file__), 'echo3.py')
|
prog = os.path.join(os.path.dirname(__file__), 'echo3.py')
|
||||||
|
@ -1934,33 +1924,32 @@ class SubprocessTestsMixin:
|
||||||
connect = self.loop.subprocess_exec(
|
connect = self.loop.subprocess_exec(
|
||||||
functools.partial(MySubprocessProtocol, self.loop),
|
functools.partial(MySubprocessProtocol, self.loop),
|
||||||
sys.executable, prog)
|
sys.executable, prog)
|
||||||
with self.assertWarns(DeprecationWarning):
|
transp, proto = self.loop.run_until_complete(connect)
|
||||||
transp, proto = self.loop.run_until_complete(connect)
|
self.assertIsInstance(proto, MySubprocessProtocol)
|
||||||
self.assertIsInstance(proto, MySubprocessProtocol)
|
self.loop.run_until_complete(proto.connected)
|
||||||
self.loop.run_until_complete(proto.connected)
|
|
||||||
|
|
||||||
stdin = transp.get_pipe_transport(0)
|
stdin = transp.get_pipe_transport(0)
|
||||||
stdout = transp.get_pipe_transport(1)
|
stdout = transp.get_pipe_transport(1)
|
||||||
stdin.write(b'test')
|
stdin.write(b'test')
|
||||||
self.loop.run_until_complete(proto.got_data[1].wait())
|
self.loop.run_until_complete(proto.got_data[1].wait())
|
||||||
self.assertEqual(b'OUT:test', proto.data[1])
|
self.assertEqual(b'OUT:test', proto.data[1])
|
||||||
|
|
||||||
stdout.close()
|
stdout.close()
|
||||||
self.loop.run_until_complete(proto.disconnects[1])
|
self.loop.run_until_complete(proto.disconnects[1])
|
||||||
stdin.write(b'xxx')
|
stdin.write(b'xxx')
|
||||||
self.loop.run_until_complete(proto.got_data[2].wait())
|
self.loop.run_until_complete(proto.got_data[2].wait())
|
||||||
if sys.platform != 'win32':
|
if sys.platform != 'win32':
|
||||||
self.assertEqual(b'ERR:BrokenPipeError', proto.data[2])
|
self.assertEqual(b'ERR:BrokenPipeError', proto.data[2])
|
||||||
else:
|
else:
|
||||||
# After closing the read-end of a pipe, writing to the
|
# After closing the read-end of a pipe, writing to the
|
||||||
# write-end using os.write() fails with errno==EINVAL and
|
# write-end using os.write() fails with errno==EINVAL and
|
||||||
# GetLastError()==ERROR_INVALID_NAME on Windows!?! (Using
|
# GetLastError()==ERROR_INVALID_NAME on Windows!?! (Using
|
||||||
# WriteFile() we get ERROR_BROKEN_PIPE as expected.)
|
# WriteFile() we get ERROR_BROKEN_PIPE as expected.)
|
||||||
self.assertEqual(b'ERR:OSError', proto.data[2])
|
self.assertEqual(b'ERR:OSError', proto.data[2])
|
||||||
with test_utils.disable_logger():
|
with test_utils.disable_logger():
|
||||||
transp.close()
|
transp.close()
|
||||||
self.loop.run_until_complete(proto.completed)
|
self.loop.run_until_complete(proto.completed)
|
||||||
self.check_killed(proto.returncode)
|
self.check_killed(proto.returncode)
|
||||||
|
|
||||||
def test_subprocess_wait_no_same_group(self):
|
def test_subprocess_wait_no_same_group(self):
|
||||||
# start the new process in a new session
|
# start the new process in a new session
|
||||||
|
|
|
@ -301,11 +301,12 @@ class QueueGetTests(_QueueTestBase):
|
||||||
with self.assertWarns(DeprecationWarning):
|
with self.assertWarns(DeprecationWarning):
|
||||||
q = asyncio.Queue(queue_size, loop=self.loop)
|
q = asyncio.Queue(queue_size, loop=self.loop)
|
||||||
|
|
||||||
self.loop.run_until_complete(
|
with self.assertWarns(DeprecationWarning):
|
||||||
asyncio.gather(producer(q, producer_num_items),
|
self.loop.run_until_complete(
|
||||||
consumer(q, producer_num_items),
|
asyncio.gather(producer(q, producer_num_items),
|
||||||
loop=self.loop),
|
consumer(q, producer_num_items),
|
||||||
)
|
loop=self.loop),
|
||||||
|
)
|
||||||
|
|
||||||
def test_cancelled_getters_not_being_held_in_self_getters(self):
|
def test_cancelled_getters_not_being_held_in_self_getters(self):
|
||||||
def a_generator():
|
def a_generator():
|
||||||
|
@ -555,8 +556,9 @@ class QueuePutTests(_QueueTestBase):
|
||||||
t1 = putter(1)
|
t1 = putter(1)
|
||||||
t2 = putter(2)
|
t2 = putter(2)
|
||||||
t3 = putter(3)
|
t3 = putter(3)
|
||||||
self.loop.run_until_complete(
|
with self.assertWarns(DeprecationWarning):
|
||||||
asyncio.gather(getter(), t0, t1, t2, t3, loop=self.loop))
|
self.loop.run_until_complete(
|
||||||
|
asyncio.gather(getter(), t0, t1, t2, t3, loop=self.loop))
|
||||||
|
|
||||||
def test_cancelled_puts_not_being_held_in_self_putters(self):
|
def test_cancelled_puts_not_being_held_in_self_putters(self):
|
||||||
def a_generator():
|
def a_generator():
|
||||||
|
|
|
@ -1606,8 +1606,9 @@ class BaseTaskTests:
|
||||||
for f in asyncio.as_completed([b, c, a], loop=loop):
|
for f in asyncio.as_completed([b, c, a], loop=loop):
|
||||||
values.append(await f)
|
values.append(await f)
|
||||||
return values
|
return values
|
||||||
with self.assertWarns(DeprecationWarning):
|
with self.assertWarns(DeprecationWarning) as w:
|
||||||
res = loop.run_until_complete(self.new_task(loop, foo()))
|
res = loop.run_until_complete(self.new_task(loop, foo()))
|
||||||
|
self.assertEqual(w.warnings[0].filename, __file__)
|
||||||
self.assertAlmostEqual(0.15, loop.time())
|
self.assertAlmostEqual(0.15, loop.time())
|
||||||
self.assertTrue('a' in res[:2])
|
self.assertTrue('a' in res[:2])
|
||||||
self.assertTrue('b' in res[:2])
|
self.assertTrue('b' in res[:2])
|
||||||
|
@ -3348,7 +3349,8 @@ class FutureGatherTests(GatherTestsBase, test_utils.TestCase):
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
asyncio.gather(fut1, fut2)
|
asyncio.gather(fut1, fut2)
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
asyncio.gather(fut1, loop=self.other_loop)
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
asyncio.gather(fut1, loop=self.other_loop)
|
||||||
|
|
||||||
def test_constructor_homogenous_futures(self):
|
def test_constructor_homogenous_futures(self):
|
||||||
children = [self.other_loop.create_future() for i in range(3)]
|
children = [self.other_loop.create_future() for i in range(3)]
|
||||||
|
@ -3356,7 +3358,8 @@ class FutureGatherTests(GatherTestsBase, test_utils.TestCase):
|
||||||
self.assertIs(fut._loop, self.other_loop)
|
self.assertIs(fut._loop, self.other_loop)
|
||||||
self._run_loop(self.other_loop)
|
self._run_loop(self.other_loop)
|
||||||
self.assertFalse(fut.done())
|
self.assertFalse(fut.done())
|
||||||
fut = asyncio.gather(*children, loop=self.other_loop)
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
fut = asyncio.gather(*children, loop=self.other_loop)
|
||||||
self.assertIs(fut._loop, self.other_loop)
|
self.assertIs(fut._loop, self.other_loop)
|
||||||
self._run_loop(self.other_loop)
|
self._run_loop(self.other_loop)
|
||||||
self.assertFalse(fut.done())
|
self.assertFalse(fut.done())
|
||||||
|
@ -3429,7 +3432,8 @@ class CoroutineGatherTests(GatherTestsBase, test_utils.TestCase):
|
||||||
self.set_event_loop(self.other_loop, cleanup=False)
|
self.set_event_loop(self.other_loop, cleanup=False)
|
||||||
gen3 = coro()
|
gen3 = coro()
|
||||||
gen4 = coro()
|
gen4 = coro()
|
||||||
fut2 = asyncio.gather(gen3, gen4, loop=self.other_loop)
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
fut2 = asyncio.gather(gen3, gen4, loop=self.other_loop)
|
||||||
self.assertIs(fut2._loop, self.other_loop)
|
self.assertIs(fut2._loop, self.other_loop)
|
||||||
self.other_loop.run_until_complete(fut2)
|
self.other_loop.run_until_complete(fut2)
|
||||||
|
|
||||||
|
@ -3439,7 +3443,8 @@ class CoroutineGatherTests(GatherTestsBase, test_utils.TestCase):
|
||||||
def coro(s):
|
def coro(s):
|
||||||
return s
|
return s
|
||||||
c = coro('abc')
|
c = coro('abc')
|
||||||
fut = asyncio.gather(c, c, coro('def'), c, loop=self.one_loop)
|
with self.assertWarns(DeprecationWarning):
|
||||||
|
fut = asyncio.gather(c, c, coro('def'), c, loop=self.one_loop)
|
||||||
self._run_loop(self.one_loop)
|
self._run_loop(self.one_loop)
|
||||||
self.assertEqual(fut.result(), ['abc', 'abc', 'def', 'abc'])
|
self.assertEqual(fut.result(), ['abc', 'abc', 'def', 'abc'])
|
||||||
|
|
||||||
|
@ -3459,7 +3464,7 @@ class CoroutineGatherTests(GatherTestsBase, test_utils.TestCase):
|
||||||
|
|
||||||
async def outer():
|
async def outer():
|
||||||
nonlocal proof, gatherer
|
nonlocal proof, gatherer
|
||||||
gatherer = asyncio.gather(child1, child2, loop=self.one_loop)
|
gatherer = asyncio.gather(child1, child2)
|
||||||
await gatherer
|
await gatherer
|
||||||
proof += 100
|
proof += 100
|
||||||
|
|
||||||
|
@ -3486,7 +3491,7 @@ class CoroutineGatherTests(GatherTestsBase, test_utils.TestCase):
|
||||||
b = self.one_loop.create_future()
|
b = self.one_loop.create_future()
|
||||||
|
|
||||||
async def outer():
|
async def outer():
|
||||||
await asyncio.gather(inner(a), inner(b), loop=self.one_loop)
|
await asyncio.gather(inner(a), inner(b))
|
||||||
|
|
||||||
f = asyncio.ensure_future(outer(), loop=self.one_loop)
|
f = asyncio.ensure_future(outer(), loop=self.one_loop)
|
||||||
test_utils.run_briefly(self.one_loop)
|
test_utils.run_briefly(self.one_loop)
|
||||||
|
@ -3705,7 +3710,7 @@ class CompatibilityTests(test_utils.TestCase):
|
||||||
return 'ok2'
|
return 'ok2'
|
||||||
|
|
||||||
async def inner():
|
async def inner():
|
||||||
return await asyncio.gather(coro1(), coro2(), loop=self.loop)
|
return await asyncio.gather(coro1(), coro2())
|
||||||
|
|
||||||
result = self.loop.run_until_complete(inner())
|
result = self.loop.run_until_complete(inner())
|
||||||
self.assertEqual(['ok1', 'ok2'], result)
|
self.assertEqual(['ok1', 'ok2'], result)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Remove deprecation warnings about the loop argument in :mod:`asyncio`
|
||||||
|
incorrectly emitted in cases when the user does not pass the loop argument.
|
Loading…
Add table
Add a link
Reference in a new issue