Skip to content
This repository was archived by the owner on Jul 16, 2023. It is now read-only.

Commit 2855698

Browse files
authored
feat: introduce --fatal-xxxx cli arguments (#447)
* feat: introduce `--fatal-xxxx` cli arguments * refactor: cleanup
1 parent 4373663 commit 2855698

File tree

12 files changed

+330
-162
lines changed

12 files changed

+330
-162
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* Add support for global rules-exclude
66
* Add `Halstead Volume` metric.
77
* Add ability to configure anti-pattern severity
8+
* Add `--fatal-warnings`, `--fatal-performance`, `--fatal-style` cli arguments.
89

910
## 4.2.1
1011

README.md

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -143,30 +143,33 @@ Usage: metrics [arguments...] <directories>
143143
-h, --help Print this usage information.
144144
145145
146-
-r, --reporter=<console> The format of the output of the analysis
146+
-r, --reporter=<console> The format of the output of the analysis.
147147
[console (default), console-verbose, codeclimate, github, gitlab, html, json]
148-
-o, --output-directory=<OUTPUT> Write HTML output to OUTPUT
148+
-o, --output-directory=<OUTPUT> Write HTML output to OUTPUT.
149149
(defaults to "metrics")
150150
151151
152-
--cyclomatic-complexity=<20> Cyclomatic Complexity threshold
153-
--halstead-volume=<150> Halstead Volume threshold
154-
--lines-of-code=<100> Lines of Code threshold
155-
--maximum-nesting-level=<5> Maximum Nesting Level threshold
156-
--number-of-methods=<10> Number of Methods threshold
157-
--number-of-parameters=<4> Number of Parameters threshold
158-
--source-lines-of-code=<50> Source lines of Code threshold
159-
--weight-of-class=<0.33> Weight Of a Class threshold
152+
--cyclomatic-complexity=<20> Cyclomatic Complexity threshold.
153+
--halstead-volume=<150> Halstead Volume threshold.
154+
--lines-of-code=<100> Lines of Code threshold.
155+
--maximum-nesting-level=<5> Maximum Nesting Level threshold.
156+
--number-of-methods=<10> Number of Methods threshold.
157+
--number-of-parameters=<4> Number of Parameters threshold.
158+
--source-lines-of-code=<50> Source lines of Code threshold.
159+
--weight-of-class=<0.33> Weight Of a Class threshold.
160160
161161
162-
--root-folder=<./> Root folder
162+
--root-folder=<./> Root folder.
163163
(defaults to current directory)
164-
--exclude=<{/**.g.dart,/**.template.dart}> File paths in Glob syntax to be exclude
164+
--exclude=<{/**.g.dart,/**.template.dart}> File paths in Glob syntax to be exclude.
165165
(defaults to "{/**.g.dart,/**.template.dart}")
166166
167167
168-
--set-exit-on-violation-level=<warning> Set exit code 2 if code violations same or higher level than selected are detected
168+
--set-exit-on-violation-level=<warning> Set exit code 2 if code violations same or higher level than selected are detected.
169169
[noted, warning, alarm]
170+
--[no-]fatal-style Treat style level issues as fatal.
171+
--[no-]fatal-performance Treat performance level issues as fatal.
172+
--[no-]fatal-warnings Treat warning level issues as fatal.
170173
```
171174
172175
## Troubleshooting

lib/lint_analyzer.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ export 'package:dart_code_metrics/src/analyzers/lint_analyzer/models/issue.dart'
77
export 'package:dart_code_metrics/src/analyzers/lint_analyzer/models/lint_file_report.dart';
88
export 'package:dart_code_metrics/src/analyzers/lint_analyzer/models/replacement.dart';
99
export 'package:dart_code_metrics/src/analyzers/lint_analyzer/models/severity.dart';
10+
11+
export 'package:dart_code_metrics/src/analyzers/lint_analyzer/utils/report_utils.dart';

lib/src/analyzers/lint_analyzer/reporters/utility_selector.dart

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,6 @@ class UtilitySelector {
7575
);
7676
}
7777

78-
static MetricValueLevel maxViolationLevel(Iterable<LintFileReport> records) =>
79-
records
80-
.expand((fileRecord) => [
81-
...fileRecord.classes.values
82-
.map((report) => report.metricsLevel),
83-
...fileRecord.functions.values
84-
.map((report) => report.metricsLevel),
85-
])
86-
.max;
87-
8878
static FileMetricsReport mergeFileReports(
8979
FileMetricsReport lhs,
9080
FileMetricsReport rhs,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import 'package:collection/collection.dart';
2+
3+
import '../metrics/models/metric_value_level.dart';
4+
import '../models/lint_file_report.dart';
5+
import '../models/severity.dart';
6+
7+
MetricValueLevel maxMetricViolationLevel(Iterable<LintFileReport> records) =>
8+
records
9+
.expand(
10+
(record) => [...record.classes.values, ...record.functions.values]
11+
.map((report) => report.metricsLevel),
12+
)
13+
.max;
14+
15+
bool hasIssueWithSevetiry(
16+
Iterable<LintFileReport> records,
17+
Severity severity,
18+
) =>
19+
records.any((record) =>
20+
record.issues.any((issue) => issue.severity == severity) ||
21+
record.antiPatternCases.any((issue) => issue.severity == severity));

lib/src/cli/commands/analyze.dart

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import 'package:collection/collection.dart';
55
import '../../analyzers/lint_analyzer/lint_analyzer.dart';
66
import '../../analyzers/lint_analyzer/metrics/metrics_factory.dart';
77
import '../../analyzers/lint_analyzer/metrics/models/metric_value_level.dart';
8-
import '../../analyzers/lint_analyzer/reporters/utility_selector.dart';
8+
import '../../analyzers/lint_analyzer/models/severity.dart';
9+
import '../../analyzers/lint_analyzer/utils/report_utils.dart';
910
import '../../config_builder/config_builder.dart';
1011
import '../../config_builder/models/deprecated_option.dart';
1112
import '../models/flag_names.dart';
@@ -39,13 +40,6 @@ class AnalyzeCommand extends BaseCommand {
3940
@override
4041
Future<void> runCommand() async {
4142
final parsedArgs = ParsedArguments(
42-
rootFolder: argResults[FlagNames.rootFolder] as String,
43-
reporterName: argResults[FlagNames.reporter] as String,
44-
reportFolder: argResults[FlagNames.reportFolder] as String,
45-
maximumAllowedLevel: MetricValueLevel.fromString(
46-
argResults[FlagNames.setExitOnViolationLevel] as String?,
47-
),
48-
folders: argResults.rest,
4943
excludePath: argResults[FlagNames.exclude] as String,
5044
metricsConfig: {
5145
for (final metric in getMetrics(config: {}))
@@ -57,24 +51,41 @@ class AnalyzeCommand extends BaseCommand {
5751
final config = ConfigBuilder.getLintConfigFromArgs(parsedArgs);
5852

5953
final lintAnalyserResult = await _analyzer.runCliAnalysis(
60-
parsedArgs.folders,
61-
parsedArgs.rootFolder,
54+
argResults.rest,
55+
argResults[FlagNames.rootFolder] as String,
6256
config,
6357
);
6458

6559
await _analyzer
6660
.getReporter(
67-
name: parsedArgs.reporterName,
61+
name: argResults[FlagNames.reporter] as String,
6862
output: stdout,
69-
reportFolder: parsedArgs.reportFolder,
63+
reportFolder: argResults[FlagNames.reportFolder] as String,
7064
)
7165
?.report(lintAnalyserResult);
7266

73-
if (parsedArgs.maximumAllowedLevel != null &&
74-
UtilitySelector.maxViolationLevel(lintAnalyserResult) >=
75-
parsedArgs.maximumAllowedLevel!) {
67+
if (hasIssueWithSevetiry(lintAnalyserResult, Severity.error)) {
68+
exit(3);
69+
} else if ((argResults[FlagNames.fatalWarnings] as bool) &&
70+
hasIssueWithSevetiry(lintAnalyserResult, Severity.warning)) {
7671
exit(2);
7772
}
73+
74+
final maximumAllowedLevel = MetricValueLevel.fromString(
75+
argResults[FlagNames.setExitOnViolationLevel] as String?,
76+
);
77+
78+
if (maximumAllowedLevel != null &&
79+
maxMetricViolationLevel(lintAnalyserResult) >= maximumAllowedLevel) {
80+
exit(2);
81+
}
82+
83+
if (((argResults[FlagNames.fatalPerformance] as bool) &&
84+
hasIssueWithSevetiry(lintAnalyserResult, Severity.performance)) ||
85+
((argResults[FlagNames.fatalStyle] as bool) &&
86+
hasIssueWithSevetiry(lintAnalyserResult, Severity.style))) {
87+
exit(1);
88+
}
7889
}
7990

8091
void _addFlags() {
@@ -147,6 +158,20 @@ class AnalyzeCommand extends BaseCommand {
147158
valueHelp: 'warning',
148159
help:
149160
'Set exit code 2 if code violations same or higher level than selected are detected.',
161+
)
162+
..addFlag(
163+
FlagNames.fatalStyle,
164+
help: 'Treat style level issues as fatal.',
165+
)
166+
..addFlag(
167+
FlagNames.fatalPerformance,
168+
help: 'Treat performance level issues as fatal.',
169+
)
170+
..addFlag(
171+
FlagNames.fatalWarnings,
172+
help: 'Treat warning level issues as fatal.',
173+
// TODO(dkrutrkikh): activate on next major version
174+
// defaultsTo: true,
150175
);
151176
}
152177
}

lib/src/cli/models/flag_names.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,7 @@ class FlagNames {
1919

2020
static const reportFolder = 'output-directory';
2121
static const setExitOnViolationLevel = 'set-exit-on-violation-level';
22+
static const fatalStyle = 'fatal-style';
23+
static const fatalPerformance = 'fatal-performance';
24+
static const fatalWarnings = 'fatal-warnings';
2225
}

lib/src/cli/models/parsed_arguments.dart

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,11 @@
11
import 'package:meta/meta.dart';
22

3-
import '../../analyzers/lint_analyzer/metrics/models/metric_value_level.dart';
4-
53
@immutable
64
class ParsedArguments {
7-
final String rootFolder;
8-
final String reporterName;
9-
final String reportFolder;
10-
final MetricValueLevel? maximumAllowedLevel;
11-
final Iterable<String> folders;
125
final String excludePath;
136
final Map<String, Object> metricsConfig;
147

158
const ParsedArguments({
16-
required this.rootFolder,
17-
required this.reporterName,
18-
required this.reportFolder,
19-
required this.maximumAllowedLevel,
20-
required this.folders,
219
required this.excludePath,
2210
required this.metricsConfig,
2311
});

0 commit comments

Comments
 (0)