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

Commit

Permalink
Fix up type hints for Twisted 21.7 (#10490)
Browse files Browse the repository at this point in the history
Mostly this involves decorating a few Deferred declarations with extra type hints. We wrap the types in quotes to avoid runtime errors when running against older versions of Twisted that don't have generics on Deferred.
  • Loading branch information
richvdh authored Jul 28, 2021
1 parent 9643dfd commit d9cb658
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 15 deletions.
1 change: 1 addition & 0 deletions changelog.d/10490.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix up type annotations to work with Twisted 21.7.
4 changes: 2 additions & 2 deletions synapse/http/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -847,7 +847,7 @@ def connectionLost(self, reason: Failure = connectionDone) -> None:

def read_body_with_max_size(
response: IResponse, stream: ByteWriteable, max_size: Optional[int]
) -> defer.Deferred:
) -> "defer.Deferred[int]":
"""
Read a HTTP response body to a file-object. Optionally enforcing a maximum file size.
Expand All @@ -862,7 +862,7 @@ def read_body_with_max_size(
Returns:
A Deferred which resolves to the length of the read body.
"""
d = defer.Deferred()
d: "defer.Deferred[int]" = defer.Deferred()

# If the Content-Length header gives a size larger than the maximum allowed
# size, do not bother downloading the body.
Expand Down
2 changes: 1 addition & 1 deletion synapse/replication/tcp/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ async def wait_for_stream_position(

# Create a new deferred that times out after N seconds, as we don't want
# to wedge here forever.
deferred = Deferred()
deferred: "Deferred[None]" = Deferred()
deferred = timeout_deferred(
deferred, _WAIT_FOR_REPLICATION_TIMEOUT_SECONDS, self._reactor
)
Expand Down
16 changes: 8 additions & 8 deletions synapse/util/async_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@

logger = logging.getLogger(__name__)

_T = TypeVar("_T")


class ObservableDeferred:
"""Wraps a deferred object so that we can add observer deferreds. These
Expand Down Expand Up @@ -121,7 +123,7 @@ def observe(self) -> defer.Deferred:
effect the underlying deferred.
"""
if not self._result:
d = defer.Deferred()
d: "defer.Deferred[Any]" = defer.Deferred()

def remove(r):
self._observers.discard(d)
Expand Down Expand Up @@ -415,7 +417,7 @@ def __init__(self):
self.key_to_current_writer: Dict[str, defer.Deferred] = {}

async def read(self, key: str) -> ContextManager:
new_defer = defer.Deferred()
new_defer: "defer.Deferred[None]" = defer.Deferred()

curr_readers = self.key_to_current_readers.setdefault(key, set())
curr_writer = self.key_to_current_writer.get(key, None)
Expand All @@ -438,7 +440,7 @@ def _ctx_manager():
return _ctx_manager()

async def write(self, key: str) -> ContextManager:
new_defer = defer.Deferred()
new_defer: "defer.Deferred[None]" = defer.Deferred()

curr_readers = self.key_to_current_readers.get(key, set())
curr_writer = self.key_to_current_writer.get(key, None)
Expand Down Expand Up @@ -471,10 +473,8 @@ def _ctx_manager():


def timeout_deferred(
deferred: defer.Deferred,
timeout: float,
reactor: IReactorTime,
) -> defer.Deferred:
deferred: "defer.Deferred[_T]", timeout: float, reactor: IReactorTime
) -> "defer.Deferred[_T]":
"""The in built twisted `Deferred.addTimeout` fails to time out deferreds
that have a canceller that throws exceptions. This method creates a new
deferred that wraps and times out the given deferred, correctly handling
Expand All @@ -497,7 +497,7 @@ def timeout_deferred(
Returns:
A new Deferred, which will errback with defer.TimeoutError on timeout.
"""
new_d = defer.Deferred()
new_d: "defer.Deferred[_T]" = defer.Deferred()

timed_out = [False]

Expand Down
15 changes: 12 additions & 3 deletions synapse/util/caches/deferred_cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,16 @@

import enum
import threading
from typing import Callable, Generic, Iterable, MutableMapping, Optional, TypeVar, Union
from typing import (
Callable,
Generic,
Iterable,
MutableMapping,
Optional,
TypeVar,
Union,
cast,
)

from prometheus_client import Gauge

Expand Down Expand Up @@ -166,7 +175,7 @@ def get_immediate(
def set(
self,
key: KT,
value: defer.Deferred,
value: "defer.Deferred[VT]",
callback: Optional[Callable[[], None]] = None,
) -> defer.Deferred:
"""Adds a new entry to the cache (or updates an existing one).
Expand Down Expand Up @@ -214,7 +223,7 @@ def set(
if value.called:
result = value.result
if not isinstance(result, failure.Failure):
self.cache.set(key, result, callbacks)
self.cache.set(key, cast(VT, result), callbacks)
return value

# otherwise, we'll add an entry to the _pending_deferred_cache for now,
Expand Down
2 changes: 1 addition & 1 deletion synapse/util/caches/descriptors.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ def arg_to_cache_key(arg):
# relevant result for that key.
deferreds_map = {}
for arg in missing:
deferred = defer.Deferred()
deferred: "defer.Deferred[Any]" = defer.Deferred()
deferreds_map[arg] = deferred
key = arg_to_cache_key(arg)
cache.set(key, deferred, callback=invalidate_callback)
Expand Down

0 comments on commit d9cb658

Please sign in to comment.