paloma 4.2.1 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +5 -5
  2. data/app/views/paloma/_hook.html.erb +10 -13
  3. data/lib/paloma/action_controller_extension.rb +4 -4
  4. data/lib/paloma/controller.rb +13 -4
  5. data/lib/paloma/test_helper.rb +7 -0
  6. data/vendor/assets/javascripts/paloma/base_controller.js +8 -0
  7. data/vendor/assets/javascripts/paloma/before_callback_performer.js +69 -0
  8. data/vendor/assets/javascripts/paloma/controller_builder.js +36 -0
  9. data/vendor/assets/javascripts/paloma/controller_class_factory.js +62 -0
  10. data/vendor/assets/javascripts/paloma/engine.js +59 -53
  11. data/vendor/assets/javascripts/paloma/index.js +5 -4
  12. data/vendor/assets/javascripts/paloma/init.js +5 -10
  13. data/vendor/assets/javascripts/paloma/paloma.js +20 -21
  14. metadata +18 -88
  15. data/.gitignore +0 -5
  16. data/Changelog.md +0 -42
  17. data/DEVELOPMENT.md +0 -15
  18. data/Gemfile +0 -2
  19. data/License +0 -22
  20. data/README.md +0 -353
  21. data/TODO.md +0 -1
  22. data/paloma.gemspec +0 -22
  23. data/test_app/.gitignore +0 -15
  24. data/test_app/.rspec +0 -1
  25. data/test_app/Gemfile +0 -5
  26. data/test_app/README.rdoc +0 -261
  27. data/test_app/Rakefile +0 -11
  28. data/test_app/app/assets/images/rails.png +0 -0
  29. data/test_app/app/assets/javascripts/admin/bar.js +0 -2
  30. data/test_app/app/assets/javascripts/application.js +0 -68
  31. data/test_app/app/assets/stylesheets/admin/bar.css +0 -4
  32. data/test_app/app/assets/stylesheets/application.css +0 -13
  33. data/test_app/app/assets/stylesheets/foo.css +0 -4
  34. data/test_app/app/assets/stylesheets/main.css +0 -4
  35. data/test_app/app/assets/stylesheets/multiple_names.css +0 -4
  36. data/test_app/app/controllers/admin/foos_controller.rb +0 -29
  37. data/test_app/app/controllers/application_controller.rb +0 -3
  38. data/test_app/app/controllers/main_controller.rb +0 -111
  39. data/test_app/app/helpers/admin/bar_helper.rb +0 -2
  40. data/test_app/app/helpers/application_helper.rb +0 -2
  41. data/test_app/app/helpers/foo_helper.rb +0 -2
  42. data/test_app/app/helpers/main_helper.rb +0 -2
  43. data/test_app/app/helpers/multiple_names_helper.rb +0 -2
  44. data/test_app/app/mailers/.gitkeep +0 -0
  45. data/test_app/app/models/.gitkeep +0 -0
  46. data/test_app/app/views/layouts/application.html.erb +0 -40
  47. data/test_app/app/views/main/ajax.html.erb +0 -2
  48. data/test_app/config.ru +0 -4
  49. data/test_app/config/application.rb +0 -69
  50. data/test_app/config/boot.rb +0 -6
  51. data/test_app/config/environment.rb +0 -5
  52. data/test_app/config/environments/development.rb +0 -37
  53. data/test_app/config/environments/production.rb +0 -67
  54. data/test_app/config/environments/test.rb +0 -37
  55. data/test_app/config/initializers/backtrace_silencers.rb +0 -7
  56. data/test_app/config/initializers/inflections.rb +0 -15
  57. data/test_app/config/initializers/mime_types.rb +0 -5
  58. data/test_app/config/initializers/secret_token.rb +0 -7
  59. data/test_app/config/initializers/session_store.rb +0 -8
  60. data/test_app/config/initializers/wrap_parameters.rb +0 -14
  61. data/test_app/config/locales/en.yml +0 -5
  62. data/test_app/config/routes.rb +0 -28
  63. data/test_app/db/seeds.rb +0 -7
  64. data/test_app/doc/README_FOR_APP +0 -2
  65. data/test_app/lib/assets/.gitkeep +0 -0
  66. data/test_app/lib/tasks/.gitkeep +0 -0
  67. data/test_app/log/.gitkeep +0 -0
  68. data/test_app/public/404.html +0 -26
  69. data/test_app/public/422.html +0 -26
  70. data/test_app/public/500.html +0 -25
  71. data/test_app/public/favicon.ico +0 -0
  72. data/test_app/public/robots.txt +0 -5
  73. data/test_app/script/rails +0 -6
  74. data/test_app/spec/integration/advanced_spec.rb +0 -64
  75. data/test_app/spec/integration/basic_spec.rb +0 -195
  76. data/test_app/spec/javascripts/controller_factory_spec.js +0 -48
  77. data/test_app/spec/javascripts/router_spec.js +0 -52
  78. data/test_app/spec/javascripts/support/jasmine.yml +0 -20
  79. data/test_app/spec/spec_helper.rb +0 -37
  80. data/test_app/spec/units/controller_spec.rb +0 -109
  81. data/test_app/spec/units/utilities_spec.rb +0 -114
  82. data/test_app/test/fixtures/.gitkeep +0 -0
  83. data/test_app/test/functional/.gitkeep +0 -0
  84. data/test_app/test/integration/.gitkeep +0 -0
  85. data/test_app/test/performance/browsing_test.rb +0 -12
  86. data/test_app/test/test_helper.rb +0 -13
  87. data/test_app/test/unit/.gitkeep +0 -0
  88. data/test_app/vendor/assets/javascripts/.gitkeep +0 -0
  89. data/test_app/vendor/assets/stylesheets/.gitkeep +0 -0
  90. data/test_app/vendor/plugins/.gitkeep +0 -0
  91. data/vendor/assets/javascripts/paloma/controller.js +0 -10
  92. data/vendor/assets/javascripts/paloma/controller_factory.js +0 -55
  93. data/vendor/assets/javascripts/paloma/router.js +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c6d90c6346ffaca96320b8924a984d7b4a09d26b
4
- data.tar.gz: d77644a771b84cfbb6e55ded22be99a7a930ac90
2
+ SHA256:
3
+ metadata.gz: 4ee7609f0466009c6a9b25ec20036d427680b2843a709127d87b7a33e8c8e335
4
+ data.tar.gz: 4f6b2dc1090af53a981621caeade5fb21b11dd1ab3616b9a017cf194928372b9
5
5
  SHA512:
6
- metadata.gz: ebc6f8eafd2f25d3983ee8c253be793da6e2736deebe61fa887a28e9d71250b677f00d74d571f51bed4ddd9af72ebe1aad9c4d4fa97071c0a6572569ff7d5a22
7
- data.tar.gz: 67753deb514e0615089d462cf86130ea85c29b1b23074b3940f7a165d7b3ba38395dc048702c1ebbad7b1cb72305cd800efdbb9579ee0144cd34bb952d202056
6
+ metadata.gz: 5667955b863d020b0d86df40f0461900745e76b4f664ca26352bdabe3ea9f6170a3ac70bc1a986e38517cd1aa1e917530608cc0bb8a6f4aa55d48fbba323145e
7
+ data.tar.gz: ea1a99055633259a9806e773bd471f70068f753c84ba4603353074bf9bc570e5a825ea6c99cd1f137f8fee654855de45c49692e85148ceb41903f398568dfece
@@ -1,25 +1,22 @@
1
1
  <% id = "#{Time.now.to_i}#{(rand * 1000).ceil}" %>
2
2
 
3
- <div class="js-paloma-hook" data-id="<%= id %>">
3
+ <div class="js-paloma-hook" data-palomaid="<%= id %>">
4
4
  <script type="text/javascript">
5
5
  (function(){
6
- // Do not continue if Paloma not found.
7
- if (window['Paloma'] === undefined) {
8
- return true;
9
- }
10
6
 
7
+ if ( !window['Paloma'] ) return true;
11
8
  Paloma.env = '<%= Rails.env %>';
12
9
 
13
- // Remove any callback details if any
14
- $('.js-paloma-hook[data-id!=' + <%= id %> + ']').remove();
15
-
16
- var request = <%= request.to_json.html_safe %>;
10
+ var id = "<%= id %>",
11
+ request = <%= request.to_json.html_safe %>;
17
12
 
18
13
  Paloma.engine.setRequest({
19
- id: "<%= id %>",
20
- resource: request['resource'],
21
- action: request['action'],
22
- params: request['params']});
14
+ id: id,
15
+ resource: request.resource,
16
+ action: request.action,
17
+ params: request.params
18
+ });
19
+
23
20
  })();
24
21
  </script>
25
22
  </div>
@@ -9,9 +9,7 @@ module Paloma
9
9
 
10
10
 
11
11
  base.module_eval do
12
- prepend_view_path "#{Paloma.root}/app/views/"
13
-
14
- before_filter :track_paloma_request
12
+ before_action :track_paloma_request
15
13
  helper_method :insert_paloma_hook
16
14
  end
17
15
  end
@@ -33,7 +31,7 @@ module Paloma
33
31
  scope[:only] = options[:only] if options[:only]
34
32
  scope[:except] = options[:except] if options[:except]
35
33
 
36
- self.before_filter(
34
+ self.before_action(
37
35
  Proc.new {
38
36
  self.js path_or_options, options[:params]
39
37
  },
@@ -113,6 +111,8 @@ module Paloma
113
111
 
114
112
  self.paloma.resource ||= self.default_resource
115
113
  self.paloma.action ||= self.default_action
114
+
115
+ self.paloma.save_request_history
116
116
  end
117
117
 
118
118
 
@@ -3,10 +3,13 @@ module Paloma
3
3
 
4
4
  attr_accessor :resource, :action, :params
5
5
 
6
+ if ::Rails.env.test?
7
+ attr_reader :request_history
8
+ end
6
9
 
7
10
 
8
11
  def initialize
9
- self.clear_request
12
+ clear_request
10
13
  end
11
14
 
12
15
 
@@ -18,14 +21,20 @@ module Paloma
18
21
  true
19
22
  end
20
23
 
24
+ def save_request_history
25
+ if ::Rails.env.test?
26
+ @request_history ||= []
27
+ @request_history.push(self.request)
28
+ end
29
+ end
21
30
 
22
31
  def request
23
- {:resource => self.resource, :action => self.action, :params => self.params}
32
+ { resource: resource, action: action, params: params }
24
33
  end
25
34
 
26
35
 
27
36
  def has_request?
28
- self.resource.present? && self.action.present?
37
+ resource.present? && action.present?
29
38
  end
30
39
 
31
40
 
@@ -35,4 +44,4 @@ module Paloma
35
44
 
36
45
 
37
46
  end
38
- end
47
+ end
@@ -0,0 +1,7 @@
1
+ module Paloma
2
+ module TestHelper
3
+ def js_params
4
+ @js_params ||= @controller.send(:paloma).request_history.last[:params]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ Paloma.BaseController = function(params){
2
+ this.params = params;
3
+ };
4
+
5
+ Paloma.BaseController.prototype = {
6
+ before: []
7
+ };
8
+
@@ -0,0 +1,69 @@
1
+ Paloma.BeforeCallbackPerformer = function(controller){
2
+ this.controller = controller;
3
+ this.entries = controller.before || [];
4
+ this.action = null;
5
+ };
6
+
7
+ Paloma.BeforeCallbackPerformer.prototype = {
8
+
9
+ perform: function(action){
10
+ this.action = action;
11
+ this._executeCallbacks();
12
+ },
13
+
14
+ _executeCallbacks: function(){
15
+ for (var i = 0, n = this._callbacks().length; i < n; i++)
16
+ this._executeCallback( this._callbacks()[i] );
17
+ },
18
+
19
+ _executeCallback: function(name){
20
+ var callback = this.controller[name];
21
+ if (callback) callback.call(this.controller);
22
+ },
23
+
24
+ _callbacks: function(){
25
+ if (this._callbackList) return this._callbackList;
26
+
27
+ this._callbackList = [];
28
+
29
+ for (var i = 0, n = this.entries.length; i < n; i++){
30
+ var entry = this.entries[i];
31
+
32
+ this._callbackList =
33
+ this._callbackList.concat( this._getCallbacksIfForAction(entry) );
34
+ }
35
+
36
+ return this._callbackList;
37
+ },
38
+
39
+ _getCallbacksIfForAction: function(entry){
40
+ var parsedEntry = this._parseEntry(entry);
41
+
42
+ if (
43
+ this._actionIsOn(parsedEntry.actions) ||
44
+ this._allIsOn(parsedEntry.actions)
45
+ )
46
+ return parsedEntry.callbacks;
47
+
48
+ return [];
49
+ },
50
+
51
+ _actionIsOn: function(actions){
52
+ return actions.indexOf(this.action) != -1;
53
+ },
54
+
55
+ _allIsOn: function(actions){
56
+ return actions.indexOf('all') != -1;
57
+ },
58
+
59
+ _parseEntry: function(entry){
60
+ var parts = entry.split('->'),
61
+ data = {actions: [], callbacks: []};
62
+
63
+ if (parts[0]) data.actions = parts[0].trim().split(' ');
64
+ if (parts[1]) data.callbacks = parts[1].trim().split(' ');
65
+
66
+ return data;
67
+ }
68
+
69
+ };
@@ -0,0 +1,36 @@
1
+ Paloma.ControllerBuilder = function(classFactory){
2
+ this.classFactory = classFactory;
3
+ this.options = {};
4
+ };
5
+
6
+ Paloma.ControllerBuilder.prototype = {
7
+
8
+ build: function(options){
9
+ this.options = options;
10
+
11
+ var ControllerClass = this._controllerClass();
12
+ if ( !ControllerClass ) return null;
13
+
14
+ var controller = new ControllerClass( this._buildParams() );
15
+
16
+ controller.controller = this.options.controller;
17
+ controller.action = this.options.action;
18
+
19
+ return controller;
20
+ },
21
+
22
+ _controllerClass: function(){
23
+ return this.classFactory.get( this.options.controller );
24
+ },
25
+
26
+ _buildParams: function(){
27
+ var params = {};
28
+
29
+ for (var k in this.options.params)
30
+ if (this.options.params.hasOwnProperty(k))
31
+ params[k] = this.options.params[k];
32
+
33
+ return params;
34
+ }
35
+
36
+ };
@@ -0,0 +1,62 @@
1
+ Paloma.ControllerClassFactory = function(){
2
+ this._controllers = {};
3
+ this._inheritanceSymbol = '<';
4
+ };
5
+
6
+ Paloma.ControllerClassFactory.prototype = {
7
+
8
+ make: function(controllerAndParent, prototype){
9
+ var parts = this._extractParts(controllerAndParent),
10
+ controller = this._getOrCreate( parts.controller );
11
+
12
+ this._updatePrototype(controller, prototype);
13
+ this._updateParent(controller, parts.parent);
14
+
15
+ return controller;
16
+ },
17
+
18
+ get: function(name){
19
+ return this._controllers[name] || null;
20
+ },
21
+
22
+ _updateParent: function(controller, parent){
23
+ if (!parent) return;
24
+
25
+ var parentClass = this.get(parent);
26
+ if (parentClass) controller.prototype = Object.create(parentClass.prototype, controller.prototype);
27
+ },
28
+
29
+ _updatePrototype: function(controller, newPrototype){
30
+ for (var k in newPrototype)
31
+ if (newPrototype.hasOwnProperty(k))
32
+ controller.prototype[k] = newPrototype[k];
33
+ },
34
+
35
+ _getOrCreate: function(name){
36
+ return this.get(name) || this._create(name);
37
+ },
38
+
39
+ _create: function(name){
40
+ var controller = function(params){
41
+ Paloma.BaseController.call(this, params);
42
+ };
43
+
44
+ controller.prototype = Object.create(Paloma.BaseController.prototype);
45
+ controller.prototype.constructor = controller;
46
+
47
+ this._controllers[name] = controller;
48
+ return controller;
49
+ },
50
+
51
+ _extractParts: function(controllerAndParent){
52
+ var parts = controllerAndParent.split( this._inheritanceSymbol );
53
+
54
+ var controller = parts[0].trim(),
55
+ parent = parts[1];
56
+
57
+ if (parent) parent = parent.trim();
58
+
59
+ return {controller: controller, parent: parent};
60
+ }
61
+
62
+ };
@@ -1,71 +1,77 @@
1
- (function(Paloma){
1
+ Paloma.Engine = function(controllerBuilder){
2
+ this.controllerBuilder = controllerBuilder;
3
+ this._clearRequest();
4
+ };
2
5
 
3
- var Engine = function(config){
4
- this.factory = config.factory;
5
- this._request = null;
6
- };
6
+ Paloma.Engine.prototype = {
7
7
 
8
- Engine.prototype.start = function(){
9
- // Do not execute if there is no request available.
10
- if ( !this._request ) return;
8
+ setRequest: function(options){
9
+ this._request = {
10
+ id: options.id,
11
+ controller: options.resource,
12
+ action: options.action,
13
+ params: options.params,
14
+ executed: false
15
+ };
16
+ },
11
17
 
12
- // Do not execute if already executed.
13
- //
14
- // This happens when using turbolinks,
15
- // if a page using js(false) is rendered
16
- // after a page with executed js, then the
17
- // previous js will be executed again.
18
- if ( this._request.executed ) return;
18
+ hasRequest: function(){
19
+ return this._request != null;
20
+ },
19
21
 
20
- var resource = this._request['controller'],
21
- Controller = this.factory.get(resource);
22
+ lastRequest: function(){
23
+ return this._lastRequest = this._lastRequest || {executed: false};
24
+ },
22
25
 
23
- if (!Controller){
24
- return Paloma.warn('Paloma: undefined controller -> ' + resource);
25
- }
26
+ start: function(){
27
+ if ( this._shouldStop() ) return;
26
28
 
27
- var controller = new Controller( this._request['params'] ),
28
- action = this._request['action'],
29
- params = this._request['params'];
29
+ this._logRequest();
30
+ this._lastRequest = this._request;
30
31
 
31
- if (!controller[action]){
32
- return Paloma.warn('Paloma: undefined action <' + action +
33
- '> for <' + resource + '> controller');
34
- }
32
+ this._executeControllerAction();
33
+ this._clearRequest();
34
+ },
35
35
 
36
+ _executeControllerAction: function(){
37
+ var controller = this._buildController();
38
+ if (!controller) return;
36
39
 
37
- Paloma.log('Paloma: Execute ' + resource + '#' + action + ' with');
38
- Paloma.log(params);
40
+ var callbackPerformer = new Paloma.BeforeCallbackPerformer(controller);
41
+ callbackPerformer.perform( this._request.action );
39
42
 
40
- controller[ this._request['action'] ]();
43
+ var method = controller[ this._request.action ];
44
+ if (method) method.call(controller);
41
45
 
42
- this._request.executed = true;
43
- };
46
+ this._lastRequest.executed = true;
47
+ },
44
48
 
49
+ _buildController: function(){
50
+ return this.controllerBuilder.build({
51
+ controller: this._request.controller,
52
+ action: this._request.action,
53
+ params: this._request.params
54
+ });
55
+ },
45
56
 
46
- //
47
- // options:
48
- // resource
49
- // action
50
- // params
51
- // id
52
- //
53
- Engine.prototype.setRequest = function(options){
54
- this._request = {
55
- id: options.id,
56
- controller: options.resource,
57
- action: options.action,
58
- params: options.params,
59
- executed: false
60
- };
61
- };
57
+ _shouldStop: function(){
58
+ if ( !this.hasRequest() ) return true;
59
+ if ( this._request.id == this.lastRequest().id ) return true;
62
60
 
61
+ return false;
62
+ },
63
63
 
64
- Engine.prototype.getRequest = function(key){
65
- return (!key ? this._request : this._request[key]);
66
- };
64
+ _logRequest: function(){
65
+ Paloma.log(
66
+ 'Paloma: ' + this._request.controller + '#' +
67
+ this._request.action + ' with params:'
68
+ );
67
69
 
70
+ Paloma.log( this._request.params );
71
+ },
68
72
 
69
- Paloma.Engine = Engine;
73
+ _clearRequest: function(){
74
+ this._request = null;
75
+ }
70
76
 
71
- })(window.Paloma);
77
+ };
@@ -1,6 +1,7 @@
1
1
  //= require ./init.js
2
- //= require ./router.js
3
- //= require ./controller.js
4
- //= require ./controller_factory.js
2
+ //= require ./base_controller.js
3
+ //= require ./controller_class_factory.js
4
+ //= require ./before_callback_performer.js
5
+ //= require ./controller_builder.js
5
6
  //= require ./engine.js
6
- //= require ./paloma.js
7
+ //= require ./paloma.js