Commit c2b4ac9c authored by Jason Simmons's avatar Jason Simmons

Validate flutter.yaml against a JSON schema

parent f5c3b75d
name: stocks name: stocks
version: 0.0.2
update-url: http://localhost:9888/
uses-material-design: true uses-material-design: true
...@@ -8,6 +8,7 @@ import 'dart:io'; ...@@ -8,6 +8,7 @@ import 'dart:io';
import 'package:flx/bundle.dart'; import 'package:flx/bundle.dart';
import 'package:flx/signing.dart'; import 'package:flx/signing.dart';
import 'package:json_schema/json_schema.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'package:yaml/yaml.dart'; import 'package:yaml/yaml.dart';
...@@ -108,6 +109,20 @@ dynamic _loadManifest(String manifestPath) { ...@@ -108,6 +109,20 @@ dynamic _loadManifest(String manifestPath) {
return loadYaml(manifestDescriptor); return loadYaml(manifestDescriptor);
} }
Future<int> _validateManifest(Object manifest) async {
String schemaPath = path.join(path.absolute(ArtifactStore.flutterRoot),
'packages', 'flutter_tools', 'schema', 'flutter_yaml.json');
Schema schema = await Schema.createSchemaFromUrl('file://$schemaPath');
Validator validator = new Validator(schema);
if (validator.validate(manifest))
return 0;
printError('Error in flutter.yaml:');
printError(validator.errors.join('\n'));
return 1;
}
ZipEntry _createAssetEntry(_Asset asset) { ZipEntry _createAssetEntry(_Asset asset) {
String source = asset.source ?? asset.key; String source = asset.source ?? asset.key;
File file = new File('${asset.base}/$source'); File file = new File('${asset.base}/$source');
...@@ -184,7 +199,14 @@ Future<int> build( ...@@ -184,7 +199,14 @@ Future<int> build(
String workingDirPath: defaultWorkingDirPath, String workingDirPath: defaultWorkingDirPath,
bool precompiledSnapshot: false bool precompiledSnapshot: false
}) async { }) async {
Map<String, dynamic> manifestDescriptor = _loadManifest(manifestPath); Object manifest = _loadManifest(manifestPath);
if (manifest != null) {
int result = await _validateManifest(manifest);
if (result != 0)
return result;
}
Map<String, dynamic> manifestDescriptor = manifest;
String assetBasePath = path.dirname(path.absolute(manifestPath)); String assetBasePath = path.dirname(path.absolute(manifestPath));
File snapshotFile; File snapshotFile;
......
...@@ -14,6 +14,7 @@ dependencies: ...@@ -14,6 +14,7 @@ dependencies:
crypto: ^0.9.2 crypto: ^0.9.2
den_api: ^0.1.0 den_api: ^0.1.0
file: ^0.1.0 file: ^0.1.0
json_schema: ^1.0.3
mustache4dart: ^1.0.0 mustache4dart: ^1.0.0
path: ^1.3.0 path: ^1.3.0
pub_semver: ^1.0.0 pub_semver: ^1.0.0
......
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "flutter.yaml",
"type": "object",
"additionalProperties": false,
"properties": {
"name": { "type": "string" },
"uses-material-design": { "type": "boolean" },
"assets": {
"type": "array",
"items": { "type": "string" }
},
"fonts": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"family": { "type": "string" },
"fonts": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"asset": { "type": "string" },
"weight": { "type": "integer" },
"style": { "enum": [ "normal", "italic" ] }
}
}
}
}
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment