File 99366-patch.dict-can-decorate-async.patch of Package python3.38017
From 1c57ada66c9f0b74f2f8082d95a387639a5f9e68 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= <mcepl@cepl.eu>
Date: Thu, 4 Apr 2024 01:05:40 +0200
Subject: [PATCH] make sure ``patch.dict()`` can be applied on async functions
Code is from gh#python/cpython@88b101ff520, it was released
upstream in 3.10.9.
Fixes: gh#98086
Patch: 99366-patch.dict-can-decorate-async.patch
---
Lib/unittest/mock.py | 18 ++++++++++++++++++
...22-10-08-19-39-27.gh-issue-98086.y---WC.rst | 1 +
2 files changed, 19 insertions(+)
create mode 100644 Misc/NEWS.d/next/Library/2022-10-08-19-39-27.gh-issue-98086.y---WC.rst
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index 645d100960e..8419397400a 100644
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -1595,6 +1595,12 @@ class _patch_dict(object):
def __call__(self, f):
if isinstance(f, type):
return self.decorate_class(f)
+ if inspect.iscoroutinefunction(f):
+ return self.decorate_async_callable(f)
+ return self.decorate_callable(f)
+
+
+ def decorate_callable(self, f):
@wraps(f)
def _inner(*args, **kw):
self._patch_dict()
@@ -1606,6 +1612,18 @@ class _patch_dict(object):
return _inner
+ def decorate_async_callable(self, f):
+ @wraps(f)
+ async def _inner(*args, **kw):
+ self._patch_dict()
+ try:
+ return await f(*args, **kw)
+ finally:
+ self._unpatch_dict()
+
+ return _inner
+
+
def decorate_class(self, klass):
for attr in dir(klass):
attr_value = getattr(klass, attr)
diff --git a/Misc/NEWS.d/next/Library/2022-10-08-19-39-27.gh-issue-98086.y---WC.rst b/Misc/NEWS.d/next/Library/2022-10-08-19-39-27.gh-issue-98086.y---WC.rst
new file mode 100644
index 00000000000..f4a1d272e13
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-10-08-19-39-27.gh-issue-98086.y---WC.rst
@@ -0,0 +1 @@
+Make sure ``patch.dict()`` can be applied on async functions.
--
2.45.0