diff options
author | Calum Lind <calumlind+deluge@gmail.com> | 2022-02-16 16:19:34 +0000 |
---|---|---|
committer | Calum Lind <calumlind+deluge@gmail.com> | 2022-02-16 16:20:54 +0000 |
commit | 055a84bb15b03f066681a17f0274bcc0fbf82d04 (patch) | |
tree | 1ba91a0329ce607e15a4792d4ecd2616abc7d78e | |
parent | 03938839e0db2c0b9ae755e66549ba93e13412de (diff) | |
download | deluge-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.py | 9 |
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 |