Index: main.dart |
diff --git a/main.dart b/main.dart |
index 5616c0e937faeac85f2c376d54432e0ca030135f..9b79f997f0fc4d2c31f4cf7909d219040e81981b 100644 |
--- a/main.dart |
+++ b/main.dart |
@@ -15,148 +15,250 @@ class Package { |
Package(this.name, this.apis, this.pubspec, this.readme, this.license); |
} |
-String generateReadme(String readmeFile, List<DirectoryListItems> items) { |
- var sb = new StringBuffer(); |
- if (readmeFile != null) { |
- sb.write(new File(readmeFile).readAsStringSync()); |
+/** |
+ * Configuration of a set of packages generated from a set of APIs exposed by |
+ * a Discovery Service. |
+ */ |
+class DiscoveryPackagesConfiguration { |
+ Map<String, Package> packages = {}; |
+ Iterable<String> excessApis; |
+ Iterable<String> missingApis; |
+ |
+ /** |
+ * Create a new discovery packages configuration. |
+ * |
+ * [config] is the path to the YAML configuration file. |
+ * |
+ * [allApis] is the list of all supported APIs returned by the Discovery |
+ * Service. |
+ * |
+ * The format of a YAML document describing a number of packages looks |
+ * like this: |
+ * |
+ * packages: |
+ * - googleapis: |
+ * version: 0.1.0 |
+ * author: Dart Team <misc@dartlang.org> |
+ * homepage: http://www.dartlang.org |
+ * readme: resources/README.md |
+ * license: resources/LICENSE |
+ * apis: |
+ * - analytics:v3 |
+ * - bigquery:v2 |
+ * - googleapis_beta: |
+ * version: 0.1.0 |
+ * author: Dart Team <misc@dartlang.org> |
+ * homepage: http://www.dartlang.org |
+ * readme: resources/README.md |
+ * license: resources/LICENSE |
+ * apis: |
+ * - datastore:v1beta2 |
+ * - dns:v1beta1 |
+ * skipped_apis: |
+ * - adexchangebuyer:v1 |
+ * |
+ * Each package to build is listed under the key `packages:`. |
+ * |
+ * The key `skipped_apis` is used to list APIs returned buy the Discovery |
+ * Service but is not part of any generated packages. |
+ * |
+ * The file names for the content of readme and license files are resolved |
+ * relative to the configuration file. |
+ */ |
+ DiscoveryPackagesConfiguration( |
+ String configFile, List<DirectoryListItems> allApis) { |
+ var configYaml = new File(configFile).readAsStringSync(); |
+ var yaml = loadYaml(configYaml); |
+ packages = _packagesFromYaml(yaml['packages'], configFile, allApis); |
+ var knownApis = _calculateKnownApis(packages, |
+ _listFromYaml(yaml['skipped_apis'])); |
+ missingApis = _calculateMissingApis(knownApis, allApis); |
+ excessApis = _calculateExcessApis(knownApis, allApis); |
+ } |
+ |
+ /** |
+ * Generate packages from the configuration. |
+ * |
+ * [discoveryDocsDir] is the directory where all the downloaded discovery |
+ * documents are stored. |
+ * |
+ * [generatedApisDir] is the directory where the packages are generated. |
+ * Each package is generated in a sub-directory. |
+ */ |
+ Future generate(String discoveryDocsDir, String generatedApisDir) { |
+ // Delete all downloaded discovery documents. |
+ var dir = new Directory(discoveryDocsDir); |
+ if (dir.existsSync()) dir.deleteSync(recursive: true); |
+ |
+ // Download the discovery documents for the packages to build. |
+ var futures = []; |
+ packages.forEach((name, package) { |
+ futures.add(downloadDiscoveryDocuments('$discoveryDocsDir/$name', |
+ ids: package.apis)); |
+ }); |
+ |
+ return Future.wait(futures).then((_) { |
+ packages.forEach((name, package) { |
+ generateAllLibraries('$discoveryDocsDir/$name', |
+ '$generatedApisDir/$name', |
+ package.pubspec); |
+ new File('$generatedApisDir/$name/README.md') |
+ .writeAsStringSync(package.readme); |
+ if (package.license != null) { |
+ new File('$generatedApisDir/$name/LICENSE') |
+ .writeAsStringSync(package.license); |
+ } |
+ }); |
+ }); |
} |
- sb.writeln(''' |
+ |
+ // Return empty list for YAML null value. |
+ static List _listFromYaml(value) => value != null ? value : []; |
+ |
+ static String _generateReadme( |
+ String readmeFile, List<DirectoryListItems> items) { |
+ var sb = new StringBuffer(); |
+ if (readmeFile != null) { |
+ sb.write(new File(readmeFile).readAsStringSync()); |
+ } |
+ sb.writeln(''' |
## Available Google APIs |
The following is a list of APIs that are currently available inside this |
package. |
'''); |
- for (DirectoryListItems item in items) { |
- sb.write("#### "); |
- if (item.icons != null && item.icons.x16 != null) { |
- sb.write(" "); |
- } |
- sb..writeln('${item.title} - ${item.name} ${item.version}') |
- ..writeln() |
- ..writeln('${item.description}') |
- ..writeln(); |
- if (item.documentationLink != null) { |
- sb.writeln( |
- 'Official API documentation: ${item.documentationLink}'); |
- sb.writeln(); |
+ for (DirectoryListItems item in items) { |
+ sb.write("#### "); |
+ if (item.icons != null && item.icons.x16 != null) { |
+ sb.write(" "); |
+ } |
+ sb..writeln('${item.title} - ${item.name} ${item.version}') |
+ ..writeln() |
+ ..writeln('${item.description}') |
+ ..writeln(); |
+ if (item.documentationLink != null) { |
+ sb.writeln( |
+ 'Official API documentation: ${item.documentationLink}'); |
+ sb.writeln(); |
+ } |
} |
+ return sb.toString(); |
} |
- return sb.toString(); |
-} |
- |
-main() { |
- listFromYaml(value) => value != null ? value : []; |
- // Set up paths to directories 'discovery' and 'generated'. |
- var discoveryDocsDir = Platform.script.resolve('discovery').path; |
- var generatedApisDir = Platform.script.resolve('generated').path; |
- |
- // Read the configuration. |
- var configFile = Platform.script.resolve('config.yaml').path; |
- var config = loadYaml(new File(configFile).readAsStringSync()); |
- |
- listAllApis().then((List<DirectoryListItems> items) { |
- var pkgs = config['packages']; |
- var packages = {}; |
+ static Map<String, Package>_packagesFromYaml( |
+ YamlList configPackages, |
+ String configFile, |
+ List<DirectoryListItems> allApis) { |
var supportedApis = []; |
- pkgs.forEach((package) { |
+ var packages = {}; |
+ configPackages.forEach((package) { |
package.forEach((name, values) { |
- var apis = listFromYaml(values['apis']); |
- var version = |
- values['version'] != null ? values['version'] : '0.1.0-dev'; |
- var author = values['author']; |
- var homepage = values['homepage']; |
- var readmeFile; |
- if (values['readme'] != null) { |
- readmeFile = Platform.script.resolve(values['readme']).path; |
- } |
- var licenseFile; |
- if (values['license'] != null) { |
- licenseFile = Platform.script.resolve(values['license']).path; |
- } |
+ packages[name] = _packageFromYaml(name, values, configFile, allApis); |
+ }); |
+ }); |
+ return packages; |
+ } |
- // Generate package description. |
- var apiDescriptions = []; |
- var sb = new StringBuffer() |
- ..write('"Auto-generated client libraries for accessing ' |
- 'the following APIs:\\n'); |
- items.forEach((DirectoryListItems apiDescription) { |
- if (apis.contains(apiDescription.id)) { |
- sb..writeln('') |
- ..write(' ') |
- ..write(apiDescription.id) |
- ..write(' - ') |
- ..write(apiDescription.description) |
- ..write('\\n'); |
- apiDescriptions.add(apiDescription); |
- } |
- }); |
- sb.write('"'); |
- |
- // Generate the README.md file content. |
- var readme = generateReadme(readmeFile, apiDescriptions); |
- |
- // Read the LICENSE |
- var license = new File(licenseFile).readAsStringSync(); |
- |
- // Create package description with pubspec.yaml information. |
- var pubspec = new Pubspec( |
- name, version, sb.toString(), author: author, homepage: homepage); |
- packages[name] = new Package(name, apis, pubspec, readme, license); |
- }); |
+ static Package _packageFromYaml(String name, |
+ YamlMap values, |
+ String configFile, |
+ List<DirectoryListItems> allApis) { |
+ var apis = _listFromYaml(values['apis']); |
+ var version = |
+ values['version'] != null ? values['version'] : '0.1.0-dev'; |
+ var author = values['author']; |
+ var homepage = values['homepage']; |
+ var readmeFile; |
+ if (values['readme'] != null) { |
+ readmeFile = new Uri.file(configFile).resolve(values['readme']).path; |
+ } |
+ var licenseFile; |
+ if (values['license'] != null) { |
+ licenseFile = |
+ new Uri.file(configFile).resolve(values['license']).path; |
+ } |
+ |
+ // Generate package description. |
+ var apiDescriptions = []; |
+ var sb = new StringBuffer() |
+ ..write('"Auto-generated client libraries for accessing ' |
+ 'the following APIs:\\n'); |
+ allApis.forEach((DirectoryListItems apiDescription) { |
+ if (apis.contains(apiDescription.id)) { |
+ sb..writeln('') |
+ ..write(' ') |
+ ..write(apiDescription.id) |
+ ..write(' - ') |
+ ..write(apiDescription.description) |
+ ..write('\\n'); |
+ apiDescriptions.add(apiDescription); |
+ } |
}); |
+ sb.write('"'); |
+ |
+ // Generate the README.md file content. |
+ var readme = _generateReadme(readmeFile, apiDescriptions); |
+ |
+ // Read the LICENSE |
+ var license = new File(licenseFile).readAsStringSync(); |
- // Check that all APIs are mentioned in the configuration. |
- var skippedApis = listFromYaml(config['skipped_apis']); |
- packages.forEach((_, package) => supportedApis.addAll(package.apis)); |
+ // Create package description with pubspec.yaml information. |
+ var pubspec = new Pubspec( |
+ name, version, sb.toString(), author: author, homepage: homepage); |
+ return new Package(name, apis, pubspec, readme, license); |
+ } |
+ |
+ /// The known APIs are the APis mentioned in each package together with |
+ /// the APIs explicitly skipped. |
+ static Set<String> _calculateKnownApis(Map<String, Package> packages, |
+ YamlList skippedApis) { |
var knownApis = new Set(); |
- knownApis.addAll(supportedApis); |
knownApis.addAll(skippedApis); |
- var excessApis = new Set.from(knownApis); |
+ packages.forEach((_, package) => knownApis.addAll(package.apis)); |
+ return knownApis; |
+ } |
+ /// The missing APIs are the APIs returned from the Discovery Service |
+ /// but not mentioned in the configuration. |
+ static Iterable<String> _calculateMissingApis( |
+ Iterable<String> knownApis, List<DirectoryListItems> allApis) { |
var missingApis = []; |
- items.forEach((item) { |
+ allApis.forEach((item) { |
if (!knownApis.contains(item.id)) missingApis.add(item.id); |
- excessApis.remove(item.id); |
}); |
kustermann
2014/08/26 14:27:14
Maybe a bit easier like this?
return allApis
Søren Gjesse
2014/08/27 07:13:10
Done.
|
+ return missingApis; |
+ } |
- if (missingApis.isNotEmpty) { |
+ /// The excess APIs are the APIs mentioned in the configuration but not |
+ /// returned from the Discovery Service. |
+ static Iterable<String> _calculateExcessApis( |
+ Iterable<String> knownApis, List<DirectoryListItems> allApis) { |
+ var excessApis = new Set.from(knownApis); |
+ allApis.forEach((item) => excessApis.remove(item.id)); |
+ return excessApis; |
+ } |
+} |
+ |
+main() { |
+ listAllApis().then((List<DirectoryListItems> items) { |
+ var configuration = new DiscoveryPackagesConfiguration( |
+ Platform.script.resolve('config.yaml').path, items); |
+ |
+ // Print warnings for APIs not mentioned. |
+ if (configuration.missingApis.isNotEmpty) { |
print('WARNING: No configuration for the following APIs:'); |
- missingApis.forEach((id) => print('- $id')); |
+ configuration.missingApis.forEach((id) => print('- $id')); |
} |
- |
- if (excessApis.isNotEmpty) { |
+ if (configuration.excessApis.isNotEmpty) { |
print('WARNING: The following APIs does not exist:'); |
kustermann
2014/08/26 14:27:14
does -> do
Søren Gjesse
2014/08/27 07:13:10
Done.
|
- excessApis.forEach((id) => print('- $id')); |
+ configuration.excessApis.forEach((id) => print('- $id')); |
} |
- // Delete downloaded discovery documents. |
- var dir = new Directory(discoveryDocsDir); |
- if (dir.existsSync()) dir.deleteSync(recursive: true); |
- |
- // Download the discovery documents for the packages to build. |
- var futures = []; |
- packages.forEach((name, package) { |
- futures.add(downloadDiscoveryDocuments('$discoveryDocsDir/$name', |
- ids: package.apis)); |
- }); |
- |
- Future.wait(futures).then((_) { |
- packages.forEach((name, package) { |
- print('Generating library $name'); |
- generateAllLibraries('$discoveryDocsDir/$name', |
- '$generatedApisDir/$name', |
- package.pubspec); |
- new File('$generatedApisDir/$name/README.md') |
- .writeAsStringSync(package.readme); |
- if (package.license != null) { |
- new File('$generatedApisDir/$name/LICENSE') |
- .writeAsStringSync(package.license); |
- } |
- }); |
- print('DONE'); |
- }); |
+ // Generate the packages. |
+ configuration.generate(Platform.script.resolve('discovery').path, |
+ Platform.script.resolve('generated').path) |
+ .then((_) => print('Done!')); |
}); |
} |