Skip to content

Commit d28bef7

Browse files
authored
Merge pull request #164 from mosuem/versionCheckToOutput
Add version check to reported output
2 parents 904cf74 + 2a17f82 commit d28bef7

File tree

10 files changed

+208
-90
lines changed

10 files changed

+208
-90
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## Version 0.17.0
44
- bump dart SDK requirements to >=3.0.0
55
- Search downloaded packages in entire .pub-cache hosted directory in case path namining changes
6+
- adds information about the package versions and the version check result to the reports (console, json, markdown)
67

78
## Version 0.16.3
89
- adds more diff result reporting options (cli, json, markdown)

lib/src/cli/commands/diff_command.dart

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -198,19 +198,23 @@ You may want to do this if you want to make sure
198198
}
199199
})();
200200

201+
VersionCheckResult? versionCheckResult;
202+
if (versionCheckMode != VersionCheckMode.none) {
203+
versionCheckResult = VersionCheck.check(
204+
diffResult: diffResult,
205+
oldPackageApi: oldPackageApi,
206+
newPackageApi: newPackageApi,
207+
ignorePrerelease: ignorePrerelease,
208+
versionCheckMode: versionCheckMode,
209+
);
210+
}
211+
201212
stdout.writeln('-- Generating report using: ${reporter.reporterName} --');
202-
await reporter.generateReport(diffResult);
203-
204-
if (versionCheckMode != VersionCheckMode.none &&
205-
!VersionCheck.versionChangeMatchesChanges(
206-
diffResult: diffResult,
207-
oldPackageApi: oldPackageApi,
208-
newPackageApi: newPackageApi,
209-
ignorePrerelease: ignorePrerelease,
210-
versionCheckMode: versionCheckMode)) {
213+
await reporter.generateReport(diffResult, versionCheckResult);
214+
if (versionCheckResult?.success ?? true) {
215+
return 0;
216+
} else {
211217
return -1;
212218
}
213-
214-
return 0;
215219
}
216220
}
Lines changed: 71 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,43 @@
11
import 'dart:io';
22

3-
import 'package:colorize/colorize.dart';
43
import 'package:pub_semver/pub_semver.dart';
54

65
import '../../../api_tool.dart';
76

7+
class VersionCheckResult {
8+
final bool success;
9+
final Version oldVersion;
10+
final Version newVersion;
11+
final Version? neededVersion;
12+
final String explanation;
13+
14+
VersionCheckResult.success({
15+
required this.oldVersion,
16+
required this.newVersion,
17+
Version? neededVersion,
18+
required this.explanation,
19+
}) : success = true,
20+
neededVersion = neededVersion ?? newVersion;
21+
22+
VersionCheckResult.failure({
23+
required this.oldVersion,
24+
required this.newVersion,
25+
required this.neededVersion,
26+
required this.explanation,
27+
}) : success = false;
28+
}
29+
830
/// helper class to check if the version change matches the changes
931
abstract class VersionCheck {
1032
/// checks if the version change between [oldPackageApi] and [newPackageApi] matches the changes in [diffResult]
11-
static bool versionChangeMatchesChanges({
33+
static VersionCheckResult check({
1234
required PackageApiDiffResult diffResult,
1335
required PackageApi oldPackageApi,
1436
required PackageApi newPackageApi,
1537
required bool ignorePrerelease,
1638
required VersionCheckMode versionCheckMode,
1739
}) {
18-
stdout.writeln('');
1940
stdout.writeln('Checking Package version');
20-
stdout.writeln('');
2141
if (oldPackageApi.packageVersion == null) {
2242
throw PackageApiDiffError(
2343
message: 'Old package doesn\'t contain a version]');
@@ -36,14 +56,21 @@ abstract class VersionCheck {
3656
diffResult.apiChanges.any((change) => !change.type.requiresMinorBump);
3757

3858
if (versionCheckMode == VersionCheckMode.none) {
39-
stdout.writeln('Skipping version check completely');
40-
return true;
59+
return VersionCheckResult.success(
60+
oldVersion: oldVersion,
61+
newVersion: newVersion,
62+
explanation:
63+
'Skipping version check completely as the version check mode is $versionCheckMode',
64+
);
4165
}
4266
if (versionCheckMode == VersionCheckMode.onlyBreakingChanges &&
4367
!containsBreakingChanges) {
44-
stdout.writeln(
45-
'Skipping version check because there are no breaking changes');
46-
return true;
68+
return VersionCheckResult.success(
69+
oldVersion: oldVersion,
70+
newVersion: newVersion,
71+
explanation:
72+
'Skipping version check because there are no breaking changes',
73+
);
4774
}
4875

4976
if (ignorePrerelease) {
@@ -57,28 +84,35 @@ abstract class VersionCheck {
5784
final oldVersionWithoutPreRelease = Version.parse(oldVersion.toString());
5885
oldVersionWithoutPreRelease.preRelease.clear();
5986
if (oldVersionWithoutPreRelease <= newVersion) {
60-
stdout.writeln(
61-
'Skipping version check because the old version is a pre-release and the new version is the same or higher without the pre-release part');
62-
return true;
87+
return VersionCheckResult.success(
88+
oldVersion: oldVersion,
89+
newVersion: newVersion,
90+
explanation:
91+
'Skipping version check because the old version is a pre-release and the new version is the same or higher without the pre-release part',
92+
);
6393
}
6494
}
6595

6696
if (newVersion.isPreRelease) {
6797
// pre-release. We don't look at differentiation between breaking and non-breaking changes
68-
stdout.writeln(
69-
'We got a pre release. We only check if there are any changes');
98+
final prefix =
99+
'We got a pre release. We only check if there are any changes.';
70100
if (containsAnyChanges && oldVersion >= newVersion) {
71-
stdout.writeln(
72-
'Got "${Colorize(newVersion.toString()).bold()}" expected > "${Colorize(oldVersion.toString()).bold()}" (pre-release but changes)');
73-
return false;
101+
return VersionCheckResult.failure(
102+
oldVersion: oldVersion,
103+
newVersion: newVersion,
104+
neededVersion: null,
105+
explanation:
106+
'$prefix Got "$newVersion" expected > "$oldVersion" (pre-release but changes)',
107+
);
74108
}
75-
stdout.writeln(Colorize('New version is OK!').green());
76-
final explaination = containsAnyChanges
77-
? 'which is > "${Colorize(oldVersion.toString()).bold()}" (pre-release but changes)'
109+
final explanation = containsAnyChanges
110+
? 'which is > "$oldVersion" (pre-release but changes)'
78111
: 'and no changes';
79-
stdout.writeln(
80-
'Got "${Colorize(newVersion.toString()).bold()}" $explaination');
81-
return true;
112+
return VersionCheckResult.success(
113+
oldVersion: oldVersion,
114+
newVersion: newVersion,
115+
explanation: '$prefix Got "$newVersion" $explanation');
82116
}
83117

84118
Version expectedMinVersion =
@@ -99,19 +133,22 @@ abstract class VersionCheck {
99133
}
100134
}
101135

102-
stdout.writeln('Old version: "$oldVersion"');
103-
stdout.writeln(
104-
'Expecting minimum version: "$expectedMinVersion" ($versionExplanation)');
105136
if (newVersion < expectedMinVersion) {
106-
stdout.writeln(Colorize('New Version is too low!').red());
107-
stdout.writeln(
108-
'Got "${Colorize(newVersion.toString()).bold()}" expected >= "${Colorize(expectedMinVersion.toString()).bold()}"');
109-
return false;
137+
return VersionCheckResult.failure(
138+
oldVersion: oldVersion,
139+
newVersion: newVersion,
140+
neededVersion: expectedMinVersion,
141+
explanation:
142+
'Got "$newVersion" expected >= "$expectedMinVersion" ($versionExplanation)',
143+
);
110144
} else {
111-
stdout.writeln(Colorize('New version is OK!').green());
112-
stdout.writeln(
113-
'Got "${Colorize(newVersion.toString()).bold()}" which is >= "${Colorize(expectedMinVersion.toString()).bold()}"');
114-
return true;
145+
return VersionCheckResult.success(
146+
oldVersion: oldVersion,
147+
newVersion: newVersion,
148+
neededVersion: expectedMinVersion,
149+
explanation:
150+
'Got "$newVersion" which is >= "$expectedMinVersion" ($versionExplanation)',
151+
);
115152
}
116153
}
117154
}

lib/src/diff/report/console_diff_reporter.dart

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@ import 'package:colorize/colorize.dart';
44
import 'package:console/console.dart';
55

66
import '../../../api_tool.dart';
7+
import '../../cli/commands/version_check.dart';
78
import 'diff_reporter.dart';
89

910
class ConsoleDiffReporter extends DiffReporter {
1011
@override
1112
final String reporterName = 'Console Reporter';
1213

1314
@override
14-
Future<void> generateReport(PackageApiDiffResult diffResult) async {
15+
Future<void> generateReport(
16+
PackageApiDiffResult diffResult,
17+
VersionCheckResult? versionCheckResult,
18+
) async {
1519
void printChanges(bool breaking) {
1620
final changes = _printApiChangeNode(diffResult.rootNode, breaking);
1721
if (changes == null) {
@@ -32,6 +36,23 @@ class ConsoleDiffReporter extends DiffReporter {
3236
} else {
3337
stdout.writeln('No changes detected!');
3438
}
39+
40+
if (versionCheckResult != null) {
41+
stdout.writeln('Version Check');
42+
if (versionCheckResult.success) {
43+
stdout.writeln(Colorize('New version is OK!').green());
44+
} else {
45+
stdout.writeln(Colorize('New Version is too low!').red());
46+
}
47+
stdout.writeln();
48+
stdout.writeln('Old version: "${versionCheckResult.oldVersion}"');
49+
stdout.writeln('New version: "${versionCheckResult.newVersion}"');
50+
if (versionCheckResult.neededVersion != null) {
51+
stdout.writeln('Needed version: "${versionCheckResult.neededVersion}"');
52+
}
53+
stdout.writeln();
54+
stdout.writeln(versionCheckResult.explanation);
55+
}
3556
}
3657

3758
String? _printApiChangeNode(ApiChangeTreeNode node, bool breaking) {
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
import 'package:dart_apitool/src/cli/commands/version_check.dart';
2+
13
import '../../../api_tool.dart';
24

35
abstract class DiffReporter {
46
String get reporterName;
57

6-
Future<void> generateReport(PackageApiDiffResult diffResult);
8+
Future<void> generateReport(
9+
PackageApiDiffResult diffResult,
10+
VersionCheckResult? versionCheckResult,
11+
);
712
}

lib/src/diff/report/json_diff_reporter.dart

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'dart:convert';
22
import 'dart:io';
33

44
import '../../../api_tool_cli.dart';
5+
import '../../cli/commands/version_check.dart';
56
import 'diff_reporter.dart';
67

78
class JsonDiffReporter extends DiffReporter {
@@ -17,8 +18,11 @@ class JsonDiffReporter extends DiffReporter {
1718
});
1819

1920
@override
20-
Future<void> generateReport(PackageApiDiffResult diffResult) async {
21-
final jsonReport = <String, dynamic>{
21+
Future<void> generateReport(
22+
PackageApiDiffResult diffResult,
23+
VersionCheckResult? versionCheckResult,
24+
) async {
25+
final report = <String, dynamic>{
2226
'reportName': 'API Changes Report',
2327
'apiToolInfo': {
2428
'toolName': 'dart_apitool',
@@ -27,15 +31,33 @@ class JsonDiffReporter extends DiffReporter {
2731
'generatedAt': DateTime.now().toUtc().toLocal().toString(),
2832
'oldRef': oldPackageRef.ref,
2933
'newRef': newPackageRef.ref
30-
},
31-
'report': {},
34+
}
3235
};
3336

37+
if (versionCheckResult != null) {
38+
report['version'] = {
39+
'success': versionCheckResult.success,
40+
'old': versionCheckResult.oldVersion.toString(),
41+
'new': versionCheckResult.newVersion.toString(),
42+
'needed': versionCheckResult.neededVersion?.toString(),
43+
'explanation': versionCheckResult.explanation.toString(),
44+
};
45+
}
46+
47+
report['report'] = getChanges(diffResult);
48+
// Write the JSON report to a file
49+
await outputFile.writeAsString(jsonEncode(report));
50+
51+
print('JSON report generated at ${outputFile.path}');
52+
}
53+
54+
Map<String, dynamic> getChanges(PackageApiDiffResult diffResult) {
55+
final changeReport = <String, dynamic>{};
3456
void addChanges(bool breaking) {
3557
final changes = _printApiChangeNode(diffResult.rootNode, breaking);
3658
if (changes != null) {
37-
jsonReport['report']
38-
[breaking ? 'breakingChanges' : 'nonBreakingChanges'] = changes;
59+
changeReport[breaking ? 'breakingChanges' : 'nonBreakingChanges'] =
60+
changes;
3961
}
4062
}
4163

@@ -44,13 +66,9 @@ class JsonDiffReporter extends DiffReporter {
4466
addChanges(true); // Breaking changes
4567
addChanges(false); // Non-breaking changes
4668
} else {
47-
jsonReport['report']['noChangesDetected'] = true;
69+
changeReport['noChangesDetected'] = true;
4870
}
49-
50-
// Write the JSON report to a file
51-
await outputFile.writeAsString(jsonEncode(jsonReport));
52-
53-
print('JSON report generated at ${outputFile.path}');
71+
return changeReport;
5472
}
5573

5674
Map<String, dynamic>? _printApiChangeNode(

lib/src/diff/report/markdown_diff_reporter.dart

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'dart:io';
22

33
import 'package:dart_apitool/api_tool_cli.dart';
44

5+
import '../../cli/commands/version_check.dart';
56
import 'diff_reporter.dart';
67

78
const changeCodesReadMe =
@@ -20,7 +21,10 @@ class MarkdownDiffReporter extends DiffReporter {
2021
});
2122

2223
@override
23-
Future<void> generateReport(PackageApiDiffResult diffResult) async {
24+
Future<void> generateReport(
25+
PackageApiDiffResult diffResult,
26+
VersionCheckResult? versionCheckResult,
27+
) async {
2428
final markdownReport = StringBuffer();
2529
markdownReport
2630
..writeln('# API Changes Report')
@@ -62,6 +66,23 @@ class MarkdownDiffReporter extends DiffReporter {
6266
..writeln('No changes detected!');
6367
}
6468

69+
if (versionCheckResult != null) {
70+
stdout.writeln('### Version Check');
71+
if (versionCheckResult.success) {
72+
stdout.writeln('New version is OK!');
73+
} else {
74+
stdout.writeln('New Version is too low!');
75+
}
76+
stdout.writeln();
77+
stdout.writeln('Old version: "${versionCheckResult.oldVersion}"');
78+
stdout.writeln('New version: "${versionCheckResult.newVersion}"');
79+
if (versionCheckResult.neededVersion != null) {
80+
stdout.writeln('Needed version: "${versionCheckResult.neededVersion}"');
81+
}
82+
stdout.writeln();
83+
stdout.writeln(versionCheckResult.explanation);
84+
}
85+
6586
// Write the Markdown report to a file
6687
await outputFile.writeAsString(markdownReport.toString());
6788

lib/src/tooling/pub_interaction.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,6 @@ abstract class PubInteraction {
6363
final packagePath = path.join(hostedUrl, '$packageName-$version');
6464
if (Directory(packagePath).existsSync()) {
6565
return packagePath;
66-
} else {
67-
return null;
6866
}
6967
}
7068
return null;

0 commit comments

Comments
 (0)