ember-introjs
Version:
An Ember Component for intro.js
164 lines (126 loc) • 5.05 kB
JavaScript
/**
* The main builder script
*/
//require mootools
require('moo-server').apply(GLOBAL);
var winston = require('winston'),
fs = require('fs'),
path = require("path"),
util = require("util"),
sys = require("sys"),
when = require("promised-io").when,
Promise = require("promised-io").Promise;
var Builder = new Class({
Implements: [Options],
options: {},
config: null,
targets: {},
logger: null,
queue: [],
stack: null,
tasks: {},
initialize: function(options, logfile) {
this.setOptions(options);
this.logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({level: "silly"}),
new (winston.transports.File)({ filename: logfile, level: "silly" })
]
});
this.logger.emitErrs = false;
if (nil(options)) {
this.logger.debug("config is nil");
} else {
this.logger.debug("config is not nil");
//this.logger.info("config: " + util.inspect(this.options, false, null));
}
this.loadInternalTasks();
this.loadTasks(this.options.tasks);
},
loadTasks: function(filename) {
Array.from(filename).each(function(file){
var tasks = require(file).tasks;
for (var name in tasks) {
this.logger.info("loading task: " + name);
this.tasks[name] = tasks[name];
}
},this);
},
build: function(target, config) {
var p = new Promise();
config = nil(config) ? this.options : config;
this.logger.info("Processing target: " + target);
//load the target file
fn = require(this.options.targets + "/" + target + ".target");
this.targets[target] = fn(config, this.logger);
this.logger.info("Starting target" + util.inspect(this.targets[target], false, null));
//start loading in the target's required dependencies
if (!nil(this.targets[target].depends)) {
this.importTargets(this.targets[target].depends);
}
this.queue.push(target);
this.logger.info("queue order: " + util.inspect(this.queue, false, null));
//begin processing targets
this.runTargets().then(function(){ p.resolve(true);});
return p;
},
loadInternalTasks: function(){
var taskPath = path.normalize(__dirname + "/tasks");
files = fs.readdirSync(taskPath);
Array.from(files).each(function(file){
this.loadTasks(taskPath + "/" + file);
}, this);
},
importTargets: function(depends){
this.logger.debug("in ImportTargets for " + util.inspect(depends,false,null));
if (!nil(depends)) {
Array.from(depends).each(function(d){
if (!Object.keys(this.targets).contains(d)) {
this.targets[d] = (require(this.options.targets + "/" + d + ".target"))(this.options,this.logger);
this.logger.info("Target config for " + d + ":\n" + util.inspect(this.targets[d],false,null));
if (!nil(this.targets[d].depends)) {
this.importTargets(this.targets[d].depends);
}
this.queue.push(d);
}
}, this);
}
},
runTargets: function(){
var target = this.queue.shift(),
p = new Promise();
this.stack = Array.clone(this.targets[target].tasks);
this.logger.info("\n\n!!!!!!!!!!!!!\nExecuting target: " + target);
this.logger.info("Target description: " + this.targets[target].description);
this.logger.info("Number of tasks: " + this.stack.length);
this.executeTarget(target).then(function(){
if (this.queue.length > 0) {
this.runTargets();
} else {
p.resolve(true);
}
}.bind(this));
return p;
},
executeTarget: function(){
var p = new Promise();
var task = this.stack.shift(),
taskName = Object.keys(task)[0],
options = task[taskName];
this.logger.info("running task: " + taskName);
this.tasks[taskName](options, this.options, this.logger).then(function(){
this.logger.info("Promise resolved from task: " + taskName);
if (this.stack.length === 0) {
this.logger.info("No more tasks...");
p.resolve(true);
} else {
this.logger.info("On to next task!!!");
this.executeTarget().then(function(){p.resolve(true);});
}
}.bind(this), function(err){
p.reject(err);
}.bind(this));
return p;
}
});
module.exports = Builder;