cells 3.8.8 → 3.9.0

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