blob: ae8ac576d5679aadaade89b9c11862f6a93316db [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'package:path/path.dart' as path;
import '../io.dart';
import '../validator.dart';
/// A validator that validates a package's top-level directories.
class DirectoryValidator extends Validator {
static final _pluralNames = [
'benchmarks',
'docs',
'examples',
'tests',
'tools'
];
static String docRef = 'See https://dart.dev/tools/pub/package-layout.';
@override
Future<void> validate() async {
final visited = <String>{};
for (final file in files) {
// Find the topmost directory name of [file].
final dir = path.join(entrypoint.root.dir,
path.split(path.relative(file, from: entrypoint.root.dir)).first);
if (!visited.add(dir)) continue;
if (!dirExists(dir)) continue;
final dirName = path.basename(dir);
if (_pluralNames.contains(dirName)) {
// Cut off the "s"
var singularName = dirName.substring(0, dirName.length - 1);
warnings.add('Rename the top-level "$dirName" directory to '
'"$singularName".\n'
'The Pub layout convention is to use singular directory '
'names.\n'
'Plural names won\'t be correctly identified by Pub and other '
'tools.\n$docRef');
}
if (dirName.contains(RegExp(r'^samples?$'))) {
warnings.add('Rename the top-level "$dirName" directory to "example".\n'
'This allows Pub to find your examples and create "packages" '
'directories for them.\n$docRef');
}
}
}
}