summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCalum Lind <calumlind+deluge@gmail.com>2022-02-16 16:19:34 +0000
committerCalum Lind <calumlind+deluge@gmail.com>2022-02-16 16:20:54 +0000
commit055a84bb15b03f066681a17f0274bcc0fbf82d04 (patch)
tree1ba91a0329ce607e15a4792d4ecd2616abc7d78e
parent03938839e0db2c0b9ae755e66549ba93e13412de (diff)
downloaddeluge-055a84bb15b03f066681a17f0274bcc0fbf82d04.tar.gz
deluge-055a84bb15b03f066681a17f0274bcc0fbf82d04.tar.bz2
deluge-055a84bb15b03f066681a17f0274bcc0fbf82d04.zip
[Core] Fix Twisted fromCoroutine AttrError
Users with older versions of Twisted <= 21.2 were encoutering the following error: File "/home/calum/projects/deluge/deluge/decorators.py", line 191, in activate d = defer.Deferred.fromCoroutine(self.coro) builtins.AttributeError: type object 'Deferred' has no attribute 'fromCoroutine' Fixed by falling back to ensureDeferred since fromCoroutine was introduced in Twisted 21.2 as a saner name for handling of coroutines. Ref: https://twistedmatrix.com/trac/ticket/9825
-rw-r--r--deluge/decorators.py9
1 files changed, 6 insertions, 3 deletions
diff --git a/deluge/decorators.py b/deluge/decorators.py
index 33b8f1984..2f9fcd7d3 100644
--- a/deluge/decorators.py
+++ b/deluge/decorators.py
@@ -188,7 +188,11 @@ class CoroutineDeferred(defer.Deferred):
"""If the result wasn't awaited before the next context switch, we turn it into a deferred."""
if self.awaited is None:
self.awaited = False
- d = defer.Deferred.fromCoroutine(self.coro)
+ try:
+ d = defer.Deferred.fromCoroutine(self.coro)
+ except AttributeError:
+ # Fallback for Twisted <= 21.2 without fromCoroutine
+ d = defer.ensureDeferred(self.coro)
d.chainDeferred(self)
def addCallbacks(self, *args, **kwargs): # noqa: N802
@@ -208,8 +212,7 @@ def maybe_coroutine(
@wraps(f)
def wrapper(*args, **kwargs):
# Uncomment for quick testing to make sure CoroutineDeferred magic isn't at fault
- # from twisted.internet.defer import ensureDeferred
- # return ensureDeferred(f(*args, **kwargs))
+ # return defer.ensureDeferred(f(*args, **kwargs))
return CoroutineDeferred(f(*args, **kwargs))
return wrapper