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

Commit bec01c0

Browse files
authored
Convert room member storage tuples to attrs. (#10629)
Instead of using namedtuples. This helps with asserting type hints and code completion.
1 parent 6e613a1 commit bec01c0

File tree

7 files changed

+54
-29
lines changed

7 files changed

+54
-29
lines changed

changelog.d/10629.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Convert room member storage tuples to `attrs` classes.

synapse/handlers/initial_sync.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ async def _snapshot_all_rooms(
151151
limit = 10
152152

153153
async def handle_room(event: RoomsForUser):
154-
d = {
154+
d: JsonDict = {
155155
"room_id": event.room_id,
156156
"membership": event.membership,
157157
"visibility": (

synapse/handlers/sync.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ async def compute_summary(
701701
name_id = state_ids.get((EventTypes.Name, ""))
702702
canonical_alias_id = state_ids.get((EventTypes.CanonicalAlias, ""))
703703

704-
summary = {}
704+
summary: JsonDict = {}
705705
empty_ms = MemberSummary([], 0)
706706

707707
# TODO: only send these when they change.
@@ -2076,21 +2076,23 @@ async def get_rooms_for_user_at(
20762076
# If the membership's stream ordering is after the given stream
20772077
# ordering, we need to go and work out if the user was in the room
20782078
# before.
2079-
for room_id, event_pos in joined_rooms:
2080-
if not event_pos.persisted_after(room_key):
2081-
joined_room_ids.add(room_id)
2079+
for joined_room in joined_rooms:
2080+
if not joined_room.event_pos.persisted_after(room_key):
2081+
joined_room_ids.add(joined_room.room_id)
20822082
continue
20832083

2084-
logger.info("User joined room after current token: %s", room_id)
2084+
logger.info("User joined room after current token: %s", joined_room.room_id)
20852085

20862086
extrems = (
20872087
await self.store.get_forward_extremities_for_room_at_stream_ordering(
2088-
room_id, event_pos.stream
2088+
joined_room.room_id, joined_room.event_pos.stream
20892089
)
20902090
)
2091-
users_in_room = await self.state.get_current_users_in_room(room_id, extrems)
2091+
users_in_room = await self.state.get_current_users_in_room(
2092+
joined_room.room_id, extrems
2093+
)
20922094
if user_id in users_in_room:
2093-
joined_room_ids.add(room_id)
2095+
joined_room_ids.add(joined_room.room_id)
20942096

20952097
return frozenset(joined_room_ids)
20962098

synapse/storage/databases/main/roommember.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,9 @@ def _get_room_summary_txn(txn):
307307
)
308308

309309
@cached()
310-
async def get_invited_rooms_for_local_user(self, user_id: str) -> RoomsForUser:
310+
async def get_invited_rooms_for_local_user(
311+
self, user_id: str
312+
) -> List[RoomsForUser]:
311313
"""Get all the rooms the *local* user is invited to.
312314
313315
Args:
@@ -522,7 +524,9 @@ def _get_users_server_still_shares_room_with_txn(txn):
522524
_get_users_server_still_shares_room_with_txn,
523525
)
524526

525-
async def get_rooms_for_user(self, user_id: str, on_invalidate=None):
527+
async def get_rooms_for_user(
528+
self, user_id: str, on_invalidate=None
529+
) -> FrozenSet[str]:
526530
"""Returns a set of room_ids the user is currently joined to.
527531
528532
If a remote user only returns rooms this server is currently

synapse/storage/databases/main/user_directory.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ async def is_room_world_readable_or_publicly_joinable(self, room_id):
365365
return False
366366

367367
async def update_profile_in_user_dir(
368-
self, user_id: str, display_name: str, avatar_url: str
368+
self, user_id: str, display_name: Optional[str], avatar_url: Optional[str]
369369
) -> None:
370370
"""
371371
Update or add a user's profile in the user directory.

synapse/storage/roommember.py

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,40 @@
1414
# limitations under the License.
1515

1616
import logging
17-
from collections import namedtuple
17+
from typing import List, Optional, Tuple
18+
19+
import attr
20+
21+
from synapse.types import PersistedEventPosition
1822

1923
logger = logging.getLogger(__name__)
2024

2125

22-
RoomsForUser = namedtuple(
23-
"RoomsForUser", ("room_id", "sender", "membership", "event_id", "stream_ordering")
24-
)
26+
@attr.s(slots=True, frozen=True, weakref_slot=True, auto_attribs=True)
27+
class RoomsForUser:
28+
room_id: str
29+
sender: str
30+
membership: str
31+
event_id: str
32+
stream_ordering: int
33+
34+
35+
@attr.s(slots=True, frozen=True, weakref_slot=True, auto_attribs=True)
36+
class GetRoomsForUserWithStreamOrdering:
37+
room_id: str
38+
event_pos: PersistedEventPosition
2539

26-
GetRoomsForUserWithStreamOrdering = namedtuple(
27-
"GetRoomsForUserWithStreamOrdering", ("room_id", "event_pos")
28-
)
2940

41+
@attr.s(slots=True, frozen=True, weakref_slot=True, auto_attribs=True)
42+
class ProfileInfo:
43+
avatar_url: Optional[str]
44+
display_name: Optional[str]
3045

31-
# We store this using a namedtuple so that we save about 3x space over using a
32-
# dict.
33-
ProfileInfo = namedtuple("ProfileInfo", ("avatar_url", "display_name"))
3446

35-
# "members" points to a truncated list of (user_id, event_id) tuples for users of
36-
# a given membership type, suitable for use in calculating heroes for a room.
37-
# "count" points to the total numberr of users of a given membership type.
38-
MemberSummary = namedtuple("MemberSummary", ("members", "count"))
47+
@attr.s(slots=True, frozen=True, weakref_slot=True, auto_attribs=True)
48+
class MemberSummary:
49+
# A truncated list of (user_id, event_id) tuples for users of a given
50+
# membership type, suitable for use in calculating heroes for a room.
51+
members: List[Tuple[str, str]]
52+
# The total number of users of a given membership type.
53+
count: int

tests/replication/slave/storage/test_events.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from synapse.events import FrozenEvent, _EventInternalMetadata, make_event_from_dict
2121
from synapse.handlers.room import RoomEventSource
2222
from synapse.replication.slave.storage.events import SlavedEventStore
23-
from synapse.storage.roommember import RoomsForUser
23+
from synapse.storage.roommember import GetRoomsForUserWithStreamOrdering, RoomsForUser
2424
from synapse.types import PersistedEventPosition
2525

2626
from tests.server import FakeTransport
@@ -216,7 +216,7 @@ def test_get_rooms_for_user_with_stream_ordering(self):
216216
self.check(
217217
"get_rooms_for_user_with_stream_ordering",
218218
(USER_ID_2,),
219-
{(ROOM_ID, expected_pos)},
219+
{GetRoomsForUserWithStreamOrdering(ROOM_ID, expected_pos)},
220220
)
221221

222222
def test_get_rooms_for_user_with_stream_ordering_with_multi_event_persist(self):
@@ -305,7 +305,10 @@ def test_get_rooms_for_user_with_stream_ordering_with_multi_event_persist(self):
305305
expected_pos = PersistedEventPosition(
306306
"master", j2.internal_metadata.stream_ordering
307307
)
308-
self.assertEqual(joined_rooms, {(ROOM_ID, expected_pos)})
308+
self.assertEqual(
309+
joined_rooms,
310+
{GetRoomsForUserWithStreamOrdering(ROOM_ID, expected_pos)},
311+
)
309312

310313
event_id = 0
311314

0 commit comments

Comments
 (0)