Add a type hints for service notices to the HomeServer object. (#9675)

This commit is contained in:
Patrick Cloke 2021-03-24 06:48:46 -04:00 committed by GitHub
parent e550ab17ad
commit 7e8dc9934e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 52 additions and 40 deletions

1
changelog.d/9675.misc Normal file
View File

@ -0,0 +1 @@
Add additional type hints to the Homeserver object.

View File

@ -80,7 +80,7 @@ class SyncConfig:
filter_collection = attr.ib(type=FilterCollection) filter_collection = attr.ib(type=FilterCollection)
is_guest = attr.ib(type=bool) is_guest = attr.ib(type=bool)
request_key = attr.ib(type=Tuple[Any, ...]) request_key = attr.ib(type=Tuple[Any, ...])
device_id = attr.ib(type=str) device_id = attr.ib(type=Optional[str])
@attr.s(slots=True, frozen=True) @attr.s(slots=True, frozen=True)
@ -723,7 +723,9 @@ class SyncHandler:
return summary return summary
def get_lazy_loaded_members_cache(self, cache_key: Tuple[str, str]) -> LruCache: def get_lazy_loaded_members_cache(
self, cache_key: Tuple[str, Optional[str]]
) -> LruCache:
cache = self.lazy_loaded_members_cache.get(cache_key) cache = self.lazy_loaded_members_cache.get(cache_key)
if cache is None: if cache is None:
logger.debug("creating LruCache for %r", cache_key) logger.debug("creating LruCache for %r", cache_key)

View File

@ -15,6 +15,7 @@
import itertools import itertools
import logging import logging
from typing import TYPE_CHECKING, Tuple
from synapse.api.constants import PresenceState from synapse.api.constants import PresenceState
from synapse.api.errors import Codes, StoreError, SynapseError from synapse.api.errors import Codes, StoreError, SynapseError
@ -26,11 +27,15 @@ from synapse.events.utils import (
from synapse.handlers.presence import format_user_presence_state from synapse.handlers.presence import format_user_presence_state
from synapse.handlers.sync import SyncConfig from synapse.handlers.sync import SyncConfig
from synapse.http.servlet import RestServlet, parse_boolean, parse_integer, parse_string from synapse.http.servlet import RestServlet, parse_boolean, parse_integer, parse_string
from synapse.types import StreamToken from synapse.http.site import SynapseRequest
from synapse.types import JsonDict, StreamToken
from synapse.util import json_decoder from synapse.util import json_decoder
from ._base import client_patterns, set_timeline_upper_limit from ._base import client_patterns, set_timeline_upper_limit
if TYPE_CHECKING:
from synapse.server import HomeServer
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -73,7 +78,7 @@ class SyncRestServlet(RestServlet):
PATTERNS = client_patterns("/sync$") PATTERNS = client_patterns("/sync$")
ALLOWED_PRESENCE = {"online", "offline", "unavailable"} ALLOWED_PRESENCE = {"online", "offline", "unavailable"}
def __init__(self, hs): def __init__(self, hs: "HomeServer"):
super().__init__() super().__init__()
self.hs = hs self.hs = hs
self.auth = hs.get_auth() self.auth = hs.get_auth()
@ -85,7 +90,7 @@ class SyncRestServlet(RestServlet):
self._server_notices_sender = hs.get_server_notices_sender() self._server_notices_sender = hs.get_server_notices_sender()
self._event_serializer = hs.get_event_client_serializer() self._event_serializer = hs.get_event_client_serializer()
async def on_GET(self, request): async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
if b"from" in request.args: if b"from" in request.args:
# /events used to use 'from', but /sync uses 'since'. # /events used to use 'from', but /sync uses 'since'.
# Lets be helpful and whine if we see a 'from'. # Lets be helpful and whine if we see a 'from'.

View File

@ -650,13 +650,13 @@ class HomeServer(metaclass=abc.ABCMeta):
return FederationHandlerRegistry(self) return FederationHandlerRegistry(self)
@cache_in_self @cache_in_self
def get_server_notices_manager(self): def get_server_notices_manager(self) -> ServerNoticesManager:
if self.config.worker_app: if self.config.worker_app:
raise Exception("Workers cannot send server notices") raise Exception("Workers cannot send server notices")
return ServerNoticesManager(self) return ServerNoticesManager(self)
@cache_in_self @cache_in_self
def get_server_notices_sender(self): def get_server_notices_sender(self) -> WorkerServerNoticesSender:
if self.config.worker_app: if self.config.worker_app:
return WorkerServerNoticesSender(self) return WorkerServerNoticesSender(self)
return ServerNoticesSender(self) return ServerNoticesSender(self)

View File

@ -13,13 +13,16 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import logging import logging
from typing import Any from typing import TYPE_CHECKING, Any, Set
from synapse.api.errors import SynapseError from synapse.api.errors import SynapseError
from synapse.api.urls import ConsentURIBuilder from synapse.api.urls import ConsentURIBuilder
from synapse.config import ConfigError from synapse.config import ConfigError
from synapse.types import get_localpart_from_id from synapse.types import get_localpart_from_id
if TYPE_CHECKING:
from synapse.server import HomeServer
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -28,16 +31,11 @@ class ConsentServerNotices:
privacy policy consent, and sends one if we do. privacy policy consent, and sends one if we do.
""" """
def __init__(self, hs): def __init__(self, hs: "HomeServer"):
"""
Args:
hs (synapse.server.HomeServer):
"""
self._server_notices_manager = hs.get_server_notices_manager() self._server_notices_manager = hs.get_server_notices_manager()
self._store = hs.get_datastore() self._store = hs.get_datastore()
self._users_in_progress = set() self._users_in_progress = set() # type: Set[str]
self._current_consent_version = hs.config.user_consent_version self._current_consent_version = hs.config.user_consent_version
self._server_notice_content = hs.config.user_consent_server_notice_content self._server_notice_content = hs.config.user_consent_server_notice_content
@ -73,6 +71,10 @@ class ConsentServerNotices:
try: try:
u = await self._store.get_user_by_id(user_id) u = await self._store.get_user_by_id(user_id)
# The user doesn't exist.
if u is None:
return
if u["is_guest"] and not self._send_to_guests: if u["is_guest"] and not self._send_to_guests:
# don't send to guests # don't send to guests
return return

View File

@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import logging import logging
from typing import List, Tuple from typing import TYPE_CHECKING, List, Tuple
from synapse.api.constants import ( from synapse.api.constants import (
EventTypes, EventTypes,
@ -24,6 +24,9 @@ from synapse.api.constants import (
from synapse.api.errors import AuthError, ResourceLimitError, SynapseError from synapse.api.errors import AuthError, ResourceLimitError, SynapseError
from synapse.server_notices.server_notices_manager import SERVER_NOTICE_ROOM_TAG from synapse.server_notices.server_notices_manager import SERVER_NOTICE_ROOM_TAG
if TYPE_CHECKING:
from synapse.server import HomeServer
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -32,11 +35,7 @@ class ResourceLimitsServerNotices:
ensures that the client is kept up to date. ensures that the client is kept up to date.
""" """
def __init__(self, hs): def __init__(self, hs: "HomeServer"):
"""
Args:
hs (synapse.server.HomeServer):
"""
self._server_notices_manager = hs.get_server_notices_manager() self._server_notices_manager = hs.get_server_notices_manager()
self._store = hs.get_datastore() self._store = hs.get_datastore()
self._auth = hs.get_auth() self._auth = hs.get_auth()

View File

@ -58,7 +58,7 @@ class ServerNoticesManager:
user_id: str, user_id: str,
event_content: dict, event_content: dict,
type: str = EventTypes.Message, type: str = EventTypes.Message,
state_key: Optional[bool] = None, state_key: Optional[str] = None,
) -> EventBase: ) -> EventBase:
"""Send a notice to the given user """Send a notice to the given user

View File

@ -12,25 +12,27 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from typing import Iterable, Union from typing import TYPE_CHECKING, Iterable, Union
from synapse.server_notices.consent_server_notices import ConsentServerNotices from synapse.server_notices.consent_server_notices import ConsentServerNotices
from synapse.server_notices.resource_limits_server_notices import ( from synapse.server_notices.resource_limits_server_notices import (
ResourceLimitsServerNotices, ResourceLimitsServerNotices,
) )
from synapse.server_notices.worker_server_notices_sender import (
WorkerServerNoticesSender,
)
if TYPE_CHECKING:
from synapse.server import HomeServer
class ServerNoticesSender: class ServerNoticesSender(WorkerServerNoticesSender):
"""A centralised place which sends server notices automatically when """A centralised place which sends server notices automatically when
Certain Events take place Certain Events take place
""" """
def __init__(self, hs): def __init__(self, hs: "HomeServer"):
""" super().__init__(hs)
Args:
hs (synapse.server.HomeServer):
"""
self._server_notices = ( self._server_notices = (
ConsentServerNotices(hs), ConsentServerNotices(hs),
ResourceLimitsServerNotices(hs), ResourceLimitsServerNotices(hs),

View File

@ -12,16 +12,17 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from synapse.server import HomeServer
class WorkerServerNoticesSender: class WorkerServerNoticesSender:
"""Stub impl of ServerNoticesSender which does nothing""" """Stub impl of ServerNoticesSender which does nothing"""
def __init__(self, hs): def __init__(self, hs: "HomeServer"):
""" pass
Args:
hs (synapse.server.HomeServer):
"""
async def on_user_syncing(self, user_id: str) -> None: async def on_user_syncing(self, user_id: str) -> None:
"""Called when the user performs a sync operation. """Called when the user performs a sync operation.

View File

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
import logging import logging
from typing import List, Tuple from typing import List, Optional, Tuple
from synapse.logging.opentracing import log_kv, set_tag, trace from synapse.logging.opentracing import log_kv, set_tag, trace
from synapse.replication.tcp.streams import ToDeviceStream from synapse.replication.tcp.streams import ToDeviceStream
@ -115,7 +115,7 @@ class DeviceInboxWorkerStore(SQLBaseStore):
async def get_new_messages_for_device( async def get_new_messages_for_device(
self, self,
user_id: str, user_id: str,
device_id: str, device_id: Optional[str],
last_stream_id: int, last_stream_id: int,
current_stream_id: int, current_stream_id: int,
limit: int = 100, limit: int = 100,
@ -163,7 +163,7 @@ class DeviceInboxWorkerStore(SQLBaseStore):
@trace @trace
async def delete_messages_for_device( async def delete_messages_for_device(
self, user_id: str, device_id: str, up_to_stream_id: int self, user_id: str, device_id: Optional[str], up_to_stream_id: int
) -> int: ) -> int:
""" """
Args: Args:

View File

@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import logging import logging
from typing import Dict, List from typing import Dict, List, Optional
from synapse.metrics.background_process_metrics import wrap_as_background_process from synapse.metrics.background_process_metrics import wrap_as_background_process
from synapse.storage._base import SQLBaseStore from synapse.storage._base import SQLBaseStore
@ -109,7 +109,7 @@ class MonthlyActiveUsersWorkerStore(SQLBaseStore):
return users return users
@cached(num_args=1) @cached(num_args=1)
async def user_last_seen_monthly_active(self, user_id: str) -> int: async def user_last_seen_monthly_active(self, user_id: str) -> Optional[int]:
""" """
Checks if a given user is part of the monthly active user group Checks if a given user is part of the monthly active user group