Skip to content

Commit c9be3e8

Browse files
committed
Improved type safety and better variable naming
1 parent 930bd74 commit c9be3e8

File tree

6 files changed

+67
-56
lines changed

6 files changed

+67
-56
lines changed

backend/analytics_server/mhq/api/incidents.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from typing import Dict, List
2+
from typing import Dict, List, Optional as typeOptional
33

44
from datetime import datetime
55

@@ -41,7 +41,10 @@
4141
),
4242
)
4343
def get_resolved_incidents(
44-
team_id: str, from_time: datetime, to_time: datetime, pr_filter: dict = None
44+
team_id: str,
45+
from_time: datetime,
46+
to_time: datetime,
47+
pr_filter: typeOptional[Dict] = None,
4548
):
4649

4750
query_validator = get_query_validator()
@@ -78,7 +81,7 @@ def get_deployments_with_related_incidents(
7881
team_id: str,
7982
from_time: datetime,
8083
to_time: datetime,
81-
pr_filter: dict = None,
84+
pr_filter: typeOptional[Dict] = None,
8285
workflow_filter: WorkflowFilter = None,
8386
):
8487
query_validator = get_query_validator()
@@ -126,7 +129,10 @@ def get_deployments_with_related_incidents(
126129
),
127130
)
128131
def get_team_mttr(
129-
team_id: str, from_time: datetime, to_time: datetime, pr_filter: dict = None
132+
team_id: str,
133+
from_time: datetime,
134+
to_time: datetime,
135+
pr_filter: typeOptional[Dict] = None,
130136
):
131137
query_validator = get_query_validator()
132138
interval = query_validator.interval_validator(from_time, to_time)
@@ -156,7 +162,10 @@ def get_team_mttr(
156162
),
157163
)
158164
def get_team_mttr_trends(
159-
team_id: str, from_time: datetime, to_time: datetime, pr_filter: dict = None
165+
team_id: str,
166+
from_time: datetime,
167+
to_time: datetime,
168+
pr_filter: typeOptional[Dict] = None,
160169
):
161170
query_validator = get_query_validator()
162171
interval = query_validator.interval_validator(from_time, to_time)
@@ -197,7 +206,7 @@ def get_team_cfr(
197206
team_id: str,
198207
from_time: datetime,
199208
to_time: datetime,
200-
pr_filter: dict = None,
209+
pr_filter: typeOptional[Dict] = None,
201210
workflow_filter: WorkflowFilter = None,
202211
):
203212

@@ -243,7 +252,7 @@ def get_team_cfr_trends(
243252
team_id: str,
244253
from_time: datetime,
245254
to_time: datetime,
246-
pr_filter: dict = None,
255+
pr_filter: typeOptional[Dict] = None,
247256
workflow_filter: WorkflowFilter = None,
248257
):
249258

backend/analytics_server/mhq/service/incidents/incidents.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
get_settings_service,
2929
)
3030
from mhq.store.repos.incidents import IncidentsRepoService
31-
from mhq.service.incidents.models.adapter import IncidentPRAdapter
31+
from mhq.service.incidents.models.adapter import adaptIncidentPR
3232
from mhq.service.code.pr_filter import apply_pr_filter
3333
from dataclasses import asdict
3434

@@ -116,19 +116,26 @@ def get_team_pr_incidents(
116116
from_time=interval.from_time, to_time=time_now()
117117
)
118118
resolution_prs_filter: PRFilter = apply_pr_filter(
119-
asdict(pr_filter),
120-
EntityType.TEAM,
121-
team_id,
122-
[SettingType.EXCLUDED_PRS_SETTING, SettingType.INCIDENT_PRS_SETTING],
119+
pr_filter=asdict(pr_filter),
120+
entity_type=EntityType.TEAM,
121+
entity_id=team_id,
122+
setting_types=[
123+
SettingType.EXCLUDED_PRS_SETTING,
124+
SettingType.INCIDENT_PRS_SETTING,
125+
],
123126
)
124127

125128
resolution_prs = self._code_repo_service.get_prs_merged_in_interval(
126-
team_repo_ids, resolution_prs_interval, resolution_prs_filter
129+
repo_ids=team_repo_ids,
130+
interval=resolution_prs_interval,
131+
pr_filter=resolution_prs_filter,
127132
)
128133

129134
pr_numbers: List[str] = []
130135
pr_incidents: List[Incident] = []
131-
repo_id_to_pr_number_to_pr_map: Dict[str, Dict[str, PullRequest]] = {}
136+
repo_id_to_pr_number_to_pr_map: Dict[str, Dict[str, PullRequest]] = defaultdict(
137+
dict
138+
)
132139

133140
for pr in resolution_prs:
134141
for filter in incident_prs_setting.filters:
@@ -138,26 +145,24 @@ def get_team_pr_incidents(
138145

139146
if incident_pr_number:
140147
pr_numbers.append(incident_pr_number)
141-
if str(pr.repo_id) not in repo_id_to_pr_number_to_pr_map:
142-
repo_id_to_pr_number_to_pr_map[str(pr.repo_id)] = {}
143148
repo_id_to_pr_number_to_pr_map[str(pr.repo_id)][
144149
incident_pr_number
145150
] = pr
146151
break
147152

148153
prs = self._code_repo_service.get_prs_merged_in_interval_by_numbers(
149-
list(repo_id_to_pr_number_to_pr_map.keys()), interval, pr_numbers, pr_filter
154+
repo_ids=list(repo_id_to_pr_number_to_pr_map.keys()),
155+
interval=interval,
156+
numbers=pr_numbers,
157+
pr_filter=pr_filter,
150158
)
151159

152160
for pr in prs:
153-
if (
154-
str(pr.repo_id) not in repo_id_to_pr_number_to_pr_map
155-
or pr.number not in repo_id_to_pr_number_to_pr_map[str(pr.repo_id)]
156-
):
161+
if pr.number not in repo_id_to_pr_number_to_pr_map[str(pr.repo_id)]:
157162
continue
158163

159164
resolution_pr = repo_id_to_pr_number_to_pr_map[str(pr.repo_id)][pr.number]
160-
adapted_pr_incident = IncidentPRAdapter.adapt(pr, resolution_pr)
165+
adapted_pr_incident = adaptIncidentPR(pr, resolution_pr)
161166
pr_incidents.append(adapted_pr_incident)
162167

163168
return pr_incidents

backend/analytics_server/mhq/service/incidents/models/adapter.py

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,20 @@
33
from mhq.store.models.incidents.enums import IncidentStatus, IncidentType
44

55

6-
class IncidentPRAdapter:
7-
@staticmethod
8-
def adapt(incident_pr: PullRequest, resolution_pr: PullRequest) -> Incident:
9-
return Incident(
10-
id=incident_pr.id,
11-
provider=incident_pr.provider,
12-
key=str(incident_pr.id),
13-
title=incident_pr.title,
14-
incident_number=int(incident_pr.number),
15-
status=IncidentStatus.RESOLVED.value,
16-
creation_date=incident_pr.state_changed_at,
17-
acknowledged_date=resolution_pr.created_at,
18-
resolved_date=resolution_pr.state_changed_at,
19-
assigned_to=resolution_pr.author,
20-
assignees=[resolution_pr.author],
21-
url=incident_pr.url,
22-
meta={},
23-
incident_type=IncidentType.REVERT_PR,
24-
)
6+
def adaptIncidentPR(incident_pr: PullRequest, resolution_pr: PullRequest) -> Incident:
7+
return Incident(
8+
id=incident_pr.id,
9+
provider=incident_pr.provider,
10+
key=str(incident_pr.id),
11+
title=incident_pr.title,
12+
incident_number=int(incident_pr.number),
13+
status=IncidentStatus.RESOLVED.value,
14+
creation_date=incident_pr.state_changed_at,
15+
acknowledged_date=resolution_pr.created_at,
16+
resolved_date=resolution_pr.state_changed_at,
17+
assigned_to=resolution_pr.author,
18+
assignees=[resolution_pr.author],
19+
url=incident_pr.url,
20+
meta={},
21+
incident_type=IncidentType.REVERT_PR,
22+
)

backend/analytics_server/mhq/service/settings/models.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from dataclasses import dataclass
22
from datetime import datetime
3-
from typing import List
3+
from typing import List, TypedDict, Literal
44

55
from mhq.store.models import EntityType
66
from mhq.store.models.incidents.enums import IncidentSource, IncidentType
@@ -46,9 +46,8 @@ class DefaultSyncDaysSetting(BaseSetting):
4646
default_sync_days: int
4747

4848

49-
@dataclass
50-
class IncidentPRFilter:
51-
field: str
49+
class IncidentPRFilter(TypedDict):
50+
field: Literal["title", "head_branch"]
5251
value: str
5352

5453

backend/analytics_server/mhq/store/models/code/filter.py

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

44
from sqlalchemy import and_, or_
55

@@ -13,7 +13,7 @@ class PRFilter:
1313
repo_filters: Dict[str, Dict] = None
1414
excluded_pr_ids: List[str] = None
1515
max_cycle_time: int = None
16-
incident_pr_filters: List[Dict] = None
16+
incident_pr_filters: Optional[List[Dict]] = None
1717

1818
class RepoFilter:
1919
def __init__(self, repo_id: str, repo_filters=None):

backend/analytics_server/tests/service/Incidents/test_team_pr_incidents.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ def get_settings_map(self, *args, **kwargs):
5656

5757

5858
class FakeCodeRepoService:
59-
def __init__(self, prs_using_filters, prs_using_numbers):
60-
self._prs_using_filters = prs_using_filters
59+
def __init__(self, resolution_prs, prs_using_numbers):
60+
self._resolution_prs = resolution_prs
6161
self._prs_using_numbers = prs_using_numbers
6262

6363
def get_active_team_repos_by_team_id(self, *args, **kwargs):
@@ -73,7 +73,7 @@ def get_active_team_repos_by_team_id(self, *args, **kwargs):
7373
]
7474

7575
def get_prs_merged_in_interval(self, *args, **kwargs):
76-
return self._prs_using_filters
76+
return self._resolution_prs
7777

7878
def get_prs_merged_in_interval_by_numbers(self, *args, **kwargs):
7979
return self._prs_using_numbers
@@ -103,7 +103,7 @@ def test_get_team_pr_incidents_no_filters():
103103

104104
def test_get_team_pr_incidents_with_filters():
105105

106-
prs_using_filters = [
106+
resolution_prs = [
107107
PullRequest(
108108
id="pr_2_of_repo_1",
109109
repo_id="repo_1",
@@ -134,7 +134,7 @@ def test_get_team_pr_incidents_with_filters():
134134
incident_service = IncidentService(
135135
FakeIncidentsRepoService(),
136136
FakeSettingsService(),
137-
FakeCodeRepoService(prs_using_filters, prs_using_numbers),
137+
FakeCodeRepoService(resolution_prs, prs_using_numbers),
138138
)
139139

140140
expected_result_keys = [
@@ -153,7 +153,7 @@ def test_get_team_pr_incidents_with_filters():
153153

154154
def test_get_team_pr_incidents_with_multiple_repos_but_no_incidents():
155155

156-
prs_using_filters = [
156+
resolution_prs = [
157157
PullRequest(
158158
id="pr_2_of_repo_1",
159159
repo_id="repo_1",
@@ -173,7 +173,7 @@ def test_get_team_pr_incidents_with_multiple_repos_but_no_incidents():
173173
incident_service = IncidentService(
174174
FakeIncidentsRepoService(),
175175
FakeSettingsService(),
176-
FakeCodeRepoService(prs_using_filters, prs_using_numbers),
176+
FakeCodeRepoService(resolution_prs, prs_using_numbers),
177177
)
178178

179179
expected_result_keys = []
@@ -189,7 +189,7 @@ def test_get_team_pr_incidents_with_multiple_repos_but_no_incidents():
189189

190190
def test_get_team_pr_incidents_with_multiple_repos_and_incidents():
191191

192-
prs_using_filters = [
192+
resolution_prs = [
193193
PullRequest(
194194
id="pr_2_of_repo_1", repo_id="repo_1", number="2", head_branch="revert-1"
195195
),
@@ -219,7 +219,7 @@ def test_get_team_pr_incidents_with_multiple_repos_and_incidents():
219219
incident_service = IncidentService(
220220
FakeIncidentsRepoService(),
221221
FakeSettingsService(),
222-
FakeCodeRepoService(prs_using_filters, prs_using_numbers),
222+
FakeCodeRepoService(resolution_prs, prs_using_numbers),
223223
)
224224

225225
expected_result_keys = [

0 commit comments

Comments
 (0)