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

Commit af6f799

Browse files
David Robertsonhughns
authored andcommitted
Fix typechecking with twisted trunk (#16121)
1 parent 55939cb commit af6f799

File tree

6 files changed

+36
-36
lines changed

6 files changed

+36
-36
lines changed

.github/workflows/twisted_trunk.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ jobs:
5454
poetry remove twisted
5555
poetry add --extras tls git+https://github.com/twisted/twisted.git#${{ inputs.twisted_ref || 'trunk' }}
5656
poetry install --no-interaction --extras "all test"
57-
- name: Remove warn_unused_ignores from mypy config
58-
run: sed '/warn_unused_ignores = True/d' -i mypy.ini
57+
- name: Remove unhelpful options from mypy config
58+
run: sed -e '/warn_unused_ignores = True/d' -e '/warn_redundant_casts = True/d' -i mypy.ini
5959
- run: poetry run mypy
6060

6161
trial:

changelog.d/16121.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Attempt to fix the twisted trunk job.

synapse/handlers/message.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,23 +1474,23 @@ async def handle_new_client_event(
14741474

14751475
# We now persist the event (and update the cache in parallel, since we
14761476
# don't want to block on it).
1477-
event, context = events_and_context[0]
1477+
#
1478+
# Note: mypy gets confused if we inline dl and check with twisted#11770.
1479+
# Some kind of bug in mypy's deduction?
1480+
deferreds = (
1481+
run_in_background(
1482+
self._persist_events,
1483+
requester=requester,
1484+
events_and_context=events_and_context,
1485+
ratelimit=ratelimit,
1486+
extra_users=extra_users,
1487+
),
1488+
run_in_background(
1489+
self.cache_joined_hosts_for_events, events_and_context
1490+
).addErrback(log_failure, "cache_joined_hosts_for_event failed"),
1491+
)
14781492
result, _ = await make_deferred_yieldable(
1479-
gather_results(
1480-
(
1481-
run_in_background(
1482-
self._persist_events,
1483-
requester=requester,
1484-
events_and_context=events_and_context,
1485-
ratelimit=ratelimit,
1486-
extra_users=extra_users,
1487-
),
1488-
run_in_background(
1489-
self.cache_joined_hosts_for_events, events_and_context
1490-
).addErrback(log_failure, "cache_joined_hosts_for_event failed"),
1491-
),
1492-
consumeErrors=True,
1493-
)
1493+
gather_results(deferreds, consumeErrors=True)
14941494
).addErrback(unwrapFirstError)
14951495

14961496
return result

synapse/logging/context.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -809,23 +809,24 @@ def run_in_background( # type: ignore[misc]
809809

810810
# `res` may be a coroutine, `Deferred`, some other kind of awaitable, or a plain
811811
# value. Convert it to a `Deferred`.
812+
d: "defer.Deferred[R]"
812813
if isinstance(res, typing.Coroutine):
813814
# Wrap the coroutine in a `Deferred`.
814-
res = defer.ensureDeferred(res)
815+
d = defer.ensureDeferred(res)
815816
elif isinstance(res, defer.Deferred):
816-
pass
817+
d = res
817818
elif isinstance(res, Awaitable):
818819
# `res` is probably some kind of completed awaitable, such as a `DoneAwaitable`
819820
# or `Future` from `make_awaitable`.
820-
res = defer.ensureDeferred(_unwrap_awaitable(res))
821+
d = defer.ensureDeferred(_unwrap_awaitable(res))
821822
else:
822823
# `res` is a plain value. Wrap it in a `Deferred`.
823-
res = defer.succeed(res)
824+
d = defer.succeed(res)
824825

825-
if res.called and not res.paused:
826+
if d.called and not d.paused:
826827
# The function should have maintained the logcontext, so we can
827828
# optimise out the messing about
828-
return res
829+
return d
829830

830831
# The function may have reset the context before returning, so
831832
# we need to restore it now.
@@ -843,8 +844,8 @@ def run_in_background( # type: ignore[misc]
843844
# which is supposed to have a single entry and exit point. But
844845
# by spawning off another deferred, we are effectively
845846
# adding a new exit point.)
846-
res.addBoth(_set_context_cb, ctx)
847-
return res
847+
d.addBoth(_set_context_cb, ctx)
848+
return d
848849

849850

850851
T = TypeVar("T")
@@ -877,7 +878,7 @@ def make_deferred_yieldable(deferred: "defer.Deferred[T]") -> "defer.Deferred[T]
877878
ResultT = TypeVar("ResultT")
878879

879880

880-
def _set_context_cb(result: ResultT, context: LoggingContext) -> ResultT:
881+
def _set_context_cb(result: ResultT, context: LoggingContextOrSentinel) -> ResultT:
881882
"""A callback function which just sets the logging context"""
882883
set_current_context(context)
883884
return result

synapse/util/caches/deferred_cache.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ def __init__(self) -> None:
470470
def deferred(self, key: KT) -> "defer.Deferred[VT]":
471471
if not self._deferred:
472472
self._deferred = ObservableDeferred(defer.Deferred(), consumeErrors=True)
473-
return self._deferred.observe().addCallback(lambda res: res.get(key))
473+
return self._deferred.observe().addCallback(lambda res: res[key])
474474

475475
def add_invalidation_callback(
476476
self, key: KT, callback: Optional[Callable[[], None]]

tests/util/test_async_helpers.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,9 @@ def check_called_first(res: int) -> int:
6060
observer1.addBoth(check_called_first)
6161

6262
# store the results
63-
results: List[Optional[ObservableDeferred[int]]] = [None, None]
63+
results: List[Optional[int]] = [None, None]
6464

65-
def check_val(
66-
res: ObservableDeferred[int], idx: int
67-
) -> ObservableDeferred[int]:
65+
def check_val(res: int, idx: int) -> int:
6866
results[idx] = res
6967
return res
7068

@@ -93,14 +91,14 @@ def check_called_first(res: int) -> int:
9391
observer1.addBoth(check_called_first)
9492

9593
# store the results
96-
results: List[Optional[ObservableDeferred[str]]] = [None, None]
94+
results: List[Optional[Failure]] = [None, None]
9795

98-
def check_val(res: ObservableDeferred[str], idx: int) -> None:
96+
def check_failure(res: Failure, idx: int) -> None:
9997
results[idx] = res
10098
return None
10199

102-
observer1.addErrback(check_val, 0)
103-
observer2.addErrback(check_val, 1)
100+
observer1.addErrback(check_failure, 0)
101+
observer2.addErrback(check_failure, 1)
104102

105103
try:
106104
raise Exception("gah!")

0 commit comments

Comments
 (0)