tty-table
Version:
Command line table generator.
206 lines (176 loc) • 6.11 kB
JavaScript
/**
* To debug gruntfile:
* node-debug $(which grunt) task
*/
module.exports = function(grunt) {
//Modules for browserify to ignore
var _ignore = '--ignore=path --ignore=request --ignore=http --ignore=fs --ignore=vm --ignore=process --ignore=lodash';
var banner = '/** \n<%= pkg.name %>: <%= pkg.description %> \nVersion: <%= pkg.version %> \nBuilt: <%= grunt.template.today("yyyy-mm-dd") %> <%= options.timestamp %>\nAuthor: <%= pkg.author %> \n*/\n';
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
options : {
timestamp : (function(){
//A FORMATTED TIMESTAMP STRING FOR BACKUP NAMING
var d = new Date(),dstr = '';
dstr = ('0' + d.getHours()).slice(-2)
+ ':' + ('0' + d.getMinutes()).slice(-2)
+ ':' + ('0' + d.getSeconds()).slice(-2);
return dstr;
}())
},
mochaTest: {
test: {
options: {
ui : 'bdd',
reporter: 'spec',
},
//We require all our tests in the conf file, so we
//can do some pre-test functions before they are run.
src: ['./test/mocha.conf.js']
}
},
shell: {
"browserify-prod-standalone": {
command: function () {
var cmd = 'browserify --standalone=TtyTable '+_ignore+' -r ./src/main.js > ./dist/<%= pkg.name %>.js -t [ babelify --presets [ es2015 babili] ] -p [ browserify-banner --template "'+banner+'"]';
return cmd;
}
},
"browserify-devel-standalone": {
command: function () {
var cmd = 'browserify --debug --standalone=TtyTable '+_ignore+' -r ./src/main.js > ./dist/<%= pkg.name %>.devel.js -t [ babelify --presets [ es2015 babili] ]';
return cmd;
}
},
"cleanup" : {
command: function(){
return "rm ./dist/<%= pkg.name %>.js ./dist/<%= pkg.name %>.bundle.js";
}
},
"generate-vim-tags-file": {
command: function (){
var cmd = 'find . -name "*.js" -path "./src/*" | xargs jsctags {} -f | sed "/^$/d" | sort > tags';
return cmd;
}
},
"get-node-version": {
command: function (){
var cmd = 'echo "Fetching node version...\n" && node --version';
return cmd;
}
},
},
//regenerate tags file on file save
watch: {
scripts: {
files: ['**/*.js'],
tasks: ['shell:generate-vim-tags-file'],
options: {
spawn: true,
reload: false
}
}
}
});
grunt.registerTask('save-test-outputs','Saves the ouptuts of all unit tests to file.',function(){
var glob = require('glob');
var exec = require('child_process').exec, child;
var gruntDeferred = this.async();
var jobQueue = [];
var orgy = require('orgy');
var fs = require('fs');
//Get list of all example scripts
var list = glob.sync('examples/*.js');
list.forEach(function(element){
//Create a deferred for each run, which is pushed into a queue.
var deferred = orgy.deferred();
jobQueue.push(deferred);
child = exec('node ./'+element+' --color=always',
function (error, stdout, stderr) {
if (error !== null) {
grunt.log.error('Exec error: ' + error);
}
var subname = element.split('.')[0];
var filename = subname + '-output.txt';
fs.writeFileSync(filename,stdout);
grunt.log.write('Wrote output to text file: ' + filename + '\n');
deferred.resolve();
});
});
//Resolve grunt deferred only after jobQueue is complete.
orgy.queue(jobQueue,[{
timeout : 1000
}])
.done(function(){
gruntDeferred();
});
});
grunt.registerTask('doc','Documentation generation task',function(){
var gruntDeferred = this.async(),
orgy = require('orgy'),
deferred1 = orgy.deferred({timeout : 20000}),
deferred2 = orgy.deferred({timeout : 20000}),
fs = require('fs');
orgy.queue([deferred1,deferred2],{
timeout : 20000
})
.done(function(){
gruntDeferred();
});
//Get README
var readme = fs.readFileSync("./README.md",{
encoding : "utf-8"
});
//Inject example usage into README
var example1 = fs.readFileSync('./examples/styles-and-formatting.js',{
encoding : 'utf-8'
});
example1 = example1.replace('../','tty-table');
example1 = '\n```js\n' + example1 + '\n```';
readme = readme.replace(/<!--EXAMPLE-USAGE-->((?:.|[\r\n])*)<!--END-EXAMPLE-USAGE-->/m,
'<!--EXAMPLE-USAGE-->\n'+example1+'\n<!--END-EXAMPLE-USAGE-->');
deferred1.resolve();
//Inject public API reference
var exec = require('child_process').exec, child;
child = exec('jsdoc2md "src/*.js"', function (error, stdout, stderr) {
//console.log('stdout: ' + stdout);
//console.log('stderr: ' + stderr);
if (error !== null) {
grunt.log.error('Exec error: ' + error);
}
//Reformat documentation to reflect correct method naming.
var str = stdout.replace(/new /g,'')
.replace(/_public\./g,'');
readme = readme.replace(/<!--API-REF-->((?:.|[\r\n])*)<!--END-API-REF-->/m,
'<!--API-REF-->\n\n'+str+'\n<!--END-API-REF-->');
fs.writeFileSync("./README.md",readme);
deferred2.resolve();
});
});
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-shell');
grunt.loadNpmTasks('grunt-mocha-test');
grunt.registerTask('tags', [
'shell:generate-vim-tags-file',
]);
grunt.registerTask('test', [
'mochaTest:test'
]);
grunt.registerTask('t', [
'mochaTest:test'
]);
grunt.registerTask('st',[
'save-test-outputs'
]);
grunt.registerTask('test-travis', [
'mochaTest:test'
]);
grunt.registerTask('default', [
'shell:get-node-version',
'shell:browserify-prod-standalone',
'shell:browserify-devel-standalone',
'shell:cleanup',
'doc'
]);
};