Rewrite _EventInternalMetadata to back it with a _dict

Mostly, this gives mypy an easier time.
This commit is contained in:
Richard van der Hoff 2020-02-07 13:22:17 +00:00
parent 43b2be9764
commit 9551911f88

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright 2014-2016 OpenMarket Ltd # Copyright 2014-2016 OpenMarket Ltd
# Copyright 2019 New Vector Ltd # Copyright 2019 New Vector Ltd
# Copyright 2020 The Matrix.org Foundation C.I.C.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -97,33 +98,55 @@ class DefaultDictProperty(DictProperty):
class _EventInternalMetadata(object): class _EventInternalMetadata(object):
def __init__(self, internal_metadata_dict): __slots__ = ["_dict"]
self.__dict__ = dict(internal_metadata_dict)
def get_dict(self): def __init__(self, internal_metadata_dict: JsonDict):
return dict(self.__dict__) # we have to copy the dict, because it turns out that the same dict is
# reused. TODO: fix that
self._dict = dict(internal_metadata_dict)
def is_outlier(self): outlier = DictProperty("outlier") # type: bool
return getattr(self, "outlier", False) out_of_band_membership = DictProperty("out_of_band_membership") # type: bool
send_on_behalf_of = DictProperty("send_on_behalf_of") # type: str
recheck_redaction = DictProperty("recheck_redaction") # type: bool
soft_failed = DictProperty("soft_failed") # type: bool
proactively_send = DictProperty("proactively_send") # type: bool
redacted = DictProperty("redacted") # type: bool
txn_id = DictProperty("txn_id") # type: str
token_id = DictProperty("token_id") # type: str
stream_ordering = DictProperty("stream_ordering") # type: int
def is_out_of_band_membership(self): # XXX: These are set by StreamWorkerStore._set_before_and_after.
# I'm pretty sure that these are never persisted to the database, so shouldn't
# be here
before = DictProperty("before") # type: str
after = DictProperty("after") # type: str
order = DictProperty("order") # type: int
def get_dict(self) -> JsonDict:
return dict(self._dict)
def is_outlier(self) -> bool:
return self._dict.get("outlier", False)
def is_out_of_band_membership(self) -> bool:
"""Whether this is an out of band membership, like an invite or an invite """Whether this is an out of band membership, like an invite or an invite
rejection. This is needed as those events are marked as outliers, but rejection. This is needed as those events are marked as outliers, but
they still need to be processed as if they're new events (e.g. updating they still need to be processed as if they're new events (e.g. updating
invite state in the database, relaying to clients, etc). invite state in the database, relaying to clients, etc).
""" """
return getattr(self, "out_of_band_membership", False) return self._dict.get("out_of_band_membership", False)
def get_send_on_behalf_of(self): def get_send_on_behalf_of(self) -> Optional[str]:
"""Whether this server should send the event on behalf of another server. """Whether this server should send the event on behalf of another server.
This is used by the federation "send_join" API to forward the initial join This is used by the federation "send_join" API to forward the initial join
event for a server in the room. event for a server in the room.
returns a str with the name of the server this event is sent on behalf of. returns a str with the name of the server this event is sent on behalf of.
""" """
return getattr(self, "send_on_behalf_of", None) return self._dict.get("send_on_behalf_of")
def need_to_check_redaction(self): def need_to_check_redaction(self) -> bool:
"""Whether the redaction event needs to be rechecked when fetching """Whether the redaction event needs to be rechecked when fetching
from the database. from the database.
@ -136,9 +159,9 @@ class _EventInternalMetadata(object):
Returns: Returns:
bool bool
""" """
return getattr(self, "recheck_redaction", False) return self._dict.get("recheck_redaction", False)
def is_soft_failed(self): def is_soft_failed(self) -> bool:
"""Whether the event has been soft failed. """Whether the event has been soft failed.
Soft failed events should be handled as usual, except: Soft failed events should be handled as usual, except:
@ -150,7 +173,7 @@ class _EventInternalMetadata(object):
Returns: Returns:
bool bool
""" """
return getattr(self, "soft_failed", False) return self._dict.get("soft_failed", False)
def should_proactively_send(self): def should_proactively_send(self):
"""Whether the event, if ours, should be sent to other clients and """Whether the event, if ours, should be sent to other clients and
@ -162,7 +185,7 @@ class _EventInternalMetadata(object):
Returns: Returns:
bool bool
""" """
return getattr(self, "proactively_send", True) return self._dict.get("proactively_send", True)
def is_redacted(self): def is_redacted(self):
"""Whether the event has been redacted. """Whether the event has been redacted.
@ -173,7 +196,7 @@ class _EventInternalMetadata(object):
Returns: Returns:
bool bool
""" """
return getattr(self, "redacted", False) return self._dict.get("redacted", False)
class EventBase(object): class EventBase(object):