Adding jsbeautifier grunt task

This commit is contained in:
Jacob Marttinen 2015-05-07 20:13:17 -04:00
parent 82cd4e5118
commit 9312aca8a1
5 changed files with 389 additions and 385 deletions

View file

@ -1,4 +1,4 @@
module.exports = function(grunt) { module.exports = function (grunt) {
grunt.initConfig({ grunt.initConfig({
simplemocha: { simplemocha: {
options: { options: {
@ -8,14 +8,25 @@ module.exports = function(grunt) {
ui: 'bdd', ui: 'bdd',
reporter: 'list' reporter: 'list'
}, },
all: { src: ['test/**/*.js'] } all: {
src: ['test/**/*.js']
}
},
jsbeautifier: {
files: ['Gruntfile.js', 'index.js', 'lib/**/*.js', 'test/**/*.js'],
options: {
js: {
jslintHappy: true
}
}
}, },
jshint: { jshint: {
options: { options: {
laxbreak: true laxbreak: true
}, },
all: [ 'Gruntfile.js', 'index.js', 'lib/**/*.js', 'test/**/*.js'] all: ['Gruntfile.js', 'index.js', 'lib/**/*.js', 'test/**/*.js']
}, },
jsdoc: { jsdoc: {
@ -27,10 +38,11 @@ module.exports = function(grunt) {
}); });
grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-jsbeautifier');
grunt.loadNpmTasks('grunt-simple-mocha'); grunt.loadNpmTasks('grunt-simple-mocha');
grunt.loadNpmTasks('grunt-jsdoc'); grunt.loadNpmTasks('grunt-jsdoc');
grunt.registerTask('test', ['simplemocha:all']); grunt.registerTask('test', ['simplemocha:all']);
grunt.registerTask('build', ['jshint', 'test']); grunt.registerTask('build', ['jsbeautifier', 'jshint', 'test']);
grunt.registerTask('default', ['build', 'jsdoc']); grunt.registerTask('default', ['build', 'jsdoc']);
}; };

View file

@ -1,4 +1,3 @@
/********************************************************* /*********************************************************
* Simple Node.js module for using the Bing Search API * * Simple Node.js module for using the Bing Search API *
*********************************************************/ *********************************************************/
@ -15,9 +14,9 @@ var request = require('request'),
* @returns {Bing} * @returns {Bing}
* @constructor * @constructor
*/ */
var Bing = function( options ) { var Bing = function (options) {
if( !(this instanceof Bing) ) return new Bing( options ); if (!(this instanceof Bing)) return new Bing(options);
var defaults = { var defaults = {
@ -44,11 +43,11 @@ var Bing = function( options ) {
//merge options passed in with defaults //merge options passed in with defaults
this.options = _.extend(defaults, options); this.options = _.extend(defaults, options);
this.searchVertical = function(query, vertical, options, callback) { this.searchVertical = function (query, vertical, options, callback) {
if (typeof options === 'function') { if (typeof options === 'function') {
callback = options; callback = options;
} }
if(typeof callback != 'function') { if (typeof callback != 'function') {
throw "Error: Callback function required!"; throw "Error: Callback function required!";
} }
@ -59,24 +58,13 @@ var Bing = function( options ) {
_.extend(opts, options); _.extend(opts, options);
} }
var reqUri = opts.rootUri var reqUri = opts.rootUri + vertical + "?$format=json&" + qs.stringify({
+ vertical "Query": "'" + query + "'"
+ "?$format=json&" }) + "&$top=" + opts.top + "&$skip=" + opts.skip + (opts.sources ? "&Sources=%27" + opts.sources + "%27" : '') + (opts.newssortby ? "&NewsSortBy=%27" + opts.newssortby + "%27" : '') + (opts.newscategory ? "&NewsCategory=%27" + opts.newscategory + "%27" : '') + (opts.newslocationoverride ? "&NewsLocationOverride=%27" + opts.newslocationoverride + "%27" : '') + (opts.market ? "&Market=%27" + opts.market + "%27" : '') + (opts.adult ? "&Adult=%27" + opts.adult + "%27" : '') + (opts.imagefilters ? '&' + qs.stringify({
+ qs.stringify({ "Query": "'" + query + "'" }) "ImageFilters": "'" + opts.imagefilters + "'"
+ "&$top=" + opts.top }) : '') + (opts.videofilters ? '&' + qs.stringify({
+ "&$skip=" + opts.skip "VideoFilters": "'" + opts.videofilters + "'"
+ (opts.sources ? "&Sources=%27" + opts.sources + "%27" : '') }) : '');
+ (opts.newssortby ? "&NewsSortBy=%27" + opts.newssortby + "%27" : '')
+ (opts.newscategory ? "&NewsCategory=%27" + opts.newscategory + "%27" : '')
+ (opts.newslocationoverride ? "&NewsLocationOverride=%27" + opts.newslocationoverride + "%27" : '')
+ (opts.market ? "&Market=%27" + opts.market + "%27" : '')
+ (opts.adult ? "&Adult=%27" + opts.adult + "%27" : '')
+ (opts.imagefilters
? '&' + qs.stringify({ "ImageFilters": "'" + opts.imagefilters + "'" })
: '')
+ (opts.videofilters
? '&' + qs.stringify({ "VideoFilters": "'" + opts.videofilters + "'" })
: '');
request({ request({
uri: reqUri, uri: reqUri,
@ -90,16 +78,14 @@ var Bing = function( options ) {
}, },
timeout: opts.reqTimeout timeout: opts.reqTimeout
}, function(err, res, body){ }, function (err, res, body) {
if(res && res.statusCode !== 200){ if (res && res.statusCode !== 200) {
err = new Error(body); err = new Error(body);
}else{ } else {
// Parse body, if body // Parse body, if body
body = typeof body === 'string' body = typeof body === 'string' ? JSON.parse(body) : body;
? JSON.parse(body)
: body;
} }
callback(err, res, body); callback(err, res, body);
@ -131,7 +117,7 @@ var Bing = function( options ) {
* *
* @function * @function
*/ */
Bing.prototype.web = function(query, options, callback) { Bing.prototype.web = function (query, options, callback) {
this.searchVertical(query, "Web", options, callback); this.searchVertical(query, "Web", options, callback);
}; };
@ -153,7 +139,7 @@ Bing.prototype.search = Bing.prototype.web;
* json-parsed) response. * json-parsed) response.
* @function * @function
*/ */
Bing.prototype.composite = function(query, options, callback) { Bing.prototype.composite = function (query, options, callback) {
this.searchVertical(query, "Composite", options, callback); this.searchVertical(query, "Composite", options, callback);
}; };
@ -170,7 +156,7 @@ Bing.prototype.composite = function(query, options, callback) {
* json-parsed) response. * json-parsed) response.
* @function * @function
*/ */
Bing.prototype.news = function(query, options, callback) { Bing.prototype.news = function (query, options, callback) {
this.searchVertical(query, "News", options, callback); this.searchVertical(query, "News", options, callback);
}; };
@ -187,14 +173,11 @@ Bing.prototype.news = function(query, options, callback) {
* json-parsed) response. * json-parsed) response.
* @function * @function
*/ */
Bing.prototype.video = function(query, options, callback) { Bing.prototype.video = function (query, options, callback) {
if (options if (options && typeof options === 'object' && options.videofilters && typeof options.videofilters === 'object') {
&& typeof options === 'object'
&& options.videofilters
&& typeof options.videofilters === 'object') {
var filterQuery = ''; var filterQuery = '';
var filters = Object.keys(options.videofilters); var filters = Object.keys(options.videofilters);
filters.map(function(key, i) { filters.map(function (key, i) {
filterQuery += capitalizeFirstLetter(key) + ':'; filterQuery += capitalizeFirstLetter(key) + ':';
filterQuery += capitalizeFirstLetter(options.videofilters[key]); filterQuery += capitalizeFirstLetter(options.videofilters[key]);
if (i < filters.length - 1) if (i < filters.length - 1)
@ -221,14 +204,11 @@ Bing.prototype.video = function(query, options, callback) {
* json-parsed) response. * json-parsed) response.
* @function * @function
*/ */
Bing.prototype.images = function(query, options, callback) { Bing.prototype.images = function (query, options, callback) {
if (options if (options && typeof options === 'object' && options.imagefilters && typeof options.imagefilters === 'object') {
&& typeof options === 'object'
&& options.imagefilters
&& typeof options.imagefilters === 'object') {
var filterQuery = ''; var filterQuery = '';
var filters = Object.keys(options.imagefilters); var filters = Object.keys(options.imagefilters);
filters.map(function(key, i) { filters.map(function (key, i) {
filterQuery += capitalizeFirstLetter(key) + ':'; filterQuery += capitalizeFirstLetter(key) + ':';
filterQuery += capitalizeFirstLetter(options.imagefilters[key]); filterQuery += capitalizeFirstLetter(options.imagefilters[key]);
if (i < filters.length - 1) if (i < filters.length - 1)

View file

@ -20,6 +20,7 @@
"express": "^4.9.5", "express": "^4.9.5",
"grunt": "^0.4.5", "grunt": "^0.4.5",
"grunt-contrib-jshint": "^0.10.0", "grunt-contrib-jshint": "^0.10.0",
"grunt-jsbeautifier": "~0.2.10",
"grunt-jsdoc": "^0.5.7", "grunt-jsdoc": "^0.5.7",
"grunt-simple-mocha": "^0.4.0", "grunt-simple-mocha": "^0.4.0",
"mocha": "^1.21.4", "mocha": "^1.21.4",

View file

@ -1,7 +1,6 @@
var validWebResponse = { var validWebResponse = {
"d": { "d": {
"results": [ "results": [{
{
"__metadata": { "__metadata": {
"uri": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=0&$top=1", "uri": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=0&$top=1",
"type": "WebResult" "type": "WebResult"
@ -11,8 +10,7 @@ var validWebResponse = {
"Description": "Experience the new generation of games and entertainment with Xbox. Play Xbox games and stream video on all your devices.", "Description": "Experience the new generation of games and entertainment with Xbox. Play Xbox games and stream video on all your devices.",
"DisplayUrl": "www.xbox.com", "DisplayUrl": "www.xbox.com",
"Url": "http://www.xbox.com/" "Url": "http://www.xbox.com/"
}, }, {
{
"__metadata": { "__metadata": {
"uri": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=1&$top=1", "uri": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=1&$top=1",
"type": "WebResult" "type": "WebResult"
@ -22,8 +20,7 @@ var validWebResponse = {
"Description": "Online shopping for Video Games from a great selection of Games, Hardware, Computer And Console Video Game Products & more at everyday low prices.", "Description": "Online shopping for Video Games from a great selection of Games, Hardware, Computer And Console Video Game Products & more at everyday low prices.",
"DisplayUrl": "www.amazon.com/Xbox-Games/b?ie=UTF8&node=537504", "DisplayUrl": "www.amazon.com/Xbox-Games/b?ie=UTF8&node=537504",
"Url": "http://www.amazon.com/Xbox-Games/b?ie=UTF8&node=537504" "Url": "http://www.amazon.com/Xbox-Games/b?ie=UTF8&node=537504"
} }],
],
"__next": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=2" "__next": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=2"
} }
}; };
@ -34,7 +31,7 @@ var should = require('should'),
request = require('request'), request = require('request'),
bing = require('../lib/bing'); bing = require('../lib/bing');
describe('Bing', function() { describe('Bing', function () {
var server; var server;
var app; var app;
var port = 4321; var port = 4321;
@ -43,13 +40,14 @@ describe('Bing', function() {
app = express(); app = express();
server = http.createServer(app); server = http.createServer(app);
server.listen.apply(server, [port, server.listen.apply(server, [port,
function(err, result) { function (err, result) {
if (err) { if (err) {
done(err); done(err);
} else { } else {
done(); done();
} }
}]); }
]);
}); });
after(function (done) { after(function (done) {
@ -59,11 +57,14 @@ describe('Bing', function() {
done(); done();
}); });
it('should cope with valid responses', function(done) { it('should cope with valid responses', function (done) {
app.get('/hello/Web', function (req, res) { app.get('/hello/Web', function (req, res) {
res.status(200).send(JSON.stringify(validWebResponse)); res.status(200).send(JSON.stringify(validWebResponse));
}); });
var bingClient = bing({ rootUri: 'http://localhost:'+port+'/hello/', accKey: '123' }); var bingClient = bing({
rootUri: 'http://localhost:' + port + '/hello/',
accKey: '123'
});
bingClient.search('xbox', function (error, response, body) { bingClient.search('xbox', function (error, response, body) {
response.statusCode.should.eql(200); response.statusCode.should.eql(200);
body.should.eql(validWebResponse); body.should.eql(validWebResponse);
@ -71,13 +72,18 @@ describe('Bing', function() {
}); });
}); });
it('should cope with errors', function(done) { it('should cope with errors', function (done) {
// No actual data on what the failure looks like. // No actual data on what the failure looks like.
var failure = { message: 'Failed request' }; var failure = {
message: 'Failed request'
};
app.get('/hello/Image', function (req, res) { app.get('/hello/Image', function (req, res) {
res.status(500).send(failure); res.status(500).send(failure);
}); });
var bingClient = bing({ rootUri: 'http://localhost:'+port+'/hello/', accKey: '123' }); var bingClient = bing({
rootUri: 'http://localhost:' + port + '/hello/',
accKey: '123'
});
bingClient.images('xbox', function (error, response, body) { bingClient.images('xbox', function (error, response, body) {
response.statusCode.should.eql(500); response.statusCode.should.eql(500);
body.should.eql(JSON.stringify(failure)); body.should.eql(JSON.stringify(failure));

View file

@ -1,29 +1,31 @@
// Try to get an access key to run all this test. // Try to get an access key to run all this test.
// If the file doesn't exist or it doesn't contain an access key, it // If the file doesn't exist or it doesn't contain an access key, it
// should still run the basic tests; thus throwing an exception must // should still run the basic tests; thus throwing an exception must
// be avoided. // be avoided.
try{ try {
var accKey = require('./secrets').accKey; var accKey = require('./secrets').accKey;
} catch (e) {
console.log(e);
} }
catch(e){ console.log(e); }
if(!accKey){ if (!accKey) {
return console.error("Need to include an access key in your secrets.js"); return console.error("Need to include an access key in your secrets.js");
} }
var Bing = require('../')({ accKey: accKey}); var Bing = require('../')({
accKey: accKey
});
var should = require('should'); var should = require('should');
describe("Bing Search", function(){ describe("Bing Search", function () {
this.timeout(1000 * 10); this.timeout(1000 * 10);
it('works without options', function(done){ it('works without options', function (done) {
Bing.search('monkey vs frog', function(err, res, body){ Bing.search('monkey vs frog', function (err, res, body) {
should.not.exist(err); should.not.exist(err);
should.exist(res); should.exist(res);
@ -36,12 +38,12 @@ describe("Bing Search", function(){
}); });
}); });
it('finds only 5 results', function(done){ it('finds only 5 results', function (done) {
Bing.search('monkey vs frog', { Bing.search('monkey vs frog', {
top: 5, top: 5,
market: 'en-US', market: 'en-US',
adult: 'Strict' adult: 'Strict'
}, function(err, res, body){ }, function (err, res, body) {
should.not.exist(err); should.not.exist(err);
should.exist(res); should.exist(res);
should.exist(body); should.exist(body);
@ -55,16 +57,19 @@ describe("Bing Search", function(){
}); });
describe("Bing Images", function(){ describe("Bing Images", function () {
this.timeout(1000 * 10); this.timeout(1000 * 10);
it('finds images with specific options', function(done){ it('finds images with specific options', function (done) {
Bing.images('pizza', { Bing.images('pizza', {
top: 3, top: 3,
adult: 'Off', adult: 'Off',
imagefilters: { size: 'small', color: 'monochrome' } imagefilters: {
}, function(err, res, body){ size: 'small',
color: 'monochrome'
}
}, function (err, res, body) {
should.not.exist(err); should.not.exist(err);
should.exist(res); should.exist(res);
should.exist(body); should.exist(body);
@ -78,17 +83,17 @@ describe("Bing Images", function(){
}); });
describe("Bing News", function(){ describe("Bing News", function () {
this.timeout(1000 * 10); this.timeout(1000 * 10);
it('finds news with specific options', function(done){ it('finds news with specific options', function (done) {
Bing.news('ps4', { Bing.news('ps4', {
top: 10, top: 10,
skip: 1, skip: 1,
newsortby: 'Date' newsortby: 'Date'
}, function(err, res, body){ }, function (err, res, body) {
//TODO try unaccepted options like imagefilters //TODO try unaccepted options like imagefilters
should.not.exist(err); should.not.exist(err);
@ -104,15 +109,15 @@ describe("Bing News", function(){
}); });
describe("Bing Video", function(){ describe("Bing Video", function () {
this.timeout(1000 * 10); this.timeout(1000 * 10);
it('finds videos with specific options', function(done){ it('finds videos with specific options', function (done) {
Bing.video('monkey vs frog', { Bing.video('monkey vs frog', {
top: 10 top: 10
}, function(err, res, body){ }, function (err, res, body) {
should.not.exist(err); should.not.exist(err);
should.exist(res); should.exist(res);
should.exist(body); should.exist(body);