paloma 4.0.0 → 4.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.
data/Changelog.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## Version 4.1.0
4
+ * Support for Turbolinks.
5
+ * `Paloma.executeHook()` to manually run the hook from the DOM.
6
+ * Paloma hook will be appended using all `render` calls, except for calls that has the following keys `[:json, :js, :xml, :file]`.
7
+ * Restore `Paloma.engine.start()` to start processing queued request.
8
+
9
+
3
10
  ## Version 4.0.0
4
11
  * https://github.com/kbparagua/paloma/issues/26 - Paloma requests are not saved on `session`.
5
12
  * https://github.com/kbparagua/paloma/issues/26 - Chaining with redirect is removed.
data/README.md CHANGED
@@ -276,12 +276,43 @@ class UsersController < ApplicationController
276
276
  end
277
277
  ```
278
278
 
279
+
280
+ ## Turbolinks Support
281
+
282
+ As of version `4.1.0`, Paloma is compatible with Turbolinks without additional setup.
283
+
284
+ ### Execute Paloma when user hits `Back` or `Forward` button.
285
+
286
+ Paloma executes page-specific javascript by adding a `<script>` tag to the response body. Turbolinks, by default, executes any inline javascript in the response body when you visit a page, so the `<script>` tag appended by Paloma will automatically be executed. However, when Turbolinks restores a page from cache (*this happens when a user hits `Back` or `Forward` button in his browser*) any **inline javascript will not be executed** anymore. This is the intentional behavior of Turbolinks, and it is not a bug. If you want to execute Paloma again when Turbolinks restores a page, do something like this:
287
+
288
+ ```js
289
+ $(document).on('page:restore', function(){
290
+ // Manually evaluates the appended script tag.
291
+ Paloma.executeHook();
292
+ });
293
+ ```
294
+
279
295
  ## Gotchas
280
296
 
281
- * Paloma will not execute if the response is `js`, `json`, `xml` or any other format except `html`.
297
+ * Paloma will execute on all `render` calls, except for calls with the following formats: `js`, `json`, `xml`, and `file`.
282
298
 
283
- For example: `render "something.js.erb"`
299
+ Example:
300
+
301
+ ```ruby
302
+ render :json => {:x => 1} # Paloma will not execute`
303
+ render :partial => '/path/to/partial' # Paloma will execute
304
+ ```
284
305
 
306
+ * It will cause conflicts if you have a controller and a module that has the same name.
307
+
308
+ Example:
309
+ ```js
310
+ var AdminController = Paloma.controller('Admin');
311
+
312
+ // This will override the AdminController and replace it
313
+ // with a module named 'Admin'.
314
+ var UsersController = Paloma.controller('Admin/Users');
315
+ ```
285
316
 
286
317
  ## Where to put code?
287
318
 
@@ -3,7 +3,6 @@
3
3
  <div class="js-paloma-hook" data-id="<%= id %>">
4
4
  <script type="text/javascript">
5
5
  (function(){
6
-
7
6
  // Do not continue if Paloma not found.
8
7
  if (window['Paloma'] === undefined && window['console'] !== undefined){
9
8
  console.warn("Paloma not found. Require it in your application.js.");
@@ -17,13 +16,12 @@
17
16
 
18
17
  var request = <%= request.to_json.html_safe %>;
19
18
 
20
- $(document).ready(function(){
21
- Paloma.engine.request(
22
- request['resource'],
23
- request['action'],
24
- request['params']);
25
- });
19
+ Paloma.engine.setRequest(
20
+ request['resource'],
21
+ request['action'],
22
+ request['params']);
26
23
 
24
+ $(document).ready(function(){ Paloma.engine.start(); });
27
25
  })();
28
26
  </script>
29
27
  </div>
@@ -12,7 +12,7 @@ module Paloma
12
12
  prepend_view_path "#{Paloma.root}/app/views/"
13
13
 
14
14
  before_filter :track_paloma_request
15
- after_filter :append_paloma_hook, :if => :html_is_rendered?
15
+ after_filter :append_paloma_hook, :if => :not_redirect?
16
16
  end
17
17
  end
18
18
 
@@ -138,9 +138,8 @@ module Paloma
138
138
  end
139
139
 
140
140
 
141
- def html_is_rendered?
142
- not_redirect = self.status != 302
143
- [nil, 'text/html'].include?(response.content_type) && not_redirect
141
+ def not_redirect?
142
+ self.status != 302
144
143
  end
145
144
 
146
145
 
@@ -149,7 +148,10 @@ module Paloma
149
148
  #
150
149
  def render options = nil, extra_options = {}, &block
151
150
  [:json, :js, :xml, :file].each do |format|
152
- self.paloma.clear_request if options.has_key?(format)
151
+ if options.has_key?(format)
152
+ self.paloma.clear_request
153
+ break
154
+ end
153
155
  end if options.is_a?(Hash)
154
156
 
155
157
  super
data/paloma.gemspec CHANGED
@@ -1,12 +1,13 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'paloma'
3
- s.version = '4.0.0'
3
+ s.version = '4.1.0'
4
4
  s.summary = "Provides an easy way to execute page-specific javascript for Rails."
5
5
  s.description = "Page-specific javascript for Rails done right"
6
6
  s.authors = ['Karl Paragua']
7
7
  s.email = 'kb.paragua@gmail.com'
8
8
  s.files = `git ls-files`.split("\n")
9
9
  s.homepage = 'https://github.com/kbparagua/paloma'
10
+ s.license = 'MIT'
10
11
 
11
12
  s.add_dependency 'jquery-rails'
12
13
 
@@ -16,4 +17,6 @@ Gem::Specification.new do |s|
16
17
  s.add_development_dependency 'rspec-rails', ['~> 2.0']
17
18
  s.add_development_dependency 'capybara', ['~> 1.0']
18
19
  s.add_development_dependency 'jasmine-rails', ['~> 0.4.5']
20
+ s.add_development_dependency 'turbolinks', ['~> 2.2.2']
21
+ s.add_development_dependency 'execjs', ['~> 2.1.0']
19
22
  end
@@ -12,10 +12,15 @@
12
12
  //
13
13
  //= require jquery
14
14
  //= require jquery_ujs
15
+ //= require turbolinks
15
16
  //= require paloma
16
17
  //= require_tree .
17
18
 
18
19
 
20
+ // $(document).on('page:restore', function(){
21
+ // Paloma.executeHook();
22
+ // });
23
+
19
24
 
20
25
  //
21
26
  //
@@ -1,12 +1,28 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
- <title>TestApp</title>
4
+ <title>Paloma Test App</title>
5
5
  <%= stylesheet_link_tag "application", :media => "all" %>
6
6
  <%= javascript_include_tag "application" %>
7
7
  <%= csrf_meta_tags %>
8
8
  </head>
9
9
  <body>
10
+ <h1>Paloma Test App</h1>
11
+
12
+ <div class='links'>
13
+ <ul>
14
+ <li><%= link_to 'Main#index', main_index_path %></li>
15
+ <li><%= link_to 'Main#new', new_main_path %></li>
16
+ <li><%= link_to 'Main#show', main_path(1) %></li>
17
+ <li><%= link_to 'Main#edit', edit_main_path(1) %></li>
18
+ <li><%= link_to 'Main#prevent', prevent_main_index_path %></li>
19
+ <li><%= link_to 'Main#basic_params', basic_params_main_index_path %></li>
20
+ <li><%= link_to 'Main#xml_response', xml_response_main_index_path %></li>
21
+ <li><%= link_to 'Main#file_response', file_response_main_index_path %></li>
22
+ </ul>
23
+ </div>
24
+
25
+ <hr/>
10
26
 
11
27
  <%= yield %>
12
28
 
@@ -33,5 +33,5 @@ end
33
33
 
34
34
 
35
35
  def request
36
- page.evaluate_script 'Paloma.engine.lastRequest'
36
+ page.evaluate_script 'Paloma.engine.getRequest()'
37
37
  end
@@ -2,31 +2,41 @@
2
2
 
3
3
  var Engine = function(config){
4
4
  this.factory = config.factory;
5
- this.lastRequest = null;
5
+ this._request = null;
6
6
  };
7
7
 
8
-
9
- Engine.prototype.request = function(resource, action, params){
10
- this.lastRequest = null;
11
-
12
- var Controller = this.factory.get(resource);
8
+ Engine.prototype.start = function(){
9
+ var resource = this._request['controller'],
10
+ Controller = this.factory.get(resource);
13
11
 
14
12
  if (!Controller){
15
13
  return Paloma.warn('Paloma: undefined controller -> ' + resource);
16
14
  }
17
15
 
18
- var controller = new Controller(params);
16
+ var controller = new Controller( this._request['params'] ),
17
+ action = this._request['action'],
18
+ params = this._request['params'];
19
19
 
20
20
  if (!controller[action]){
21
21
  return Paloma.warn('Paloma: undefined action <' + action +
22
22
  '> for <' + resource + '> controller');
23
23
  }
24
24
 
25
+
25
26
  Paloma.log('Paloma: Execute ' + resource + '#' + action + ' with');
26
27
  Paloma.log(params);
27
28
 
28
- controller[action]();
29
- this.lastRequest = {controller: resource, action: action, params: params};
29
+ controller[ this._request['action'] ]();
30
+ };
31
+
32
+
33
+ Engine.prototype.setRequest = function(resource, action, params){
34
+ this._request = {controller: resource, action: action, params: params};
35
+ };
36
+
37
+
38
+ Engine.prototype.getRequest = function(key){
39
+ return (!key ? this._request : this._request[key]);
30
40
  };
31
41
 
32
42
 
@@ -1,6 +1,6 @@
1
1
  //= require ./init.js
2
2
  //= require ./router.js
3
3
  //= require ./controller.js
4
- //= require ./controller_builder.js
4
+ //= require ./controller_factory.js
5
5
  //= require ./engine.js
6
6
  //= require ./paloma.js
@@ -16,4 +16,15 @@
16
16
 
17
17
  Paloma.engine = new Paloma.Engine({factory: Paloma._controllerFactory});
18
18
 
19
+
20
+ Paloma.executeHook = function(){
21
+ var $hook = $('.js-paloma-hook:first script:first');
22
+
23
+ if ($hook.length == 0){ return; }
24
+
25
+ var hook = $hook.html();
26
+ eval(hook);
27
+ };
28
+
29
+
19
30
  })(window.Paloma);
metadata CHANGED
@@ -1,136 +1,166 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: paloma
3
- version: !ruby/object:Gem::Version
4
- hash: 63
3
+ version: !ruby/object:Gem::Version
4
+ version: 4.1.0
5
5
  prerelease:
6
- segments:
7
- - 4
8
- - 0
9
- - 0
10
- version: 4.0.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Karl Paragua
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2014-02-15 00:00:00 +08:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2014-06-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: jquery-rails
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
33
22
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rails
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
39
25
  none: false
40
- requirements:
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rails
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
41
35
  - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 15
44
- segments:
45
- - 3
46
- - 2
47
- - 0
36
+ - !ruby/object:Gem::Version
48
37
  version: 3.2.0
49
38
  type: :development
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: rake
53
39
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
55
41
  none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 3
60
- segments:
61
- - 0
62
- version: "0"
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 3.2.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
63
54
  type: :development
64
- version_requirements: *id003
65
- - !ruby/object:Gem::Dependency
66
- name: rspec
67
55
  prerelease: false
68
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
69
57
  none: false
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- hash: 3
74
- segments:
75
- - 0
76
- version: "0"
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
77
70
  type: :development
78
- version_requirements: *id004
79
- - !ruby/object:Gem::Dependency
80
- name: rspec-rails
81
71
  prerelease: false
82
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec-rails
80
+ requirement: !ruby/object:Gem::Requirement
83
81
  none: false
84
- requirements:
82
+ requirements:
85
83
  - - ~>
86
- - !ruby/object:Gem::Version
87
- hash: 3
88
- segments:
89
- - 2
90
- - 0
91
- version: "2.0"
84
+ - !ruby/object:Gem::Version
85
+ version: '2.0'
92
86
  type: :development
93
- version_requirements: *id005
94
- - !ruby/object:Gem::Dependency
95
- name: capybara
96
87
  prerelease: false
97
- requirement: &id006 !ruby/object:Gem::Requirement
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '2.0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: capybara
96
+ requirement: !ruby/object:Gem::Requirement
98
97
  none: false
99
- requirements:
98
+ requirements:
100
99
  - - ~>
101
- - !ruby/object:Gem::Version
102
- hash: 15
103
- segments:
104
- - 1
105
- - 0
106
- version: "1.0"
100
+ - !ruby/object:Gem::Version
101
+ version: '1.0'
107
102
  type: :development
108
- version_requirements: *id006
109
- - !ruby/object:Gem::Dependency
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: '1.0'
110
+ - !ruby/object:Gem::Dependency
110
111
  name: jasmine-rails
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.4.5
118
+ type: :development
111
119
  prerelease: false
112
- requirement: &id007 !ruby/object:Gem::Requirement
120
+ version_requirements: !ruby/object:Gem::Requirement
113
121
  none: false
114
- requirements:
122
+ requirements:
115
123
  - - ~>
116
- - !ruby/object:Gem::Version
117
- hash: 5
118
- segments:
119
- - 0
120
- - 4
121
- - 5
124
+ - !ruby/object:Gem::Version
122
125
  version: 0.4.5
126
+ - !ruby/object:Gem::Dependency
127
+ name: turbolinks
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 2.2.2
123
134
  type: :development
124
- version_requirements: *id007
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 2.2.2
142
+ - !ruby/object:Gem::Dependency
143
+ name: execjs
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ~>
148
+ - !ruby/object:Gem::Version
149
+ version: 2.1.0
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: 2.1.0
125
158
  description: Page-specific javascript for Rails done right
126
159
  email: kb.paragua@gmail.com
127
160
  executables: []
128
-
129
161
  extensions: []
130
-
131
162
  extra_rdoc_files: []
132
-
133
- files:
163
+ files:
134
164
  - .gitignore
135
165
  - Changelog.md
136
166
  - Gemfile
@@ -196,7 +226,7 @@ files:
196
226
  - test_app/script/rails
197
227
  - test_app/spec/integration/advanced_spec.rb
198
228
  - test_app/spec/integration/basic_spec.rb
199
- - test_app/spec/javascripts/controller_builder_spec.js
229
+ - test_app/spec/javascripts/controller_factory_spec.js
200
230
  - test_app/spec/javascripts/router_spec.js
201
231
  - test_app/spec/javascripts/support/jasmine.yml
202
232
  - test_app/spec/spec_helper.rb
@@ -212,45 +242,35 @@ files:
212
242
  - test_app/vendor/assets/stylesheets/.gitkeep
213
243
  - test_app/vendor/plugins/.gitkeep
214
244
  - vendor/assets/javascripts/paloma/controller.js
215
- - vendor/assets/javascripts/paloma/controller_builder.js
245
+ - vendor/assets/javascripts/paloma/controller_factory.js
216
246
  - vendor/assets/javascripts/paloma/engine.js
217
247
  - vendor/assets/javascripts/paloma/index.js
218
248
  - vendor/assets/javascripts/paloma/init.js
219
249
  - vendor/assets/javascripts/paloma/paloma.js
220
250
  - vendor/assets/javascripts/paloma/router.js
221
- has_rdoc: true
222
251
  homepage: https://github.com/kbparagua/paloma
223
- licenses: []
224
-
252
+ licenses:
253
+ - MIT
225
254
  post_install_message:
226
255
  rdoc_options: []
227
-
228
- require_paths:
256
+ require_paths:
229
257
  - lib
230
- required_ruby_version: !ruby/object:Gem::Requirement
258
+ required_ruby_version: !ruby/object:Gem::Requirement
231
259
  none: false
232
- requirements:
233
- - - ">="
234
- - !ruby/object:Gem::Version
235
- hash: 3
236
- segments:
237
- - 0
238
- version: "0"
239
- required_rubygems_version: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - ! '>='
262
+ - !ruby/object:Gem::Version
263
+ version: '0'
264
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
265
  none: false
241
- requirements:
242
- - - ">="
243
- - !ruby/object:Gem::Version
244
- hash: 3
245
- segments:
246
- - 0
247
- version: "0"
266
+ requirements:
267
+ - - ! '>='
268
+ - !ruby/object:Gem::Version
269
+ version: '0'
248
270
  requirements: []
249
-
250
271
  rubyforge_project:
251
- rubygems_version: 1.5.2
272
+ rubygems_version: 1.8.24
252
273
  signing_key:
253
274
  specification_version: 3
254
275
  summary: Provides an easy way to execute page-specific javascript for Rails.
255
276
  test_files: []
256
-