Skip to content

Commit caf31f8

Browse files
stuartmorganmauricioluz
authored andcommitted
[tools] Allow skipping packages by Dart version (flutter#6038)
1 parent 596a1e9 commit caf31f8

File tree

5 files changed

+86
-18
lines changed

5 files changed

+86
-18
lines changed

script/tool/CHANGELOG.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
## NEXT
1+
## 0.8.7
22

33
- Supports empty custom analysis allow list files.
44
- `drive-examples` now validates files to ensure that they don't accidentally
55
use `test(...)`.
66
- Adds a new `dependabot-check` command to ensure complete Dependabot coverage.
7+
- Adds `skip-if-not-supporting-dart-version` to allow for the same use cases
8+
as `skip-if-not-supporting-flutter-version` but for packages without Flutter
9+
constraints.
710

811
## 0.8.6
912

script/tool/lib/src/common/package_looping_command.dart

+22-1
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,17 @@ abstract class PackageLoopingCommand extends PluginCommand {
9696
help: 'Skip any packages that require a Flutter version newer than '
9797
'the provided version.',
9898
);
99+
argParser.addOption(
100+
_skipByDartVersionArg,
101+
help: 'Skip any packages that require a Dart version newer than '
102+
'the provided version.',
103+
);
99104
}
100105

101106
static const String _skipByFlutterVersionArg =
102107
'skip-if-not-supporting-flutter-version';
108+
static const String _skipByDartVersionArg =
109+
'skip-if-not-supporting-dart-version';
103110

104111
/// Packages that had at least one [logWarning] call.
105112
final Set<PackageEnumerationEntry> _packagesWithWarnings =
@@ -264,6 +271,9 @@ abstract class PackageLoopingCommand extends PluginCommand {
264271
final Version? minFlutterVersion = minFlutterVersionArg.isEmpty
265272
? null
266273
: Version.parse(minFlutterVersionArg);
274+
final String minDartVersionArg = getStringArg(_skipByDartVersionArg);
275+
final Version? minDartVersion =
276+
minDartVersionArg.isEmpty ? null : Version.parse(minDartVersionArg);
267277

268278
final DateTime runStart = DateTime.now();
269279

@@ -289,7 +299,8 @@ abstract class PackageLoopingCommand extends PluginCommand {
289299
PackageResult result;
290300
try {
291301
result = await _runForPackageIfSupported(entry.package,
292-
minFlutterVersion: minFlutterVersion);
302+
minFlutterVersion: minFlutterVersion,
303+
minDartVersion: minDartVersion);
293304
} catch (e, stack) {
294305
printError(e.toString());
295306
printError(stack.toString());
@@ -337,6 +348,7 @@ abstract class PackageLoopingCommand extends PluginCommand {
337348
Future<PackageResult> _runForPackageIfSupported(
338349
RepositoryPackage package, {
339350
Version? minFlutterVersion,
351+
Version? minDartVersion,
340352
}) async {
341353
if (minFlutterVersion != null) {
342354
final Pubspec pubspec = package.parsePubspec();
@@ -349,6 +361,15 @@ abstract class PackageLoopingCommand extends PluginCommand {
349361
}
350362
}
351363

364+
if (minDartVersion != null) {
365+
final Pubspec pubspec = package.parsePubspec();
366+
final VersionConstraint? dartConstraint = pubspec.environment?['sdk'];
367+
if (dartConstraint != null && !dartConstraint.allows(minDartVersion)) {
368+
return PackageResult.skip(
369+
'Does not support Dart ${minDartVersion.toString()}');
370+
}
371+
}
372+
352373
return await runForPackage(package);
353374
}
354375

script/tool/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: flutter_plugin_tools
22
description: Productivity utils for flutter/plugins and flutter/packages
33
repository: https://github.com/flutter/plugins/tree/main/script/tool
4-
version: 0.8.6
4+
version: 0.8.7
55

66
dependencies:
77
args: ^2.1.0

script/tool/test/common/package_looping_command_test.dart

+32-1
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ void main() {
340340
}
341341
});
342342

343-
test('skips unsupported versions when requested', () async {
343+
test('skips unsupported Flutter versions when requested', () async {
344344
final RepositoryPackage excluded = createFakePlugin(
345345
'a_plugin', packagesDir,
346346
flutterConstraint: '>=2.10.0');
@@ -370,6 +370,37 @@ void main() {
370370
'$_startSkipColor SKIPPING: Does not support Flutter 2.5.0$_endColor',
371371
]));
372372
});
373+
374+
test('skips unsupported Dart versions when requested', () async {
375+
final RepositoryPackage excluded = createFakePackage(
376+
'excluded_package', packagesDir,
377+
isFlutter: false, dartConstraint: '>=2.17.0 <3.0.0');
378+
final RepositoryPackage included = createFakePackage(
379+
'a_package', packagesDir,
380+
isFlutter: false, dartConstraint: '>=2.14.0 <3.0.0');
381+
382+
final TestPackageLoopingCommand command = createTestCommand(
383+
packageLoopingType: PackageLoopingType.includeAllSubpackages,
384+
hasLongOutput: false);
385+
final List<String> output = await runCommand(command,
386+
arguments: <String>['--skip-if-not-supporting-dart-version=2.14.0']);
387+
388+
expect(
389+
command.checkedPackages,
390+
unorderedEquals(<String>[
391+
included.path,
392+
getExampleDir(included).path,
393+
]));
394+
expect(command.checkedPackages, isNot(contains(excluded.path)));
395+
396+
expect(
397+
output,
398+
containsAllInOrder(<String>[
399+
'${_startHeadingColor}Running for a_package...$_endColor',
400+
'${_startHeadingColor}Running for excluded_package...$_endColor',
401+
'$_startSkipColor SKIPPING: Does not support Dart 2.14.0$_endColor',
402+
]));
403+
});
373404
});
374405

375406
group('output', () {

script/tool/test/util.dart

+27-14
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ import 'mocks.dart';
2323

2424
export 'package:flutter_plugin_tools/src/common/repository_package.dart';
2525

26+
const String _defaultDartConstraint = '>=2.14.0 <3.0.0';
27+
const String _defaultFlutterConstraint = '>=2.5.0';
28+
2629
/// Returns the exe name that command will use when running Flutter on
2730
/// [platform].
2831
String getFlutterCommand(Platform platform) =>
@@ -97,14 +100,19 @@ RepositoryPackage createFakePlugin(
97100
Map<String, PlatformDetails> platformSupport =
98101
const <String, PlatformDetails>{},
99102
String? version = '0.0.1',
100-
String flutterConstraint = '>=2.5.0',
103+
String flutterConstraint = _defaultFlutterConstraint,
104+
String dartConstraint = _defaultDartConstraint,
101105
}) {
102-
final RepositoryPackage package = createFakePackage(name, parentDirectory,
103-
isFlutter: true,
104-
examples: examples,
105-
extraFiles: extraFiles,
106-
version: version,
107-
flutterConstraint: flutterConstraint);
106+
final RepositoryPackage package = createFakePackage(
107+
name,
108+
parentDirectory,
109+
isFlutter: true,
110+
examples: examples,
111+
extraFiles: extraFiles,
112+
version: version,
113+
flutterConstraint: flutterConstraint,
114+
dartConstraint: dartConstraint,
115+
);
108116

109117
createFakePubspec(
110118
package,
@@ -114,6 +122,7 @@ RepositoryPackage createFakePlugin(
114122
platformSupport: platformSupport,
115123
version: version,
116124
flutterConstraint: flutterConstraint,
125+
dartConstraint: dartConstraint,
117126
);
118127

119128
return package;
@@ -136,7 +145,8 @@ RepositoryPackage createFakePackage(
136145
List<String> extraFiles = const <String>[],
137146
bool isFlutter = false,
138147
String? version = '0.0.1',
139-
String flutterConstraint = '>=2.5.0',
148+
String flutterConstraint = _defaultFlutterConstraint,
149+
String dartConstraint = _defaultDartConstraint,
140150
bool includeCommonFiles = true,
141151
String? directoryName,
142152
String? publishTo,
@@ -150,7 +160,8 @@ RepositoryPackage createFakePackage(
150160
name: name,
151161
isFlutter: isFlutter,
152162
version: version,
153-
flutterConstraint: flutterConstraint);
163+
flutterConstraint: flutterConstraint,
164+
dartConstraint: dartConstraint);
154165
if (includeCommonFiles) {
155166
package.changelogFile.writeAsStringSync('''
156167
## $version
@@ -167,7 +178,8 @@ RepositoryPackage createFakePackage(
167178
includeCommonFiles: false,
168179
isFlutter: isFlutter,
169180
publishTo: 'none',
170-
flutterConstraint: flutterConstraint);
181+
flutterConstraint: flutterConstraint,
182+
dartConstraint: dartConstraint);
171183
} else if (examples.isNotEmpty) {
172184
final Directory examplesDirectory = getExampleDir(package)..createSync();
173185
for (final String exampleName in examples) {
@@ -176,7 +188,8 @@ RepositoryPackage createFakePackage(
176188
includeCommonFiles: false,
177189
isFlutter: isFlutter,
178190
publishTo: 'none',
179-
flutterConstraint: flutterConstraint);
191+
flutterConstraint: flutterConstraint,
192+
dartConstraint: dartConstraint);
180193
}
181194
}
182195

@@ -189,7 +202,7 @@ RepositoryPackage createFakePackage(
189202
return package;
190203
}
191204

192-
/// Creates a `pubspec.yaml` file with a flutter dependency.
205+
/// Creates a `pubspec.yaml` file for [package].
193206
///
194207
/// [platformSupport] is a map of platform string to the support details for
195208
/// that platform. If empty, no `plugin` entry will be created unless `isPlugin`
@@ -203,8 +216,8 @@ void createFakePubspec(
203216
const <String, PlatformDetails>{},
204217
String? publishTo,
205218
String? version,
206-
String dartConstraint = '>=2.0.0 <3.0.0',
207-
String flutterConstraint = '>=2.5.0',
219+
String dartConstraint = _defaultDartConstraint,
220+
String flutterConstraint = _defaultFlutterConstraint,
208221
}) {
209222
isPlugin |= platformSupport.isNotEmpty;
210223

0 commit comments

Comments
 (0)