Skip to content
This repository has been archived by the owner on May 3, 2023. It is now read-only.

Commit

Permalink
replace nodeunit to mocha and cleanup!
Browse files Browse the repository at this point in the history
  • Loading branch information
iolo committed Sep 18, 2014
1 parent 301ae95 commit 33e48d1
Show file tree
Hide file tree
Showing 6 changed files with 326 additions and 361 deletions.
7 changes: 4 additions & 3 deletions Gruntfile.js
Expand Up @@ -6,13 +6,14 @@ module.exports = function (grunt) {
devel: true,
node: true
},
all: ['libs/**/*.js']
all: ['*.js']
},
nodeunit: {
mochaTest: {
all: ['tests/**/*_test.js']
}
});
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-nodeunit');
grunt.loadNpmTasks('grunt-mocha-test');
grunt.registerTask('default', ['jshint']);
grunt.registerTask('test', ['mochaTest']);
};
20 changes: 10 additions & 10 deletions README.md
Expand Up @@ -24,7 +24,7 @@ var mongoose = require('mongoose-q')();
```javascript
SomeModel.findByIdQ(....blahblah...)
.then(function (result) { ... })
.fail(function (err) { ... })
.catch(function (err) { ... })
.done();
```

Expand All @@ -34,7 +34,7 @@ SomeModel.findByIdQ(....blahblah...)
var someModel = new SomeModel(...);
someModel.populateQ()
.then(function (result) { ... })
.fail(function (err) { ... })
.catch(function (err) { ... })
.done();
```

Expand All @@ -44,7 +44,7 @@ someModel.populateQ()
SomeModel.find(...).where(...).skip(...).limit(...).sort(...).populate(...)
.execQ() // no 'Q' suffix for model statics except for execQ()
.then(function (result) { ... })
.fail(function (err) { ... })
.catch(function (err) { ... })
.done();
```

Expand All @@ -53,7 +53,7 @@ SomeModel.find(...).where(...).skip(...).limit(...).sort(...).populate(...)
SomeModel.aggregate(...).project(...).group(...).match(...).skip(...).limit(...).sort(...).unwind(...)
.execQ() // no 'Q' suffix for model statics except for execQ()
.then(function (result) { ... })
.fail(function (err) { ... })
.catch(function (err) { ... })
.done();
```

Expand All @@ -63,7 +63,7 @@ SomeModel.aggregate(...).project(...).group(...).match(...).skip(...).limit(...)
var mongoose = require('mongoose-q')(require('mongoose'), {prefix:'promiseOf_', suffix:'_withQ'});
SomeModel.promiseOf_findAndUpdate_withQ(...)
.then(function (result) { ... })
.fail(function (err) { ... })
.catch(function (err) { ... })
.done();
```

Expand All @@ -76,7 +76,7 @@ function customMapper(name) {
var mongoose = require('mongoose-q')(require('mongoose'), {mapper:customMapper});
SomeModel.qFindAndUpdate(...)
.then(function (result) { ... })
.fail(function (err) { ... })
.catch(function (err) { ... })
.done();
```

Expand All @@ -86,23 +86,23 @@ SomeModel.qFindAndUpdate(...)
var mongoose = require('mongoose-q')(require('mongoose'), {spread:true});
SomeModel.updateQ(...)
.spread(function (affectedRows, raw) { ... })
.fail(function (err) { ... })
.catch(function (err) { ... })
.done();
SomeModel.updateQ(...)
.then(function (result) { var affectedRows = result[0], raw = result[1]; ... })
.fail(function (err) { ... })
.catch(function (err) { ... })
.done();
...
var model = new SomeModel();
...
model.saveQ()
.spread(function (savedDoc, affectedRows) { ... })
.fail(function (err) { ... })
.catch(function (err) { ... })
.done();
...
model.saveQ()
.then(function (result) { var savedDoc = result[0], affectedRows = result[1]; ... })
.fail(function (err) { ... })
.catch(function (err) { ... })
.done();
```
> NOTE: without `spread` option(by default), you can access only the first result with `then`!!
Expand Down
114 changes: 113 additions & 1 deletion index.js
@@ -1 +1,113 @@
module.exports = require('./libs/mongoose_q');
'use strict';

var
Q = require('q'),
MONGOOSE_MODEL_STATICS = [
// mongoose.Model static
'remove', 'ensureIndexes', 'find', 'findById', 'findOne', 'count', 'distinct',
'findOneAndUpdate', 'findByIdAndUpdate', 'findOneAndRemove', 'findByIdAndRemove',
'create', 'update', 'mapReduce', 'aggregate', 'populate',
'geoNear', 'geoSearch',
// mongoose.Document static
'update'
],
MONGOOSE_MODEL_METHODS = [
// mongoose.Model instance
'save', 'remove',
// mongoose.Document instance
'populate', 'update', 'validate'
],
MONGOOSE_QUERY_METHODS = [
// mongoose.Query instance
'find', 'exec', 'findOne', 'count', 'distinct', 'update', 'remove',
'findOneAndUpdate', 'findOneAndRemove', 'lean', 'limit', 'skip', 'sort'
],
MONGOOSE_AGGREGATE_METHODS = [
'exec'
],
apslice = Array.prototype.slice,
debug = console.log.bind(console),
DEBUG = !!process.env.MONGOOSEQ_DEBUG;

/**
* @module mongooseq
*/

/**
*
* @param {object} obj
* @param {Array.<string>} funcNames - original function names to apply Q
* @param {function(string):string} funcNameMapper maps a function name into Q-applied one
* @param {*} [spread=false] use spread for multi-results
*/
function qualify(obj, funcNames, funcNameMapper, spread) {
funcNames.forEach(function (funcName) {
if (typeof(obj[funcName]) !== 'function') {
DEBUG && debug('***skip*** function not found:', funcName);
return;
}
var mappedFuncName = funcNameMapper(funcName);
DEBUG && debug('wrap function:', funcName, '-->', mappedFuncName);
obj[mappedFuncName] = function () {
var d = Q.defer();
var args = apslice.call(arguments);
args.push(function (err, result) {
if (err) {
return d.reject(err);
}
// with 'spread' option: returns 'all' result with 'spread' only for multiple result
if (spread && arguments.length > 2) {
return d.resolve(apslice.call(arguments, 1));
}
// without 'spread' option: returns the 'first' result only and ignores following result
return d.resolve(result);
});
// fix https://github.com/iolo/mongoose-q/issues/1
// mongoose patches some instance methods after instantiation. :(
this[funcName].apply(this, args);
return d.promise;
};
});
}

/**
* add Q wrappers for static/instance functions of mongoose model and query.
*
* @param {mongoose.Mongoose} [mongoose]
* @param {object.<string,*>} [options={}] - prefix and/or suffix for wrappers
* @param {string} [options.prefix='']
* @param {string} [options.suffix='']
* @param {function(string):string} [options.mapper]
* @param {boolean} [options.spread=false]
* @returns {mongoose.Mongoose} the same mongoose instance, for convenince
*/
function mongooseQ(mongoose, options) {
mongoose = mongoose || require('mongoose');
options = options || {};
var prefix = options.prefix || '';
var suffix = options.suffix || 'Q';
var mapper = options.mapper || function (funcName) {
return prefix + funcName + suffix;
};
var spread = options.spread;
// avoid duplicated application for custom mapper function...
var applied = require('crypto').createHash('md5').update(mapper.toString()).digest('hex');
if (mongoose['__q_applied_' + applied]) {
return mongoose;
}

qualify(mongoose.Model, MONGOOSE_MODEL_STATICS, mapper, spread);
qualify(mongoose.Model.prototype, MONGOOSE_MODEL_METHODS, mapper, spread);
qualify(mongoose.Query.prototype, MONGOOSE_QUERY_METHODS, mapper, spread);

// see https://github.com/iolo/mongoose-q/issues/6 and
// https://github.com/LearnBoost/mongoose/issues/1910
var Aggregate = require('mongoose/lib/aggregate');
qualify(Aggregate.prototype, MONGOOSE_AGGREGATE_METHODS, mapper, spread);

mongoose['__q_applied_' + applied] = true;
return mongoose;
}

module.exports = mongooseQ;
module.exports.qualify = qualify;
130 changes: 0 additions & 130 deletions libs/mongoose_q.js

This file was deleted.

12 changes: 4 additions & 8 deletions package.json
@@ -1,6 +1,6 @@
{
"name": "mongoose-q",
"version": "0.0.12",
"version": "0.0.13",
"description": "kriskowal's Q support for mongoose",
"author": "Dongsu Jang <iolothebard@gmail.com>",
"repository": {
Expand All @@ -16,14 +16,10 @@
"mongoose": "^3.8.3"
},
"devDependencies": {
"nodeunit": "latest",
"mocha": "latest",
"pow-mongodb-fixtures": "latest",
"grunt": "latest",
"grunt-contrib-jshint": "latest",
"grunt-contrib-nodeunit": "latest"
},
"directories": {
"lib": "./lib"
},
"main": "./lib/mongoose_q"
"grunt-mocha-test": "latest"
}
}

0 comments on commit 33e48d1

Please sign in to comment.