Skip to content

Commit 694478a

Browse files
feat(dart): add dart config to very_good.yaml (#1664)
* feat(dart): add dart config to very_good.yaml Closes #1655 Co-authored-by: marcossevilla <marcossevilla@users.noreply.github.com> * chore: simplify --------- Co-authored-by: unicoderbot[bot] <269805761+unicoderbot[bot]@users.noreply.github.com> Co-authored-by: marcossevilla <marcossevilla@users.noreply.github.com> Co-authored-by: Marcos Sevilla <31174242+marcossevilla@users.noreply.github.com> Co-authored-by: Marcos Sevilla <me@marcossevilla.dev>
1 parent a4505cf commit 694478a

10 files changed

Lines changed: 606 additions & 115 deletions

File tree

lib/src/commands/dart/commands/dart_test_command.dart

Lines changed: 72 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:mason/mason.dart';
77
import 'package:meta/meta.dart';
88
import 'package:path/path.dart' as path;
99
import 'package:very_good_cli/src/cli/cli.dart';
10+
import 'package:very_good_cli/src/very_good_config/very_good_config.dart';
1011

1112
/// Options for configuring the Dart test command.
1213
class DartTestOptions {
@@ -32,18 +33,43 @@ class DartTestOptions {
3233
});
3334

3435
/// Parses [ArgResults] into a [DartTestOptions] instance.
35-
factory DartTestOptions.parse(ArgResults argResults) {
36-
final concurrency = argResults['concurrency'] as String;
37-
final collectCoverage = argResults['coverage'] as bool;
38-
final minCoverage = double.tryParse(
39-
argResults['min-coverage'] as String? ?? '',
36+
///
37+
/// When [config] is provided, its values are used as defaults for any
38+
/// option that was not explicitly parsed on the command line.
39+
factory DartTestOptions.parse(
40+
ArgResults argResults, {
41+
VeryGoodConfig config = VeryGoodConfig.empty,
42+
}) {
43+
final testConfig = config.dart.test;
44+
45+
final concurrency = argResults.resolve(
46+
'concurrency',
47+
testConfig.concurrency,
48+
);
49+
final collectCoverage = argResults.resolve('coverage', testConfig.coverage);
50+
final minCoverageString = argResults.resolve<String?>(
51+
'min-coverage',
52+
testConfig.minCoverage,
53+
);
54+
final minCoverage = double.tryParse(minCoverageString ?? '');
55+
final showUncovered = argResults.resolve(
56+
'show-uncovered',
57+
testConfig.showUncovered,
58+
);
59+
final excludeTags = argResults.resolve<String?>(
60+
'exclude-tags',
61+
testConfig.excludeTags,
62+
);
63+
final tags = argResults.resolve<String?>('tags', testConfig.tags);
64+
final excludeFromCoverage = argResults.resolve<String?>(
65+
'exclude-coverage',
66+
testConfig.excludeCoverage,
67+
);
68+
final collectCoverageFromString = argResults.resolve<String>(
69+
'collect-coverage-from',
70+
testConfig.collectCoverageFrom,
71+
fallbackValue: 'imports',
4072
);
41-
final showUncovered = argResults['show-uncovered'] as bool;
42-
final excludeTags = argResults['exclude-tags'] as String?;
43-
final tags = argResults['tags'] as String?;
44-
final excludeFromCoverage = argResults['exclude-coverage'] as String?;
45-
final collectCoverageFromString =
46-
argResults['collect-coverage-from'] as String? ?? 'imports';
4773
final collectCoverageFrom = CoverageCollectionMode.fromString(
4874
collectCoverageFromString,
4975
);
@@ -52,17 +78,33 @@ class DartTestOptions {
5278
final randomSeed = randomOrderingSeed == 'random'
5379
? Random().nextInt(4294967295).toString()
5480
: randomOrderingSeed;
55-
final optimizePerformance = argResults['optimization'] as bool;
56-
final failFast = argResults['fail-fast'] as bool;
81+
final optimizePerformance = argResults.resolve(
82+
'optimization',
83+
testConfig.optimization,
84+
);
85+
final failFast = argResults.resolve('fail-fast', testConfig.failFast);
5786
final forceAnsi = argResults['force-ansi'] as bool?;
58-
final platform = argResults['platform'] as String?;
59-
final reportOn = (argResults['report-on'] as List<String>)
87+
final platform = argResults.resolve<String?>(
88+
'platform',
89+
testConfig.platform,
90+
);
91+
final reportOn = argResults
92+
.resolve<List<String>>('report-on', testConfig.reportOn)
6093
.expand((e) => e.split(RegExp(r'[,\s]+')))
6194
.where((e) => e.isNotEmpty)
6295
.toList();
63-
final runSkipped = argResults['run-skipped'] as bool;
64-
final checkIgnore = argResults['check-ignore'] as bool;
65-
final fileReporter = argResults['file-reporter'] as String?;
96+
final runSkipped = argResults.resolve(
97+
'run-skipped',
98+
testConfig.runSkipped,
99+
);
100+
final checkIgnore = argResults.resolve(
101+
'check-ignore',
102+
testConfig.checkIgnore,
103+
);
104+
final fileReporter = argResults.resolve<String?>(
105+
'file-reporter',
106+
testConfig.fileReporter,
107+
);
66108
final rest = argResults.rest;
67109

68110
return DartTestOptions._(
@@ -327,9 +369,20 @@ This command should be run from the root of your Dart project.''');
327369
return ExitCode.noInput.code;
328370
}
329371

372+
final VeryGoodConfig config;
373+
try {
374+
config = VeryGoodConfig.loadFromClosestAncestor(Directory(targetPath));
375+
} on VeryGoodConfigParseException catch (e) {
376+
_logger.err(
377+
'Could not read `$veryGoodConfigFileName`.\n'
378+
'${e.message}',
379+
);
380+
return ExitCode.config.code;
381+
}
382+
330383
final isDartInstalled = await _dartInstalled(logger: _logger);
331384

332-
final options = DartTestOptions.parse(_argResults);
385+
final options = DartTestOptions.parse(_argResults, config: config);
333386

334387
if (isDartInstalled) {
335388
try {

lib/src/commands/packages/commands/check/commands/licenses.dart

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,33 +87,27 @@ class PackagesCheckLicensesOptions {
8787
}) {
8888
final licensesConfig = config.packages.check.licenses;
8989

90-
final ignoreRetrievalFailures = resolveArg(
91-
argResults,
90+
final ignoreRetrievalFailures = argResults.resolve(
9291
'ignore-retrieval-failures',
9392
licensesConfig.ignoreRetrievalFailures,
9493
);
95-
final dependencyTypes = resolveArg<List<String>>(
96-
argResults,
94+
final dependencyTypes = argResults.resolve<List<String>>(
9795
'dependency-type',
9896
licensesConfig.dependencyType,
9997
);
100-
final allowedLicenses = resolveArg<List<String>>(
101-
argResults,
98+
final allowedLicenses = argResults.resolve<List<String>>(
10299
'allowed',
103100
licensesConfig.allowed,
104101
);
105-
final forbiddenLicenses = resolveArg<List<String>>(
106-
argResults,
102+
final forbiddenLicenses = argResults.resolve<List<String>>(
107103
'forbidden',
108104
licensesConfig.forbidden,
109105
);
110-
final skippedPackages = resolveArg<List<String>>(
111-
argResults,
106+
final skippedPackages = argResults.resolve<List<String>>(
112107
'skip-packages',
113108
licensesConfig.skipPackages,
114109
);
115-
final reporter = resolveArg<String?>(
116-
argResults,
110+
final reporter = argResults.resolve<String?>(
117111
'reporter',
118112
licensesConfig.reporter,
119113
);

lib/src/commands/packages/commands/get.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@ class PackagesGetOptions {
2121
}) {
2222
final getConfig = config.packages.get;
2323

24-
final recursive = resolveArg(
25-
argResults,
24+
final recursive = argResults.resolve(
2625
'recursive',
2726
getConfig.recursive,
2827
);
29-
final ignore = resolveArg<List<String>>(
30-
argResults,
28+
final ignore = argResults.resolve<List<String>>(
3129
'ignore',
3230
getConfig.ignore,
3331
);

lib/src/commands/test/test.dart

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -46,40 +46,33 @@ class FlutterTestOptions {
4646
}) {
4747
final testConfig = config.test;
4848

49-
final concurrency = resolveArg(
50-
argResults,
49+
final concurrency = argResults.resolve(
5150
'concurrency',
5251
testConfig.concurrency,
5352
);
54-
final collectCoverage = resolveArg(
55-
argResults,
53+
final collectCoverage = argResults.resolve(
5654
'coverage',
5755
testConfig.coverage,
5856
);
59-
final minCoverage = resolveArg<String?>(
60-
argResults,
57+
final minCoverage = argResults.resolve<String?>(
6158
'min-coverage',
6259
testConfig.minCoverage,
6360
);
6461
final effectiveMinCoverage = double.tryParse(minCoverage ?? '');
65-
final showUncovered = resolveArg(
66-
argResults,
62+
final showUncovered = argResults.resolve(
6763
'show-uncovered',
6864
testConfig.showUncovered,
6965
);
70-
final excludeTags = resolveArg<String?>(
71-
argResults,
66+
final excludeTags = argResults.resolve<String?>(
7267
'exclude-tags',
7368
testConfig.excludeTags,
7469
);
75-
final tags = resolveArg<String?>(argResults, 'tags', testConfig.tags);
76-
final excludeFromCoverage = resolveArg<String?>(
77-
argResults,
70+
final tags = argResults.resolve<String?>('tags', testConfig.tags);
71+
final excludeFromCoverage = argResults.resolve<String?>(
7872
'exclude-coverage',
7973
testConfig.excludeCoverage,
8074
);
81-
final collectCoverageFrom = resolveArg<String>(
82-
argResults,
75+
final collectCoverageFrom = argResults.resolve<String>(
8376
'collect-coverage-from',
8477
testConfig.collectCoverageFrom,
8578
fallbackValue: 'imports',
@@ -92,39 +85,32 @@ class FlutterTestOptions {
9285
final randomSeed = randomOrderingSeed == 'random'
9386
? Random().nextInt(4294967295).toString()
9487
: randomOrderingSeed;
95-
final optimizePerformance = resolveArg(
96-
argResults,
88+
final optimizePerformance = argResults.resolve(
9789
'optimization',
9890
testConfig.optimization,
9991
);
100-
final updateGoldens = resolveArg(
101-
argResults,
92+
final updateGoldens = argResults.resolve(
10293
'update-goldens',
10394
testConfig.updateGoldens,
10495
);
105-
final failFast = resolveArg(
106-
argResults,
96+
final failFast = argResults.resolve(
10797
'fail-fast',
10898
testConfig.failFast,
10999
);
110100
final forceAnsi = argResults['force-ansi'] as bool?;
111-
final dartDefine = resolveArg<List<String>?>(
112-
argResults,
101+
final dartDefine = argResults.resolve<List<String>?>(
113102
'dart-define',
114103
testConfig.dartDefine,
115104
);
116-
final dartDefineFromFile = resolveArg<List<String>?>(
117-
argResults,
105+
final dartDefineFromFile = argResults.resolve<List<String>?>(
118106
'dart-define-from-file',
119107
testConfig.dartDefineFromFile,
120108
);
121-
final platform = resolveArg<String?>(
122-
argResults,
109+
final platform = argResults.resolve<String?>(
123110
'platform',
124111
testConfig.platform,
125112
);
126-
final reportOn = resolveArg<List<String>>(
127-
argResults,
113+
final reportOn = argResults.resolve<List<String>>(
128114
'report-on',
129115
testConfig.reportOn,
130116
);
@@ -133,27 +119,23 @@ class FlutterTestOptions {
133119
.where((e) => e.isNotEmpty)
134120
.toList();
135121

136-
final runSkipped = resolveArg(
137-
argResults,
122+
final runSkipped = argResults.resolve(
138123
'run-skipped',
139124
testConfig.runSkipped,
140125
);
141-
final flavor = resolveArg<String?>(
142-
argResults,
126+
final flavor = argResults.resolve<String?>(
143127
'flavor',
144128
testConfig.flavor,
145129
);
146-
final timeout = resolveArg<String?>(
147-
argResults,
130+
final timeout = argResults.resolve<String?>(
148131
'timeout',
149132
testConfig.timeout,
150133
);
151134
final timeoutSeconds = int.tryParse(timeout ?? '');
152135
final effectiveTimeout = timeoutSeconds != null
153136
? Duration(seconds: timeoutSeconds)
154137
: null;
155-
final fileReporter = resolveArg<String?>(
156-
argResults,
138+
final fileReporter = argResults.resolve<String?>(
157139
'file-reporter',
158140
testConfig.fileReporter,
159141
);

0 commit comments

Comments
 (0)