[Python-checkins] bpo-38161: Removes _AwaitEvent from AsyncMock. (GH-16443)

Lisa Roach webhook-mailer at python.org
Mon Sep 30 00:01:34 EDT 2019


https://github.com/python/cpython/commit/25e115ec00b5f75e3589c9f21013c47c21e1753f
commit: 25e115ec00b5f75e3589c9f21013c47c21e1753f
branch: master
author: Lisa Roach <lisaroach14 at gmail.com>
committer: GitHub <noreply at github.com>
date: 2019-09-29T21:01:28-07:00
summary:

bpo-38161: Removes _AwaitEvent from AsyncMock. (GH-16443)

files:
A Misc/NEWS.d/next/Library/2019-09-27-16-31-28.bpo-38161.zehai1.rst
M Lib/unittest/mock.py
M Lib/unittest/test/testmock/testasync.py

diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index 27aa3bc65c9a..e797d2f5b5e1 100644
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -246,7 +246,6 @@ def _setup_async_mock(mock):
     mock.await_count = 0
     mock.await_args = None
     mock.await_args_list = _CallList()
-    mock.awaited = _AwaitEvent(mock)
 
     # Mock is not configured yet so the attributes are set
     # to a function and then the corresponding mock helper function
@@ -2116,7 +2115,6 @@ def __get__(self, obj, _type=None):
 
 
 class AsyncMockMixin(Base):
-    awaited = _delegating_property('awaited')
     await_count = _delegating_property('await_count')
     await_args = _delegating_property('await_args')
     await_args_list = _delegating_property('await_args_list')
@@ -2130,7 +2128,6 @@ def __init__(self, /, *args, **kwargs):
         # It is set through __dict__ because when spec_set is True, this
         # attribute is likely undefined.
         self.__dict__['_is_coroutine'] = asyncio.coroutines._is_coroutine
-        self.__dict__['_mock_awaited'] = _AwaitEvent(self)
         self.__dict__['_mock_await_count'] = 0
         self.__dict__['_mock_await_args'] = None
         self.__dict__['_mock_await_args_list'] = _CallList()
@@ -2159,7 +2156,6 @@ def __init__(self, /, *args, **kwargs):
                 self.await_count += 1
                 self.await_args = _call
                 self.await_args_list.append(_call)
-                await self.awaited._notify()
 
         return await proxy()
 
@@ -2890,35 +2886,3 @@ def __aiter__(self):
         except StopIteration:
             pass
         raise StopAsyncIteration
-
-
-class _AwaitEvent:
-    def __init__(self, mock):
-        self._mock = mock
-        self._condition = None
-
-    async def _notify(self):
-        condition = self._get_condition()
-        try:
-            await condition.acquire()
-            condition.notify_all()
-        finally:
-            condition.release()
-
-    def _get_condition(self):
-        """
-        Creation of condition is delayed, to minimize the chance of using the
-        wrong loop.
-        A user may create a mock with _AwaitEvent before selecting the
-        execution loop.  Requiring a user to delay creation is error-prone and
-        inflexible. Instead, condition is created when user actually starts to
-        use the mock.
-        """
-        # No synchronization is needed:
-        #   - asyncio is thread unsafe
-        #   - there are no awaits here, method will be executed without
-        #   switching asyncio context.
-        if self._condition is None:
-            self._condition = asyncio.Condition()
-
-        return self._condition
diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py
index 624fadca2649..5a9e93e40bc4 100644
--- a/Lib/unittest/test/testmock/testasync.py
+++ b/Lib/unittest/test/testmock/testasync.py
@@ -4,7 +4,7 @@
 import unittest
 
 from unittest.mock import (ANY, call, AsyncMock, patch, MagicMock,
-                           create_autospec, _AwaitEvent, sentinel, _CallList)
+                           create_autospec, sentinel, _CallList)
 
 
 def tearDownModule():
@@ -178,7 +178,6 @@ def test_create_autospec(self):
         self.assertEqual(spec.await_count, 0)
         self.assertIsNone(spec.await_args)
         self.assertEqual(spec.await_args_list, [])
-        self.assertIsInstance(spec.awaited, _AwaitEvent)
         spec.assert_not_awaited()
 
         asyncio.run(main())
@@ -212,7 +211,6 @@ def test_patch_with_autospec(self):
                 self.assertEqual(mock_method.await_count, 0)
                 self.assertEqual(mock_method.await_args_list, [])
                 self.assertIsNone(mock_method.await_args)
-                self.assertIsInstance(mock_method.awaited, _AwaitEvent)
                 mock_method.assert_not_awaited()
 
                 await awaitable
diff --git a/Misc/NEWS.d/next/Library/2019-09-27-16-31-28.bpo-38161.zehai1.rst b/Misc/NEWS.d/next/Library/2019-09-27-16-31-28.bpo-38161.zehai1.rst
new file mode 100644
index 000000000000..0077033c654f
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-09-27-16-31-28.bpo-38161.zehai1.rst
@@ -0,0 +1 @@
+Removes _AwaitEvent from AsyncMock.



More information about the Python-checkins mailing list