Validate imports/exports in benchmark and example dirs
Just like test and tool
Also expanded and generalized these tests
Closes https://github.com/dart-lang/pub/issues/1537
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index 259d228..6dcc5f4 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -819,12 +819,6 @@
/// This will report the error and cause pub to exit with [exit_codes.DATA].
void dataError(String message) => throw new DataException(message);
-/// Returns an iterable that contains the elements of [iter1] followed by those
-/// of [iter2].
-Iterable/*<T>*/ combineIterables/*<T>*/(
- Iterable/*<T>*/ iter1, Iterable/*<T>*/ iter2) =>
- iter1.toList()..addAll(iter2);
-
/// Returns a UUID in v4 format as a `String`.
///
/// If [bytes] is provided, it must be length 16 and have values between `0` and
diff --git a/lib/src/validator/strict_dependencies.dart b/lib/src/validator/strict_dependencies.dart
index 71647be..3259bb8 100644
--- a/lib/src/validator/strict_dependencies.dart
+++ b/lib/src/validator/strict_dependencies.dart
@@ -66,7 +66,7 @@
var devDependencies =
entrypoint.root.devDependencies.map((d) => d.name).toSet();
_validateLibBin(dependencies, devDependencies);
- _validateTestTool(dependencies, devDependencies);
+ _validateBenchmarkExampleTestTool(dependencies, devDependencies);
}
/// Validates that no Dart files in `lib/` or `bin/` have dependencies that
@@ -75,9 +75,7 @@
/// The [devDeps] are used to generate special warnings for files that import
/// dev dependencies.
void _validateLibBin(Set<String> deps, Set<String> devDeps) {
- var libFiles = entrypoint.root.listFiles(beneath: 'lib').where(_isDart);
- var binFiles = entrypoint.root.listFiles(beneath: 'bin').where(_isDart);
- for (var usage in _findPackages(combineIterables(libFiles, binFiles))) {
+ for (var usage in _usagesBeneath(['lib', 'bin'])) {
if (!deps.contains(usage.package)) {
if (devDeps.contains(usage.package)) {
warnings.add(usage.dependencyMisplaceMessage());
@@ -88,20 +86,22 @@
}
}
- /// Validates that no Dart files in `test/` or `tool/` have dependencies that
- /// aren't in [deps] or [devDeps].
- void _validateTestTool(Set<String> deps, Set<String> devDeps) {
- var testFiles = entrypoint.root.listFiles(beneath: 'test').where(_isDart);
- var toolFiles = entrypoint.root.listFiles(beneath: 'tool').where(_isDart);
- for (var usage in _findPackages(combineIterables(testFiles, toolFiles))) {
+ /// Validates that no Dart files in `benchmark/`, `example/, `test/` or
+ /// `tool/` have dependencies that aren't in [deps] or [devDeps].
+ void _validateBenchmarkExampleTestTool(
+ Set<String> deps, Set<String> devDeps) {
+ for (var usage
+ in _usagesBeneath(['benchmark', 'example', 'test', 'tool'])) {
if (!deps.contains(usage.package) && !devDeps.contains(usage.package)) {
warnings.add(usage.dependencyMissingMessage());
}
}
}
- /// Returns whether [file] is a Dart file.
- bool _isDart(String file) => p.extension(file) == '.dart';
+ Iterable<_Usage> _usagesBeneath(List<String> paths) => _findPackages(paths
+ .map((path) => entrypoint.root.listFiles(beneath: path))
+ .expand((files) => files)
+ .where((String file) => p.extension(file) == '.dart'));
}
/// A parsed import or export directive in a D source file.
diff --git a/test/validator/strict_dependencies_test.dart b/test/validator/strict_dependencies_test.dart
index 08a5109..a156687 100644
--- a/test/validator/strict_dependencies_test.dart
+++ b/test/validator/strict_dependencies_test.dart
@@ -69,37 +69,37 @@
expectNoValidationError(strictDeps);
});
- integration('declares an "import" as a dev dependency in test/', () {
- d.dir(appPath, [
- d.libPubspec("test_pkg", "1.0.0",
- devDeps: {"silly_monkey": "^1.2.3"}, sdk: ">=1.8.0 <2.0.0"),
- d.dir('test', [
- d.file(
- 'library.dart',
- r'''
- import 'package:silly_monkey/silly_monkey.dart';
+ for (var port in ['import', 'export']) {
+ for (var isDev in [false, true]) {
+ var deps;
+ var devDeps;
+
+ if (isDev) {
+ devDeps = {"silly_monkey": "^1.2.3"};
+ } else {
+ deps = {"silly_monkey": "^1.2.3"};
+ }
+ for (var devDir in ['benchmark', 'example', 'test', 'tool']) {
+ integration(
+ 'declares an "$port" as a '
+ '${isDev ? 'dev ': ''}dependency in $devDir/', () {
+ d.dir(appPath, [
+ d.libPubspec("test_pkg", "1.0.0",
+ deps: deps, devDeps: devDeps, sdk: ">=1.8.0 <2.0.0"),
+ d.dir(devDir, [
+ d.file(
+ 'library.dart',
+ '''
+ $port 'package:silly_monkey/silly_monkey.dart';
'''),
- ]),
- ]).create();
+ ]),
+ ]).create();
- expectNoValidationError(strictDeps);
- });
-
- integration('declares an "import" as a dev dependency in tool/', () {
- d.dir(appPath, [
- d.libPubspec("test_pkg", "1.0.0",
- devDeps: {"silly_monkey": "^1.2.3"}, sdk: ">=1.8.0 <2.0.0"),
- d.dir('tool', [
- d.file(
- 'library.dart',
- r'''
- import 'package:silly_monkey/silly_monkey.dart';
- '''),
- ]),
- ]).create();
-
- expectNoValidationError(strictDeps);
- });
+ expectNoValidationError(strictDeps);
+ });
+ }
+ }
+ }
integration('only uses dart: dependencies (not pub packages)', () {
d
@@ -227,37 +227,45 @@
expectValidationWarning(strictDeps);
});
- integration('declares an "import" as a devDependency for lib/', () {
- d.dir(appPath, [
- d.libPubspec("test_pkg", "1.0.0",
- devDeps: {"silly_monkey": "^1.2.3"}, sdk: ">=1.8.0 <2.0.0"),
- d.dir('lib', [
- d.file(
- 'library.dart',
- r'''
- import 'package:silly_monkey/silly_monkey.dart';
+ for (var port in ['import', 'export']) {
+ for (var codeDir in ['bin', 'lib']) {
+ integration('declares an "$port" as a devDependency for $codeDir/', () {
+ d.dir(appPath, [
+ d.libPubspec("test_pkg", "1.0.0",
+ devDeps: {"silly_monkey": "^1.2.3"}, sdk: ">=1.8.0 <2.0.0"),
+ d.dir(codeDir, [
+ d.file(
+ 'library.dart',
+ '''
+ $port 'package:silly_monkey/silly_monkey.dart';
'''),
- ]),
- ]).create();
+ ]),
+ ]).create();
- expectValidationWarning(strictDeps);
- });
+ expectValidationWarning(strictDeps);
+ });
+ }
+ }
- integration('declares an "import" as a devDependency for bin/', () {
- d.dir(appPath, [
- d.libPubspec("test_pkg", "1.0.0",
- devDeps: {"silly_monkey": "^1.2.3"}, sdk: ">=1.8.0 <2.0.0"),
- d.dir('bin', [
- d.file(
- 'library.dart',
- r'''
- import 'package:silly_monkey/silly_monkey.dart';
+ for (var port in ['import', 'export']) {
+ for (var devDir in ['benchmark', 'example', 'test', 'tool']) {
+ integration('does not declare an "$port" as a dependency in $devDir/',
+ () {
+ d.dir(appPath, [
+ d.libPubspec("test_pkg", "1.0.0", sdk: ">=1.8.0 <2.0.0"),
+ d.dir(devDir, [
+ d.file(
+ 'library.dart',
+ '''
+ $port 'package:silly_monkey/silly_monkey.dart';
'''),
- ]),
- ]).create();
+ ]),
+ ]).create();
- expectValidationWarning(strictDeps);
- });
+ expectValidationWarning(strictDeps);
+ });
+ }
+ }
group('declares an import with an invalid package URL: ', () {
integration('"package:"', () {