Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.

Commit 061215d

Browse files
committed
API Improvements: Fix typings for various files pt2
1 parent ee8ecc9 commit 061215d

File tree

6 files changed

+79
-41
lines changed

6 files changed

+79
-41
lines changed

core/commands/repository/repository.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import uuid
2-
from typing import Optional
2+
from typing import Awaitable, Optional
33

44
from codecov.commands.base import BaseCommand
55
from codecov_auth.models import Owner
@@ -38,7 +38,7 @@ def regenerate_repository_upload_token(
3838
self,
3939
repo_name: str,
4040
owner_username: str,
41-
) -> uuid.UUID:
41+
) -> Awaitable[uuid.UUID]:
4242
return self.get_interactor(RegenerateRepositoryUploadTokenInteractor).execute(
4343
repo_name, owner_username
4444
)

graphql_api/types/mutation/erase_repository/erase_repository.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
from typing import Any, Dict
2+
13
from ariadne import UnionType
4+
from graphql import GraphQLResolveInfo
25

36
from graphql_api.helpers.mutation import (
47
require_authenticated,
@@ -9,7 +12,9 @@
912

1013
@wrap_error_handling_mutation
1114
@require_authenticated
12-
async def resolve_erase_repository(_, info, input) -> None:
15+
async def resolve_erase_repository(
16+
_: Any, info: GraphQLResolveInfo, input: Dict[str, Any]
17+
) -> None:
1318
command = info.context["executor"].get_command("repository")
1419
current_owner = info.context["request"].current_owner
1520
repo_name = input.get("repo_name")

graphql_api/types/mutation/regenerate_repository_upload_token/regenerate_repository_upload_token.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
import uuid
2+
from typing import Any, Dict
3+
14
from ariadne import UnionType
5+
from graphql import GraphQLResolveInfo
26

37
from core.commands.repository.repository import RepositoryCommands
48
from graphql_api.helpers.mutation import (
@@ -10,11 +14,13 @@
1014

1115
@wrap_error_handling_mutation
1216
@require_authenticated
13-
async def resolve_regenerate_repository_upload_token(_, info, input):
17+
async def resolve_regenerate_repository_upload_token(
18+
_: Any, info: GraphQLResolveInfo, input: Dict[str, str]
19+
) -> Dict[str, uuid.UUID]:
1420
command: RepositoryCommands = info.context["executor"].get_command("repository")
1521
token = await command.regenerate_repository_upload_token(
16-
repo_name=input.get("repo_name"),
17-
owner_username=input.get("owner"),
22+
repo_name=input.get("repo_name", ""),
23+
owner_username=input.get("owner", ""),
1824
)
1925

2026
return {"token": token}

graphql_api/types/repository/repository.py

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22
from datetime import datetime
3-
from typing import List, Optional
3+
from typing import Any, Dict, List, Optional
44

55
import shared.rate_limits as rate_limits
66
import yaml
@@ -9,8 +9,8 @@
99
from graphql.type.definition import GraphQLResolveInfo
1010

1111
from codecov.db import sync_to_async
12-
from codecov_auth.models import SERVICE_GITHUB, SERVICE_GITHUB_ENTERPRISE
13-
from core.models import Branch, Repository
12+
from codecov_auth.models import SERVICE_GITHUB, SERVICE_GITHUB_ENTERPRISE, Owner
13+
from core.models import Branch, Commit, Pull, Repository
1414
from graphql_api.actions.commits import repo_commits
1515
from graphql_api.dataloader.commit import CommitLoader
1616
from graphql_api.dataloader.owner import OwnerLoader
@@ -21,6 +21,7 @@
2121
CoverageAnalyticsProps,
2222
)
2323
from graphql_api.types.enums import OrderingDirection
24+
from graphql_api.types.enums.enum_types import PullRequestState
2425
from graphql_api.types.errors.errors import NotFoundError, OwnerNotActivatedError
2526
from services.profiling import CriticalFile, ProfilingSummary
2627
from services.redis_configuration import get_redis_connection
@@ -59,18 +60,18 @@ def resolve_branch(
5960

6061

6162
@repository_bindable.field("author")
62-
def resolve_author(repository: Repository, info: GraphQLResolveInfo):
63+
def resolve_author(repository: Repository, info: GraphQLResolveInfo) -> Owner:
6364
return OwnerLoader.loader(info).load(repository.author_id)
6465

6566

6667
@repository_bindable.field("commit")
67-
def resolve_commit(repository: Repository, info: GraphQLResolveInfo, id):
68+
def resolve_commit(repository: Repository, info: GraphQLResolveInfo, id: int) -> Commit:
6869
loader = CommitLoader.loader(info, repository.pk)
6970
return loader.load(id)
7071

7172

7273
@repository_bindable.field("uploadToken")
73-
def resolve_upload_token(repository: Repository, info: GraphQLResolveInfo):
74+
def resolve_upload_token(repository: Repository, info: GraphQLResolveInfo) -> str:
7475
should_hide_tokens = settings.HIDE_ALL_CODECOV_TOKENS
7576

7677
current_owner = info.context["request"].current_owner
@@ -86,7 +87,7 @@ def resolve_upload_token(repository: Repository, info: GraphQLResolveInfo):
8687

8788

8889
@repository_bindable.field("pull")
89-
def resolve_pull(repository: Repository, info: GraphQLResolveInfo, id):
90+
def resolve_pull(repository: Repository, info: GraphQLResolveInfo, id: int) -> Pull:
9091
command = info.context["executor"].get_command("pull")
9192
return command.fetch_pull_request(repository, id)
9293

@@ -95,10 +96,10 @@ def resolve_pull(repository: Repository, info: GraphQLResolveInfo, id):
9596
async def resolve_pulls(
9697
repository: Repository,
9798
info: GraphQLResolveInfo,
98-
filters=None,
99-
ordering_direction=OrderingDirection.DESC,
100-
**kwargs,
101-
):
99+
filters: Optional[Dict[str, List[PullRequestState]]] = None,
100+
ordering_direction: Optional[OrderingDirection] = OrderingDirection.DESC,
101+
**kwargs: Any,
102+
) -> List[Pull]:
102103
command = info.context["executor"].get_command("pull")
103104
queryset = await command.fetch_pull_requests(repository, filters)
104105
return await queryset_to_connection(
@@ -111,8 +112,11 @@ async def resolve_pulls(
111112

112113
@repository_bindable.field("commits")
113114
async def resolve_commits(
114-
repository: Repository, info: GraphQLResolveInfo, filters=None, **kwargs
115-
):
115+
repository: Repository,
116+
info: GraphQLResolveInfo,
117+
filters: Optional[Dict[str, Any]] = None,
118+
**kwargs: Any,
119+
) -> List[Commit]:
116120
queryset = await sync_to_async(repo_commits)(repository, filters)
117121
connection = await queryset_to_connection(
118122
queryset,
@@ -132,8 +136,11 @@ async def resolve_commits(
132136

133137
@repository_bindable.field("branches")
134138
async def resolve_branches(
135-
repository: Repository, info: GraphQLResolveInfo, filters=None, **kwargs
136-
):
139+
repository: Repository,
140+
info: GraphQLResolveInfo,
141+
filters: Optional[Dict[str, str | bool]] = None,
142+
**kwargs: Any,
143+
) -> List[Branch]:
137144
command = info.context["executor"].get_command("branch")
138145
queryset = await command.fetch_branches(repository, filters)
139146
return await queryset_to_connection(
@@ -145,18 +152,20 @@ async def resolve_branches(
145152

146153

147154
@repository_bindable.field("defaultBranch")
148-
def resolve_default_branch(repository: Repository, info: GraphQLResolveInfo):
155+
def resolve_default_branch(repository: Repository, info: GraphQLResolveInfo) -> str:
149156
return repository.branch
150157

151158

152159
@repository_bindable.field("profilingToken")
153-
def resolve_profiling_token(repository: Repository, info: GraphQLResolveInfo):
160+
def resolve_profiling_token(repository: Repository, info: GraphQLResolveInfo) -> str:
154161
command = info.context["executor"].get_command("repository")
155162
return command.get_repository_token(repository, token_type="profiling")
156163

157164

158165
@repository_bindable.field("staticAnalysisToken")
159-
def resolve_static_analysis_token(repository: Repository, info: GraphQLResolveInfo):
166+
def resolve_static_analysis_token(
167+
repository: Repository, info: GraphQLResolveInfo
168+
) -> str:
160169
command = info.context["executor"].get_command("repository")
161170
return command.get_repository_token(repository, token_type="static_analysis")
162171

@@ -178,20 +187,24 @@ def resolve_critical_files(
178187

179188

180189
@repository_bindable.field("graphToken")
181-
def resolve_graph_token(repository: Repository, info: GraphQLResolveInfo):
190+
def resolve_graph_token(repository: Repository, info: GraphQLResolveInfo) -> str:
182191
return repository.image_token
183192

184193

185194
@repository_bindable.field("yaml")
186-
def resolve_repo_yaml(repository: Repository, info: GraphQLResolveInfo):
195+
def resolve_repo_yaml(
196+
repository: Repository, info: GraphQLResolveInfo
197+
) -> Optional[str]:
187198
if repository.yaml is None:
188199
return None
189200
return yaml.dump(repository.yaml)
190201

191202

192203
@repository_bindable.field("bot")
193204
@sync_to_async
194-
def resolve_repo_bot(repository: Repository, info: GraphQLResolveInfo):
205+
def resolve_repo_bot(
206+
repository: Repository, info: GraphQLResolveInfo
207+
) -> Optional[Owner]:
195208
return repository.bot
196209

197210

@@ -212,7 +225,9 @@ def resolve_is_ats_configured(repository: Repository, info: GraphQLResolveInfo)
212225

213226

214227
@repository_bindable.field("repositoryConfig")
215-
def resolve_repository_config(repository: Repository, info: GraphQLResolveInfo):
228+
def resolve_repository_config(
229+
repository: Repository, info: GraphQLResolveInfo
230+
) -> Repository:
216231
return repository
217232

218233

@@ -251,7 +266,7 @@ def resolve_coverage_enabled(
251266

252267

253268
@repository_result_bindable.type_resolver
254-
def resolve_repository_result_type(obj, *_):
269+
def resolve_repository_result_type(obj: Any, *_: Any) -> Optional[str]:
255270
if isinstance(obj, Repository):
256271
return "Repository"
257272
elif isinstance(obj, OwnerNotActivatedError):
@@ -262,7 +277,9 @@ def resolve_repository_result_type(obj, *_):
262277

263278
@repository_bindable.field("isFirstPullRequest")
264279
@sync_to_async
265-
def resolve_is_first_pull_request(repository: Repository, info) -> bool:
280+
def resolve_is_first_pull_request(
281+
repository: Repository, info: GraphQLResolveInfo
282+
) -> bool:
266283
has_one_pr = repository.pull_requests.count() == 1
267284

268285
if has_one_pr:
@@ -274,7 +291,9 @@ def resolve_is_first_pull_request(repository: Repository, info) -> bool:
274291

275292
@repository_bindable.field("isGithubRateLimited")
276293
@sync_to_async
277-
def resolve_is_github_rate_limited(repository: Repository, info) -> bool | None:
294+
def resolve_is_github_rate_limited(
295+
repository: Repository, info: GraphQLResolveInfo
296+
) -> bool | None:
278297
if (
279298
repository.service != SERVICE_GITHUB
280299
and repository.service != SERVICE_GITHUB_ENTERPRISE

upload/tokenless/github_actions.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
from datetime import datetime, timedelta
3+
from typing import Any, Dict
34

45
from asgiref.sync import async_to_sync
56
from django.conf import settings
@@ -18,7 +19,7 @@ class TokenlessGithubActionsHandler(BaseTokenlessUploadHandler):
1819
client_id = settings.GITHUB_CLIENT_ID
1920
client_secret = settings.GITHUB_CLIENT_SECRET
2021

21-
def log_warning(self, message):
22+
def log_warning(self, message: str) -> None:
2223
log.warning(
2324
message,
2425
extra=dict(
@@ -29,7 +30,7 @@ def log_warning(self, message):
2930
),
3031
)
3132

32-
def get_build(self):
33+
def get_build(self) -> Dict[str, Any]:
3334
git = get(
3435
"github",
3536
token=dict(key=self.actions_token),
@@ -73,7 +74,7 @@ def get_build(self):
7374

7475
return actions_response
7576

76-
def verify(self):
77+
def verify(self) -> str:
7778
if not self.upload_params.get("owner"):
7879
raise NotFound(
7980
'Missing "owner" argument. Please upload with the Codecov repository upload token to resolve issue.'

upload/views/reports.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import logging
2+
from typing import Any, Callable
23

34
from django.http import HttpRequest, HttpResponseNotAllowed
45
from rest_framework.exceptions import ValidationError
56
from rest_framework.generics import CreateAPIView, ListCreateAPIView, RetrieveAPIView
7+
from rest_framework.response import Response
68
from shared.metrics import inc_counter
79

810
from codecov_auth.authentication.repo_auth import (
@@ -14,6 +16,7 @@
1416
UploadTokenRequiredAuthenticationCheck,
1517
repo_auth_custom_exception_handler,
1618
)
19+
from core.models import Commit, Repository
1720
from reports.models import CommitReport, ReportResults
1821
from services.task import TaskService
1922
from upload.helpers import (
@@ -28,7 +31,9 @@
2831
log = logging.getLogger(__name__)
2932

3033

31-
def create_report(serializer, repository, commit):
34+
def create_report(
35+
serializer: CommitReportSerializer, repository: Repository, commit: Commit
36+
) -> CommitReport:
3237
code = serializer.validated_data.get("code")
3338
if code == "default":
3439
serializer.validated_data["code"] = None
@@ -55,10 +60,10 @@ class ReportViews(ListCreateAPIView, GetterMixin):
5560
TokenlessAuthentication,
5661
]
5762

58-
def get_exception_handler(self):
63+
def get_exception_handler(self) -> Callable[[Exception, dict[str, Any]], Response]:
5964
return repo_auth_custom_exception_handler
6065

61-
def perform_create(self, serializer):
66+
def perform_create(self, serializer: CommitReportSerializer) -> CommitReport:
6267
inc_counter(
6368
API_UPLOAD_COUNTER,
6469
labels=generate_upload_prometheus_metrics_labels(
@@ -91,7 +96,9 @@ def perform_create(self, serializer):
9196
)
9297
return instance
9398

94-
def list(self, request: HttpRequest, service: str, repo: str, commit_sha: str):
99+
def list(
100+
self, request: HttpRequest, service: str, repo: str, commit_sha: str
101+
) -> HttpResponseNotAllowed:
95102
return HttpResponseNotAllowed(permitted_methods=["POST"])
96103

97104

@@ -111,10 +118,10 @@ class ReportResultsView(
111118
TokenlessAuthentication,
112119
]
113120

114-
def get_exception_handler(self):
121+
def get_exception_handler(self) -> Callable[[Exception, dict[str, Any]], Response]:
115122
return repo_auth_custom_exception_handler
116123

117-
def perform_create(self, serializer):
124+
def perform_create(self, serializer: ReportResultsSerializer) -> ReportResults:
118125
inc_counter(
119126
API_UPLOAD_COUNTER,
120127
labels=generate_upload_prometheus_metrics_labels(
@@ -154,7 +161,7 @@ def perform_create(self, serializer):
154161
)
155162
return instance
156163

157-
def get_object(self):
164+
def get_object(self) -> ReportResults:
158165
repository = self.get_repo()
159166
commit = self.get_commit(repository)
160167
report = self.get_report(commit)

0 commit comments

Comments
 (0)