mirror of
https://github.com/kbparagua/paloma
synced 2023-03-27 23:21:17 -04:00
Merge pull request #91 from kbparagua/feature/before-callbacks
Feature/before callbacks
This commit is contained in:
commit
c2a75403ad
6 changed files with 182 additions and 4 deletions
|
@ -31,9 +31,29 @@
|
||||||
var blank = function(){};
|
var blank = function(){};
|
||||||
|
|
||||||
Paloma.controller('Application', {
|
Paloma.controller('Application', {
|
||||||
|
|
||||||
|
// before: [
|
||||||
|
// 'all -> logRequest',
|
||||||
|
// 'show index -> askUser changeBackground'
|
||||||
|
// ],
|
||||||
|
|
||||||
|
before: [
|
||||||
|
'all -> performThis',
|
||||||
|
'show -> doSomething'
|
||||||
|
],
|
||||||
|
|
||||||
index: function(){
|
index: function(){
|
||||||
console.log('Inherited');
|
console.log('Inherited');
|
||||||
|
},
|
||||||
|
|
||||||
|
doSomething: function(){
|
||||||
|
console.log('Do something');
|
||||||
|
},
|
||||||
|
|
||||||
|
performThis: function(){
|
||||||
|
console.log('Perform This!');
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Paloma.controller('Main < Application', {
|
Paloma.controller('Main < Application', {
|
||||||
|
@ -44,7 +64,7 @@ Paloma.controller('Main < Application', {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
Paloma.controller('OtherMain', {
|
Paloma.controller('OtherMain < Application', {
|
||||||
show: blank,
|
show: blank,
|
||||||
otherAction: blank,
|
otherAction: blank,
|
||||||
multiple_calls_2: blank
|
multiple_calls_2: blank
|
||||||
|
|
79
test_app/spec/javascripts/before_callback_performer_spec.js
Normal file
79
test_app/spec/javascripts/before_callback_performer_spec.js
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
describe('Paloma.BeforeCallbackPerformer', function(){
|
||||||
|
describe('#perform(action)', function(){
|
||||||
|
|
||||||
|
var Controller = Paloma.controller('MyController', {
|
||||||
|
before: [
|
||||||
|
'all -> initialize doThat',
|
||||||
|
'singleCallback unknown -> doSomething',
|
||||||
|
'multiCallback -> doSomething doAnotherThing'
|
||||||
|
],
|
||||||
|
|
||||||
|
initialize: function(){
|
||||||
|
this.didWhat = [];
|
||||||
|
},
|
||||||
|
|
||||||
|
did: function(what){ return this.didWhat.indexOf(what) >= 0; },
|
||||||
|
|
||||||
|
noCallback: function(){ console.log('I have no callback.'); },
|
||||||
|
singleCallback: function(){ console.log('Single callback.'); },
|
||||||
|
multiCallback: function(){ console.log('Multiple callbacks.')},
|
||||||
|
|
||||||
|
doThat: function(){ this.didWhat.push('that'); },
|
||||||
|
doSomething: function(){ this.didWhat.push('something'); },
|
||||||
|
doAnotherThing: function(){ this.didWhat.push('anotherThing') }
|
||||||
|
});
|
||||||
|
|
||||||
|
function itPerformsCallbackForAll(controller){
|
||||||
|
it('performs callback for all', function(){
|
||||||
|
expect( controller.did('that') ).toBeTruthy();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
describe('when there is no matched callback', function(){
|
||||||
|
var controller = new Controller(),
|
||||||
|
performer = new Paloma.BeforeCallbackPerformer(controller);
|
||||||
|
|
||||||
|
performer.perform('noCallback');
|
||||||
|
|
||||||
|
it('will not perform any callback', function(){
|
||||||
|
expect( controller.did('something') ).toBeFalsy();
|
||||||
|
});
|
||||||
|
|
||||||
|
itPerformsCallbackForAll(controller);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when there is one matched callback', function(){
|
||||||
|
var controller = new Controller(),
|
||||||
|
performer = new Paloma.BeforeCallbackPerformer(controller);
|
||||||
|
|
||||||
|
performer.perform('singleCallback');
|
||||||
|
|
||||||
|
it('will perform the matched callback', function(){
|
||||||
|
expect( controller.did('something') ).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
itPerformsCallbackForAll(controller);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when there is more than one matched callbacks', function(){
|
||||||
|
var controller = new Controller(),
|
||||||
|
performer = new Paloma.BeforeCallbackPerformer(controller);
|
||||||
|
|
||||||
|
performer.perform('multiCallback');
|
||||||
|
|
||||||
|
it('will perform all the matched callbacks', function(){
|
||||||
|
expect( controller.did('something') && controller.did('anotherThing') ).
|
||||||
|
toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('will perform the callbacks in order of definition', function(){
|
||||||
|
expect(controller.didWhat).toEqual([
|
||||||
|
'that', 'something', 'anotherThing'
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
itPerformsCallbackForAll(controller);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,3 +1,8 @@
|
||||||
Paloma.BaseController = function(params){
|
Paloma.BaseController = function(params){
|
||||||
this.params = params;
|
this.params = params;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Paloma.BaseController.prototype = {
|
||||||
|
before: []
|
||||||
|
};
|
||||||
|
|
||||||
|
|
69
vendor/assets/javascripts/paloma/before_callback_performer.js
vendored
Normal file
69
vendor/assets/javascripts/paloma/before_callback_performer.js
vendored
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
Paloma.BeforeCallbackPerformer = function(controller){
|
||||||
|
this.controller = controller;
|
||||||
|
this.entries = controller.before;
|
||||||
|
this.action = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
Paloma.BeforeCallbackPerformer.prototype = {
|
||||||
|
|
||||||
|
perform: function(action){
|
||||||
|
this.action = action;
|
||||||
|
this._executeCallbacks();
|
||||||
|
},
|
||||||
|
|
||||||
|
_executeCallbacks: function(){
|
||||||
|
for (var i = 0, n = this._callbacks().length; i < n; i++)
|
||||||
|
this._executeCallback( this._callbacks()[i] );
|
||||||
|
},
|
||||||
|
|
||||||
|
_executeCallback: function(name){
|
||||||
|
var callback = this.controller[name];
|
||||||
|
if (callback) callback.call(this.controller);
|
||||||
|
},
|
||||||
|
|
||||||
|
_callbacks: function(){
|
||||||
|
if (this._callbackList) return this._callbackList;
|
||||||
|
|
||||||
|
this._callbackList = [];
|
||||||
|
|
||||||
|
for (var i = 0, n = this.entries.length; i < n; i++){
|
||||||
|
var entry = this.entries[i];
|
||||||
|
|
||||||
|
this._callbackList =
|
||||||
|
this._callbackList.concat( this._getCallbacksIfForAction(entry) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._callbackList;
|
||||||
|
},
|
||||||
|
|
||||||
|
_getCallbacksIfForAction: function(entry){
|
||||||
|
var parsedEntry = this._parseEntry(entry);
|
||||||
|
|
||||||
|
if (
|
||||||
|
this._actionIsOn(parsedEntry.actions) ||
|
||||||
|
this._allIsOn(parsedEntry.actions)
|
||||||
|
)
|
||||||
|
return parsedEntry.callbacks;
|
||||||
|
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
|
||||||
|
_actionIsOn: function(actions){
|
||||||
|
return actions.indexOf(this.action) != -1;
|
||||||
|
},
|
||||||
|
|
||||||
|
_allIsOn: function(actions){
|
||||||
|
return actions.indexOf('all') != -1;
|
||||||
|
},
|
||||||
|
|
||||||
|
_parseEntry: function(entry){
|
||||||
|
var parts = entry.split('->'),
|
||||||
|
data = {actions: [], callbacks: []};
|
||||||
|
|
||||||
|
if (parts[0]) data.actions = parts[0].trim().split(' ');
|
||||||
|
if (parts[1]) data.callbacks = parts[1].trim().split(' ');
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
10
vendor/assets/javascripts/paloma/engine.js
vendored
10
vendor/assets/javascripts/paloma/engine.js
vendored
|
@ -40,10 +40,14 @@ Paloma.Engine.prototype = {
|
||||||
},
|
},
|
||||||
|
|
||||||
_executeActionOf: function(controller){
|
_executeActionOf: function(controller){
|
||||||
var callback = controller[ this._request.action ];
|
var action = controller[ this._request.action ];
|
||||||
|
|
||||||
|
if (action){
|
||||||
|
var callbackPerformer = new Paloma.BeforeCallbackPerformer(controller);
|
||||||
|
callbackPerformer.perform( this._request.action );
|
||||||
|
|
||||||
|
action.call(controller);
|
||||||
|
|
||||||
if (callback){
|
|
||||||
callback.call(controller);
|
|
||||||
this._lastRequest.executed = true;
|
this._lastRequest.executed = true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
1
vendor/assets/javascripts/paloma/index.js
vendored
1
vendor/assets/javascripts/paloma/index.js
vendored
|
@ -1,5 +1,6 @@
|
||||||
//= require ./init.js
|
//= require ./init.js
|
||||||
//= require ./base_controller.js
|
//= require ./base_controller.js
|
||||||
//= require ./controller_builder.js
|
//= require ./controller_builder.js
|
||||||
|
//= require ./before_callback_performer.js
|
||||||
//= require ./engine.js
|
//= require ./engine.js
|
||||||
//= require ./paloma.js
|
//= require ./paloma.js
|
||||||
|
|
Loading…
Reference in a new issue