Skip to content

Commit 7e76393

Browse files
ref: fix more mypy issues (#54470)
<!-- Describe your PR here. -->
1 parent 87e312b commit 7e76393

File tree

59 files changed

+310
-283
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+310
-283
lines changed

pyproject.toml

-44
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,6 @@ module = [
241241
"sentry.api.endpoints.organization_member.details",
242242
"sentry.api.endpoints.organization_member.index",
243243
"sentry.api.endpoints.organization_member.requests.invite.details",
244-
"sentry.api.endpoints.organization_member.requests.invite.index",
245244
"sentry.api.endpoints.organization_member.requests.join",
246245
"sentry.api.endpoints.organization_member_unreleased_commits",
247246
"sentry.api.endpoints.organization_metrics",
@@ -901,7 +900,6 @@ module = [
901900
"tests.sentry.api.test_event_search",
902901
"tests.sentry.api.test_invite_helper",
903902
"tests.sentry.api.test_issue_search",
904-
"tests.sentry.auth.test_access",
905903
"tests.sentry.digests.test_notifications",
906904
"tests.sentry.eventstore.test_base",
907905
"tests.sentry.grouping.test_result",
@@ -1001,51 +999,9 @@ module = [
1001999
"tests.sentry.mail.test_actions",
10021000
"tests.sentry.manager.test_group_manager",
10031001
"tests.sentry.manager.test_team_manager",
1004-
"tests.sentry.mediators.external_issues.test_creator",
1005-
"tests.sentry.mediators.external_issues.test_issue_link_creator",
1006-
"tests.sentry.mediators.external_requests.test_alert_rule_action_requester",
1007-
"tests.sentry.mediators.external_requests.test_issue_link_requester",
1008-
"tests.sentry.mediators.external_requests.test_select_requester",
1009-
"tests.sentry.mediators.project_rules.test_creator",
1010-
"tests.sentry.mediators.project_rules.test_updater",
1011-
"tests.sentry.mediators.sentry_app_installations.test_installation_notifier",
1012-
"tests.sentry.mediators.token_exchange.test_grant_exchanger",
1013-
"tests.sentry.mediators.token_exchange.test_refresher",
1014-
"tests.sentry.mediators.token_exchange.test_validator",
1015-
"tests.sentry.middleware.integrations.parsers.test_slack",
1016-
"tests.sentry.middleware.test_auth",
1017-
"tests.sentry.middleware.test_proxy",
1018-
"tests.sentry.middleware.test_ratelimit_middleware",
1019-
"tests.sentry.middleware.test_stats",
1020-
"tests.sentry.middleware.test_subdomain",
1021-
"tests.sentry.models.test_notificationaction",
1022-
"tests.sentry.models.test_organization",
10231002
"tests.sentry.models.test_organizationmember",
10241003
"tests.sentry.models.test_project",
1025-
"tests.sentry.monitors.endpoints.test_monitor_ingest_checkin_details",
1026-
"tests.sentry.monitors.test_models",
1027-
"tests.sentry.nodestore.bigtable.test_backend",
1028-
"tests.sentry.notifications.notifications.organization_request.test_integration_request",
1029-
"tests.sentry.notifications.notifications.test_digests",
1030-
"tests.sentry.notifications.test_utils",
1031-
"tests.sentry.notifications.utils.test_tasks",
1032-
"tests.sentry.options.test_store",
1033-
"tests.sentry.pipeline.test_pipeline",
1034-
"tests.sentry.plugins.bases.test_issue2",
1035-
"tests.sentry.processing.realtime_metrics.test_redis",
1036-
"tests.sentry.profiles.consumers.test_process",
1037-
"tests.sentry.profiles.test_task",
1038-
"tests.sentry.ratelimits.test_cardinality",
1039-
"tests.sentry.ratelimits.test_config",
1040-
"tests.sentry.ratelimits.test_redis",
1041-
"tests.sentry.ratelimits.utils.test_get_rate_limit_value",
1042-
"tests.sentry.ratelimits.utils.test_get_ratelimit_key",
1043-
"tests.sentry.receivers.test_onboarding",
1044-
"tests.sentry.relay.test_config",
1045-
"tests.sentry.relay.test_projectconfig_cache",
10461004
"tests.sentry.release_health.release_monitor",
1047-
"tests.sentry.release_health.release_monitor.test_metrics",
1048-
"tests.sentry.release_health.release_monitor.test_sessions",
10491005
"tests.sentry.release_health.test_tasks",
10501006
"tests.sentry.replays.consumers.test_recording",
10511007
"tests.sentry.replays.test_project_replay_recording_segment_details",

src/sentry/api/invite_helper.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
from logging import Logger
55
from typing import Dict, Optional
66

7+
from django.http.request import HttpRequest
78
from django.utils.crypto import constant_time_compare
8-
from rest_framework.request import Request
99

1010
from sentry import audit_log, features
1111
from sentry.models import AuthIdentity, AuthProvider, User, UserEmail
@@ -20,15 +20,15 @@
2020

2121

2222
def add_invite_details_to_session(
23-
request: Request, member_id: int, token: str, organization_id: int
23+
request: HttpRequest, member_id: int, token: str, organization_id: int
2424
) -> None:
2525
"""Add member ID and token to the request session"""
2626
request.session["invite_token"] = token
2727
request.session["invite_member_id"] = member_id
2828
request.session["invite_organization_id"] = organization_id
2929

3030

31-
def remove_invite_details_from_session(request: Request) -> None:
31+
def remove_invite_details_from_session(request: HttpRequest) -> None:
3232
"""Deletes invite details from the request session"""
3333
request.session.pop("invite_member_id", None)
3434
request.session.pop("invite_token", None)
@@ -42,7 +42,7 @@ class InviteDetails:
4242
invite_organization_id: Optional[int]
4343

4444

45-
def get_invite_details(request: Request) -> InviteDetails:
45+
def get_invite_details(request: HttpRequest) -> InviteDetails:
4646
"""Returns tuple of (token, member_id) from request session"""
4747
return InviteDetails(
4848
invite_token=request.session.get("invite_token", None),
@@ -55,7 +55,7 @@ class ApiInviteHelper:
5555
@classmethod
5656
def from_session_or_email(
5757
cls,
58-
request: Request,
58+
request: HttpRequest,
5959
organization_id: int,
6060
email: str,
6161
logger: Logger | None = None,
@@ -99,7 +99,7 @@ def from_session_or_email(
9999
@classmethod
100100
def from_session(
101101
cls,
102-
request: Request,
102+
request: HttpRequest,
103103
logger: Logger | None = None,
104104
) -> ApiInviteHelper | None:
105105
invite_details = get_invite_details(request)
@@ -128,7 +128,7 @@ def from_session(
128128

129129
def __init__(
130130
self,
131-
request: Request,
131+
request: HttpRequest,
132132
invite_context: RpcUserInviteContext,
133133
token: str | None,
134134
logger: Logger | None = None,

src/sentry/mediators/param.py

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from typing import TYPE_CHECKING, Callable, Generic, TypeVar, overload
3+
from typing import TYPE_CHECKING, Callable, Generic, Literal, TypeVar, overload
44

55
from typing_extensions import Self
66

@@ -77,6 +77,26 @@ class Param(Generic[T]):
7777
>>> name = Param(str, default=lambda self: self.user['name'])
7878
"""
7979

80+
@overload
81+
def __init__(
82+
self: Param[T | None],
83+
type: type[T],
84+
*,
85+
required: Literal[False],
86+
default: T | Callable[..., T] | None = None,
87+
) -> None:
88+
...
89+
90+
@overload
91+
def __init__(
92+
self: Param[T],
93+
type: type[T],
94+
*,
95+
required: bool = ...,
96+
default: T | Callable[..., T] | None = None,
97+
) -> None:
98+
...
99+
80100
def __init__(
81101
self,
82102
type: type[T],

src/sentry/mediators/project_rules/updater.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
class Updater(Mediator):
1010
rule = Param(Rule)
1111
name = Param(str, required=False)
12-
owner = Param(Actor, required=False)
12+
owner = Param(int, required=False)
1313
environment = Param(int, required=False)
1414
project = Param(Project)
1515
action_match = Param(str, required=False)
@@ -33,11 +33,11 @@ def call(self):
3333
self.rule.save()
3434
return self.rule
3535

36-
@if_param("name")
3736
def _update_name(self):
38-
self.rule.label = self.name
37+
if self.name:
38+
self.rule.label = self.name
3939

40-
def _update_owner(self):
40+
def _update_owner(self) -> None:
4141
self.rule.owner = Actor.objects.get(id=self.owner) if self.owner else None
4242

4343
def _update_environment(self):

src/sentry/middleware/auth.py

+16-7
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44

55
from django.contrib.auth import get_user as auth_get_user
66
from django.contrib.auth.models import AnonymousUser
7+
from django.http.request import HttpRequest
8+
from django.http.response import HttpResponseBase
79
from django.utils.deprecation import MiddlewareMixin
810
from django.utils.functional import SimpleLazyObject
911
from rest_framework.authentication import get_authorization_header
1012
from rest_framework.exceptions import AuthenticationFailed
11-
from rest_framework.request import Request
1213

1314
from sentry.api.authentication import (
1415
ApiKeyAuthentication,
@@ -57,7 +58,7 @@ def impl(self) -> Any:
5758
return RequestAuthenticationMiddleware(self.get_response)
5859
return HybridCloudAuthenticationMiddleware(self.get_response)
5960

60-
def process_request(self, request: Request):
61+
def process_request(self, request: HttpRequest) -> None:
6162
if request.path.startswith("/api/0/internal/rpc/"):
6263
# Avoid doing RPC authentication when we're already
6364
# in an RPC request.
@@ -66,12 +67,14 @@ def process_request(self, request: Request):
6667

6768
return self.impl.process_request(request)
6869

69-
def process_exception(self, request: Request, exception):
70+
def process_exception(
71+
self, request: HttpRequest, exception: Exception
72+
) -> HttpResponseBase | None:
7073
return self.impl.process_exception(request, exception)
7174

7275

7376
class RequestAuthenticationMiddleware(MiddlewareMixin):
74-
def process_request(self, request: Request):
77+
def process_request(self, request: HttpRequest) -> None:
7578
request.user_from_signed_request = False
7679

7780
# If there is a valid signature on the request we override the
@@ -107,15 +110,19 @@ def process_request(self, request: Request):
107110
# default to anonymous user and use IP ratelimit
108111
request.user = SimpleLazyObject(lambda: get_user(request))
109112

110-
def process_exception(self, request: Request, exception):
113+
def process_exception(
114+
self, request: HttpRequest, exception: Exception
115+
) -> HttpResponseBase | None:
111116
if isinstance(exception, AuthUserPasswordExpired):
112117
from sentry.web.frontend.accounts import expired
113118

114119
return expired(request, exception.user)
120+
else:
121+
return None
115122

116123

117124
class HybridCloudAuthenticationMiddleware(MiddlewareMixin):
118-
def process_request(self, request: Request):
125+
def process_request(self, request: HttpRequest) -> None:
119126
from sentry.web.frontend.accounts import expired
120127

121128
auth_result = auth_service.authenticate(request=authentication_request_from(request))
@@ -135,5 +142,7 @@ def process_request(self, request: Request):
135142
else:
136143
request.user = AnonymousUser()
137144

138-
def process_exception(self, request: Request, exception: Exception):
145+
def process_exception(
146+
self, request: HttpRequest, exception: Exception
147+
) -> HttpResponseBase | None:
139148
pass

src/sentry/middleware/proxy.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1+
from typing import Any
2+
13
from django.conf import settings
24
from django.core.exceptions import MiddlewareNotUsed
5+
from django.http.request import HttpRequest
36
from django.utils.deprecation import MiddlewareMixin
4-
from rest_framework.request import Request
57

68

79
class SetRemoteAddrFromForwardedFor(MiddlewareMixin):
8-
def __init__(self, *args, **kwargs):
10+
def __init__(self, *args: Any, **kwargs: Any) -> None:
911
if not getattr(settings, "SENTRY_USE_X_FORWARDED_FOR", True):
1012
raise MiddlewareNotUsed
1113
super().__init__(*args, **kwargs)
1214

13-
def _remove_port_number(self, ip_address):
15+
def _remove_port_number(self, ip_address: str) -> str:
1416
if "[" in ip_address and "]" in ip_address:
1517
# IPv6 address with brackets, possibly with a port number
1618
return ip_address[ip_address.find("[") + 1 : ip_address.find("]")]
@@ -20,7 +22,7 @@ def _remove_port_number(self, ip_address):
2022
return ip_address.rsplit(":", 1)[0]
2123
return ip_address
2224

23-
def process_request(self, request: Request):
25+
def process_request(self, request: HttpRequest) -> None:
2426
try:
2527
real_ip = request.META["HTTP_X_FORWARDED_FOR"]
2628
except KeyError:

src/sentry/middleware/ratelimit.py

+10-7
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
from typing import Callable
66

77
from django.conf import settings
8-
from django.http.response import HttpResponse
9-
from rest_framework.request import Request
10-
from rest_framework.response import Response
8+
from django.http.request import HttpRequest
9+
from django.http.response import HttpResponse, HttpResponseBase
1110

1211
from sentry.ratelimits import (
1312
above_rate_limit_check,
@@ -32,16 +31,18 @@ class RatelimitMiddleware:
3231
See: https://docs.djangoproject.com/en/4.0/topics/http/middleware/#writing-your-own-middleware
3332
"""
3433

35-
def __init__(self, get_response: Callable[[Request], Response]):
34+
def __init__(self, get_response: Callable[[HttpRequest], HttpResponseBase]):
3635
self.get_response = get_response
3736

38-
def __call__(self, request: Request) -> Response:
37+
def __call__(self, request: HttpRequest) -> HttpResponseBase:
3938
# process_view is automatically called by Django
4039
response = self.get_response(request)
4140
self.process_response(request, response)
4241
return response
4342

44-
def process_view(self, request: Request, view_func, view_args, view_kwargs) -> Response | None:
43+
def process_view(
44+
self, request: HttpRequest, view_func, view_args, view_kwargs
45+
) -> HttpResponseBase | None:
4546
"""Check if the endpoint call will violate."""
4647

4748
with metrics.timer("middleware.ratelimit.process_view"):
@@ -116,7 +117,9 @@ def process_view(self, request: Request, view_func, view_args, view_kwargs) -> R
116117
)
117118
return None
118119

119-
def process_response(self, request: Request, response: Response) -> Response:
120+
def process_response(
121+
self, request: HttpRequest, response: HttpResponseBase
122+
) -> HttpResponseBase:
120123
with metrics.timer("middleware.ratelimit.process_response"):
121124
try:
122125
rate_limit_metadata: RateLimitMeta | None = getattr(

src/sentry/middleware/subdomain.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
from django.core.exceptions import DisallowedHost
66
from django.http import HttpResponseRedirect
7-
from rest_framework.request import Request
8-
from rest_framework.response import Response
7+
from django.http.request import HttpRequest
8+
from django.http.response import HttpResponseBase
99

1010
from sentry import options
1111

@@ -18,15 +18,15 @@ class SubdomainMiddleware:
1818
If no subdomain is extracted, then request.subdomain is None.
1919
"""
2020

21-
def __init__(self, get_response: Callable[[Request], Response]):
21+
def __init__(self, get_response: Callable[[HttpRequest], HttpResponseBase]):
2222
self.base_hostname = options.get("system.base-hostname")
2323

2424
if self.base_hostname:
2525
self.base_hostname = self.base_hostname.rstrip("/")
2626

2727
self.get_response = get_response
2828

29-
def __call__(self, request: Request) -> Response:
29+
def __call__(self, request: HttpRequest) -> HttpResponseBase:
3030
request.subdomain = None
3131

3232
if not self.base_hostname:

src/sentry/monitors/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ class Monitor(Model):
248248
default=MonitorType.UNKNOWN,
249249
choices=[(k, str(v)) for k, v in MonitorType.as_choices()],
250250
)
251-
config = JSONField(default=dict)
251+
config: models.Field[dict[str, Any], dict[str, Any]] = JSONField(default=dict)
252252
date_added = models.DateTimeField(default=timezone.now)
253253

254254
class Meta:

src/sentry/notifications/notifications/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ def get_settings_url(self, recipient: RpcActor, provider: ExternalProviders) ->
203203
)
204204
)
205205

206-
def determine_recipients(self) -> Iterable[RpcActor]:
206+
def determine_recipients(self) -> list[RpcActor]:
207207
raise NotImplementedError
208208

209209
def get_notification_providers(self) -> Iterable[ExternalProviders]:

src/sentry/notifications/notifications/codeowners_auto_sync.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class AutoSyncNotification(ProjectNotification):
1616
notification_setting_type = NotificationSettingTypes.DEPLOY
1717
template_path = "sentry/emails/codeowners-auto-sync-failure"
1818

19-
def determine_recipients(self) -> Iterable[RpcActor]:
19+
def determine_recipients(self) -> list[RpcActor]:
2020
return RpcActor.many_from_object(self.organization.get_owners())
2121

2222
@property

0 commit comments

Comments
 (0)