|
| 1 | +from datetime import datetime |
1 | 2 | from typing import List, Mapping, Optional |
2 | 3 |
|
3 | | -from ariadne import ObjectType |
| 4 | +from ariadne import ObjectType, convert_kwargs_to_snake_case |
| 5 | +from graphql import GraphQLResolveInfo |
4 | 6 |
|
| 7 | +from codecov.db import sync_to_async |
| 8 | +from graphql_api.types.enums import OrderingDirection |
5 | 9 | from services.bundle_analysis import ( |
6 | 10 | AssetReport, |
| 11 | + BundleAnalysisMeasurementData, |
| 12 | + BundleAnalysisMeasurementsAssetType, |
| 13 | + BundleAnalysisMeasurementsService, |
7 | 14 | BundleData, |
8 | 15 | BundleLoadTime, |
9 | 16 | BundleReport, |
10 | 17 | BundleSize, |
11 | 18 | ModuleReport, |
12 | 19 | ) |
| 20 | +from timeseries.models import Interval |
13 | 21 |
|
14 | 22 | bundle_data_bindable = ObjectType("BundleData") |
15 | 23 | bundle_module_bindable = ObjectType("BundleModule") |
|
21 | 29 |
|
22 | 30 |
|
23 | 31 | @bundle_data_bindable.field("size") |
24 | | -def resolve_bundle_size(bundle_data: BundleData, info) -> BundleSize: |
| 32 | +def resolve_bundle_size( |
| 33 | + bundle_data: BundleData, info: GraphQLResolveInfo |
| 34 | +) -> BundleSize: |
25 | 35 | return bundle_data.size |
26 | 36 |
|
27 | 37 |
|
28 | 38 | @bundle_data_bindable.field("loadTime") |
29 | | -def resolve_bundle_load_time(bundle_data: BundleData, info) -> BundleLoadTime: |
| 39 | +def resolve_bundle_load_time( |
| 40 | + bundle_data: BundleData, info: GraphQLResolveInfo |
| 41 | +) -> BundleLoadTime: |
30 | 42 | return bundle_data.load_time |
31 | 43 |
|
32 | 44 |
|
33 | 45 | # ============= Bundle Module Bindable ============= |
34 | 46 |
|
35 | 47 |
|
36 | 48 | @bundle_module_bindable.field("name") |
37 | | -def resolve_bundle_module_name(bundle_module: ModuleReport, info) -> str: |
| 49 | +def resolve_bundle_module_name( |
| 50 | + bundle_module: ModuleReport, info: GraphQLResolveInfo |
| 51 | +) -> str: |
38 | 52 | return bundle_module.name |
39 | 53 |
|
40 | 54 |
|
41 | 55 | @bundle_module_bindable.field("bundleData") |
42 | | -def resolve_bundle_module_bundle_data(bundle_module: ModuleReport, info) -> int: |
| 56 | +def resolve_bundle_module_bundle_data( |
| 57 | + bundle_module: ModuleReport, info: GraphQLResolveInfo |
| 58 | +) -> BundleData: |
43 | 59 | return BundleData(bundle_module.size_total) |
44 | 60 |
|
45 | 61 |
|
46 | 62 | # ============= Bundle Asset Bindable ============= |
47 | 63 |
|
48 | 64 |
|
49 | 65 | @bundle_asset_bindable.field("name") |
50 | | -def resolve_bundle_asset_name(bundle_asset: AssetReport, info) -> str: |
| 66 | +def resolve_bundle_asset_name( |
| 67 | + bundle_asset: AssetReport, info: GraphQLResolveInfo |
| 68 | +) -> str: |
51 | 69 | return bundle_asset.name |
52 | 70 |
|
53 | 71 |
|
54 | 72 | @bundle_asset_bindable.field("normalizedName") |
55 | | -def resolve_normalized_name(bundle_asset: AssetReport, info) -> str: |
| 73 | +def resolve_normalized_name(bundle_asset: AssetReport, info: GraphQLResolveInfo) -> str: |
56 | 74 | return bundle_asset.normalized_name |
57 | 75 |
|
58 | 76 |
|
59 | 77 | @bundle_asset_bindable.field("extension") |
60 | | -def resolve_extension(bundle_asset: AssetReport, info) -> str: |
| 78 | +def resolve_extension(bundle_asset: AssetReport, info: GraphQLResolveInfo) -> str: |
61 | 79 | return bundle_asset.extension |
62 | 80 |
|
63 | 81 |
|
64 | 82 | @bundle_asset_bindable.field("bundleData") |
65 | | -def resolve_bundle_asset_bundle_data(bundle_asset: AssetReport, info) -> BundleData: |
| 83 | +def resolve_bundle_asset_bundle_data( |
| 84 | + bundle_asset: AssetReport, info: GraphQLResolveInfo |
| 85 | +) -> BundleData: |
66 | 86 | return BundleData(bundle_asset.size_total) |
67 | 87 |
|
68 | 88 |
|
69 | 89 | @bundle_asset_bindable.field("modules") |
70 | | -def resolve_modules(bundle_asset: AssetReport, info) -> List[ModuleReport]: |
| 90 | +def resolve_modules( |
| 91 | + bundle_asset: AssetReport, info: GraphQLResolveInfo |
| 92 | +) -> List[ModuleReport]: |
71 | 93 | return bundle_asset.modules |
72 | 94 |
|
73 | 95 |
|
74 | 96 | @bundle_asset_bindable.field("moduleExtensions") |
75 | 97 | def resolve_bundle_asset_module_extensions( |
76 | | - bundle_asset: AssetReport, info |
| 98 | + bundle_asset: AssetReport, info: GraphQLResolveInfo |
77 | 99 | ) -> List[str]: |
78 | 100 | return bundle_asset.module_extensions |
79 | 101 |
|
80 | 102 |
|
| 103 | +@bundle_asset_bindable.field("measurements") |
| 104 | +@convert_kwargs_to_snake_case |
| 105 | +@sync_to_async |
| 106 | +def resolve_asset_report_measurements( |
| 107 | + bundle_asset: AssetReport, |
| 108 | + info: GraphQLResolveInfo, |
| 109 | + interval: Interval, |
| 110 | + before: datetime, |
| 111 | + after: datetime, |
| 112 | + branch: Optional[str] = None, |
| 113 | +) -> Optional[BundleAnalysisMeasurementData]: |
| 114 | + bundle_analysis_measurements = BundleAnalysisMeasurementsService( |
| 115 | + repository=info.context["commit"].repository, |
| 116 | + interval=interval, |
| 117 | + after=after, |
| 118 | + before=before, |
| 119 | + branch=branch, |
| 120 | + ) |
| 121 | + return bundle_analysis_measurements.compute_asset(bundle_asset) |
| 122 | + |
| 123 | + |
81 | 124 | # ============= Bundle Report Bindable ============= |
82 | 125 |
|
83 | 126 |
|
84 | 127 | @bundle_report_bindable.field("name") |
85 | | -def resolve_name(bundle_report: BundleReport, info) -> str: |
| 128 | +def resolve_name(bundle_report: BundleReport, info: GraphQLResolveInfo) -> str: |
86 | 129 | return bundle_report.name |
87 | 130 |
|
88 | 131 |
|
89 | 132 | # TODO: depreacted with Issue 1199 |
90 | 133 | @bundle_report_bindable.field("sizeTotal") |
91 | | -def resolve_size_total(bundle_report: BundleReport, info) -> int: |
| 134 | +def resolve_size_total(bundle_report: BundleReport, info: GraphQLResolveInfo) -> int: |
92 | 135 | return bundle_report.size_total |
93 | 136 |
|
94 | 137 |
|
95 | 138 | # TODO: depreacted with Issue 1199 |
96 | 139 | @bundle_report_bindable.field("loadTimeTotal") |
97 | | -def resolve_load_time_total(bundle_report: BundleReport, info) -> float: |
| 140 | +def resolve_load_time_total( |
| 141 | + bundle_report: BundleReport, info: GraphQLResolveInfo |
| 142 | +) -> float: |
98 | 143 | return bundle_report.load_time_total |
99 | 144 |
|
100 | 145 |
|
101 | 146 | @bundle_report_bindable.field("moduleExtensions") |
102 | | -def resolve_module_extensions(bundle_report: BundleReport, info) -> List[str]: |
| 147 | +def resolve_module_extensions( |
| 148 | + bundle_report: BundleReport, info: GraphQLResolveInfo |
| 149 | +) -> List[str]: |
103 | 150 | return bundle_report.module_extensions |
104 | 151 |
|
105 | 152 |
|
106 | 153 | @bundle_report_bindable.field("moduleCount") |
107 | | -def resolve_module_count(bundle_report: BundleReport, info) -> int: |
| 154 | +def resolve_module_count(bundle_report: BundleReport, info: GraphQLResolveInfo) -> int: |
108 | 155 | return bundle_report.module_count |
109 | 156 |
|
110 | 157 |
|
111 | 158 | @bundle_report_bindable.field("assets") |
112 | 159 | def resolve_assets( |
113 | 160 | bundle_report: BundleReport, |
114 | | - info, |
| 161 | + info: GraphQLResolveInfo, |
115 | 162 | filters: Optional[Mapping] = None, |
116 | 163 | ) -> List[AssetReport]: |
117 | 164 | extensions_filter = filters.get("moduleExtensions", None) if filters else None |
118 | 165 | return list(bundle_report.assets(extensions_filter)) |
119 | 166 |
|
120 | 167 |
|
121 | 168 | @bundle_report_bindable.field("asset") |
122 | | -def resolve_asset(bundle_report: BundleReport, info, name: str) -> AssetReport: |
| 169 | +def resolve_asset( |
| 170 | + bundle_report: BundleReport, info: GraphQLResolveInfo, name: str |
| 171 | +) -> Optional[AssetReport]: |
123 | 172 | return bundle_report.asset(name) |
124 | 173 |
|
125 | 174 |
|
126 | 175 | @bundle_report_bindable.field("bundleData") |
127 | | -def resolve_bundle_data(bundle_report: BundleReport, info) -> BundleData: |
| 176 | +def resolve_bundle_data( |
| 177 | + bundle_report: BundleReport, info: GraphQLResolveInfo |
| 178 | +) -> BundleData: |
128 | 179 | return BundleData(bundle_report.size_total) |
| 180 | + |
| 181 | + |
| 182 | +@bundle_report_bindable.field("measurements") |
| 183 | +@convert_kwargs_to_snake_case |
| 184 | +@sync_to_async |
| 185 | +def resolve_bundle_report_measurements( |
| 186 | + bundle_report: BundleReport, |
| 187 | + info: GraphQLResolveInfo, |
| 188 | + interval: Interval, |
| 189 | + before: datetime, |
| 190 | + after: datetime, |
| 191 | + branch: Optional[str] = None, |
| 192 | + filters: Mapping = {}, |
| 193 | + ordering_direction: Optional[OrderingDirection] = OrderingDirection.ASC, |
| 194 | +) -> List[BundleAnalysisMeasurementData]: |
| 195 | + if not filters.get("asset_types", []): |
| 196 | + measurable_names = [item for item in list(BundleAnalysisMeasurementsAssetType)] |
| 197 | + else: |
| 198 | + measurable_names = [ |
| 199 | + BundleAnalysisMeasurementsAssetType[item] for item in filters["asset_types"] |
| 200 | + ] |
| 201 | + |
| 202 | + bundle_analysis_measurements = BundleAnalysisMeasurementsService( |
| 203 | + repository=info.context["commit"].repository, |
| 204 | + interval=interval, |
| 205 | + after=after, |
| 206 | + before=before, |
| 207 | + branch=branch, |
| 208 | + ) |
| 209 | + |
| 210 | + measurements = [] |
| 211 | + for name in measurable_names: |
| 212 | + measurements.extend( |
| 213 | + bundle_analysis_measurements.compute_report(bundle_report, asset_type=name) |
| 214 | + ) |
| 215 | + |
| 216 | + return sorted( |
| 217 | + measurements, |
| 218 | + key=lambda c: c.asset_type, |
| 219 | + reverse=ordering_direction == OrderingDirection.DESC, |
| 220 | + ) |
0 commit comments