cells 3.8.8 → 3.9.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 (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -1
  3. data/.travis.yml +5 -2
  4. data/CHANGES.textile +23 -15
  5. data/Gemfile +1 -1
  6. data/README.md +412 -0
  7. data/Rakefile +2 -2
  8. data/cells.gemspec +5 -6
  9. data/gemfiles/Gemfile.rails3-0 +2 -2
  10. data/gemfiles/Gemfile.rails3-1 +1 -1
  11. data/gemfiles/Gemfile.rails3-2 +1 -2
  12. data/gemfiles/Gemfile.rails4-0 +7 -0
  13. data/lib/cell.rb +27 -0
  14. data/lib/cell/base.rb +31 -18
  15. data/lib/cell/builder.rb +11 -10
  16. data/lib/cell/dsl.rb +7 -0
  17. data/lib/cell/rack.rb +5 -9
  18. data/lib/cell/rails.rb +19 -11
  19. data/lib/cell/rails/view_model.rb +115 -0
  20. data/lib/cell/rails3_0_strategy.rb +1 -1
  21. data/lib/cell/rails3_1_strategy.rb +1 -1
  22. data/lib/cell/rails4_0_strategy.rb +1 -2
  23. data/lib/cell/test_case.rb +11 -11
  24. data/lib/cells.rb +4 -3
  25. data/lib/cells/rails.rb +16 -3
  26. data/lib/cells/version.rb +1 -1
  27. data/test/app/cells/bassist_cell.rb +9 -1
  28. data/test/app/cells/rails_helper_api_test/bassist/edit.html.erb +3 -3
  29. data/test/app/cells/song/dashboard.haml +7 -0
  30. data/test/app/cells/song/details.html.haml +1 -0
  31. data/test/app/cells/song/info.html.haml +1 -0
  32. data/test/app/cells/song/lyrics.html.haml +6 -0
  33. data/test/app/cells/song/plays.haml +1 -0
  34. data/test/app/cells/song/show.html.haml +3 -0
  35. data/test/app/cells/song/title.html.haml +1 -0
  36. data/test/app/cells/view_model_test/comments/show.haml +7 -0
  37. data/test/cell_module_test.rb +39 -41
  38. data/test/cell_test.rb +28 -0
  39. data/test/dummy/app/views/musician/featured_with_block.html.erb +1 -1
  40. data/test/dummy/app/views/musician/title.erb +1 -0
  41. data/test/dummy/config/routes.rb +1 -0
  42. data/test/helper_test.rb +13 -10
  43. data/test/rails/caching_test.rb +75 -73
  44. data/test/rails/cells_test.rb +25 -23
  45. data/test/rails/integration_test.rb +80 -61
  46. data/test/rails/view_model_test.rb +119 -0
  47. data/test/rails_helper_api_test.rb +11 -13
  48. metadata +41 -61
  49. data/README.rdoc +0 -279
  50. data/about.yml +0 -7
  51. data/test/app/cells/producer/capture.html.erb +0 -1
  52. data/test/app/cells/producer/content_for.html.erb +0 -2
  53. data/test/rails/capture_test.rb +0 -70
@@ -1,4 +1,4 @@
1
1
  <% flag = false %>
2
- <%= render_cell :bassist, :play do |cell|
2
+ <%= render_cell :bassist, :slap do |cell|
3
3
  flag = cell.class
4
4
  end %> from <%= flag %>
@@ -0,0 +1 @@
1
+ <%= cell("controller_methods_test/song", :title => "First Call").title %>
@@ -1,4 +1,5 @@
1
1
  Dummy::Application.routes.draw do
2
2
  get ':controller(/:action(/:id(.:format)))'
3
3
  resources :musicians
4
+ resources :songs
4
5
  end
data/test/helper_test.rb CHANGED
@@ -9,7 +9,7 @@ end
9
9
 
10
10
  class DrummerCell < Cell::Rails
11
11
  helper StringHelper
12
-
12
+
13
13
  def assist
14
14
  render :inline => "<%= pick %>"
15
15
  end
@@ -18,19 +18,22 @@ end
18
18
 
19
19
  class HelperTest < MiniTest::Spec
20
20
  include Cell::TestCase::TestMethods
21
-
21
+
22
22
  describe "a cell with included helper modules" do
23
23
  class SongCell < Cell::Rails
24
24
  include ActionView::Helpers::TagHelper # for Rails 3.0.
25
25
  include ActionView::Helpers::AssetTagHelper
26
26
 
27
27
  def show
28
+ controller.config.relative_url_root = "" if Cell.rails3_0?
28
29
  image_tag("no-more-the-meek.jpg")
29
30
  end
30
31
  end
31
32
 
32
33
  it "allows using helpers using #controller on instance level" do
33
- assert_equal "<img alt=\"No-more-the-meek\" src=\"/images/no-more-the-meek.jpg\" />", render_cell("helper_test/song", :show)
34
+ alt = "No-more-the-meek"
35
+ alt = "No more the meek" if Cell.rails4_0_or_more?
36
+ assert_equal "<img alt=\"#{alt}\" src=\"/images/no-more-the-meek.jpg\" />", render_cell("helper_test/song", :show)
34
37
  end
35
38
  end
36
39
 
@@ -42,32 +45,32 @@ class HelperTest < MiniTest::Spec
42
45
  render :inline => "<%= submit_tag %>"
43
46
  end
44
47
  end
45
-
48
+
46
49
  assert_equal "<input name=\"commit\" type=\"submit\" value=\"Save changes\" />", render_cell(:bassist, :assist)
47
50
  end
48
-
51
+
49
52
  it "have access to methods declared with #helper_method" do
50
53
  BassistCell.class_eval do
51
54
  def help; "Great!"; end
52
55
  helper_method :help
53
-
56
+
54
57
  def assist
55
58
  render :inline => "<%= help %>"
56
59
  end
57
60
  end
58
-
61
+
59
62
  assert_equal "Great!", render_cell(:bassist, :assist)
60
63
  end
61
-
64
+
62
65
  it "have access to methods provided by helper" do
63
66
  assert_equal "plong", render_cell(:drummer, :assist)
64
67
  end
65
-
68
+
66
69
  it "mix in required helpers, only" do
67
70
  assert_equal "false true", render_cell(:"club_security/medic", :help)
68
71
  assert_equal "true false", render_cell(:"club_security/guard", :help)
69
72
  end
70
-
73
+
71
74
  it "include helpers only once" do
72
75
  assert_equal "false true", render_cell(:"club_security/medic", :help)
73
76
  assert_equal "true false", render_cell(:"club_security/guard", :help)
@@ -3,12 +3,12 @@ require 'test_helper'
3
3
 
4
4
  class DirectorCell < Cell::Rails
5
5
  attr_reader :count
6
-
6
+
7
7
  def initialize(*)
8
8
  super
9
9
  @count = 0
10
10
  end
11
-
11
+
12
12
  cache :tock
13
13
  def tock
14
14
  @count += 1
@@ -23,20 +23,20 @@ end
23
23
 
24
24
  class CachingUnitTest < MiniTest::Spec
25
25
  include Cell::TestCase::TestMethods
26
-
26
+
27
27
  before :each do
28
28
  ActionController::Base.cache_store.clear
29
29
  ActionController::Base.perform_caching = true
30
30
  @cell = cell(:director)
31
31
  @class = @cell.class
32
32
  end
33
-
34
-
33
+
34
+
35
35
  describe ".state_cache_key" do
36
36
  it "accept state only" do
37
37
  assert_equal "cells/director/count/", @class.state_cache_key(:count)
38
38
  end
39
-
39
+
40
40
  it "accept hash as key parts" do
41
41
  if Cell.rails4_0_or_more?
42
42
  assert_equal "cells/director/count/b/2/a/1", @class.state_cache_key(:count, :b=>2, :a=>1)
@@ -44,64 +44,64 @@ class CachingUnitTest < MiniTest::Spec
44
44
  assert_equal "cells/director/count/a=1&b=2", @class.state_cache_key(:count, :b=>2, :a=>1)
45
45
  end
46
46
  end
47
-
47
+
48
48
  it "accept array as key parts" do
49
49
  assert_equal "cells/director/count/1/2/3", @class.state_cache_key(:count, [1,2,3])
50
50
  end
51
-
51
+
52
52
  it "accept string as key parts" do
53
53
  assert_equal "cells/director/count/1/2", @class.state_cache_key(:count, "1/2")
54
54
  end
55
-
55
+
56
56
  it "accept nil as key parts" do
57
57
  assert_equal "cells/director/count/", @class.state_cache_key(:count, nil)
58
58
  end
59
59
  end
60
-
61
-
60
+
61
+
62
62
  describe "#state_cached?" do
63
63
  it "return true for cached" do
64
64
  assert @cell.send :state_cached?, :tock
65
65
  end
66
-
66
+
67
67
  it "return false otherwise" do
68
68
  assert_not @cell.send :state_cached?, :sing
69
69
  end
70
70
  end
71
-
72
-
71
+
72
+
73
73
  describe "#cache?" do
74
74
  it "return true for cached" do
75
75
  assert @cell.cache?(:tock)
76
76
  end
77
-
77
+
78
78
  it "return false otherwise" do
79
79
  assert_not @cell.cache?(:sing)
80
80
  end
81
-
81
+
82
82
  describe "perform_caching turned off" do
83
83
  after :each do
84
84
  ::ActionController::Base.perform_caching = true
85
85
  end
86
-
86
+
87
87
  it "always return false if caching turned-off" do
88
88
  ::ActionController::Base.perform_caching = false
89
89
  assert_not @cell.cache?(:count)
90
90
  assert_not @cell.cache?(:sing)
91
91
  end
92
92
  end
93
-
93
+
94
94
  describe ".cache_store" do
95
95
  it "return Rails cache store per default" do
96
96
  assert_equal ActionController::Base.cache_store, DirectorCell.cache_store
97
97
  end
98
-
98
+
99
99
  describe "Cell::Base" do
100
100
  before :each do
101
101
  @class = Class.new(Cell::Base)
102
102
  @cell = @class.new
103
103
  end
104
-
104
+
105
105
  describe "#cache_store" do
106
106
  it "be setable from the outside" do
107
107
  assert_equal nil, @cell.cache_store
@@ -109,7 +109,7 @@ class CachingUnitTest < MiniTest::Spec
109
109
  assert_equal Object, @cell.cache_store
110
110
  end
111
111
  end
112
-
112
+
113
113
  describe "#cache_configured?" do
114
114
  it "be setable from the outside" do
115
115
  assert_equal nil, @cell.cache_configured?
@@ -117,38 +117,38 @@ class CachingUnitTest < MiniTest::Spec
117
117
  assert_equal true, @cell.cache_configured?
118
118
  end
119
119
  end
120
-
120
+
121
121
  end
122
122
  end
123
123
  end
124
-
125
-
124
+
125
+
126
126
  describe ".expire_cache_key" do
127
127
  before :each do
128
128
  @key = @class.state_cache_key(:tock)
129
129
  assert_equal "1", render_cell(:director, :tock)
130
130
  assert_equal "1", @class.cache_store.read(@key)
131
131
  end
132
-
132
+
133
133
  it "delete the state from cache" do
134
134
  @class.expire_cache_key(@key)
135
135
  assert_not @class.cache_store.read(@key)
136
136
  end
137
-
137
+
138
138
  it "be available in controllers for sweepers" do
139
139
  MusicianController.new.expire_cell_state(DirectorCell, :tock)
140
140
  assert_not @class.cache_store.read(@key)
141
141
  end
142
-
142
+
143
143
  it "accept cache options" do
144
144
  key = @class.state_cache_key(:tock, :volume => 9)
145
145
  assert Cell::Rails.cache_store.write(key, 'ONE!')
146
-
146
+
147
147
  MusicianController.new.expire_cell_state(DirectorCell, :tock, :volume => 9)
148
148
  assert_equal "1", @class.cache_store.read(@key)
149
149
  assert_not ::Cell::Rails.cache_store.read(key)
150
150
  end
151
-
151
+
152
152
  include ActiveSupport::Testing::Deprecation
153
153
  it "raise a deprecation notice when passing in a :symbol" do
154
154
  assert_deprecated do
@@ -157,45 +157,45 @@ class CachingUnitTest < MiniTest::Spec
157
157
  assert_not @class.cache_store.read(@key)
158
158
  end
159
159
  end
160
-
161
-
160
+
161
+
162
162
  describe ".cache" do
163
163
  let (:proc) { Proc.new {} }
164
164
  let (:parent) { Class.new(Cell::Base) }
165
165
  let (:brother) { Class.new(parent) }
166
166
  let (:sister) { Class.new(parent) }
167
-
167
+
168
168
  it "accept a state name, only" do
169
169
  @class.cache :count
170
-
170
+
171
171
  assert_not @class.version_procs[:count]
172
172
  assert_equal({}, @class.cache_options[:count])
173
173
  end
174
-
174
+
175
175
  it "accept state and cache options" do
176
176
  @class.cache :count, :expires_in => 10.minutes
177
-
177
+
178
178
  assert_not @class.version_procs[:count]
179
179
  assert_equal({:expires_in => 10.minutes}, @class.cache_options[:count])
180
180
  end
181
-
181
+
182
182
  it "accept args and versioner block" do
183
183
  @class.cache :count, :expires_in => 10.minutes do "v1" end
184
184
 
185
185
  assert_kind_of Proc, @class.version_procs[:count]
186
186
  assert_equal({:expires_in => 10.minutes}, @class.cache_options[:count])
187
187
  end
188
-
188
+
189
189
  it "stil accept a versioner proc, only" do
190
190
  @class.cache :count, proc
191
-
191
+
192
192
  assert_equal proc, @class.version_procs[:count]
193
193
  assert_equal({}, @class.cache_options[:count])
194
194
  end
195
-
195
+
196
196
  it "stil accept a versioner block" do
197
197
  @class.cache :count do "v1" end
198
-
198
+
199
199
  assert_kind_of Proc, @class.version_procs[:count]
200
200
  assert_equal({}, @class.cache_options[:count])
201
201
  end
@@ -239,21 +239,21 @@ class CachingFunctionalTest < MiniTest::Spec
239
239
  ActionController::Base.cache_store.clear
240
240
  ActionController::Base.perform_caching = true
241
241
  #setup # from Cell::TestCase::TestMethods
242
-
242
+
243
243
  @cell = cell(:director)
244
244
  @class = @cell.class
245
245
  end
246
-
246
+
247
247
  describe "turned off" do
248
248
  it "not invoke caching" do
249
249
  ::ActionController::Base.perform_caching = false
250
-
250
+
251
251
  assert_equal "1", @cell.render_state(:tock)
252
252
  assert_equal "2", @cell.render_state(:tock)
253
253
  end
254
- end
255
-
256
-
254
+ end
255
+
256
+
257
257
  describe "without options" do
258
258
  it "cache forever" do
259
259
  @class.cache :tock
@@ -261,8 +261,8 @@ class CachingFunctionalTest < MiniTest::Spec
261
261
  assert_equal "1", render_cell(:director, :tock)
262
262
  end
263
263
  end
264
-
265
-
264
+
265
+
266
266
  describe "uncached states" do
267
267
  it "not cache at all" do
268
268
  @class.class_eval do
@@ -271,12 +271,12 @@ class CachingFunctionalTest < MiniTest::Spec
271
271
  render :text => (@count += 1)
272
272
  end
273
273
  end
274
-
274
+
275
275
  assert_equal "1", @cell.render_state(:dictate)
276
276
  assert_equal "2", @cell.render_state(:dictate)
277
277
  end
278
278
  end
279
-
279
+
280
280
  describe "with versioner" do
281
281
  before do
282
282
  @class.class_eval do
@@ -285,19 +285,19 @@ class CachingFunctionalTest < MiniTest::Spec
285
285
  end
286
286
  end
287
287
  end
288
-
288
+
289
289
  it "compute the key with a block receiving state-args" do
290
290
  @class.cache :count do |cell, int|
291
291
  (int % 2)==0 ? {:count => "even"} : {:count => "odd"}
292
292
  end
293
293
  # example cache key: cells/director/count/count=odd
294
-
294
+
295
295
  assert_equal "1", render_cell(:director, :count, 1)
296
296
  assert_equal "2", render_cell(:director, :count, 2)
297
297
  assert_equal "1", render_cell(:director, :count, 3)
298
298
  assert_equal "2", render_cell(:director, :count, 4)
299
299
  end
300
-
300
+
301
301
  it "compute the key with an instance method" do
302
302
  @class.cache :count, :version
303
303
  @class.class_eval do
@@ -306,33 +306,33 @@ class CachingFunctionalTest < MiniTest::Spec
306
306
  (int % 2)==0 ? {:count => "even"} : {:count => "odd"}
307
307
  end
308
308
  end
309
-
309
+
310
310
  assert_equal "1", render_cell(:director, :count, 1)
311
311
  assert_equal "2", render_cell(:director, :count, 2)
312
312
  assert_equal "1", render_cell(:director, :count, 3)
313
313
  assert_equal "2", render_cell(:director, :count, 4)
314
314
  end
315
-
315
+
316
316
  it "allow returning strings, too" do
317
317
  @class.cache :count do |cell, int|
318
318
  (int % 2)==0 ? "even" : "odd"
319
319
  end
320
-
320
+
321
321
  assert_equal "1", render_cell(:director, :count, 1)
322
322
  assert_equal "2", render_cell(:director, :count, 2)
323
323
  assert_equal "1", render_cell(:director, :count, 3)
324
324
  assert_equal "2", render_cell(:director, :count, 4)
325
325
  end
326
-
326
+
327
327
  it "be able to use caching conditionally" do
328
328
  @class.cache :count, :if => proc { |cell, int| (int % 2) != 0 }
329
-
329
+
330
330
  assert_equal "1", render_cell(:director, :count, 1)
331
331
  assert_equal "2", render_cell(:director, :count, 2)
332
332
  assert_equal "1", render_cell(:director, :count, 3)
333
333
  assert_equal "4", render_cell(:director, :count, 4)
334
334
  end
335
-
335
+
336
336
  it "cache conditionally with an instance method" do
337
337
  @class.cache :count, :if => :odd?
338
338
  @class.class_eval do
@@ -340,43 +340,45 @@ class CachingFunctionalTest < MiniTest::Spec
340
340
  (int % 2) != 0
341
341
  end
342
342
  end
343
-
343
+
344
344
  assert_equal "1", render_cell(:director, :count, 1)
345
345
  assert_equal "2", render_cell(:director, :count, 2)
346
346
  assert_equal "1", render_cell(:director, :count, 3)
347
347
  assert_equal "4", render_cell(:director, :count, 4)
348
348
  end
349
-
349
+
350
350
  it "allow using a different cache store" do
351
351
  class BassistCell < Cell::Base
352
352
  cache :play
353
-
353
+
354
354
  def play(song)
355
355
  render :text => song
356
356
  end
357
357
  end
358
-
358
+
359
359
  @cell = BassistCell.new
360
-
360
+
361
361
  assert_equal "New Years", @cell.render_state(:play, "New Years")
362
362
  assert_equal "Liar", @cell.render_state(:play, "Liar")
363
-
363
+
364
364
  @cell.cache_configured = true
365
365
  @cell.cache_store = ActiveSupport::Cache::MemoryStore.new
366
-
366
+
367
367
  assert_equal "New Years", @cell.render_state(:play, "New Years")
368
368
  assert_equal "New Years", @cell.render_state(:play, "Liar")
369
369
  end
370
370
  end
371
371
 
372
- describe "utf-8" do
373
- before do
374
- @key = @class.state_cache_key(:utf8)
375
- end
372
+ unless ::ActionPack::VERSION::MAJOR == 3 and ::ActionPack::VERSION::MINOR >= 2 # bug in 3.2.
373
+ describe "utf-8" do
374
+ before do
375
+ @key = @class.state_cache_key(:utf8)
376
+ end
376
377
 
377
- it "have the correct encoding when reading from cache" do
378
- assert_equal "UTF-8", render_cell(:director, :utf8).encoding.to_s
379
- assert_equal "UTF-8", @class.cache_store.read(@key).encoding.to_s
378
+ it "have the correct encoding when reading from cache" do
379
+ assert_equal "UTF-8", render_cell(:director, :utf8).encoding.to_s
380
+ assert_equal "UTF-8", @class.cache_store.read(@key).encoding.to_s
381
+ end
380
382
  end
381
383
  end
382
384
  end