Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 7557472

Browse files
authored
Add type hints for ObservableDeferred attributes (#12159)
Signed-off-by: Sean Quah <[email protected]>
1 parent 158e093 commit 7557472

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

changelog.d/12159.misc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add type hints for `ObservableDeferred` attributes.

synapse/util/async_helpers.py

+11-3
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
)
4141

4242
import attr
43-
from typing_extensions import ContextManager
43+
from typing_extensions import ContextManager, Literal
4444

4545
from twisted.internet import defer
4646
from twisted.internet.defer import CancelledError
@@ -96,6 +96,10 @@ class ObservableDeferred(Generic[_T], AbstractObservableDeferred[_T]):
9696

9797
__slots__ = ["_deferred", "_observers", "_result"]
9898

99+
_deferred: "defer.Deferred[_T]"
100+
_observers: Union[List["defer.Deferred[_T]"], Tuple[()]]
101+
_result: Union[None, Tuple[Literal[True], _T], Tuple[Literal[False], Failure]]
102+
99103
def __init__(self, deferred: "defer.Deferred[_T]", consumeErrors: bool = False):
100104
object.__setattr__(self, "_deferred", deferred)
101105
object.__setattr__(self, "_result", None)
@@ -158,12 +162,14 @@ def observe(self) -> "defer.Deferred[_T]":
158162
effect the underlying deferred.
159163
"""
160164
if not self._result:
165+
assert isinstance(self._observers, list)
161166
d: "defer.Deferred[_T]" = defer.Deferred()
162167
self._observers.append(d)
163168
return d
169+
elif self._result[0]:
170+
return defer.succeed(self._result[1])
164171
else:
165-
success, res = self._result
166-
return defer.succeed(res) if success else defer.fail(res)
172+
return defer.fail(self._result[1])
167173

168174
def observers(self) -> "Collection[defer.Deferred[_T]]":
169175
return self._observers
@@ -175,6 +181,8 @@ def has_succeeded(self) -> bool:
175181
return self._result is not None and self._result[0] is True
176182

177183
def get_result(self) -> Union[_T, Failure]:
184+
if self._result is None:
185+
raise ValueError(f"{self!r} has no result yet")
178186
return self._result[1]
179187

180188
def __getattr__(self, name: str) -> Any:

0 commit comments

Comments
 (0)