Skip to content

Commit

Permalink
Add traits plugin (resolves #374)
Browse files Browse the repository at this point in the history
  • Loading branch information
ClickerMonkey committed Feb 16, 2017
1 parent 66d5535 commit 86de284
Show file tree
Hide file tree
Showing 6 changed files with 164 additions and 6 deletions.
3 changes: 2 additions & 1 deletion Gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,8 @@ var modularized = {
'./src/lib/plugins/grabAll.js',
'./src/lib/plugins/methods.js',
'./src/lib/plugins/ready.js',
'./src/lib/plugins/refresh.js'
'./src/lib/plugins/refresh.js',
'./src/lib/plugins/traits.js'
],
modules: {
S: [ // searching
Expand Down
39 changes: 39 additions & 0 deletions build/rekord.js
Original file line number Diff line number Diff line change
Expand Up @@ -18634,6 +18634,45 @@ Rekord.Timestamp = Timestamp;
Rekord.formatDate = noop;
Rekord.convertDate = convertDate;

addPlugin(function(model, db, options)
{
var traits = options.traits || Defaults.traits;

if ( !isEmpty( traits ) )
{
if ( isFunction( traits ) )
{
traits = traits( model, db, options );
}

if ( isArray( traits ) )
{
for (var i = 0; i < traits.length; i++)
{
var trait = traits[ i ];

if ( isFunction( trait ) )
{
trait = trait( model, db, options );
}

if ( isObject( trait ) )
{
Class.methods( model, trait );
}
else
{
throw 'traits are expected to be an object with methods or a function which returns an object of methods';
}
}
}
else
{
throw 'traits are expected to be an array or a function which returns an array';
}
}
});

addPlugin(function(model, db, options)
{

Expand Down
8 changes: 4 additions & 4 deletions build/rekord.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion build/rekord.min.js.map

Large diffs are not rendered by default.

38 changes: 38 additions & 0 deletions src/lib/plugins/traits.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
addPlugin(function(model, db, options)
{
var traits = options.traits || Defaults.traits;

if ( !isEmpty( traits ) )
{
if ( isFunction( traits ) )
{
traits = traits( model, db, options );
}

if ( isArray( traits ) )
{
for (var i = 0; i < traits.length; i++)
{
var trait = traits[ i ];

if ( isFunction( trait ) )
{
trait = trait( model, db, options );
}

if ( isObject( trait ) )
{
Class.methods( model, trait );
}
else
{
throw 'traits are expected to be an object with methods or a function which returns an object of methods';
}
}
}
else
{
throw 'traits are expected to be an array or a function which returns an array';
}
}
});
80 changes: 80 additions & 0 deletions test/cases/rekord-options.js
Original file line number Diff line number Diff line change
Expand Up @@ -2037,3 +2037,83 @@ test( 'saveAlways field', function(assert)

deepEqual( Task.Database.rest.lastRecord, {name: 't1', done: true} );
});

test( 'traits simple', function(assert)
{
var prefix = 'traits_simple_';

var TraitFoo = {
foo: function() { return 1; }
};

var TraitBar = {
bar: function() { return 2; }
};

var Task = Rekord({
name: prefix + 'task',
fields: ['name', 'done'],
traits: [TraitFoo, TraitBar]
});

var t0 = Task.create({name: 't0', done: false});

strictEqual( t0.foo(), 1 );
strictEqual( t0.bar(), 2 );
});


test( 'traits function', function(assert)
{
var prefix = 'traits_function_';

var TraitFoo = {
foo: function() { return 1; }
};

var TraitBar = function(model, db, options) {
return {
bar: function() { return options.name; }
}
};

var Task = Rekord({
name: prefix + 'task',
fields: ['name', 'done'],
traits: [TraitFoo, TraitBar]
});

var t0 = Task.create({name: 't0', done: false});

strictEqual( t0.foo(), 1 );
strictEqual( t0.bar(), 'traits_function_task' );
});


test( 'traits generator', function(assert)
{
var prefix = 'traits_generator_';

var TraitFoo = {
foo: function() { return 1; }
};

var TraitBar = {
bar: function() { return 2; }
};

var TraitGenerator = function() {
return [TraitFoo, TraitBar];
};

var Task = Rekord({
name: prefix + 'task',
fields: ['name', 'done'],
traits: TraitGenerator
});

var t0 = Task.create({name: 't0', done: false});

strictEqual( t0.foo(), 1 );
strictEqual( t0.bar(), 2 );
});

0 comments on commit 86de284

Please sign in to comment.