diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2022-06-30 18:04:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-30 18:04:42 (GMT) |
commit | 9ebec7d46cd52fff68507c291fde34fc865acfc4 (patch) | |
tree | 2ae4a1829964965e19ae968ccee8bacd92e36d60 | |
parent | 7fe949e5eac3efa8bb0cd9e7274380a044a408ea (diff) | |
download | cpython-9ebec7d46cd52fff68507c291fde34fc865acfc4.zip cpython-9ebec7d46cd52fff68507c291fde34fc865acfc4.tar.gz cpython-9ebec7d46cd52fff68507c291fde34fc865acfc4.tar.bz2 |
gh-84753: Make inspect.iscoroutinefunction() work with AsyncMock (GH-94050) (GH-94460)
The inspect version was not working with unittest.mock.AsyncMock.
The fix introduces special-casing of AsyncMock in
`inspect.iscoroutinefunction` equivalent to the one
performed in `asyncio.iscoroutinefunction`.
Co-authored-by: Ćukasz Langa <lukasz@langa.pl>
(cherry picked from commit 4261b6bffc0b8bb5c6d4d80578a81b7520f4aefc)
Co-authored-by: Mehdi ABAAKOUK <sileht@sileht.net>
-rw-r--r-- | Lib/inspect.py | 2 | ||||
-rw-r--r-- | Lib/test/test_asyncio/test_tasks.py | 1 | ||||
-rw-r--r-- | Lib/test/test_inspect.py | 14 | ||||
-rw-r--r-- | Lib/unittest/mock.py | 4 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2022-06-21-11-40-31.gh-issue-84753.FW1pxO.rst | 3 |
5 files changed, 23 insertions, 1 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py index 6e74471..cbc0632 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -395,7 +395,7 @@ def _has_code_flag(f, flag): while ismethod(f): f = f.__func__ f = functools._unwrap_partial(f) - if not isfunction(f): + if not (isfunction(f) or _signature_is_functionlike(f)): return False return bool(f.__code__.co_flags & flag) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 6458859..b4a8627 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1653,6 +1653,7 @@ class BaseTaskTests: self.assertTrue(asyncio.iscoroutinefunction(fn2)) self.assertFalse(asyncio.iscoroutinefunction(mock.Mock())) + self.assertTrue(asyncio.iscoroutinefunction(mock.AsyncMock())) def test_coroutine_non_gen_function(self): async def func(): diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index ae18427..be9f29e 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -202,6 +202,10 @@ class TestPredicates(IsTestBase): gen_coroutine_function_example)))) self.assertTrue(inspect.isgenerator(gen_coro)) + self.assertFalse( + inspect.iscoroutinefunction(unittest.mock.Mock())) + self.assertTrue( + inspect.iscoroutinefunction(unittest.mock.AsyncMock())) self.assertTrue( inspect.iscoroutinefunction(coroutine_function_example)) self.assertTrue( @@ -211,6 +215,10 @@ class TestPredicates(IsTestBase): self.assertTrue(inspect.iscoroutine(coro)) self.assertFalse( + inspect.isgeneratorfunction(unittest.mock.Mock())) + self.assertFalse( + inspect.isgeneratorfunction(unittest.mock.AsyncMock())) + self.assertFalse( inspect.isgeneratorfunction(coroutine_function_example)) self.assertFalse( inspect.isgeneratorfunction( @@ -218,6 +226,12 @@ class TestPredicates(IsTestBase): coroutine_function_example)))) self.assertFalse(inspect.isgenerator(coro)) + self.assertFalse( + inspect.isasyncgenfunction(unittest.mock.Mock())) + self.assertFalse( + inspect.isasyncgenfunction(unittest.mock.AsyncMock())) + self.assertFalse( + inspect.isasyncgenfunction(coroutine_function_example)) self.assertTrue( inspect.isasyncgenfunction(async_generator_function_example)) self.assertTrue( diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 8262b71..cd46fea 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2175,6 +2175,10 @@ class AsyncMockMixin(Base): code_mock = NonCallableMock(spec_set=CodeType) code_mock.co_flags = inspect.CO_COROUTINE self.__dict__['__code__'] = code_mock + self.__dict__['__name__'] = 'AsyncMock' + self.__dict__['__defaults__'] = tuple() + self.__dict__['__kwdefaults__'] = {} + self.__dict__['__annotations__'] = None async def _execute_mock_call(self, /, *args, **kwargs): # This is nearly just like super(), except for special handling diff --git a/Misc/NEWS.d/next/Library/2022-06-21-11-40-31.gh-issue-84753.FW1pxO.rst b/Misc/NEWS.d/next/Library/2022-06-21-11-40-31.gh-issue-84753.FW1pxO.rst new file mode 100644 index 0000000..f701d2a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-06-21-11-40-31.gh-issue-84753.FW1pxO.rst @@ -0,0 +1,3 @@ +:func:`inspect.iscoroutinefunction` now properly returns ``True`` when an instance +of :class:`unittest.mock.AsyncMock` is passed to it. This makes it consistent with +behavior of :func:`asyncio.iscoroutinefunction`. Patch by Mehdi ABAAKOUK. |