Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(301)

Unified Diff: utils/pub/validator/name.dart

Issue 11444018: Add a validator that checks package names. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix tests. Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: utils/pub/validator/name.dart
diff --git a/utils/pub/validator/name.dart b/utils/pub/validator/name.dart
new file mode 100644
index 0000000000000000000000000000000000000000..3a37e31dd9f10e14e9f064893608e539d84e5e65
--- /dev/null
+++ b/utils/pub/validator/name.dart
@@ -0,0 +1,73 @@
+// 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.
+
+library name_validator;
+
+import 'dart:io';
+
+import '../entrypoint.dart';
+import '../io.dart';
+import '../validator.dart';
+
+/// Dart reserved words, from the Dart spec.
+final _RESERVED_WORDS = [
+ "abstract", "as", "dynamic", "export", "external", "factory", "get",
+ "implements", "import", "library", "operator", "part", "set", "static",
+ "typedef"
+];
+
+/// A validator that validates the name of the package and its libraries.
+class NameValidator extends Validator {
+ NameValidator(Entrypoint entrypoint)
+ : super(entrypoint);
+
+ Future validate() {
+ _checkName(entrypoint.root.name, 'Package name "${entrypoint.root.name}"');
+
+ var libDir = join(entrypoint.root.dir, "lib");
+ return dirExists(libDir).chain((libDirExists) {
+ if (!libDirExists) return new Future.immediate([]);
+ return listDir(libDir, recursive: true);
+ }).transform((files) {
+ for (var file in files) {
+ if (file.contains("/src/")) continue;
+ if (new Path(file).extension != 'dart') continue;
+ var libName = new Path(file).filenameWithoutExtension;
+ _checkName(libName, 'The name of "$file", "$libName",');
+ }
+ });
+ }
+
+ void _checkName(String name, String description) {
+ if (name == "") {
+ errors.add("$description may not be empty.");
+ } else if (!new RegExp(r"^[a-zA-Z0-9_]*$").hasMatch(name)) {
+ errors.add("$description must be a valid Dart identifier: it may only "
+ "contain letters, numbers, and underscores.");
+ } else if (!new RegExp(r"^[a-zA-Z]").hasMatch(name)) {
+ errors.add("$description must be a valid Dart identifier: it must begin "
+ "with a letter.");
+ } else if (_RESERVED_WORDS.contains(name.toLowerCase())) {
+ errors.add("$description must be a valid Dart identifier: it may not be "
+ "a reserved word in Dart.");
+ } else if (new RegExp(r"[A-Z]").hasMatch(name)) {
+ warnings.add('$description should be lower-case. Maybe use '
+ '"${_unCamelCase(name)}"?');
+ }
+ }
+
+ String _unCamelCase(String source) {
+ var builder = new StringBuffer();
+ var lastMatchEnd = 0;
+ for (var match in new RegExp(r"[a-z]([A-Z])").allMatches(source)) {
+ builder
+ ..add(source.substring(lastMatchEnd, match.start + 1))
+ ..add("_")
+ ..add(match.group(1).toLowerCase());
+ lastMatchEnd = match.end;
+ }
+ builder.add(source.substring(lastMatchEnd));
+ return builder.toString().toLowerCase();
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698