| // 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 '../entrypoint.dart'; |
| import '../validator.dart'; |
| |
| /// A validator that checks that the pubspec has valid "author" and "homepage" |
| /// fields. |
| class PubspecFieldValidator extends Validator { |
| PubspecFieldValidator(Entrypoint entrypoint) : super(entrypoint); |
| |
| Future validate() { |
| _validateAuthors(); |
| _validateFieldIsString('description'); |
| _validateFieldIsString('homepage'); |
| _validateFieldUrl('homepage'); |
| _validateFieldUrl('documentation'); |
| |
| // Any complex parsing errors in version will be exposed through |
| // [Pubspec.allErrors]. |
| _validateFieldIsString('version'); |
| |
| // Pubspec errors are detected lazily, so we make sure there aren't any |
| // here. |
| for (var error in entrypoint.root.pubspec.allErrors) { |
| errors.add('In your pubspec.yaml, ${error.message}'); |
| } |
| |
| return new Future.value(); |
| } |
| |
| /// Adds an error if the "author" or "authors" field doesn't exist or has the |
| /// wrong type. |
| void _validateAuthors() { |
| var pubspec = entrypoint.root.pubspec; |
| var author = pubspec.fields['author']; |
| var authors = pubspec.fields['authors']; |
| if (author == null && authors == null) { |
| errors.add('Your pubspec.yaml must have an "author" or "authors" field.'); |
| return; |
| } |
| |
| if (author != null && author is! String) { |
| errors.add('Your pubspec.yaml\'s "author" field must be a string, but it ' |
| 'was "$author".'); |
| return; |
| } |
| |
| if (authors != null && |
| (authors is! List || authors.any((author) => author is! String))) { |
| errors.add('Your pubspec.yaml\'s "authors" field must be a list, but ' |
| 'it was "$authors".'); |
| return; |
| } |
| |
| if (authors == null) authors = [author]; |
| |
| var hasName = new RegExp(r"^ *[^< ]"); |
| var hasEmail = new RegExp(r"<[^>]+> *$"); |
| for (var authorName in authors) { |
| if (!hasName.hasMatch(authorName)) { |
| warnings.add('Author "$authorName" in pubspec.yaml should have a ' |
| 'name.'); |
| } |
| if (!hasEmail.hasMatch(authorName)) { |
| warnings.add('Author "$authorName" in pubspec.yaml should have an ' |
| 'email address\n(e.g. "name <email>").'); |
| } |
| } |
| } |
| |
| /// Adds an error if [field] doesn't exist or isn't a string. |
| void _validateFieldIsString(String field) { |
| var value = entrypoint.root.pubspec.fields[field]; |
| if (value == null) { |
| errors.add('Your pubspec.yaml is missing a "$field" field.'); |
| } else if (value is! String) { |
| errors.add('Your pubspec.yaml\'s "$field" field must be a string, but ' |
| 'it was "$value".'); |
| } |
| } |
| |
| /// Adds an error if the URL for [field] is invalid. |
| void _validateFieldUrl(String field) { |
| var url = entrypoint.root.pubspec.fields[field]; |
| if (url == null) return; |
| |
| if (url is! String) { |
| errors.add('Your pubspec.yaml\'s "$field" field must be a string, but ' |
| 'it was "$url".'); |
| return; |
| } |
| |
| var goodScheme = new RegExp(r'^https?:'); |
| if (!goodScheme.hasMatch(url)) { |
| errors.add('Your pubspec.yaml\'s "$field" field must be an "http:" or ' |
| '"https:" URL, but it was "$url".'); |
| } |
| } |
| } |