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

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

Merged
merged 4 commits into from
Mar 24, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/9675.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add additional type hints to the Homeserver object.
6 changes: 4 additions & 2 deletions synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ class SyncConfig:
filter_collection = attr.ib(type=FilterCollection)
is_guest = attr.ib(type=bool)
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)
Expand Down Expand Up @@ -723,7 +723,9 @@ async def compute_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)
if cache is None:
logger.debug("creating LruCache for %r", cache_key)
Expand Down
11 changes: 8 additions & 3 deletions synapse/rest/client/v2_alpha/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import itertools
import logging
from typing import TYPE_CHECKING, Tuple

from synapse.api.constants import PresenceState
from synapse.api.errors import Codes, StoreError, SynapseError
Expand All @@ -26,11 +27,15 @@
from synapse.handlers.presence import format_user_presence_state
from synapse.handlers.sync import SyncConfig
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 ._base import client_patterns, set_timeline_upper_limit

if TYPE_CHECKING:
from synapse.server import HomeServer

logger = logging.getLogger(__name__)


Expand Down Expand Up @@ -73,7 +78,7 @@ class SyncRestServlet(RestServlet):
PATTERNS = client_patterns("/sync$")
ALLOWED_PRESENCE = {"online", "offline", "unavailable"}

def __init__(self, hs):
def __init__(self, hs: "HomeServer"):
super().__init__()
self.hs = hs
self.auth = hs.get_auth()
Expand All @@ -85,7 +90,7 @@ def __init__(self, hs):
self._server_notices_sender = hs.get_server_notices_sender()
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:
# /events used to use 'from', but /sync uses 'since'.
# Lets be helpful and whine if we see a 'from'.
Expand Down
4 changes: 2 additions & 2 deletions synapse/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -650,13 +650,13 @@ def get_federation_registry(self) -> FederationHandlerRegistry:
return FederationHandlerRegistry(self)

@cache_in_self
def get_server_notices_manager(self):
def get_server_notices_manager(self) -> ServerNoticesManager:
if self.config.worker_app:
raise Exception("Workers cannot send server notices")
return ServerNoticesManager(self)

@cache_in_self
def get_server_notices_sender(self):
def get_server_notices_sender(self) -> WorkerServerNoticesSender:
if self.config.worker_app:
return WorkerServerNoticesSender(self)
return ServerNoticesSender(self)
Expand Down
18 changes: 10 additions & 8 deletions synapse/server_notices/consent_server_notices.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from typing import Any
from typing import TYPE_CHECKING, Any, Set

from synapse.api.errors import SynapseError
from synapse.api.urls import ConsentURIBuilder
from synapse.config import ConfigError
from synapse.types import get_localpart_from_id

if TYPE_CHECKING:
from synapse.server import HomeServer

logger = logging.getLogger(__name__)


Expand All @@ -28,16 +31,11 @@ class ConsentServerNotices:
privacy policy consent, and sends one if we do.
"""

def __init__(self, hs):
"""

Args:
hs (synapse.server.HomeServer):
"""
def __init__(self, hs: "HomeServer"):
self._server_notices_manager = hs.get_server_notices_manager()
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._server_notice_content = hs.config.user_consent_server_notice_content
Expand Down Expand Up @@ -73,6 +71,10 @@ async def maybe_send_server_notice_to_user(self, user_id: str) -> None:
try:
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:
# don't send to guests
return
Expand Down
11 changes: 5 additions & 6 deletions synapse/server_notices/resource_limits_server_notices.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
from typing import List, Tuple
from typing import TYPE_CHECKING, List, Tuple

from synapse.api.constants import (
EventTypes,
Expand All @@ -24,6 +24,9 @@
from synapse.api.errors import AuthError, ResourceLimitError, SynapseError
from synapse.server_notices.server_notices_manager import SERVER_NOTICE_ROOM_TAG

if TYPE_CHECKING:
from synapse.server import HomeServer

logger = logging.getLogger(__name__)


Expand All @@ -32,11 +35,7 @@ class ResourceLimitsServerNotices:
ensures that the client is kept up to date.
"""

def __init__(self, hs):
"""
Args:
hs (synapse.server.HomeServer):
"""
def __init__(self, hs: "HomeServer"):
self._server_notices_manager = hs.get_server_notices_manager()
self._store = hs.get_datastore()
self._auth = hs.get_auth()
Expand Down
2 changes: 1 addition & 1 deletion synapse/server_notices/server_notices_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ async def send_notice(
user_id: str,
event_content: dict,
type: str = EventTypes.Message,
state_key: Optional[bool] = None,
state_key: Optional[str] = None,
) -> EventBase:
"""Send a notice to the given user

Expand Down
18 changes: 10 additions & 8 deletions synapse/server_notices/server_notices_sender.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,27 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# 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.resource_limits_server_notices import (
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
Certain Events take place
"""

def __init__(self, hs):
"""

Args:
hs (synapse.server.HomeServer):
"""
def __init__(self, hs: "HomeServer"):
super().__init__(hs)
self._server_notices = (
ConsentServerNotices(hs),
ResourceLimitsServerNotices(hs),
Expand Down
11 changes: 6 additions & 5 deletions synapse/server_notices/worker_server_notices_sender.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,17 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from synapse.server import HomeServer


class WorkerServerNoticesSender:
"""Stub impl of ServerNoticesSender which does nothing"""

def __init__(self, hs):
"""
Args:
hs (synapse.server.HomeServer):
"""
def __init__(self, hs: "HomeServer"):
pass

async def on_user_syncing(self, user_id: str) -> None:
"""Called when the user performs a sync operation.
Expand Down
6 changes: 3 additions & 3 deletions synapse/storage/databases/main/deviceinbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# limitations under the License.

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.replication.tcp.streams import ToDeviceStream
Expand Down Expand Up @@ -115,7 +115,7 @@ def get_to_device_stream_token(self):
async def get_new_messages_for_device(
self,
user_id: str,
device_id: str,
device_id: Optional[str],
last_stream_id: int,
current_stream_id: int,
limit: int = 100,
Expand Down Expand Up @@ -163,7 +163,7 @@ def get_new_messages_for_device_txn(txn):

@trace
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:
"""
Args:
Expand Down
4 changes: 2 additions & 2 deletions synapse/storage/databases/main/monthly_active_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
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.storage._base import SQLBaseStore
Expand Down Expand Up @@ -109,7 +109,7 @@ async def get_registered_reserved_users(self) -> List[str]:
return users

@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

Expand Down