waterline
Advanced tools
Comparing version 0.9.6 to 0.9.7
@@ -98,3 +98,5 @@ /** | ||
obj[self._transformations[property]] = _.clone(obj[property]); | ||
delete obj[property]; | ||
if(self._transformations[property] !== property) { | ||
delete obj[property]; | ||
} | ||
@@ -110,3 +112,5 @@ return recursiveParse(obj[self._transformations[property]]); | ||
obj[self._transformations[property]] = obj[property]; | ||
delete obj[property]; | ||
if(self._transformations[property] !== property) { | ||
delete obj[property]; | ||
} | ||
} | ||
@@ -113,0 +117,0 @@ }); |
@@ -111,5 +111,2 @@ /** | ||
// Ignore Text type validation | ||
if(curValidation.type === 'text') return cb(); | ||
// If Boolean and required manually check | ||
@@ -116,0 +113,0 @@ if(curValidation.required && curValidation.type === 'boolean') { |
@@ -95,2 +95,24 @@ /** | ||
/** | ||
* Model.validate() | ||
* | ||
* Takes the currently set attributes and validates the model | ||
* Shorthand for Model.validate({ attributes }, cb) | ||
* | ||
* @param {Function} callback | ||
* @return callback - (err) | ||
*/ | ||
validate: function(cb) { | ||
var self = this; | ||
// Collect current values | ||
var values = this.toObject(); | ||
context.validate( values, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}) | ||
}, | ||
/** | ||
* Model.save() | ||
@@ -189,2 +211,2 @@ * | ||
return Model.extend(prototype); | ||
}; | ||
}; |
@@ -55,3 +55,3 @@ /** | ||
for(var key in self.attributes) { | ||
if(!record[key] && record[key] !== false && self.attributes[key].hasOwnProperty('defaultsTo')) { | ||
if(record[key] === undefined && self.attributes[key].hasOwnProperty('defaultsTo')) { | ||
record[key] = _.clone(self.attributes[key].defaultsTo); | ||
@@ -66,40 +66,10 @@ } | ||
// Run Before Validate Lifecycle Callbacks | ||
// Run Validation with Validation LifeCycle Callbacks | ||
function(cb) { | ||
var runner = function(item, callback) { | ||
item(record, function(err) { | ||
if(err) return callback(err); | ||
callback(); | ||
}); | ||
}; | ||
async.eachSeries(self._callbacks.beforeValidation, runner, function(err) { | ||
self.validate(record, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}) | ||
}, | ||
// Run Validation | ||
function(cb) { | ||
self._validator.validate(record, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}, | ||
// Run After Validate Lifecycle Callbacks | ||
function(cb) { | ||
var runner = function(item, callback) { | ||
item(record, function(err) { | ||
if(err) return callback(err); | ||
callback(); | ||
}); | ||
}; | ||
async.eachSeries(self._callbacks.afterValidation, runner, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}, | ||
// Before Create Lifecycle Callback | ||
@@ -244,3 +214,3 @@ function(cb) { | ||
for(var key in self.attributes) { | ||
if(!record[key] && record[key] !== false && self.attributes[key].hasOwnProperty('defaultsTo')) { | ||
if(record[key] === undefined && self.attributes[key].hasOwnProperty('defaultsTo')) { | ||
record[key] = _.clone(self.attributes[key].defaultsTo); | ||
@@ -255,40 +225,10 @@ } | ||
// Run Before Validate Lifecycle Callbacks | ||
// Run Validation with Validation LifeCycle Callbacks | ||
function(cb) { | ||
var runner = function(item, callback) { | ||
item(record, function(err) { | ||
if(err) return callback(err); | ||
callback(); | ||
}); | ||
}; | ||
async.eachSeries(self._callbacks.beforeValidation, runner, function(err) { | ||
self.validate(record, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}) | ||
}, | ||
// Run Validation | ||
function(cb) { | ||
self._validator.validate(record, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}, | ||
// Run After Validate Lifecycle Callbacks | ||
function(cb) { | ||
var runner = function(item, callback) { | ||
item(record, function(err) { | ||
if(err) return callback(err); | ||
callback(); | ||
}); | ||
}; | ||
async.eachSeries(self._callbacks.afterValidation, runner, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}, | ||
// Before Create Lifecycle Callback | ||
@@ -295,0 +235,0 @@ function(cb) { |
@@ -50,3 +50,3 @@ /** | ||
for(var key in this.attributes) { | ||
if(!values[key] && values[key] !== false && this.attributes[key].hasOwnProperty('defaultsTo')) { | ||
if(values[key] === undefined && this.attributes[key].hasOwnProperty('defaultsTo')) { | ||
values[key] = _.clone(this.attributes[key].defaultsTo); | ||
@@ -61,40 +61,10 @@ } | ||
// Run Before Validate Lifecycle Callbacks | ||
// Run Validation with Validation LifeCycle Callbacks | ||
function(cb) { | ||
var runner = function(item, callback) { | ||
item(values, function(err) { | ||
if(err) return callback(err); | ||
callback(); | ||
}); | ||
}; | ||
async.eachSeries(self._callbacks.beforeValidation, runner, function(err) { | ||
self.validate(values, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}, | ||
}) | ||
}, | ||
// Run Validation | ||
function(cb) { | ||
self._validator.validate(values, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}, | ||
// Run After Validate Lifecycle Callbacks | ||
function(cb) { | ||
var runner = function(item, callback) { | ||
item(values, function(err) { | ||
if(err) return callback(err); | ||
callback(); | ||
}); | ||
}; | ||
async.eachSeries(self._callbacks.afterValidation, runner, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}, | ||
// Before Create Lifecycle Callback | ||
@@ -101,0 +71,0 @@ function(cb) { |
@@ -8,3 +8,2 @@ /** | ||
normalize = require('../utils/normalize'), | ||
_ = require('underscore'), | ||
Deferred = require('./deferred'), | ||
@@ -67,40 +66,10 @@ async = require('async'), | ||
// Run Before Validate Lifecycle Callbacks | ||
// Run Validation with Validation LifeCycle Callbacks | ||
function(cb) { | ||
var runner = function(item, callback) { | ||
item(values, function(err) { | ||
if(err) return callback(err); | ||
callback(); | ||
}); | ||
}; | ||
async.eachSeries(self._callbacks.beforeValidation, runner, function(err) { | ||
self.validate(values, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}) | ||
}, | ||
// Run Validation | ||
function(cb) { | ||
self._validator.validate(values, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}, | ||
// Run After Validate Lifecycle Callbacks | ||
function(cb) { | ||
var runner = function(item, callback) { | ||
item(values, function(err) { | ||
if(err) return callback(err); | ||
callback(); | ||
}); | ||
}; | ||
async.eachSeries(self._callbacks.afterValidation, runner, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}, | ||
// Before Create Lifecycle Callback | ||
@@ -199,40 +168,10 @@ function(cb) { | ||
// Run Before Validate Lifecycle Callbacks | ||
// Run Validation with Validation LifeCycle Callbacks | ||
function(cb) { | ||
var runner = function(item, callback) { | ||
item(newValues, function(err) { | ||
if(err) return callback(err); | ||
callback(); | ||
}); | ||
}; | ||
async.eachSeries(self._callbacks.beforeValidation, runner, function(err) { | ||
self.validate(newValues, true, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}) | ||
}, | ||
// Run Validation | ||
function(cb) { | ||
self._validator.validate(newValues, true, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}, | ||
// Run After Validate Lifecycle Callbacks | ||
function(cb) { | ||
var runner = function(item, callback) { | ||
item(newValues, function(err) { | ||
if(err) return callback(err); | ||
callback(); | ||
}); | ||
}; | ||
async.eachSeries(self._callbacks.afterValidation, runner, function(err) { | ||
if(err) return cb(err); | ||
cb(); | ||
}); | ||
}, | ||
// Before Update Lifecycle Callback | ||
@@ -239,0 +178,0 @@ function(cb) { |
@@ -30,7 +30,26 @@ /** | ||
// Check if criteria is an integer or string and normalize criteria | ||
// to object, using the id field. If something besides | ||
// an id field is being used as a primary key a where criteria | ||
// should be used and not an integer. | ||
// to object, using the specified primary key field. | ||
if(_.isNumber(criteria) || _.isString(criteria)) { | ||
criteria = { id: criteria }; | ||
// Default to id as primary key | ||
var pk = 'id'; | ||
// If not autoPK is used, attempt to find a primary key | ||
if (!self.autoPK) { | ||
// Check which attribute is use as primary key | ||
for(var key in self.attributes) { | ||
if(!self.attributes[key].hasOwnProperty('primaryKey')) continue; | ||
// If no custom columnName was set, use the key name | ||
pk = key; | ||
break; | ||
} | ||
} | ||
// Temporary store the given criteria | ||
var pkCriteria = _.clone(criteria); | ||
// Make the criteria object, with the primary key | ||
criteria = {}; | ||
criteria[pk] = pkCriteria; | ||
} | ||
@@ -37,0 +56,0 @@ |
@@ -56,2 +56,3 @@ /** | ||
Query.prototype, | ||
require('./validate'), | ||
require('./ddl'), | ||
@@ -58,0 +59,0 @@ require('./dql'), |
{ | ||
"name": "waterline", | ||
"description": "An ORM for Node.js and the Sails framework", | ||
"version": "0.9.6", | ||
"version": "0.9.7", | ||
"contributors": [ | ||
@@ -20,6 +20,6 @@ { | ||
"dependencies": { | ||
"underscore": "1.4.4", | ||
"async": "0.2.9", | ||
"anchor": "~0.9.5", | ||
"q": "0.9.4" | ||
"underscore": "~1.5.2", | ||
"async": "~0.2.9", | ||
"anchor": "~0.9.6", | ||
"q": "~0.9.7" | ||
}, | ||
@@ -26,0 +26,0 @@ "devDependencies": { |
@@ -173,9 +173,8 @@ ![image_squidhome@2x.png](http://i.imgur.com/7rMxw.png) | ||
beforeCreate: function(values, cb) { | ||
var self = this; | ||
// an example encrypt function defined somewhere | ||
encrypt(this.password, function(err, password) { | ||
encrypt(values.password, function(err, password) { | ||
if(err) return cb(err); | ||
self.password = password; | ||
values.password = password; | ||
cb(); | ||
@@ -182,0 +181,0 @@ }); |
@@ -55,25 +55,54 @@ var Transformer = require('../../../lib/waterline/core/transformations'), | ||
describe('serialize', function() { | ||
var transformer; | ||
describe('with different names', function() { | ||
var transformer; | ||
before(function() { | ||
var attributes = { | ||
name: 'string', | ||
username: { | ||
columnName: 'login' | ||
} | ||
}; | ||
before(function() { | ||
var attributes = { | ||
name: 'string', | ||
username: { | ||
columnName: 'login' | ||
} | ||
}; | ||
transformer = new Transformer(attributes); | ||
}); | ||
transformer = new Transformer(attributes); | ||
}); | ||
it('should change username key to login', function() { | ||
var values = transformer.serialize({ username: 'foo' }); | ||
assert(values.login); | ||
assert(values.login === 'foo'); | ||
it('should change username key to login', function() { | ||
var values = transformer.serialize({ username: 'foo' }); | ||
assert(values.login); | ||
assert(values.login === 'foo'); | ||
}); | ||
it('should work recursively', function() { | ||
var values = transformer.serialize({ where: { user: { username: 'foo' }}}); | ||
assert(values.where.user.login); | ||
assert(values.where.user.login === 'foo'); | ||
}); | ||
}); | ||
it('should work recursively', function() { | ||
var values = transformer.serialize({ where: { user: { username: 'foo' }}}); | ||
assert(values.where.user.login); | ||
assert(values.where.user.login === 'foo'); | ||
describe('with the same names', function() { | ||
var transformer; | ||
before(function() { | ||
var attributes = { | ||
name: 'string', | ||
username: { | ||
columnName: 'username' | ||
} | ||
}; | ||
transformer = new Transformer(attributes); | ||
}); | ||
it('should keep the username key', function() { | ||
var values = transformer.serialize({ username: 'foo' }); | ||
assert(values.username); | ||
assert(values.username === 'foo'); | ||
}); | ||
it('should work recursively', function() { | ||
var values = transformer.serialize({ where: { user: { username: 'foo' }}}); | ||
assert(values.where.user.username); | ||
assert(values.where.user.username === 'foo'); | ||
}); | ||
}); | ||
@@ -80,0 +109,0 @@ }); |
@@ -7,60 +7,152 @@ var Collection = require('../../../lib/waterline/collection'), | ||
describe('.findOne()', function() { | ||
var query; | ||
before(function(done) { | ||
describe('with autoPK', function() { | ||
var query; | ||
// Extend for testing purposes | ||
var Model = Collection.extend({ | ||
identity: 'user', | ||
adapter: 'foo', | ||
attributes: { | ||
name: { | ||
type: 'string', | ||
defaultsTo: 'Foo Bar' | ||
}, | ||
doSomething: function() {} | ||
} | ||
before(function(done) { | ||
// Extend for testing purposes | ||
var Model = Collection.extend({ | ||
identity: 'user', | ||
adapter: 'foo', | ||
attributes: { | ||
name: { | ||
type: 'string', | ||
defaultsTo: 'Foo Bar' | ||
}, | ||
doSomething: function() {} | ||
} | ||
}); | ||
// Fixture Adapter Def | ||
var adapterDef = { find: function(col, criteria, cb) { return cb(null, [criteria]); }}; | ||
new Model({ adapters: { foo: adapterDef }}, function(err, coll) { | ||
if(err) done(err); | ||
query = coll; | ||
done(); | ||
}); | ||
}); | ||
// Fixture Adapter Def | ||
var adapterDef = { find: function(col, criteria, cb) { return cb(null, [criteria]); }}; | ||
new Model({ adapters: { foo: adapterDef }}, function(err, coll) { | ||
if(err) done(err); | ||
query = coll; | ||
done(); | ||
it('should return an instance of Model', function(done) { | ||
query.findOne({ name: 'foo' }, function(err, values) { | ||
assert(typeof values.doSomething === 'function'); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
it('should return an instance of Model', function(done) { | ||
query.findOne({ name: 'foo' }, function(err, values) { | ||
assert(typeof values.doSomething === 'function'); | ||
done(); | ||
it('should allow an integer to be passed in as criteria', function(done) { | ||
query.findOne(1, function(err, values) { | ||
assert(!err); | ||
assert(values.where.id === 1); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
it('should allow an integer to be passed in as criteria', function(done) { | ||
query.findOne(1, function(err, values) { | ||
assert(!err); | ||
assert(values.where.id === 1); | ||
done(); | ||
it('should allow a query to be built using deferreds', function(done) { | ||
query.findOne() | ||
.where({ name: 'Foo Bar' }) | ||
.where({ id: { '>': 1 } }) | ||
.exec(function(err, results) { | ||
assert(!err); | ||
assert(!Array.isArray(results)); | ||
assert(Object.keys(results.where).length === 2); | ||
assert(results.where.name == 'Foo Bar'); | ||
assert(results.where.id['>'] == 1); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
it('should allow a query to be built using deferreds', function(done) { | ||
query.findOne() | ||
.where({ name: 'Foo Bar' }) | ||
.where({ id: { '>': 1 } }) | ||
.exec(function(err, results) { | ||
assert(!err); | ||
assert(!Array.isArray(results)); | ||
describe('with custom PK', function() { | ||
assert(Object.keys(results.where).length === 2); | ||
assert(results.where.name == 'Foo Bar'); | ||
assert(results.where.id['>'] == 1); | ||
describe('with no columnName set', function() { | ||
var query; | ||
done(); | ||
before(function(done) { | ||
// Extend for testing purposes | ||
var Model = Collection.extend({ | ||
identity: 'user', | ||
adapter: 'foo', | ||
autoPK: false, | ||
attributes: { | ||
name: { | ||
type: 'string', | ||
defaultsTo: 'Foo Bar' | ||
}, | ||
myPk: { | ||
type: 'integer', | ||
primaryKey: true, | ||
defaultsTo: 1 | ||
} | ||
} | ||
}); | ||
// Fixture Adapter Def | ||
var adapterDef = { find: function(col, criteria, cb) { return cb(null, [criteria]); }}; | ||
new Model({ adapters: { foo: adapterDef }}, function(err, coll) { | ||
if(err) done(err); | ||
query = coll; | ||
done(); | ||
}); | ||
}); | ||
it('should use the custom primary key when a single value is passed in', function(done) { | ||
query.findOne(1, function(err, values) { | ||
assert(!err); | ||
assert(values.where.myPk === 1); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
describe('with custom columnName set', function() { | ||
var query; | ||
before(function(done) { | ||
// Extend for testing purposes | ||
var Model = Collection.extend({ | ||
identity: 'user', | ||
adapter: 'foo', | ||
autoPK: false, | ||
attributes: { | ||
name: { | ||
type: 'string', | ||
defaultsTo: 'Foo Bar' | ||
}, | ||
myPk: { | ||
type: 'integer', | ||
primaryKey: true, | ||
columnName: 'pkColumn', | ||
defaultsTo: 1 | ||
} | ||
} | ||
}); | ||
// Fixture Adapter Def | ||
var adapterDef = { find: function(col, criteria, cb) { return cb(null, [criteria]); }}; | ||
new Model({ adapters: { foo: adapterDef }}, function(err, coll) { | ||
if(err) done(err); | ||
query = coll; | ||
done(); | ||
}); | ||
}); | ||
it('should use the custom primary key when a single value is passed in', function(done) { | ||
query.findOne(1, function(err, values) { | ||
assert(!err); | ||
assert(values.where.pkColumn === 1); | ||
done(); | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); |
268899
123
8155
441
+ Addedq@0.9.7(transitive)
+ Addedunderscore@1.5.2(transitive)
- Removedasync@0.2.9(transitive)
- Removedq@0.9.4(transitive)
- Removedunderscore@1.4.4(transitive)
Updatedanchor@~0.9.6
Updatedasync@~0.2.9
Updatedq@~0.9.7
Updatedunderscore@~1.5.2