summaryrefslogtreecommitdiff
path: root/dev-python/cached-property/files/cached-property-1.5.2-python311.patch
blob: 989033f200363e17b52ed403e3288b344f3e851d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
From 297031687679762849dedeaf24aa3a19116f095b Mon Sep 17 00:00:00 2001
From: Petr Viktorin <encukou@gmail.com>
Date: Thu, 2 Dec 2021 11:26:20 +0100
Subject: [PATCH 1/2] Don't use asyncio.coroutinefunction if it's not available

Python 3.11 drops the deprecated @asyncio.coroutine and
asyncio.iscoroutinefunction.

Using a wrapper with @asyncio.coroutine in __get__ wasn't
necessary (the future from asyncio.ensure_future is awaitable,
and the wrapper doesn't do anything asynchronous), so the
logic can be simplified to just call asyncio.ensure_future
(to schedule the task and store the result when it's
available).

Tests for @asyncio.coroutine are skipped on 3.11+.

An unnecessary call to asyncio.coroutine in tests is
removed: it's not necessary to call this for `async def`
functions.
---
 cached_property.py                  | 24 +++++++++++-------------
 conftest.py                         |  6 +++++-
 tests/test_async_cached_property.py |  3 +--
 3 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/cached_property.py b/cached_property.py
index 3135871..254739c 100644
--- a/cached_property.py
+++ b/cached_property.py
@@ -13,6 +13,12 @@
     import asyncio
 except (ImportError, SyntaxError):
     asyncio = None
+try:
+    iscoroutinefunction = asyncio.iscoroutinefunction
+except AttributeError:
+    # Python 3.11: @asyncio.coroutine was removed
+    from inspect import iscoroutinefunction
+
 
 
 class cached_property(object):
@@ -30,22 +36,14 @@ def __get__(self, obj, cls):
         if obj is None:
             return self
 
-        if asyncio and asyncio.iscoroutinefunction(self.func):
-            return self._wrap_in_coroutine(obj)
+        if asyncio and iscoroutinefunction(self.func):
+            value = asyncio.ensure_future(self.func(obj))
+        else:
+            value = self.func(obj)
 
-        value = obj.__dict__[self.func.__name__] = self.func(obj)
+        obj.__dict__[self.func.__name__] = value
         return value
 
-    def _wrap_in_coroutine(self, obj):
-        @wraps(obj)
-        @asyncio.coroutine
-        def wrapper():
-            future = asyncio.ensure_future(self.func(obj))
-            obj.__dict__[self.func.__name__] = future
-            return future
-
-        return wrapper()
-
 
 class threaded_cached_property(object):
     """
diff --git a/conftest.py b/conftest.py
index 0563f64..1c4b618 100644
--- a/conftest.py
+++ b/conftest.py
@@ -7,13 +7,17 @@
 # Whether the async and await keywords work
 has_async_await = sys.version_info[0] == 3 and sys.version_info[1] >= 5
 
+# Whether "from asyncio import coroutine" *fails*
+version_info = sys.version_info
+dropped_asyncio_coroutine = version_info[0] == 3 and version_info[1] >= 11
+
 
 print("conftest.py", has_asyncio, has_async_await)
 
 
 collect_ignore = []
 
-if not has_asyncio:
+if not has_asyncio or dropped_asyncio_coroutine:
     collect_ignore.append("tests/test_coroutine_cached_property.py")
 
 if not has_async_await:
diff --git a/tests/test_async_cached_property.py b/tests/test_async_cached_property.py
index 4ba84f3..d61cc28 100644
--- a/tests/test_async_cached_property.py
+++ b/tests/test_async_cached_property.py
@@ -9,8 +9,7 @@
 
 def unittest_run_loop(f):
     def wrapper(*args, **kwargs):
-        coro = asyncio.coroutine(f)
-        future = coro(*args, **kwargs)
+        future = f(*args, **kwargs)
         loop = asyncio.get_event_loop()
         loop.run_until_complete(future)
 

From 9b210d12fa73c91743378ba4a966417846e7ea9a Mon Sep 17 00:00:00 2001
From: Petr Viktorin <encukou@gmail.com>
Date: Thu, 2 Dec 2021 11:44:18 +0100
Subject: [PATCH 2/2] Restore	compatibility with python 2.7

This is	still necessary	according to the Contributing Guidelines.
---
 cached_property.py | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/cached_property.py b/cached_property.py
index 254739c..944e2f5 100644
--- a/cached_property.py
+++ b/cached_property.py
@@ -13,12 +13,12 @@
     import asyncio
 except (ImportError, SyntaxError):
     asyncio = None
-try:
-    iscoroutinefunction = asyncio.iscoroutinefunction
-except AttributeError:
-    # Python 3.11: @asyncio.coroutine was removed
-    from inspect import iscoroutinefunction
-
+if asyncio:
+    try:
+        iscoroutinefunction = asyncio.iscoroutinefunction
+    except AttributeError:
+        # Python 3.11: @asyncio.coroutine was removed
+        from inspect import iscoroutinefunction
 
 
 class cached_property(object):