Просмотр исходного кода

fix(typing): type serialize function return val as Mapping (#51626)

- change the base serializer function to return `Mapping...` instead of
`MutableMapping...`. This makes the return type compatible with the
`TypedDict` overrides used in sub-classes, and fixes a few type errors.

---------

Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
Josh Ferge 1 год назад
Родитель
Сommit
1f8dae9775

+ 0 - 4
pyproject.toml

@@ -385,10 +385,6 @@ module = [
     "sentry.api.serializers.models.notification_setting",
     "sentry.api.serializers.models.organization",
     "sentry.api.serializers.models.organization_member.base",
-    "sentry.api.serializers.models.organization_member.expand.projects",
-    "sentry.api.serializers.models.organization_member.expand.roles",
-    "sentry.api.serializers.models.organization_member.expand.teams",
-    "sentry.api.serializers.models.organization_member.scim",
     "sentry.api.serializers.models.plugin",
     "sentry.api.serializers.models.project",
     "sentry.api.serializers.models.projectcodeowners",

+ 7 - 16
src/sentry/api/serializers/base.py

@@ -1,16 +1,5 @@
 import logging
-from typing import (
-    Any,
-    Callable,
-    List,
-    Mapping,
-    MutableMapping,
-    Optional,
-    Sequence,
-    Type,
-    TypeVar,
-    Union,
-)
+from typing import Any, Callable, Mapping, MutableMapping, Optional, Sequence, Type, TypeVar, Union
 
 import sentry_sdk
 from django.contrib.auth.models import AnonymousUser
@@ -92,13 +81,15 @@ class Serializer:
 
     def __call__(
         self, obj: Any, attrs: Mapping[Any, Any], user: Any, **kwargs: Any
-    ) -> Optional[MutableMapping[str, Any]]:
+    ) -> Optional[Mapping[str, Any]]:
         """See documentation for `serialize`."""
         if obj is None:
             return None
         return self._serialize(obj, attrs, user, **kwargs)
 
-    def get_attrs(self, item_list: List[Any], user: Any, **kwargs: Any) -> MutableMapping[Any, Any]:
+    def get_attrs(
+        self, item_list: Sequence[Any], user: Any, **kwargs: Any
+    ) -> MutableMapping[Any, Any]:
         """
         Fetch all of the associated data needed to serialize the objects in `item_list`.
 
@@ -111,7 +102,7 @@ class Serializer:
 
     def _serialize(
         self, obj: Any, attrs: Mapping[Any, Any], user: Any, **kwargs: Any
-    ) -> Optional[MutableMapping[str, JSONData]]:
+    ) -> Optional[Mapping[str, JSONData]]:
         try:
             return self.serialize(obj, attrs, user, **kwargs)
         except Exception:
@@ -120,7 +111,7 @@ class Serializer:
 
     def serialize(
         self, obj: Any, attrs: Mapping[Any, Any], user: Any, **kwargs: Any
-    ) -> MutableMapping[str, JSONData]:
+    ) -> Mapping[str, JSONData]:
         """
         Convert an arbitrary python object `obj` to an object that only contains primitives.
 

+ 3 - 3
src/sentry/api/serializers/models/sentry_app_installation.py

@@ -1,6 +1,6 @@
 from __future__ import annotations
 
-from typing import Any, List, MutableMapping
+from typing import Any, MutableMapping, Sequence
 
 from sentry.api.serializers import Serializer, register
 from sentry.constants import SentryAppInstallationStatus
@@ -12,8 +12,8 @@ from sentry.services.hybrid_cloud.user import RpcUser
 @register(SentryAppInstallation)
 class SentryAppInstallationSerializer(Serializer):
     def get_attrs(
-        self, item_list: List[SentryAppInstallation], user: User | RpcUser, **kwargs: Any
-    ) -> MutableMapping[Any, Any]:
+        self, item_list: Sequence[SentryAppInstallation], user: User | RpcUser, **kwargs: Any
+    ):
         result: MutableMapping[Any, Any] = super().get_attrs(item_list, user, **kwargs)
 
         organizations = {