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

Commit a7826d8

Browse files
committed
Improve typing and optimize Comparison
This primarily improves some typings related to `Comparison/Report`, adds some tracing, and removes the need to initialize the related `Repository` when initializing the `ArchiveService` as that is not needed.
1 parent 9fd0ef4 commit a7826d8

File tree

8 files changed

+23
-28
lines changed

8 files changed

+23
-28
lines changed

api/shared/compare/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def get_lines(self, segment: Segment) -> serializers.ListField:
131131
class ImpactedFileSegmentsSerializer(serializers.Serializer):
132132
segments = serializers.SerializerMethodField()
133133

134-
def get_segments(self, file_path: str) -> ImpactedFileSegmentSerializer:
134+
def get_segments(self, file_path: str) -> list[ImpactedFileSegmentSerializer]:
135135
file_comparison = self.context["comparison"].get_file_comparison(
136136
file_path, with_src=True, bypass_max_diff=True
137137
)

graphql_api/actions/comparison.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from typing import Optional, Union
2-
31
from compare.models import CommitComparison
42
from graphql_api.types.comparison.comparison import (
53
MissingBaseReport,
@@ -9,8 +7,8 @@
97

108

119
def validate_commit_comparison(
12-
commit_comparison: Optional[CommitComparison],
13-
) -> Union[MissingBaseReport, MissingHeadReport, MissingComparison]:
10+
commit_comparison: CommitComparison | None,
11+
) -> MissingBaseReport | MissingHeadReport | MissingComparison | None:
1412
if not commit_comparison:
1513
return MissingComparison()
1614

graphql_api/types/commit/commit.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ def resolve_list_uploads(commit: Commit, info: GraphQLResolveInfo, **kwargs):
118118
@commit_bindable.field("compareWithParent")
119119
@sentry_sdk.trace
120120
async def resolve_compare_with_parent(
121-
commit: Commit, info: GraphQLResolveInfo, **kwargs
122-
):
121+
commit: Commit, info: GraphQLResolveInfo, **kwargs: Any
122+
) -> ComparisonReport | Any:
123123
if not commit.parent_commit_id:
124124
return MissingBaseCommit()
125125

@@ -129,7 +129,6 @@ async def resolve_compare_with_parent(
129129
)
130130

131131
comparison_error = validate_commit_comparison(commit_comparison=commit_comparison)
132-
133132
if comparison_error:
134133
return comparison_error
135134

graphql_api/types/comparison/comparison.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from asyncio import gather
2-
from typing import List, Optional
2+
from typing import Any, List, Optional
33

44
import sentry_sdk
55
from ariadne import ObjectType, UnionType
@@ -245,9 +245,7 @@ def resolve_flag_comparisons_count(
245245
@sync_to_async
246246
@sentry_sdk.trace
247247
def resolve_has_different_number_of_head_and_base_reports(
248-
comparison: ComparisonReport,
249-
info: GraphQLResolveInfo,
250-
**kwargs, # type: ignore
248+
comparison: ComparisonReport, info: GraphQLResolveInfo, **kwargs: Any
251249
) -> bool:
252250
# TODO: can we remove the need for `info.context["comparison"]` here?
253251
if "comparison" not in info.context:

graphql_api/types/impacted_file/impacted_file.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import hashlib
2-
from typing import List, Union
2+
from typing import List
33

44
import sentry_sdk
55
from ariadne import ObjectType, UnionType
66
from asgiref.sync import sync_to_async
7+
from graphql import GraphQLResolveInfo
78
from shared.reports.types import ReportTotals
89
from shared.torngit.exceptions import TorngitClientError
910

@@ -67,8 +68,8 @@ def resolve_hashed_path(impacted_file: ImpactedFile, info) -> str:
6768
@sync_to_async
6869
@sentry_sdk.trace
6970
def resolve_segments(
70-
impacted_file: ImpactedFile, info, filters=None
71-
) -> Union[UnknownPath, ProviderError, SegmentComparisons]:
71+
impacted_file: ImpactedFile, info: GraphQLResolveInfo, filters: dict | None = None
72+
) -> SegmentComparisons | UnknownPath | ProviderError:
7273
if filters is None:
7374
filters = {}
7475
if "comparison" not in info.context:

graphql_api/types/pull/pull.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ async def resolve_compare_with_base(
7676
commit_comparison = await comparison_loader.load((pull.compared_to, pull.head))
7777

7878
comparison_error = validate_commit_comparison(commit_comparison=commit_comparison)
79-
8079
if comparison_error:
8180
return comparison_error
8281

services/comparison.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import minio
1111
import pytz
12+
import sentry_sdk
1213
import shared.reports.api_report_service as report_service
1314
from asgiref.sync import async_to_sync
1415
from django.db.models import Prefetch, QuerySet
@@ -756,7 +757,7 @@ def head_report_without_applied_diff(self):
756757
return report
757758

758759
@cached_property
759-
def has_different_number_of_head_and_base_sessions(self):
760+
def has_different_number_of_head_and_base_sessions(self) -> bool:
760761
"""
761762
This method checks if the head and the base have different number of sessions.
762763
It makes use of the head_report_without_applied_diff property instead of the
@@ -989,10 +990,10 @@ class ComparisonReport(object):
989990
on a `CommitComparison`
990991
"""
991992

992-
commit_comparison: CommitComparison = None
993+
commit_comparison: CommitComparison
993994

994995
@cached_property
995-
def files(self) -> List[ImpactedFile]:
996+
def files(self) -> list[ImpactedFile]:
996997
if not self.commit_comparison.report_storage_path:
997998
return []
998999

@@ -1001,29 +1002,29 @@ def files(self) -> List[ImpactedFile]:
10011002
ImpactedFile.create(**data) for data in comparison_data.get("files", [])
10021003
]
10031004

1004-
def impacted_file(self, path: str) -> Optional[ImpactedFile]:
1005+
def impacted_file(self, path: str) -> ImpactedFile | None:
10051006
for file in self.files:
10061007
if file.head_name == path:
10071008
return file
10081009

1009-
@cached_property
1010-
def impacted_files(self) -> List[ImpactedFile]:
1010+
@property
1011+
def impacted_files(self) -> list[ImpactedFile]:
10111012
return self.files
10121013

10131014
@cached_property
1014-
def impacted_files_with_unintended_changes(self) -> List[ImpactedFile]:
1015+
def impacted_files_with_unintended_changes(self) -> list[ImpactedFile]:
10151016
return [file for file in self.files if file.has_changes]
10161017

10171018
@cached_property
1018-
def impacted_files_with_direct_changes(self) -> List[ImpactedFile]:
1019+
def impacted_files_with_direct_changes(self) -> list[ImpactedFile]:
10191020
return [file for file in self.files if file.has_diff or not file.has_changes]
10201021

1022+
@sentry_sdk.trace
10211023
def _fetch_raw_comparison_data(self) -> dict:
10221024
"""
10231025
Fetches the raw comparison data from storage
10241026
"""
1025-
repository = self.commit_comparison.compare_commit.repository
1026-
archive_service = ArchiveService(repository)
1027+
archive_service = ArchiveService(repository=None)
10271028
try:
10281029
data = archive_service.read_file(self.commit_comparison.report_storage_path)
10291030
return json.loads(data)

upload/serializers.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ class Meta:
5151
raw_upload_location = serializers.SerializerMethodField()
5252

5353
def get_raw_upload_location(self, obj: ReportSession) -> str:
54-
repo = obj.report.commit.repository
55-
archive_service = ArchiveService(repo)
54+
archive_service = ArchiveService(repository=None)
5655
return archive_service.create_presigned_put(obj.storage_path)
5756

5857
def get_url(self, obj: ReportSession) -> str:

0 commit comments

Comments
 (0)