paloma 4.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
-