blob: 383961387b0ea5721b0ac9b1e861f988e8e0d5da [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library sky_tools.init;
import 'dart:async';
import 'dart:io';
import 'package:args/args.dart';
import 'package:mustache4dart/mustache4dart.dart' as mustache;
import 'package:path/path.dart' as p;
import 'common.dart';
class InitCommandHandler extends CommandHandler {
InitCommandHandler() : super('init', 'Create a new sky project.');
ArgParser get parser {
// TODO: Add a --template option for template selection when we have more than one.
ArgParser parser = new ArgParser();
parser.addFlag('help',
abbr: 'h', negatable: false, help: 'Display this help message.');
parser.addOption('out', abbr: 'o', help: 'The output directory.');
parser.addFlag('pub', defaultsTo: true,
help: 'Whether to run pub after the project has been created.');
return parser;
}
Future processArgResults(ArgResults results) async {
if (results['help']) {
printUsage();
return new Future.value();
}
if (!results.wasParsed('out')) {
printUsage('No option specified for the output directory.');
return new Future.value();
}
// TODO: Confirm overwrite of an existing directory with the user.
Directory out = new Directory(results['out']);
new SkySimpleTemplate().generateInto(out);
print('');
String message = 'All done! To run your application:\n'
'cd ${out.path}\n'
'./packages/sky/sky_tool start';
if (results['pub']) {
print("Running pub get...");
Process process = await Process.start('pub', ['get'], workingDirectory: out.path);
stdout.addStream(process.stdout);
stderr.addStream(process.stderr);
int code = await process.exitCode;
if (code == 0) {
print('\n${message}');
}
} else {
print(message);
}
}
}
abstract class Template {
final String name;
final String description;
Map<String, String> files = {};
Template(this.name, this.description);
void generateInto(Directory dir) {
String projectName = _normalizeProjectName(p.basename(dir.path));
print('Creating ${p.basename(projectName)}...');
dir.createSync(recursive: true);
files.forEach((String path, String contents) {
Map m = {
'projectName': projectName,
'description': description
};
contents = mustache.render(contents, m);
File file = new File(p.join(dir.path, path));
file.parent.createSync();
file.writeAsStringSync(contents);
print(file.path);
});
}
String toString() => name;
}
class SkySimpleTemplate extends Template {
SkySimpleTemplate() : super('sky-simple', 'A minimal Sky project.') {
files['.gitignore']= _gitignore;
files['pubspec.yaml']= _pubspec;
files['README.md']= _readme;
files['lib/main.dart']= _libMain;
}
}
String _normalizeProjectName(String name) {
name = name.replaceAll('-', '_').replaceAll(' ', '_');
// Strip any extension (like .dart).
if (name.contains('.')) {
name = name.substring(0, name.indexOf('.'));
}
return name;
}
const _gitignore = r'''
.DS_Store
.idea
.packages
.pub/
build/
packages
pubspec.lock
''';
const _readme = r'''
# {{projectName}}
{{description}}
## Getting Started
For help getting started, view our online
[readme](https://github.com/domokit/sky_engine/blob/master/sky/packages/sky/README.md).
''';
const _pubspec = r'''
name: {{projectName}}
description: {{description}}
dependencies:
sky: any
sky_tools: any
''';
const _libMain = r'''
import 'package:sky/widgets.dart';
class HelloWorldApp extends App {
Widget build() {
return new Scaffold(
toolbar: new ToolBar(center: new Text("Demo")),
body: new Material(child: new Center(child: new Text("Hello world!"))),
floatingActionButton: new FloatingActionButton(
child: new Icon(type: 'content/add', size: 24)));
}
}
void main() {
runApp(new HelloWorldApp());
}
''';