Skip to content

Commit

Permalink
Added ability to install widgets from zipballs
Browse files Browse the repository at this point in the history
  • Loading branch information
fabiocaseri committed Apr 29, 2013
1 parent 7756de6 commit a2b64df
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 34 deletions.
101 changes: 68 additions & 33 deletions bin/dashing-js
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ var fs = require('fs')
, Thor = require('../lib/thor').Thor
, utils = require('../lib/utils')
, program = require('commander')
, request = require('request');
, request = require('request')
, unzip = require('unzip');

program.version(pkg.version);

Expand Down Expand Up @@ -74,48 +75,82 @@ program.command('generate <type> <name>')
}
});

program.command('install <gist_id>')
.description('Installs a new widget from a gist.')
program.command('install <id>')
.description('Installs a new widget from a gist or a zipball.')
.option('-p, --proxy <proxy>', 'Use proxy')
.action(function(gist_id, options) {
console.log('Installing gist "%s"', gist_id);
var public_url = "https://gist.github.com/" + gist_id;
.action(function(id, options) {
if (options.proxy) {
console.log('Using proxy "%s"', options.proxy);
request = request.defaults({proxy: options.proxy});
}
request({
url: 'https://api.github.com/gists/' + gist_id,
headers: {'User-Agent': pkg.name + '-' + pkg.version}
}, function(err, res, body) {
if (!err && res.statusCode == 200) {
var gist = JSON.parse(body);
var widget_name;
for (var k in gist.files) {
var m = gist.files[k].filename.match(/(\w*)\.(coffee|html|scss)$/);
if (m) {
widget_name = m[1];
break;
if (isNaN(parseInt(id, 10))) {
console.log('Installing zip "%s"', id);
var origDirName, widgetName;
request({
url: id,
headers: {'User-Agent': pkg.name + '-' + pkg.version}
}).pipe(unzip.Parse())
.on('entry', function(entry) {
if (entry.type === 'Directory' && !origDirName) {
origDirName = entry.path;
utils.mkdir.sync('widgets/' + origDirName);
entry.autodrain();
} else if (entry.type === 'File') {
var m = entry.path.match(/(\w*)\.(coffee|html|scss)$/);
var mj = entry.path.match(/(\w*)\.js$/);
if (mj) {
console.log(' \x1b[36mcreate\x1b[0m jobs/' + mj[0]);
entry.pipe(fs.createWriteStream('jobs/' + mj[0]));
} else {
widgetName = m ? m[1] : widgetName;
console.log(' \x1b[36mcreate\x1b[0m widgets/' + entry.path);
entry.pipe(fs.createWriteStream('widgets/' + entry.path));
}
}
utils.mkdir('widgets/' + widget_name, function() {
})
.on('error', function(err) {
console.error('Error reading zip file from: ' + id);
err && console.error(err);
})
.on('close', function() {
utils.mv.sync('widgets/' + origDirName, 'widgets/' + widgetName);
});
} else {
console.log('Installing gist "%s"', id);
var public_url = "https://gist.github.com/" + id;
request({
url: 'https://api.github.com/gists/' + id,
headers: {'User-Agent': pkg.name + '-' + pkg.version}
}, function(err, res, body) {
if (!err && res.statusCode == 200) {
var gist = JSON.parse(body);
var widgetName;
for (var k in gist.files) {
var filename = gist.files[k].filename;
var outFile = filename;
if (filename.match(/(\w*)\.js$/)) {
utils.write('jobs/' + filename, gist.files[k].content);
} else if(filename.match(/(\w*)\.(coffee|html|scss)$/)) {
utils.write('widgets/' + widget_name + '/' + filename, gist.files[k].content);
var m = gist.files[k].filename.match(/(\w*)\.(coffee|html|scss)$/);
if (m) {
widgetName = m[1];
break;
}
}
console.log('if needed. More information for this widget can be found at ' + public_url);
});
} else {
console.error('Could not find gist at ' + public_url);
res && console.error('[' + res.statusCode + '] ' + body);
err && console.error(err);
}
});
utils.mkdir('widgets/' + widgetName, function() {
for (var k in gist.files) {
var filename = gist.files[k].filename;
var outFile = filename;
if (filename.match(/(\w*)\.js$/)) {
utils.write('jobs/' + filename, gist.files[k].content);
} else/* if(filename.match(/(\w*)\.(coffee|html|scss)$/))*/ {
utils.write('widgets/' + widgetName + '/' + filename, gist.files[k].content);
}
}
console.log('if needed. More information for this widget can be found at ' + public_url);
});
} else {
console.error('Could not find gist at ' + public_url);
res && console.error('[' + res.statusCode + '] ' + body);
err && console.error(err);
}
});
}
});

program.command('start')
Expand Down
26 changes: 26 additions & 0 deletions lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,32 @@ exports.mkdir.sync = function(path) {
return r;
};

/**
* mv.
*
* @param {String} src
* @param {String} dest
* @param {Function} fn
*/
exports.mv = function(src, dest, fn) {
fs.rename(src, dest, function(err){
if (err) throw err;
console.log(' \033[36mmove\033[0m ' + src + ' -> ' + dest);
fn && fn();
});
};

/**
* mv (sync).
*
* @param {String} src
* @param {String} dest
*/
exports.mv.sync = function(src, dest) {
var r = fs.renameSync(src, dest);
console.log(' \033[36mmove\033[0m ' + src + ' -> ' + dest);
};

/**
* Exit with the given `str`.
*
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
"node-sass": "~0.4.3",
"node-schedule": "~0.1.8",
"request": "~2.20.0",
"walker": "~1.0.3"
"walker": "~1.0.3",
"unzip": "~0.1.7"
},
"devDependencies": {
"ejs": "*",
Expand Down

0 comments on commit a2b64df

Please sign in to comment.