paloma 4.2.1 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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