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

Commit ac016ff

Browse files
committed
Generics for ObservableDeferred
Now that `Deferred` is a generic class, let's update `ObeservableDeferred` to follow suit.
1 parent b653472 commit ac016ff

File tree

4 files changed

+14
-9
lines changed

4 files changed

+14
-9
lines changed

changelog.d/10491.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve type annotations for `ObservableDeferred`.

synapse/notifier.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,9 @@ def __init__(
111111
self.last_notified_token = current_token
112112
self.last_notified_ms = time_now_ms
113113

114-
with PreserveLoggingContext():
115-
self.notify_deferred = ObservableDeferred(defer.Deferred())
114+
self.notify_deferred: ObservableDeferred[StreamToken] = ObservableDeferred(
115+
defer.Deferred()
116+
)
116117

117118
def notify(
118119
self,

synapse/storage/persist_events.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,9 @@ async def add_to_queue(
170170
end_item = queue[-1]
171171
else:
172172
# need to make a new queue item
173-
deferred = ObservableDeferred(defer.Deferred(), consumeErrors=True)
173+
deferred: ObservableDeferred[_PersistResult] = ObservableDeferred(
174+
defer.Deferred(), consumeErrors=True
175+
)
174176

175177
end_item = _EventPersistQueueItem(
176178
events_and_contexts=[],

synapse/util/async_helpers.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
Awaitable,
2424
Callable,
2525
Dict,
26+
Generic,
2627
Hashable,
2728
Iterable,
2829
List,
@@ -52,7 +53,7 @@
5253
_T = TypeVar("_T")
5354

5455

55-
class ObservableDeferred:
56+
class ObservableDeferred(Generic[_T]):
5657
"""Wraps a deferred object so that we can add observer deferreds. These
5758
observer deferreds do not affect the callback chain of the original
5859
deferred.
@@ -70,7 +71,7 @@ class ObservableDeferred:
7071

7172
__slots__ = ["_deferred", "_observers", "_result"]
7273

73-
def __init__(self, deferred: defer.Deferred, consumeErrors: bool = False):
74+
def __init__(self, deferred: defer.Deferred[_T], consumeErrors: bool = False):
7475
object.__setattr__(self, "_deferred", deferred)
7576
object.__setattr__(self, "_result", None)
7677
object.__setattr__(self, "_observers", set())
@@ -115,15 +116,15 @@ def errback(f):
115116

116117
deferred.addCallbacks(callback, errback)
117118

118-
def observe(self) -> defer.Deferred:
119+
def observe(self) -> defer.Deferred[_T]:
119120
"""Observe the underlying deferred.
120121
121122
This returns a brand new deferred that is resolved when the underlying
122123
deferred is resolved. Interacting with the returned deferred does not
123124
effect the underlying deferred.
124125
"""
125126
if not self._result:
126-
d: defer.Deferred[Any] = defer.Deferred()
127+
d: defer.Deferred[_T] = defer.Deferred()
127128

128129
def remove(r):
129130
self._observers.discard(d)
@@ -137,7 +138,7 @@ def remove(r):
137138
success, res = self._result
138139
return defer.succeed(res) if success else defer.fail(res)
139140

140-
def observers(self) -> List[defer.Deferred]:
141+
def observers(self) -> List[defer.Deferred[_T]]:
141142
return self._observers
142143

143144
def has_called(self) -> bool:
@@ -146,7 +147,7 @@ def has_called(self) -> bool:
146147
def has_succeeded(self) -> bool:
147148
return self._result is not None and self._result[0] is True
148149

149-
def get_result(self) -> Any:
150+
def get_result(self) -> _T:
150151
return self._result[1]
151152

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

0 commit comments

Comments
 (0)