cells 3.8.5 → 3.8.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES.textile CHANGED
@@ -1,6 +1,12 @@
1
+ h2. 3.8.6
2
+
3
+ * @cell/base@ can now be required without trouble.
4
+ * Generated test files now respect namespaced cells.
5
+
1
6
  h2. 3.8.5
2
7
 
3
- * Fixing the bad release, sorry for the delay - my laptop got stolen.
8
+ * Added @Cell::Rails::HelperAPI@ module to provide the entire Rails view "API" (quotes on purpose!) in cells running completely outside of Rails. This makes it possible to use gems like simple_form in any Ruby environment, especially interesting for people using Sinatra, webmachine, etc.
9
+ * Moved @Caching.expire_cache_key@ to @Rails@. Use @Caching.expire_cache_key_for(key, cache_store, ..)@ if you want to expire caches outside of Rails.
4
10
 
5
11
  h2. 3.8.4
6
12
 
data/README.rdoc CHANGED
@@ -31,11 +31,11 @@ Rails 2.3:
31
31
 
32
32
  Creating a cell is nothing more than
33
33
 
34
- $ rails generate cell cart display -e haml
34
+ $ rails generate cell cart show -e haml
35
35
  create app/cells/
36
36
  create app/cells/cart
37
37
  create app/cells/cart_cell.rb
38
- create app/cells/cart/display.html.haml
38
+ create app/cells/cart/show.html.haml
39
39
  create test/cells/cart_test.rb
40
40
 
41
41
  That looks very familiar.
@@ -45,7 +45,7 @@ That looks very familiar.
45
45
  Now, render your cart. Why not put it in <tt>layouts/application.html.erb</tt> for now?
46
46
 
47
47
  <div id="header">
48
- <%= render_cell :cart, :display, :user => @current_user %>
48
+ <%= render_cell :cart, :show, :user => @current_user %>
49
49
 
50
50
  Feels like rendering a controller action. For good encapsulation we pass the current +user+ from outside into the cell - a dependency injection.
51
51
 
@@ -54,11 +54,11 @@ Feels like rendering a controller action. For good encapsulation we pass the cur
54
54
  Time to improve our cell code. Let's start with <tt>app/cells/cart_cell.rb</tt>:
55
55
 
56
56
  class CartCell < Cell::Rails
57
- def display(args)
57
+ def show(args)
58
58
  user = args[:user]
59
59
  @items = user.items_in_cart
60
60
 
61
- render # renders display.html.haml
61
+ render # renders show.html.haml
62
62
  end
63
63
  end
64
64
 
@@ -67,7 +67,7 @@ Is that a controller? Hell, yeah. We even got a +#render+ method as we know it f
67
67
 
68
68
  == Views
69
69
 
70
- Since a plain call to +#render+ will start rendering <tt>app/cells/cart/display.html.haml</tt> we should put some meaningful markup there.
70
+ Since a plain call to +#render+ will start rendering <tt>app/cells/cart/show.html.haml</tt> we should put some meaningful markup there.
71
71
 
72
72
  #cart
73
73
  You have #{@items.size} items in your shopping cart.
@@ -94,6 +94,14 @@ The distinction between partials and views is making things more complex, so why
94
94
  %p
95
95
  = render :view => 'items'
96
96
 
97
+ === Rendering Global Partials
98
+
99
+ Sometimes you need to render a global partial from <tt>app/views</tt> within a cell. For instance, the +gmaps4rails+ helper depends on a global partial. While this breaks encapsulation it's still possible in cells - just add the global view path.
100
+
101
+ class MapCell < Cell::Rails
102
+ append_view_path "app/views"
103
+
104
+
97
105
  == View Inheritance
98
106
 
99
107
  This is where OOP comes back to your view.
@@ -122,18 +130,18 @@ will render the configured +UnauthorizedUserCell+ instead of the original +Login
122
130
  Cells do strict view caching. No cluttered fragment caching. Add
123
131
 
124
132
  class CartCell < Cell::Rails
125
- cache :display, :expires_in => 10.minutes
133
+ cache :show, :expires_in => 10.minutes
126
134
 
127
135
  and your cart will be re-rendered after 10 minutes.
128
136
 
129
137
  You can expand the state's cache key - why not use a versioner block to do just this?
130
138
 
131
139
  class CartCell < Cell::Rails
132
- cache :display do |cell, options|
140
+ cache :show do |cell, options|
133
141
  options[:items].md5
134
142
  end
135
143
 
136
- The block's return value is appended to the state key: <tt>"cells/cart/display/0ecb1360644ce665a4ef"</tt>.
144
+ The block's return value is appended to the state key: <tt>"cells/cart/show/0ecb1360644ce665a4ef"</tt>.
137
145
 
138
146
  Check the {API to learn more}[http://rdoc.info/gems/cells/Cell/Caching/ClassMethods#cache-instance_method].
139
147
 
@@ -146,8 +154,8 @@ Another big advantage compared to monolithic controller/helper/partial piles is
146
154
  So what if you wanna test the cart cell? Use the generated <tt>test/cells/cart_cell_test.rb</tt> test.
147
155
 
148
156
  class CartCellTest < Cell::TestCase
149
- test "display" do
150
- invoke :display, :user => @user_fixture
157
+ test "show" do
158
+ invoke :show, :user => @user_fixture
151
159
  assert_select "#cart", "You have 3 items in your shopping cart."
152
160
  end
153
161
 
@@ -186,11 +194,54 @@ In your <tt>routes.rb</tt> file, mount the cell like a Rack app.
186
194
  [ 200, {}, [ Cell::Base.render_cell_for(:post, :show) ]]
187
195
  }
188
196
 
197
+ === Cells in ActionMailer
198
+
199
+ ActionMailer doesn't have request object, so if you inherit from Cell::Rails you will receive an error. Cell::Base will fix that problem, but you will not be able to use any of routes inside your cells.
200
+
201
+ You can fix that with {actionmailer_with_request}[https://github.com/weppos/actionmailer_with_request] which (suprise!) brings request object to the ActionMailer.
202
+
203
+ == Using Rails Gems Like simple_form Outside Of Rails
204
+
205
+ Cells can be used outside of Rails. A new module brought in 3.8.5 provides the Rails view "API" making it possible to use gems like the popular {simple_form}[https://github.com/plataformatec/simple_form] outside Rails!
206
+
207
+ All you need to do is providing the cell with some helpers, usually it's the polymorphic routing paths required by the gems.
208
+
209
+ module RoutingHelpers
210
+ def musician_path(model)
211
+ "/musicians/#{model.id}"
212
+ end
213
+ end
214
+
215
+ Then, use the Cell::Rails::HelperAPI module and it should work fine (depending on the quality of the gem you're desiring to use).
216
+
217
+ require 'cell/base'
218
+ require "cell/rails/helper_api"
219
+ require "simple_form"
220
+
221
+ class BassistCell < Cell::Base
222
+ include Cell::Rails::HelperAPI
223
+
224
+ self._helpers = RoutingHelpers
225
+
226
+ def show
227
+ @musician = Musician.find(:first)
228
+ end
229
+ end
230
+
231
+ Your views can now use the gem's helpers.
232
+
233
+ <%= simple_form_for @musician do |f| %>
234
+ <%= f.input :name %>
235
+ <%= f.button :submit %>
236
+ <% end %>
237
+
238
+ Note that this currently "only" works with Rails 3.2.
239
+
189
240
  == Cells is Rails::Engine aware!
190
241
 
191
242
  Now <tt>Rails::Engine</tt>s can contribute to Cells view paths. By default, any 'app/cells' found inside any Engine is automatically included into Cells view paths. If you need to, you can customize the view paths changing/appending to the <tt>'app/cell_views'</tt> path configuration. See the @Cell::EngineIntegration@ for more details.
192
243
 
193
- == Custom base class
244
+ == Generators
194
245
 
195
246
  By default, generated cells inherit from <code>Cell::Rails</code>. If you want to change this, specify your new class name in <code>config/application.rb</code>:
196
247
 
data/cells.gemspec CHANGED
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
26
26
  s.add_development_dependency "shoulda"
27
27
  s.add_development_dependency "haml"
28
28
  s.add_development_dependency "slim"
29
+ s.add_development_dependency "simple_form"
29
30
  s.add_development_dependency "tzinfo" # FIXME: why the hell do we need this for 3.1?
30
31
  s.add_development_dependency "minitest", ">= 2.8.1"
31
32
  end
data/lib/cell/base.rb CHANGED
@@ -2,10 +2,21 @@ require 'abstract_controller'
2
2
  require 'cell/builder'
3
3
  require 'cell/caching'
4
4
  require 'cell/rendering'
5
- require 'cell/rails3_0_strategy' if Cells.rails3_0?
6
- require 'cell/rails3_1_strategy' if Cells.rails3_1_or_more?
7
5
 
8
6
  module Cell
7
+ def self.rails3_0?
8
+ ::ActionPack::VERSION::MINOR == 0
9
+ end
10
+
11
+ def self.rails3_1_or_more?
12
+ ::ActionPack::VERSION::MINOR >= 1
13
+ end
14
+
15
+ def self.rails3_2_or_more? # FIXME: move to tests.
16
+ ::ActionPack::VERSION::MINOR >= 2
17
+ end
18
+
19
+
9
20
  class Base < AbstractController::Base
10
21
  abstract!
11
22
  DEFAULT_VIEW_PATHS = [File.join('app', 'cells')]
@@ -14,11 +25,20 @@ module Cell
14
25
  include AbstractController
15
26
  include AbstractController::Rendering, Layouts, Helpers, Callbacks, Translation, Logger
16
27
 
28
+ require 'cell/rails3_0_strategy' if Cell.rails3_0?
29
+ require 'cell/rails3_1_strategy' if Cell.rails3_1_or_more?
17
30
  include VersionStrategy
18
31
  include Rendering
19
32
  include Caching
20
33
 
21
34
  class View < ActionView::Base
35
+ def self.prepare(modules)
36
+ # TODO: remove for 4.0 if PR https://github.com/rails/rails/pull/6826 is merged.
37
+ Class.new(self) do # DISCUSS: why are we mixing that stuff into this _anonymous_ class at all? that makes things super complicated.
38
+ include *modules.reverse
39
+ end
40
+ end
41
+
22
42
  def render(*args, &block)
23
43
  options = args.first.is_a?(::Hash) ? args.first : {} # this is copied from #render by intention.
24
44
 
@@ -28,6 +48,12 @@ module Cell
28
48
  end
29
49
 
30
50
 
51
+ def self.view_context_class
52
+ @view_context_class ||= begin
53
+ Cell::Base::View.prepare(helper_modules)
54
+ end
55
+ end
56
+
31
57
  # Called in Railtie at initialization time.
32
58
  def self.setup_view_paths!
33
59
  self.view_paths = self::DEFAULT_VIEW_PATHS
data/lib/cell/caching.rb CHANGED
@@ -60,25 +60,15 @@ module Cell
60
60
  self.cache_options = cache_options.merge(state => options)
61
61
  end
62
62
 
63
- def cache_store
64
- # DISCUSS: move to instance level and delegate to #config/#parent_controller.
65
- # This would allow convenient cache settings per cell (if needed).
66
- ::ActionController::Base.cache_store
67
- end
68
-
69
63
  # Computes the complete, namespaced cache key for +state+.
70
64
  def state_cache_key(state, key_parts={})
71
65
  expand_cache_key([controller_path, state, key_parts])
72
66
  end
73
67
 
74
- def expire_cache_key(key, *args)
68
+ def expire_cache_key_for(key, cache_store, *args)
75
69
  cache_store.delete(key, *args)
76
70
  end
77
71
 
78
- def cache?(state)
79
- # DISCUSS: why is it private?
80
- ActionController::Base.send(:cache_configured?) and state_cached?(state)
81
- end
82
72
 
83
73
  protected
84
74
  # Compiles cache key and adds :cells namespace to +key+, according to the
@@ -86,28 +76,36 @@ module Cell
86
76
  def expand_cache_key(key)
87
77
  ::ActiveSupport::Cache.expand_cache_key(key, :cells)
88
78
  end
89
-
90
- def state_cached?(state)
91
- version_procs.has_key?(state)
92
- end
93
79
  end
94
80
 
81
+
95
82
  def render_state(state, *args)
96
83
  return super(state, *args) unless cache?(state, *args)
97
84
 
98
85
  key = self.class.state_cache_key(state, call_state_versioner(state, *args))
99
86
  options = self.class.cache_options[state]
100
87
 
101
- self.class.cache_store.fetch(key, options) do
88
+ cache_store.fetch(key, options) do
102
89
  super(state, *args)
103
90
  end
104
91
  end
105
92
 
93
+ def cache_configured?
94
+ @cache_configured
95
+ end
96
+ attr_writer :cache_configured
97
+
98
+ attr_accessor :cache_store # we want to use DI to set a cache store in cell/rails.
99
+
106
100
  def cache?(state, *args)
107
- self.class.cache?(state) and call_state_conditional(state, *args)
101
+ cache_configured? and state_cached?(state) and call_state_conditional(state, *args)
108
102
  end
109
103
 
110
104
  protected
105
+ def state_cached?(state)
106
+ self.class.version_procs.has_key?(state)
107
+ end
108
+
111
109
  def call_proc_or_method(state, method, *args)
112
110
  return method.call(self, *args) if method.kind_of?(Proc)
113
111
  send(method, *args)
data/lib/cell/rails.rb CHANGED
@@ -2,12 +2,24 @@ require 'cell/rack'
2
2
 
3
3
  module Cell
4
4
  class Rails < Rack
5
+ # When this file is included we can savely assume that a rails environment with caching, etc. is available.
5
6
  include ActionController::RequestForgeryProtection
6
7
 
7
8
  abstract!
8
9
  delegate :session, :params, :request, :config, :env, :url_options, :to => :parent_controller
9
10
 
10
11
  class << self
12
+ def cache_store
13
+ # FIXME: i'd love to have an initializer in the cells gem that _sets_ the cache_store attr instead of overriding here.
14
+ # since i dunno how to do that we'll have this method in rails for now.
15
+ # DISCUSS: should this be in Cell::Rails::Caching ?
16
+ ActionController::Base.cache_store
17
+ end
18
+
19
+ def expire_cache_key(key, *args) # FIXME: move to Rails.
20
+ expire_cache_key_for(key, cache_store ,*args)
21
+ end
22
+
11
23
  private
12
24
  # Run builder block in controller instance context.
13
25
  def run_builder_block(block, controller, *args)
@@ -15,11 +27,20 @@ module Cell
15
27
  end
16
28
  end
17
29
 
30
+
18
31
  attr_reader :parent_controller
19
32
 
20
33
  def initialize(parent_controller)
21
34
  super
22
35
  @parent_controller = parent_controller
23
36
  end
37
+
38
+ def cache_configured?
39
+ ActionController::Base.send(:cache_configured?) # DISCUSS: why is it private?
40
+ end
41
+
42
+ def cache_store
43
+ self.class.cache_store # in Rails, we have a global cache store.
44
+ end
24
45
  end
25
46
  end
@@ -0,0 +1,37 @@
1
+ module Cell
2
+ # Allows using many Rails gem in your cells outside of a Rails environment.
3
+ class Rails
4
+ module HelperAPI
5
+ module InternalHelpers
6
+ def protect_against_forgery? # used in form_tag_helper.rb:651
7
+ false
8
+ end
9
+
10
+ def _routes # FIXME: where is this set in rails?
11
+ self.class._routes
12
+ end
13
+ end
14
+
15
+ extend ActiveSupport::Concern
16
+
17
+ module ClassMethods
18
+ attr_accessor :_routes
19
+
20
+ def helper_modules
21
+ [_helpers, InternalHelpers]
22
+ end
23
+
24
+ def view_context_class
25
+ super
26
+ @view_context_class._routes = _routes
27
+ @view_context_class
28
+ end
29
+
30
+ def action_methods
31
+ # DISCUSS: we have to overwrite this to avoid a stupid dependency in AbstractController::UrlFor where _routes.named_routes.helper_names is accessed.
32
+ public_instance_methods(true).map { |x| x.to_s }
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -12,13 +12,8 @@ module Cell
12
12
 
13
13
 
14
14
  module ClassMethods
15
- def view_context_class
16
- @view_context_class ||= begin
17
- Class.new(Cell::Rails::View).tap do |klass|
18
- klass.send(:include, _helpers)
19
- klass.send(:include, _routes.url_helpers)
20
- end
21
- end
15
+ def helper_modules
16
+ [_helpers, _routes.url_helpers]
22
17
  end
23
18
 
24
19
  # Return the default view path for +state+. Override this if you cell has a differing naming style.
@@ -4,16 +4,12 @@ module Cell
4
4
  module VersionStrategy
5
5
  extend ActiveSupport::Concern
6
6
 
7
- include AbstractController::UrlFor # must be included before _routes is set in Railstie.
7
+ include AbstractController::UrlFor # must be included before _routes is set in Railstie. # TODO: remove that.
8
8
 
9
9
 
10
10
  module ClassMethods
11
- def view_context_class
12
- @view_context_class ||= begin
13
- routes = _routes #if respond_to?(:_routes)
14
- helpers = _helpers #if respond_to?(:_helpers)
15
- Cell::Rails::View.prepare(routes, helpers)
16
- end
11
+ def helper_modules
12
+ [_routes.url_helpers, _routes.mounted_helpers, _helpers]
17
13
  end
18
14
  end
19
15
 
data/lib/cells.rb CHANGED
@@ -70,18 +70,6 @@ module Cells
70
70
  def self.setup
71
71
  yield(Cell::Rails)
72
72
  end
73
-
74
- def self.rails3_0?
75
- ::Rails::VERSION::MINOR == 0
76
- end
77
-
78
- def self.rails3_1_or_more?
79
- ::Rails::VERSION::MINOR >= 1
80
- end
81
-
82
- def self.rails3_2_or_more? # FIXME: move to tests.
83
- ::Rails::VERSION::MINOR >= 2
84
- end
85
73
  end
86
74
 
87
75
  require 'cell/rails'
data/lib/cells/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cells
2
- VERSION = '3.8.5'
2
+ VERSION = '3.8.6'
3
3
  end
@@ -7,7 +7,7 @@ module TestUnit
7
7
 
8
8
  def create_test
9
9
  @states = actions
10
- template 'cell_test.rb', File.join('test/cells/', "#{file_name}_cell_test.rb")
10
+ template 'cell_test.rb', File.join('test/cells/', class_path, "#{file_name}_cell_test.rb")
11
11
  end
12
12
  end
13
13
  end
@@ -0,0 +1,5 @@
1
+ <%= simple_form_for @fruit do |f| %>
2
+ <%= f.input :title %>
3
+ <%= f.button :submit %>
4
+ <% end %>
5
+ <%= url_for(:host => "apotomo.de") %>
@@ -0,0 +1 @@
1
+ Dong!
@@ -100,6 +100,12 @@ class CellGeneratorTest < Rails::Generators::TestCase
100
100
  assert_file "test/cells/blog_cell_test.rb"
101
101
  end
102
102
 
103
+ should "work with namespace and test_unit" do
104
+ run_generator %w(Blog::Post latest -t test_unit)
105
+
106
+ assert_file "test/cells/blog/post_cell_test.rb", /class Blog::PostCellTest < Cell::TestCase/
107
+ end
108
+
103
109
  should "create test_unit assets with -t rspec" do
104
110
  run_generator %w(Blog post latest -t rspec)
105
111
 
@@ -149,7 +149,7 @@ class CellModuleTest < ActiveSupport::TestCase
149
149
  assert_equal BassistCell, ::Cell::Rails.class_from_cell_name('bassist')
150
150
  end
151
151
 
152
- if Cells.rails3_0?
152
+ if Cell.rails3_0?
153
153
  should "provide possible_paths_for_state" do
154
154
  assert_equal ["bad_guitarist/play", "bassist/play"], cell(:bad_guitarist).send(:possible_paths_for_state, :play)
155
155
  end
@@ -166,4 +166,17 @@ class CellModuleTest < ActiveSupport::TestCase
166
166
  end
167
167
  end
168
168
  end
169
+
170
+ should "respond to #rails3_1_or_more?" do
171
+ if Rails::VERSION::MINOR == 0
172
+ assert ! Cell.rails3_1_or_more?
173
+ assert Cell.rails3_0?
174
+ elsif Rails::VERSION::MINOR == 1
175
+ assert Cell.rails3_1_or_more?
176
+ assert ! Cell.rails3_0?
177
+ elsif Rails::VERSION::MINOR == 2
178
+ assert Cell.rails3_1_or_more?
179
+ assert ! Cell.rails3_0?
180
+ end
181
+ end
169
182
  end
@@ -16,25 +16,12 @@ class CellsModuleTest < ActiveSupport::TestCase
16
16
  c.append_view_path "/road/to/nowhere"
17
17
  end
18
18
 
19
- if Cells.rails3_2_or_more?
19
+ if Cell.rails3_2_or_more?
20
20
  assert_equal "/road/to/nowhere", Cell::Rails.view_paths.paths.last.to_s
21
21
  else
22
22
  assert_equal "/road/to/nowhere", Cell::Rails.view_paths.last.to_s
23
23
  end
24
24
  end
25
25
  end
26
-
27
- should "respond to #rails3_1_or_more?" do
28
- if Rails::VERSION::MINOR == 0
29
- assert ! Cells.rails3_1_or_more?
30
- assert Cells.rails3_0?
31
- elsif Rails::VERSION::MINOR == 1
32
- assert Cells.rails3_1_or_more?
33
- assert ! Cells.rails3_0?
34
- elsif Rails::VERSION::MINOR == 2
35
- assert Cells.rails3_1_or_more?
36
- assert ! Cells.rails3_0?
37
- end
38
- end
39
26
  end
40
27
  end
@@ -49,24 +49,24 @@ class CachingUnitTest < ActiveSupport::TestCase
49
49
  end
50
50
 
51
51
 
52
- context ".state_cached?" do
52
+ context "#state_cached?" do
53
53
  should "return true for cached" do
54
- assert @class.send :state_cached?, :count
54
+ assert @cell.send :state_cached?, :count
55
55
  end
56
56
 
57
57
  should "return false otherwise" do
58
- assert_not @class.send :state_cached?, :sing
58
+ assert_not @cell.send :state_cached?, :sing
59
59
  end
60
60
  end
61
61
 
62
62
 
63
- context ".cache?" do
63
+ context "#cache?" do
64
64
  should "return true for cached" do
65
- assert @cell.class.cache?(:count)
65
+ assert @cell.cache?(:count)
66
66
  end
67
67
 
68
68
  should "return false otherwise" do
69
- assert_not @cell.class.cache?(:sing)
69
+ assert_not @cell.cache?(:sing)
70
70
  end
71
71
 
72
72
  context "perform_caching turned off" do
@@ -76,8 +76,38 @@ class CachingUnitTest < ActiveSupport::TestCase
76
76
 
77
77
  should "always return false if caching turned-off" do
78
78
  ::ActionController::Base.perform_caching = false
79
- assert_not @cell.class.cache?(:count)
80
- assert_not @cell.class.cache?(:sing)
79
+ assert_not @cell.cache?(:count)
80
+ assert_not @cell.cache?(:sing)
81
+ end
82
+ end
83
+
84
+ context ".cache_store" do
85
+ should "return Rails cache store per default" do
86
+ assert_equal ActionController::Base.cache_store, DirectorCell.cache_store
87
+ end
88
+
89
+ context "Cell::Base" do
90
+ setup do
91
+ @class = Class.new(Cell::Base)
92
+ @cell = @class.new
93
+ end
94
+
95
+ context "#cache_store" do
96
+ should "be setable from the outside" do
97
+ assert_equal nil, @cell.cache_store
98
+ @cell.cache_store = Object
99
+ assert_equal Object, @cell.cache_store
100
+ end
101
+ end
102
+
103
+ context "#cache_configured?" do
104
+ should "be setable from the outside" do
105
+ assert_equal nil, @cell.cache_configured?
106
+ @cell.cache_configured = true
107
+ assert_equal true, @cell.cache_configured?
108
+ end
109
+ end
110
+
81
111
  end
82
112
  end
83
113
  end
@@ -307,5 +337,26 @@ class CachingFunctionalTest < ActiveSupport::TestCase
307
337
  assert_equal "1", render_cell(:director, :count, 3)
308
338
  assert_equal "4", render_cell(:director, :count, 4)
309
339
  end
340
+
341
+ should "allow using a different cache store" do
342
+ class BassistCell < Cell::Base
343
+ cache :play
344
+
345
+ def play(song)
346
+ render :text => song
347
+ end
348
+ end
349
+
350
+ @cell = BassistCell.new
351
+
352
+ assert_equal "New Years", @cell.render_state(:play, "New Years")
353
+ assert_equal "Liar", @cell.render_state(:play, "Liar")
354
+
355
+ @cell.cache_configured = true
356
+ @cell.cache_store = ActiveSupport::Cache::MemoryStore.new
357
+
358
+ assert_equal "New Years", @cell.render_state(:play, "New Years")
359
+ assert_equal "New Years", @cell.render_state(:play, "Liar")
360
+ end
310
361
  end
311
362
  end
@@ -54,7 +54,7 @@ class RailsCellsTest < ActiveSupport::TestCase
54
54
  should "respond to .setup_view_paths!" do
55
55
  swap( Cell::Rails, :view_paths => []) do
56
56
  Cell::Rails.setup_view_paths!
57
- if Cells.rails3_2_or_more?
57
+ if Cell.rails3_2_or_more?
58
58
  assert_equal ActionView::PathSet.new(Cell::Rails::DEFAULT_VIEW_PATHS).paths, Cell::Rails.view_paths.paths
59
59
  else
60
60
  assert_equal ActionView::PathSet.new(Cell::Rails::DEFAULT_VIEW_PATHS), Cell::Rails.view_paths
@@ -81,8 +81,7 @@ class RailsCellsTest < ActiveSupport::TestCase
81
81
  end
82
82
 
83
83
 
84
- if Cells.rails3_0?
85
- puts "rails-3.0"
84
+ if Cell.rails3_0?
86
85
  context "invoking find_family_view_for_state" do
87
86
  should "raise an error when a template is missing" do
88
87
  assert_raises ActionView::MissingTemplate do
@@ -128,7 +128,7 @@ class RailsRenderTest < ActiveSupport::TestCase
128
128
  def groove; render; end
129
129
  end
130
130
 
131
- if Cells.rails3_0?
131
+ if Cell.rails3_0?
132
132
  e = assert_raise Cell::Rails::MissingTemplate do
133
133
  render_cell(:bad_guitarist, :groove)
134
134
  end
@@ -4,6 +4,7 @@ class RailsViewTest < ActiveSupport::TestCase
4
4
  include Cell::TestCase::TestMethods
5
5
 
6
6
  context "A cell view" do
7
+ # DISCUSS: should we allow :partial from a state, too?
7
8
  context "calling render :partial" do
8
9
  should "render the local cell partial in bassist/dii" do
9
10
  assert_equal("Dii", in_view(:bassist) do
@@ -16,6 +17,16 @@ class RailsViewTest < ActiveSupport::TestCase
16
17
  render :partial => "bad_guitarist/dii"
17
18
  end)
18
19
  end
20
+
21
+
22
+ should "render the global partial app/views/shared/dong" do
23
+ class PercussionistCell < BassistCell
24
+ append_view_path("test/app/views")
25
+ end
26
+ assert_equal("Dong!", in_view("rails_view_test/percussionist") do
27
+ render :partial => "shared/dong"
28
+ end)
29
+ end
19
30
  end
20
31
 
21
32
  should "respond to render :state" do
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+ require 'cell/rails/helper_api'
3
+
4
+
5
+ class RailsHelperAPITest < MiniTest::Spec
6
+ class ::Fruit
7
+ extend ActiveModel::Naming
8
+ include ActiveModel::Conversion
9
+
10
+ def initialize(attributes={})
11
+ @attributes = attributes
12
+ end
13
+
14
+ def title
15
+ @attributes[:title]
16
+ end
17
+
18
+ def persisted?
19
+ false
20
+ end
21
+ end
22
+
23
+
24
+ class FakeUrlFor # should be sinatra's url helper instance
25
+ def url_for(*)
26
+ end
27
+ end
28
+
29
+ module FakeHelpers
30
+ def fruits_path(model, *args)
31
+ "/fruits"
32
+ end
33
+ end
34
+
35
+ require "simple_form"
36
+ class BassistCell < Cell::Base
37
+ include Cell::Rails::HelperAPI
38
+
39
+ self._helpers = FakeHelpers
40
+ self._routes = FakeUrlFor.new
41
+
42
+ def edit
43
+ @tone = "C"
44
+ @fruit = Fruit.new(:title => "Banana")
45
+ render
46
+ end
47
+ end
48
+
49
+ describe "Rails::HelperAPI" do
50
+ it "allows accessing the request object" do
51
+ #BassistCell.append_view_path(".")
52
+ assert_equal '<form accept-charset="UTF-8" action="/fruits" class="simple_form new_fruit" id="new_fruit" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>
53
+ <div class="input string required"><label class="string required" for="fruit_title"><abbr title="required">*</abbr> Title</label><input class="string required" id="fruit_title" name="fruit[title]" required="required" size="50" type="text" value="Banana" /></div>
54
+ <input class="button" name="commit" type="submit" value="Create Fruit" />
55
+ </form>
56
+ ', BassistCell.new.render_state(:edit) if Cell.rails3_1_or_more? and Rails::VERSION::MINOR == 2
57
+ end
58
+ end
59
+ end
@@ -47,7 +47,7 @@ class TestCaseTest < Cell::TestCase
47
47
  context "#view_assigns" do
48
48
  should "be emtpy when nothing was set" do
49
49
  render_cell(:bassist, :play)
50
- if Cells.rails3_0?
50
+ if Cell.rails3_0?
51
51
  assert_equal([:lookup_context], view_assigns.keys)
52
52
  else
53
53
  assert_equal({}, view_assigns)
@@ -61,7 +61,7 @@ class TestCaseTest < Cell::TestCase
61
61
  end
62
62
  end
63
63
  render_cell(:bassist, :sleep)
64
- if Cells.rails3_0?
64
+ if Cell.rails3_0?
65
65
  assert_equal([:lookup_context, :duration], view_assigns.keys)
66
66
  assert_equal("8h", view_assigns[:duration])
67
67
  else
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cells
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.8.5
4
+ version: 3.8.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-17 00:00:00.000000000 Z
12
+ date: 2012-10-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -107,6 +107,22 @@ dependencies:
107
107
  - - ! '>='
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: simple_form
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
110
126
  - !ruby/object:Gem::Dependency
111
127
  name: tzinfo
112
128
  requirement: !ruby/object:Gem::Requirement
@@ -166,6 +182,7 @@ files:
166
182
  - lib/cell/deprecations.rb
167
183
  - lib/cell/rack.rb
168
184
  - lib/cell/rails.rb
185
+ - lib/cell/rails/helper_api.rb
169
186
  - lib/cell/rails3_0_strategy.rb
170
187
  - lib/cell/rails3_1_strategy.rb
171
188
  - lib/cell/rendering.rb
@@ -216,9 +233,11 @@ files:
216
233
  - test/app/cells/layouts/metal.html.erb
217
234
  - test/app/cells/producer/capture.html.erb
218
235
  - test/app/cells/producer/content_for.html.erb
236
+ - test/app/cells/rails_helper_api_test/bassist/edit.html.erb
219
237
  - test/app/cells/shouter/sing.html.erb
220
238
  - test/app/cells/trumpeter/promote.html.erb
221
239
  - test/app/cells/trumpeter_cell.rb
240
+ - test/app/views/shared/_dong.html.erb
222
241
  - test/cell_generator_test.rb
223
242
  - test/cell_module_test.rb
224
243
  - test/cells_module_test.rb
@@ -265,6 +284,7 @@ files:
265
284
  - test/rails/render_test.rb
266
285
  - test/rails/router_test.rb
267
286
  - test/rails/view_test.rb
287
+ - test/rails_helper_api_test.rb
268
288
  - test/test_case_test.rb
269
289
  - test/test_helper.rb
270
290
  homepage: http://cells.rubyforge.org
@@ -291,81 +311,4 @@ rubygems_version: 1.8.24
291
311
  signing_key:
292
312
  specification_version: 3
293
313
  summary: View Components for Rails.
294
- test_files:
295
- - test/app/cells/bad_guitarist/_dii.html.erb
296
- - test/app/cells/bad_guitarist_cell.rb
297
- - test/app/cells/bassist/_dii.html.erb
298
- - test/app/cells/bassist/ahem.html.erb
299
- - test/app/cells/bassist/compose.html.erb
300
- - test/app/cells/bassist/contact_form.html.erb
301
- - test/app/cells/bassist/jam.html.erb
302
- - test/app/cells/bassist/play.html.erb
303
- - test/app/cells/bassist/play.js.erb
304
- - test/app/cells/bassist/pose.html.erb
305
- - test/app/cells/bassist/promote.html.erb
306
- - test/app/cells/bassist/provoke.html.erb
307
- - test/app/cells/bassist/shout.html.erb
308
- - test/app/cells/bassist/sing.html.haml
309
- - test/app/cells/bassist/slap.html.erb
310
- - test/app/cells/bassist/yell.en.html.erb
311
- - test/app/cells/bassist_cell.rb
312
- - test/app/cells/club_security.rb
313
- - test/app/cells/club_security/guard/help.html.erb
314
- - test/app/cells/club_security/guard_cell.rb
315
- - test/app/cells/club_security/medic/help.html.erb
316
- - test/app/cells/club_security/medic_cell.rb
317
- - test/app/cells/layouts/b.erb
318
- - test/app/cells/layouts/metal.html.erb
319
- - test/app/cells/producer/capture.html.erb
320
- - test/app/cells/producer/content_for.html.erb
321
- - test/app/cells/shouter/sing.html.erb
322
- - test/app/cells/trumpeter/promote.html.erb
323
- - test/app/cells/trumpeter_cell.rb
324
- - test/cell_generator_test.rb
325
- - test/cell_module_test.rb
326
- - test/cells_module_test.rb
327
- - test/deprecations_test.rb
328
- - test/dummy/Rakefile
329
- - test/dummy/app/controllers/application_controller.rb
330
- - test/dummy/app/controllers/musician_controller.rb
331
- - test/dummy/app/helpers/application_helper.rb
332
- - test/dummy/app/views/layouts/application.html.erb
333
- - test/dummy/app/views/musician/featured.html.erb
334
- - test/dummy/app/views/musician/featured_with_block.html.erb
335
- - test/dummy/app/views/musician/hamlet.html.haml
336
- - test/dummy/config.ru
337
- - test/dummy/config/application.rb
338
- - test/dummy/config/boot.rb
339
- - test/dummy/config/database.yml
340
- - test/dummy/config/environment.rb
341
- - test/dummy/config/environments/development.rb
342
- - test/dummy/config/environments/production.rb
343
- - test/dummy/config/environments/test.rb
344
- - test/dummy/config/locales/en.yml
345
- - test/dummy/config/routes.rb
346
- - test/dummy/db/test.sqlite3
347
- - test/dummy/log/production.log
348
- - test/dummy/log/server.log
349
- - test/dummy/public/404.html
350
- - test/dummy/public/422.html
351
- - test/dummy/public/500.html
352
- - test/dummy/public/favicon.ico
353
- - test/dummy/public/javascripts/application.js
354
- - test/dummy/public/javascripts/controls.js
355
- - test/dummy/public/javascripts/dragdrop.js
356
- - test/dummy/public/javascripts/effects.js
357
- - test/dummy/public/javascripts/prototype.js
358
- - test/dummy/public/javascripts/rails.js
359
- - test/dummy/public/stylesheets/.gitkeep
360
- - test/dummy/script/rails
361
- - test/helper_test.rb
362
- - test/rack_test.rb
363
- - test/rails/caching_test.rb
364
- - test/rails/capture_test.rb
365
- - test/rails/cells_test.rb
366
- - test/rails/integration_test.rb
367
- - test/rails/render_test.rb
368
- - test/rails/router_test.rb
369
- - test/rails/view_test.rb
370
- - test/test_case_test.rb
371
- - test/test_helper.rb
314
+ test_files: []