Index: utils/pub/pubspec.dart |
diff --git a/utils/pub/pubspec.dart b/utils/pub/pubspec.dart |
index 6fbe647e525f9edcbc33eca0507f057a46a1ec68..ac037fadffa2e0c0d713f22d9d35e8b9e03c643b 100644 |
--- a/utils/pub/pubspec.dart |
+++ b/utils/pub/pubspec.dart |
@@ -59,7 +59,13 @@ class Pubspec { |
throw new FormatException('The pubspec must be a YAML mapping.'); |
} |
- if (parsedPubspec.containsKey('name')) name = parsedPubspec['name']; |
+ if (parsedPubspec.containsKey('name')) { |
+ name = parsedPubspec['name']; |
+ if (name is! String) { |
+ throw new FormatException( |
+ 'The pubspec "name" field should be a string, but was "$name".'); |
+ } |
+ } |
if (parsedPubspec.containsKey('version')) { |
version = new Version.parse(parsedPubspec['version']); |
@@ -70,7 +76,8 @@ class Pubspec { |
if (dependencyEntries is! Map || |
dependencyEntries.getKeys().some((e) => e is! String)) { |
throw new FormatException( |
- 'The pubspec dependencies must be a map of package names.'); |
+ 'The pubspec dependencies should be a map of package names, but ' |
+ 'was ${dependencyEntries}.'); |
} |
dependencyEntries.forEach((name, spec) { |
@@ -98,14 +105,15 @@ class Pubspec { |
var sourceName = only(sourceNames); |
if (sourceName is! String) { |
throw new FormatException( |
- 'Source name $sourceName must be a string.'); |
+ 'Source name $sourceName should be a string.'); |
} |
source = sources[sourceName]; |
description = spec[sourceName]; |
} else { |
throw new FormatException( |
- 'Dependency specification $spec must be a string or a mapping.'); |
+ 'Dependency specification $spec should be a string or a ' |
+ 'mapping.'); |
} |
source.validateDescription(description, fromLockFile: false); |
@@ -115,6 +123,43 @@ class Pubspec { |
}); |
} |
+ // Even though the pub app itself doesn't use these fields, we validate |
+ // them here so that users find errors early before they try to upload to |
+ // the server: |
+ |
+ if (parsedPubspec.containsKey('homepage') && |
+ parsedPubspec['homepage'] is! String) { |
+ throw new FormatException( |
+ 'The "homepage" field should be a string, but was ' |
+ '${parsedPubspec["homepage"]}.'); |
+ } |
+ |
+ if (parsedPubspec.containsKey('author') && |
+ parsedPubspec['author'] is! String) { |
+ throw new FormatException( |
+ 'The "author" field should be a string, but was ' |
+ '${parsedPubspec["author"]}.'); |
+ } |
+ |
+ if (parsedPubspec.containsKey('authors')) { |
+ var authors = parsedPubspec['authors']; |
+ if (authors is List) { |
+ // All of the elements must be strings. |
+ if (!authors.every((author) => author is String)) { |
+ throw new FormatException('The "authors" field should be a string ' |
+ 'or a list of strings, but was "$authors".'); |
+ } |
+ } else if (authors is! String) { |
+ throw new FormatException('The pubspec "authors" field should be a ' |
+ 'string or a list of strings, but was "$authors".'); |
+ } |
+ |
+ if (parsedPubspec.containsKey('author')) { |
+ throw new FormatException('A pubspec should not have both an "author" ' |
+ 'and an "authors" field.'); |
+ } |
+ } |
+ |
return new Pubspec(name, version, dependencies); |
} |
} |