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

Commit 7468723

Browse files
authored
Add most missing type hints to synapse.util (#11328)
1 parent 3a1462f commit 7468723

File tree

10 files changed

+161
-165
lines changed

10 files changed

+161
-165
lines changed

changelog.d/11328.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add type hints to `synapse.util`.

mypy.ini

Lines changed: 3 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -196,92 +196,11 @@ disallow_untyped_defs = True
196196
[mypy-synapse.streams.*]
197197
disallow_untyped_defs = True
198198

199-
[mypy-synapse.util.batching_queue]
199+
[mypy-synapse.util.*]
200200
disallow_untyped_defs = True
201201

202-
[mypy-synapse.util.caches.cached_call]
203-
disallow_untyped_defs = True
204-
205-
[mypy-synapse.util.caches.dictionary_cache]
206-
disallow_untyped_defs = True
207-
208-
[mypy-synapse.util.caches.lrucache]
209-
disallow_untyped_defs = True
210-
211-
[mypy-synapse.util.caches.response_cache]
212-
disallow_untyped_defs = True
213-
214-
[mypy-synapse.util.caches.stream_change_cache]
215-
disallow_untyped_defs = True
216-
217-
[mypy-synapse.util.caches.ttl_cache]
218-
disallow_untyped_defs = True
219-
220-
[mypy-synapse.util.daemonize]
221-
disallow_untyped_defs = True
222-
223-
[mypy-synapse.util.file_consumer]
224-
disallow_untyped_defs = True
225-
226-
[mypy-synapse.util.frozenutils]
227-
disallow_untyped_defs = True
228-
229-
[mypy-synapse.util.hash]
230-
disallow_untyped_defs = True
231-
232-
[mypy-synapse.util.httpresourcetree]
233-
disallow_untyped_defs = True
234-
235-
[mypy-synapse.util.iterutils]
236-
disallow_untyped_defs = True
237-
238-
[mypy-synapse.util.linked_list]
239-
disallow_untyped_defs = True
240-
241-
[mypy-synapse.util.logcontext]
242-
disallow_untyped_defs = True
243-
244-
[mypy-synapse.util.logformatter]
245-
disallow_untyped_defs = True
246-
247-
[mypy-synapse.util.macaroons]
248-
disallow_untyped_defs = True
249-
250-
[mypy-synapse.util.manhole]
251-
disallow_untyped_defs = True
252-
253-
[mypy-synapse.util.module_loader]
254-
disallow_untyped_defs = True
255-
256-
[mypy-synapse.util.msisdn]
257-
disallow_untyped_defs = True
258-
259-
[mypy-synapse.util.patch_inline_callbacks]
260-
disallow_untyped_defs = True
261-
262-
[mypy-synapse.util.ratelimitutils]
263-
disallow_untyped_defs = True
264-
265-
[mypy-synapse.util.retryutils]
266-
disallow_untyped_defs = True
267-
268-
[mypy-synapse.util.rlimit]
269-
disallow_untyped_defs = True
270-
271-
[mypy-synapse.util.stringutils]
272-
disallow_untyped_defs = True
273-
274-
[mypy-synapse.util.templates]
275-
disallow_untyped_defs = True
276-
277-
[mypy-synapse.util.threepids]
278-
disallow_untyped_defs = True
279-
280-
[mypy-synapse.util.wheel_timer]
281-
disallow_untyped_defs = True
282-
283-
[mypy-synapse.util.versionstring]
284-
disallow_untyped_defs = True
202+
[mypy-synapse.util.caches.treecache]
203+
disallow_untyped_defs = False
285204

286205
[mypy-tests.handlers.test_user_directory]
287206
disallow_untyped_defs = True

synapse/util/async_helpers.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
Generic,
2828
Hashable,
2929
Iterable,
30+
Iterator,
3031
Optional,
3132
Set,
3233
TypeVar,
@@ -40,7 +41,6 @@
4041
from twisted.internet import defer
4142
from twisted.internet.defer import CancelledError
4243
from twisted.internet.interfaces import IReactorTime
43-
from twisted.python import failure
4444
from twisted.python.failure import Failure
4545

4646
from synapse.logging.context import (
@@ -78,7 +78,7 @@ def __init__(self, deferred: "defer.Deferred[_T]", consumeErrors: bool = False):
7878
object.__setattr__(self, "_result", None)
7979
object.__setattr__(self, "_observers", [])
8080

81-
def callback(r):
81+
def callback(r: _T) -> _T:
8282
object.__setattr__(self, "_result", (True, r))
8383

8484
# once we have set _result, no more entries will be added to _observers,
@@ -98,7 +98,7 @@ def callback(r):
9898
)
9999
return r
100100

101-
def errback(f):
101+
def errback(f: Failure) -> Optional[Failure]:
102102
object.__setattr__(self, "_result", (False, f))
103103

104104
# once we have set _result, no more entries will be added to _observers,
@@ -109,7 +109,7 @@ def errback(f):
109109
for observer in observers:
110110
# This is a little bit of magic to correctly propagate stack
111111
# traces when we `await` on one of the observer deferreds.
112-
f.value.__failure__ = f
112+
f.value.__failure__ = f # type: ignore[union-attr]
113113
try:
114114
observer.errback(f)
115115
except Exception as e:
@@ -314,7 +314,7 @@ def queue(self, key: Hashable) -> defer.Deferred:
314314
# will release the lock.
315315

316316
@contextmanager
317-
def _ctx_manager(_):
317+
def _ctx_manager(_: None) -> Iterator[None]:
318318
try:
319319
yield
320320
finally:
@@ -355,7 +355,7 @@ def _await_lock(self, key: Hashable) -> defer.Deferred:
355355
new_defer = make_deferred_yieldable(defer.Deferred())
356356
entry.deferreds[new_defer] = 1
357357

358-
def cb(_r):
358+
def cb(_r: None) -> "defer.Deferred[None]":
359359
logger.debug("Acquired linearizer lock %r for key %r", self.name, key)
360360
entry.count += 1
361361

@@ -371,7 +371,7 @@ def cb(_r):
371371
# code must be synchronous, so this is the only sensible place.)
372372
return self._clock.sleep(0)
373373

374-
def eb(e):
374+
def eb(e: Failure) -> Failure:
375375
logger.info("defer %r got err %r", new_defer, e)
376376
if isinstance(e, CancelledError):
377377
logger.debug(
@@ -435,7 +435,7 @@ async def read(self, key: str) -> ContextManager:
435435
await make_deferred_yieldable(curr_writer)
436436

437437
@contextmanager
438-
def _ctx_manager():
438+
def _ctx_manager() -> Iterator[None]:
439439
try:
440440
yield
441441
finally:
@@ -464,7 +464,7 @@ async def write(self, key: str) -> ContextManager:
464464
await make_deferred_yieldable(defer.gatherResults(to_wait_on))
465465

466466
@contextmanager
467-
def _ctx_manager():
467+
def _ctx_manager() -> Iterator[None]:
468468
try:
469469
yield
470470
finally:
@@ -524,7 +524,7 @@ def time_it_out() -> None:
524524

525525
delayed_call = reactor.callLater(timeout, time_it_out)
526526

527-
def convert_cancelled(value: failure.Failure):
527+
def convert_cancelled(value: Failure) -> Failure:
528528
# if the original deferred was cancelled, and our timeout has fired, then
529529
# the reason it was cancelled was due to our timeout. Turn the CancelledError
530530
# into a TimeoutError.
@@ -534,19 +534,19 @@ def convert_cancelled(value: failure.Failure):
534534

535535
deferred.addErrback(convert_cancelled)
536536

537-
def cancel_timeout(result):
537+
def cancel_timeout(result: _T) -> _T:
538538
# stop the pending call to cancel the deferred if it's been fired
539539
if delayed_call.active():
540540
delayed_call.cancel()
541541
return result
542542

543543
deferred.addBoth(cancel_timeout)
544544

545-
def success_cb(val):
545+
def success_cb(val: _T) -> None:
546546
if not new_d.called:
547547
new_d.callback(val)
548548

549-
def failure_cb(val):
549+
def failure_cb(val: Failure) -> None:
550550
if not new_d.called:
551551
new_d.errback(val)
552552

@@ -557,13 +557,13 @@ def failure_cb(val):
557557

558558
# This class can't be generic because it uses slots with attrs.
559559
# See: https://github.com/python-attrs/attrs/issues/313
560-
@attr.s(slots=True, frozen=True)
560+
@attr.s(slots=True, frozen=True, auto_attribs=True)
561561
class DoneAwaitable: # should be: Generic[R]
562562
"""Simple awaitable that returns the provided value."""
563563

564-
value = attr.ib(type=Any) # should be: R
564+
value: Any # should be: R
565565

566-
def __await__(self):
566+
def __await__(self) -> Any:
567567
return self
568568

569569
def __iter__(self) -> "DoneAwaitable":

synapse/util/caches/__init__.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import typing
1818
from enum import Enum, auto
1919
from sys import intern
20-
from typing import Callable, Dict, Optional, Sized
20+
from typing import Any, Callable, Dict, List, Optional, Sized
2121

2222
import attr
2323
from prometheus_client.core import Gauge
@@ -58,20 +58,20 @@ class EvictionReason(Enum):
5858
time = auto()
5959

6060

61-
@attr.s(slots=True)
61+
@attr.s(slots=True, auto_attribs=True)
6262
class CacheMetric:
6363

64-
_cache = attr.ib()
65-
_cache_type = attr.ib(type=str)
66-
_cache_name = attr.ib(type=str)
67-
_collect_callback = attr.ib(type=Optional[Callable])
64+
_cache: Sized
65+
_cache_type: str
66+
_cache_name: str
67+
_collect_callback: Optional[Callable]
6868

69-
hits = attr.ib(default=0)
70-
misses = attr.ib(default=0)
69+
hits: int = 0
70+
misses: int = 0
7171
eviction_size_by_reason: typing.Counter[EvictionReason] = attr.ib(
7272
factory=collections.Counter
7373
)
74-
memory_usage = attr.ib(default=None)
74+
memory_usage: Optional[int] = None
7575

7676
def inc_hits(self) -> None:
7777
self.hits += 1
@@ -89,13 +89,14 @@ def inc_memory_usage(self, memory: int) -> None:
8989
self.memory_usage += memory
9090

9191
def dec_memory_usage(self, memory: int) -> None:
92+
assert self.memory_usage is not None
9293
self.memory_usage -= memory
9394

9495
def clear_memory_usage(self) -> None:
9596
if self.memory_usage is not None:
9697
self.memory_usage = 0
9798

98-
def describe(self):
99+
def describe(self) -> List[str]:
99100
return []
100101

101102
def collect(self) -> None:
@@ -118,8 +119,9 @@ def collect(self) -> None:
118119
self.eviction_size_by_reason[reason]
119120
)
120121
cache_total.labels(self._cache_name).set(self.hits + self.misses)
121-
if getattr(self._cache, "max_size", None):
122-
cache_max_size.labels(self._cache_name).set(self._cache.max_size)
122+
max_size = getattr(self._cache, "max_size", None)
123+
if max_size:
124+
cache_max_size.labels(self._cache_name).set(max_size)
123125

124126
if TRACK_MEMORY_USAGE:
125127
# self.memory_usage can be None if nothing has been inserted
@@ -193,7 +195,7 @@ def register_cache(
193195
}
194196

195197

196-
def intern_string(string):
198+
def intern_string(string: Optional[str]) -> Optional[str]:
197199
"""Takes a (potentially) unicode string and interns it if it's ascii"""
198200
if string is None:
199201
return None
@@ -204,15 +206,15 @@ def intern_string(string):
204206
return string
205207

206208

207-
def intern_dict(dictionary):
209+
def intern_dict(dictionary: Dict[str, Any]) -> Dict[str, Any]:
208210
"""Takes a dictionary and interns well known keys and their values"""
209211
return {
210212
KNOWN_KEYS.get(key, key): _intern_known_values(key, value)
211213
for key, value in dictionary.items()
212214
}
213215

214216

215-
def _intern_known_values(key, value):
217+
def _intern_known_values(key: str, value: Any) -> Any:
216218
intern_keys = ("event_id", "room_id", "sender", "user_id", "type", "state_key")
217219

218220
if key in intern_keys:

synapse/util/caches/deferred_cache.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ def prefill(
289289
callbacks = [callback] if callback else []
290290
self.cache.set(key, value, callbacks=callbacks)
291291

292-
def invalidate(self, key) -> None:
292+
def invalidate(self, key: KT) -> None:
293293
"""Delete a key, or tree of entries
294294
295295
If the cache is backed by a regular dict, then "key" must be of

0 commit comments

Comments
 (0)