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

Unified Diff: packages/polymer/bin/new_entry.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 months 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
« no previous file with comments | « packages/polymer/bin/new_element.dart ('k') | packages/polymer/codereview.settings » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: packages/polymer/bin/new_entry.dart
diff --git a/packages/polymer/bin/new_entry.dart b/packages/polymer/bin/new_entry.dart
new file mode 100644
index 0000000000000000000000000000000000000000..a1abf22e4b5a4b2472d2fb8be461aa8b3b668900
--- /dev/null
+++ b/packages/polymer/bin/new_entry.dart
@@ -0,0 +1,207 @@
+// Copyright (c) 2014, 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.
+
+/// Script to create boilerplate for a Polymer element.
+/// Produces new .html entry point for a polymer app and updates the
+/// pubspec.yaml to reflect it.
+///
+/// Run this script with pub run:
+///
+/// pub run polymer:new_entry <html_file>
+///
+library polymer.bin.new_entry;
+
+import 'dart:io';
+import 'package:args/args.dart';
+import 'package:path/path.dart' as path;
+import 'package:yaml/yaml.dart';
+import 'package:source_span/source_span.dart';
+
+void printUsage() {
+ print('pub run polymer:new_entry entry_point_file.html');
+}
+
+void main(List<String> args) {
+ var parser = new ArgParser(allowTrailingOptions: true);
+ parser.addFlag('help', abbr: 'h');
+ var entryPoint;
+
+ try {
+ var options = parser.parse(args);
+ if (options['help']) {
+ printUsage();
+ return;
+ }
+ entryPoint = options.rest[0];
+ } catch (e) {
+ print('$e\n');
+ printUsage();
+ exitCode = 1;
+ return;
+ }
+
+ // If the entrypoint file has no extension, add .html to it.
+ if (path.extension(entryPoint) == '') {
+ entryPoint = '${entryPoint}.html';
+ }
+
+ var outputDir = path.dirname(entryPoint);
+ var outputDirLocation = new Directory(outputDir);
+
+ if (!outputDirLocation.existsSync()) {
+ outputDirLocation.createSync(recursive: true);
+ }
+
+ outputDir = outputDirLocation.resolveSymbolicLinksSync();
+ var pubspecDir = _findDirWithFile(outputDir, 'pubspec.yaml');
+
+ if (pubspecDir == null) {
+ print('Could not find pubspec.yaml when walking up from $outputDir');
+ exitCode = 1;
+ return;
+ }
+
+ var relativeEntryPoint = path.relative(
+ path.join(outputDir, path.basename(entryPoint)), from: pubspecDir);
+
+ try {
+ if (_createBoilerPlate(relativeEntryPoint, pubspecDir)) {
+ print('Added $entryPoint to ${path.join(pubspecDir, "pubspec.yaml")}');
+ }
+ print('Successfully created:');
+ print(' ' + path.join(pubspecDir, entryPoint));
+ } catch (e, t) {
+ print('Exception: $e\n$t');
+ print('Error creating files in $outputDir');
+ exitCode = 1;
+ }
+
+ return;
+}
+
+String _findDirWithFile(String dir, String filename) {
+ while (!new File(path.join(dir, filename)).existsSync()) {
+ var parentDir = path.dirname(dir);
+ // If we reached root and failed to find it, bail.
+ if (parentDir == dir) return null;
+ dir = parentDir;
+ }
+ return dir;
+}
+
+// Returns true if the pubspec file was modified. It might not be modified if
+// there was a monolithic polymer transformer in the pubspec, or if the entry
+// point for some reason already existed in the pubspec.
+bool _createBoilerPlate(String entryPoint, String pubspecDir) {
+ String html = '''
+<!doctype html>
+<html>
+ <head>
+ <!-- link rel="import" href="path_to_html_import.html" -->
+ </head>
+ <body>
+ <!-- HTML for body here -->
+ <script type="application/dart">export 'package:polymer/init.dart';</script>
+ </body>
+</html>
+''';
+
+ new File(path.join(pubspecDir, entryPoint)).writeAsStringSync(html);
+
+ var pubspecPath = path.join(pubspecDir, 'pubspec.yaml');
+ var pubspecText = new File(pubspecPath).readAsStringSync();
+ var transformers = loadYaml(pubspecText)['transformers'];
+ var entryPoints;
+
+ var insertionPoint;
+ var textToInsert = '';
+
+ if (transformers != null) {
+ // If there are transformers in the pubspec, look for the polymer
+ // transformers, get the entry points, and delete the old entry points.
+ SourceSpan transformersSourceSpan = transformers.span;
+
+ SourceSpan polymerTransformerSourceSpan;
+ SourceSpan entryPointsSourceSpan;
+ for (var e in transformers) {
+ if (e == 'polymer') {
+ // If they had an empty polymer transformer, just get rid of it (we will
+ // replace it with our own map style one).
+ var polymerRegex = new RegExp(r'\n\s*-\spolymer\s*');
+ // Insert right after the newline.
+ insertionPoint = pubspecText.indexOf(polymerRegex) + 1;
+ pubspecText = pubspecText.replaceFirst(polymerRegex, '\n');
+ } else if (e is YamlMap && e['polymer'] != null) {
+ polymerTransformerSourceSpan = e['polymer'].span;
+
+ var existing = e['polymer']['entry_points'];
+ if (existing == null && e['polymer'].containsKey('entry_points')) {
+ if (path.split(entryPoint)[0] != 'web') {
+ print('WARNING: Did not add entry_point $entryPoint to pubspec.yaml'
+ ' because of existing empty `entry_points` field in polymer'
+ ' transformer. This defaults to treating all files under `web/`'
+ ' as entry points, but you tried to add an entry point outside'
+ ' of the `web/` folder. You will need to explicitly list all'
+ ' entrypoints that you care about into your pubspec in order to'
+ ' include any outside of `web/`.');
+ }
+ return false;
+ }
+ entryPoints = (existing == null
+ ? []
+ : (existing is String ? [existing] : existing.toList()));
+
+ if (entryPoints.contains(entryPoint)) return false;
+ entryPoints.add(entryPoint);
+
+ if (existing != null) {
+ entryPointsSourceSpan = existing.span;
+ }
+ }
+ }
+
+ if (polymerTransformerSourceSpan == null) {
+ if (insertionPoint == null) {
+ insertionPoint = transformersSourceSpan.start.offset;
+ }
+ textToInsert = '- polymer:\n entry_points:\n';
+ } else if (entryPointsSourceSpan == null) {
+ insertionPoint = polymerTransformerSourceSpan.start.offset;
+ textToInsert = ' entry_points:\n';
+ } else {
+ insertionPoint = entryPointsSourceSpan.start.offset;
+ pubspecText = '${pubspecText.substring(0, insertionPoint)}'
+ '${pubspecText.substring(entryPointsSourceSpan.end.offset)}';
+ }
+ } else {
+ // There were no transformers at all.
+ insertionPoint = pubspecText.length;
+ var optionalNewline = pubspecText.endsWith('\n') ? '' : '\n';
+ textToInsert = '''
+${optionalNewline}transformers:
+- polymer:
+ entry_points:
+''';
+ entryPoints = [entryPoint];
+ }
+
+ if (entryPoints == null) entryPoints = [entryPoint];
+ // TODO(dgrove): Once dartbug.com/20409 is addressed, use that here.
+ var entryPointsText = entryPoints.map((e) => ' - $e').join('\n');
+
+ textToInsert += entryPointsText;
+ if (insertionPoint == pubspecText.length) {
+ pubspecText = '${pubspecText}${textToInsert}';
+ } else {
+ pubspecText = '${pubspecText.substring(0, insertionPoint)}'
+ '${textToInsert}\n${pubspecText.substring(insertionPoint)}';
+ }
+
+ _writePubspec(pubspecPath, pubspecText);
+ return true;
+}
+
+_writePubspec(String pubspecPath, String text) {
+ new File(pubspecPath).writeAsStringSync(text);
+}
« no previous file with comments | « packages/polymer/bin/new_element.dart ('k') | packages/polymer/codereview.settings » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698