This repository has been archived by the owner on Jul 16, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 258
/
report_utils.dart
123 lines (108 loc) · 3.84 KB
/
report_utils.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import 'package:collection/collection.dart';
import 'package:path/path.dart' as p;
import '../metrics/metric_utils.dart';
import '../metrics/metrics_list/cyclomatic_complexity/cyclomatic_complexity_metric.dart';
import '../metrics/metrics_list/source_lines_of_code/source_lines_of_code_metric.dart';
import '../metrics/metrics_list/technical_debt/technical_debt_metric.dart';
import '../metrics/models/metric_value_level.dart';
import '../models/lint_file_report.dart';
import '../models/severity.dart';
MetricValueLevel maxMetricViolationLevel(Iterable<LintFileReport> records) =>
records
.expand(
(record) => [...record.classes.values, ...record.functions.values]
.map((report) => report.metricsLevel),
)
.maxOrNull ??
MetricValueLevel.none;
bool hasIssueWithSeverity(
Iterable<LintFileReport> records,
Severity severity,
) =>
records.any((record) =>
record.issues.any((issue) => issue.severity == severity) ||
record.antiPatternCases.any((issue) => issue.severity == severity));
Iterable<String> scannedFolders(Iterable<LintFileReport> records) =>
records.map((record) => p.split(record.relativePath).first).toSet().toList()
..sort();
int totalFiles(Iterable<LintFileReport> records) =>
records.map((record) => record.path).toSet().length;
int totalSLOC(Iterable<LintFileReport> records) => records.fold(
0,
(prevValue, fileReport) =>
prevValue +
fileReport.functions.values.fold(
0,
(prevValue, functionReport) =>
prevValue +
(functionReport
.metric(SourceLinesOfCodeMetric.metricId)
?.value
.toInt() ??
0),
),
);
String totalTechDebt(Iterable<LintFileReport> records) {
final debtValue = records.fold<num>(
0,
(prevValue, fileReport) =>
prevValue +
(fileReport.file.metric(TechnicalDebtMetric.metricId)?.value ?? 0),
);
final debtUnitType = records
.firstWhereOrNull(
(record) =>
record.file.metric(TechnicalDebtMetric.metricId) != null,
)
?.file
.metric(TechnicalDebtMetric.metricId)
?.unitType ??
'';
return debtValue > 0 ? '$debtValue $debtUnitType'.trim() : 'not found';
}
int totalClasses(Iterable<LintFileReport> records) => records.fold(
0,
(prevValue, fileReport) => prevValue + fileReport.classes.keys.length,
);
double averageCYCLO(Iterable<LintFileReport> records) {
final totalSloc = totalSLOC(records);
return totalSloc > 0
? records.fold<num>(
0,
(prevValue, fileReport) =>
prevValue +
fileReport.functions.values.fold(
0,
(prevValue, functionReport) =>
prevValue +
(functionReport
.metric(CyclomaticComplexityMetric.metricId)
?.value ??
0),
),
) /
totalSloc
: 0;
}
int averageSLOC(Iterable<LintFileReport> records) {
final functionsCount = records.fold<int>(
0,
(prevValue, fileReport) => prevValue + fileReport.functions.keys.length,
);
return functionsCount > 0 ? totalSLOC(records) ~/ functionsCount : 0;
}
int metricViolations(Iterable<LintFileReport> records, String metricId) =>
records.fold<int>(
0,
(prevValue, fileReport) =>
prevValue +
fileReport.functions.values.fold(
0,
(prevValue, functionReport) =>
prevValue +
(isReportLevel(functionReport.metric(metricId)?.level ??
MetricValueLevel.none)
? 1
: 0),
),
);