exposure 0.0.6 → 0.0.7

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.
@@ -5,10 +5,12 @@ module Exposure
5
5
  base::const_set(:DefaultResponses, DefaultResponses)
6
6
  base::const_set(:DefaultFlashMessages, DefaultFlashMessages)
7
7
  base::const_set(:Finders, { true => {}, false => {} })
8
- base::const_set(:FlashMessages, { true => {}, false => {} })
8
+ base::const_set(:FlashMessages, {})
9
9
  base::const_set(:Responses, {} )
10
10
  end
11
11
 
12
+ DefaultActions = [:index, :show, :new, :create, :edit, :update, :destroy]
13
+
12
14
  Callbacks = %w(
13
15
  before_find after_find after_find_on_failure after_find_on_success
14
16
  before_find_many after_find_many after_find_many_on_failure after_find_many_on_success
@@ -21,12 +23,9 @@ module Exposure
21
23
  )
22
24
 
23
25
  DefaultFlashMessages = {
24
- true => {
25
- :create => Proc.new { "#{resource_name.capitalize} successfully created" },
26
- :update => Proc.new { "#{resource_name.capitalize} successfully updated" },
27
- :destroy => Proc.new { "#{resource_name.capitalize} successfully removed" }
28
- },
29
- false => {}
26
+ 'create.success.html' => Proc.new { "#{resource_name.capitalize} successfully created" },
27
+ 'update.success.html' => Proc.new { "#{resource_name.capitalize} successfully updated" },
28
+ 'destroy.success.html' => Proc.new { "#{resource_name.capitalize} successfully removed" }
30
29
  }
31
30
 
32
31
  DefaultResponses = {
@@ -86,7 +85,7 @@ module Exposure
86
85
 
87
86
  def new
88
87
  run_callbacks(:before_assign)
89
- new_record
88
+ build_record
90
89
  run_callbacks(:after_assign)
91
90
  run_callbacks(:before_response)
92
91
  run_callbacks(:before_response_on_success)
@@ -95,7 +94,7 @@ module Exposure
95
94
 
96
95
  def create
97
96
  run_callbacks(:before_assign)
98
- new_record
97
+ build_record
99
98
  run_callbacks(:after_assign)
100
99
 
101
100
  run_callbacks(:before_create)
@@ -106,14 +105,14 @@ module Exposure
106
105
  run_callbacks(:after_create_on_success)
107
106
  run_callbacks(:before_response)
108
107
  run_callbacks(:before_response_on_success)
109
- flash_for(:create, true)
108
+ flash_for(:create, :success)
110
109
  response_for(:create, :success, request.format.to_sym)
111
110
  else
112
111
  run_callbacks(:after_save_on_failure)
113
112
  run_callbacks(:after_create_on_failure)
114
113
  run_callbacks(:before_response)
115
114
  run_callbacks(:before_response_on_failure)
116
- flash_for(:create, false)
115
+ flash_for(:create, :failure)
117
116
  response_for(:create, :failure, request.format.to_sym)
118
117
  end
119
118
 
@@ -146,14 +145,14 @@ module Exposure
146
145
  run_callbacks(:after_update_on_success)
147
146
  run_callbacks(:before_response)
148
147
  run_callbacks(:before_response_on_success)
149
- flash_for(:update, true)
148
+ flash_for(:update, :success)
150
149
  response_for(:update, :success, request.format.to_sym)
151
150
  else
152
151
  run_callbacks(:after_save_on_failure)
153
152
  run_callbacks(:after_create_on_failure)
154
153
  run_callbacks(:before_response)
155
154
  run_callbacks(:before_response_on_failure)
156
- flash_for(:update, false)
155
+ flash_for(:update, :failure)
157
156
  response_for(:update, :failure, request.format.to_sym)
158
157
  end
159
158
  else
@@ -177,7 +176,7 @@ module Exposure
177
176
  run_callbacks(:after_destroy_on_success)
178
177
  run_callbacks(:before_response)
179
178
  run_callbacks(:before_response_on_success)
180
- flash_for(:destroy, true)
179
+ flash_for(:destroy, :success)
181
180
  response_for(:destroy, :success, request.format.to_sym)
182
181
 
183
182
  else
@@ -188,104 +187,6 @@ module Exposure
188
187
  end
189
188
 
190
189
  private
191
- def custom_response_for(action_name, action_status, format)
192
- if responder = self.class::Responses["#{action_name}.#{action_status}.#{format}"]
193
- case responder
194
- when Symbol
195
- self.send(responder)
196
- when Proc
197
- self.instance_eval &responder
198
- end
199
- else
200
- false
201
- end
202
- end
203
-
204
- def default_response_for(action_name, action_status, format)
205
- if responder = self.class::DefaultResponses["#{action_name}.#{action_status}.#{format}"]
206
- self.instance_eval &responder
207
- else
208
- return false
209
- end
210
- end
211
-
212
- def response_for(action_name, action_status, format = :html)
213
- format = :html if format == :all
214
- custom_response_for(action_name, action_status, format) || default_response_for(action_name, action_status, format) || head(:not_acceptable)
215
- end
216
-
217
- def custom_flash_for(action_name, action_successful)
218
- if flash_message = self.class::FlashMessages[action_successful][action_name]
219
- case flash_message
220
- when String
221
- flash[:message] = flash_message
222
- when Symbol
223
- flash[:message] = self.send(flash_message)
224
- when Proc
225
- flash[:message] = self.instance_eval(&flash_message)
226
- end
227
- else
228
- false
229
- end
230
- end
231
-
232
- def default_flash_for(action_name, action_successful)
233
- if message_proc = self.class::DefaultFlashMessages[action_successful][action_name]
234
- flash[:message] = self.instance_eval(&message_proc)
235
- end
236
- end
237
-
238
- def flash_for(action_name, action_successful)
239
- custom_flash_for(action_name, action_successful) || default_flash_for(action_name, action_successful)
240
- end
241
-
242
- def custom_finder_for(resource_name)
243
- if finder = self.class::Finders[resource_name]
244
- return finder
245
- end
246
- end
247
-
248
- def default_finder_for(resource_name)
249
- if finder = self.class::DefaultFinders[resource_name]
250
- return finder
251
- end
252
- end
253
-
254
- def finder_for(resource_name)
255
- custom_finder_for(resource_name) || default_finder_for(resource_name)
256
- end
257
-
258
- def call_finder_chain(object, chain, use_associaiton = true)
259
- links = chain.shift
260
- return object unless links
261
-
262
- message = finder_for(links[0])
263
- association = links[1] if use_associaiton
264
-
265
- case message
266
- when Symbol
267
- value = self.send(message)
268
- when Proc
269
- value = self.instance_eval(&message)
270
- else
271
- raise "invalid finder of #{message.inspect}"
272
- end
273
-
274
- if value.kind_of?(Array) && !value.respond_to?(:proxy_target)
275
- if use_associaiton
276
- call_finder_chain(object.send(association).send(*value), chain)
277
- else
278
- call_finder_chain(object.send(*value), chain)
279
- end
280
- else
281
- call_finder_chain(value, chain)
282
- end
283
- end
284
-
285
- def builder_for(resource_name)
286
- custom_builder_for(resource_name) || default_builder_for(resource_name)
287
- end
288
-
289
190
  def resource_name
290
191
  self.class.resource_name
291
192
  end
@@ -294,6 +195,10 @@ module Exposure
294
195
  self.class.resources_name
295
196
  end
296
197
 
198
+ def parent_model
199
+ self.class.parent_model
200
+ end
201
+
297
202
  def save_record
298
203
  @resource.save
299
204
  end
@@ -302,16 +207,16 @@ module Exposure
302
207
  @resource.update_attributes(params[resource_name])
303
208
  end
304
209
 
305
- def new_record
306
- @resource = instance_variable_set("@#{resource_name}", self.class.parent_model.new(params[resource_name]))
210
+ def build_record
211
+ @resource = instance_variable_set("@#{resource_name}", parent_model.new(params[resource_name]))
307
212
  end
308
213
 
309
214
  def find_record
310
- @resource = instance_variable_set("@#{resource_name}", call_finder_chain(self.class.parent_model, self.class.member_nesting.clone, false))
215
+ @resource = instance_variable_set("@#{resource_name}", call_finder_chain(parent_model, self.class.member_nesting.clone, false))
311
216
  end
312
217
 
313
218
  def find_records
314
- @resources = instance_variable_set("@#{resources_name}", call_finder_chain(self.class.parent_model, self.class.collection_nesting.clone, false))
219
+ @resources = instance_variable_set("@#{resources_name}", call_finder_chain(parent_model, self.class.collection_nesting.clone, false))
315
220
  end
316
221
 
317
222
  def delete_record
data/lib/exposure.rb CHANGED
@@ -1,10 +1,15 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
  require 'action_controller'
4
+ require 'exposure/options'
4
5
  require 'exposure/configuration'
5
- require 'exposure/common'
6
+ require 'exposure/behaviors/building'
7
+ require 'exposure/behaviors/callbacks'
8
+ require 'exposure/behaviors/finding'
9
+ require 'exposure/behaviors/flashing'
10
+ require 'exposure/behaviors/responding'
11
+
6
12
  require 'exposure/patterns/resources'
7
- require 'exposure/patterns/resource'
8
13
 
9
14
  module Exposure
10
15
  VERSION = '0.0.6'
@@ -0,0 +1,46 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe "callbacks'", :type => :controller do
4
+ setup = lambda {
5
+ class PiratesController < ActionController::Base
6
+ expose_many(:pirates)
7
+ private
8
+ def first_callback_called
9
+ @callback_called = 1
10
+ end
11
+
12
+ def second_callback_called
13
+ @callback_called += 1
14
+ end
15
+
16
+ def third_callback_called
17
+ @callback_called += 1
18
+ end
19
+ end
20
+ }
21
+ setup.call
22
+
23
+ ActionController::Routing::Routes.draw do |map|
24
+ map.resources :pirates
25
+ end
26
+
27
+ controller_name :pirates
28
+ Object.remove_class(PiratesController)
29
+
30
+ before(:each) do
31
+ setup.call
32
+ @controller = PiratesController.new
33
+ @request = ActionController::TestRequest.new
34
+ @response = ActionController::TestResponse.new
35
+ end
36
+
37
+ after(:each) do
38
+ Object.remove_class(PiratesController)
39
+ end
40
+
41
+ it "can call multiple callbacks" do
42
+ PiratesController.after :assign, :first_callback_called, :second_callback_called, :third_callback_called
43
+ get(:new)
44
+ should assign_to(:callback_called).with(3)
45
+ end
46
+ end
@@ -0,0 +1,82 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe "included actions" do
4
+ AllActions = [:index, :show, :new, :create, :edit, :update, :destroy]
5
+ IncludedActions = [:new, :show]
6
+ ExcludedActions = AllActions - IncludedActions
7
+
8
+ setup = lambda {
9
+ class ShipTypesController < ActionController::Base
10
+ expose_many(:ship_types, :only => IncludedActions)
11
+ end
12
+ }
13
+
14
+ setup.call
15
+
16
+ ActionController::Routing::Routes.draw do |map|
17
+ map.resources :ship_types
18
+ end
19
+
20
+ Object.remove_class(ShipTypesController)
21
+
22
+ before(:each) do
23
+ setup.call
24
+ @controller = ShipTypesController.new
25
+ @request = ActionController::TestRequest.new
26
+ @response = ActionController::TestResponse.new
27
+ end
28
+
29
+ after(:each) do
30
+ Object.remove_class(ShipTypesController)
31
+ end
32
+
33
+ IncludedActions.each do |action|
34
+ it "should have action #{action}" do
35
+ @controller.should respond_to(action)
36
+ end
37
+ end
38
+
39
+ ExcludedActions.each do |action|
40
+ it "should have not action #{action}" do
41
+ @controller.should_not respond_to(action)
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "excluded actions" do
47
+ setup = lambda {
48
+ class ShipTypesController < ActionController::Base
49
+ expose_many(:ship_types, :except => ExcludedActions)
50
+ end
51
+ }
52
+ setup.call
53
+
54
+ ActionController::Routing::Routes.draw do |map|
55
+ map.resources :ship_types
56
+ end
57
+
58
+ Object.remove_class(ShipTypesController)
59
+
60
+ before(:each) do
61
+ setup.call
62
+ @controller = ShipTypesController.new
63
+ @request = ActionController::TestRequest.new
64
+ @response = ActionController::TestResponse.new
65
+ end
66
+
67
+ after(:each) do
68
+ Object.remove_class(ShipTypesController)
69
+ end
70
+
71
+ IncludedActions.each do |action|
72
+ it "should have action #{action}" do
73
+ @controller.should respond_to(action)
74
+ end
75
+ end
76
+
77
+ ExcludedActions.each do |action|
78
+ it "should have not action #{action}" do
79
+ @controller.should_not respond_to(action)
80
+ end
81
+ end
82
+ end
@@ -1,18 +1,28 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper.rb'
2
2
 
3
3
  describe "exposure", :type => :controller do
4
- class ShipTypesController < ActionController::Base
5
- expose_many(:ship_types)
6
- end
4
+ setup = lambda {
5
+ class ShipTypesController < ActionController::Base
6
+ expose_many(:ship_types)
7
+ end
8
+ }
9
+ setup.call
7
10
  controller_name :ship_types
11
+ Object.remove_class(ShipTypesController)
12
+
13
+ ActionController::Routing::Routes.draw do |map|
14
+ map.resources :ship_types
15
+ end
8
16
 
9
17
  before(:each) do
18
+ setup.call
10
19
  @controller = ShipTypesController.new
11
20
  @request = ActionController::TestRequest.new
12
21
  @response = ActionController::TestResponse.new
13
- ActionController::Routing::Routes.draw do |map|
14
- map.resources :ship_types
15
- end
22
+ end
23
+
24
+ after(:each) do
25
+ Object.remove_class(ShipTypesController)
16
26
  end
17
27
 
18
28
  describe "parent models" do
@@ -1,30 +1,36 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe "finders", :type => :controller do
4
- class PiratesController < ActionController::Base
5
- expose_many(:pirates)
6
- private
7
- def find_pirate
8
- Pirate.find_by_title(params[:id])
9
- end
10
- end
3
+ describe "finders", :type => :controller do
4
+ setup = lambda {
5
+ class PiratesController < ActionController::Base
6
+ expose_many(:pirates)
7
+ private
8
+ def find_pirate
9
+ Pirate.find_by_title(params[:id])
10
+ end
11
+ end
12
+
13
+ ActionController::Routing::Routes.draw do |map|
14
+ map.resources :pirates
15
+ end
16
+ }
11
17
 
18
+ setup.call
12
19
  controller_name :pirates
20
+ Object.remove_class(PiratesController)
13
21
 
14
22
  before(:each) do
23
+ setup.call
15
24
  @controller = PiratesController.new
16
25
  @request = ActionController::TestRequest.new
17
26
  @response = ActionController::TestResponse.new
18
- ActionController::Routing::Routes.draw do |map|
19
- map.resources :pirates
20
- end
21
27
 
22
28
  @pirate = Factory.stub(:pirate)
23
29
  Pirate.stub(:find_by_title => @pirate)
24
30
  end
25
31
 
26
32
  after(:each) do
27
- PiratesController::Finders.clear
33
+ Object.remove_class(PiratesController)
28
34
  end
29
35
 
30
36
  it "finds with a method name as symbol" do
@@ -1,21 +1,27 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe "nested finders", :type => :controller do
4
- class ShipsController < ActionController::Base
5
- expose_many(:ships, :nested => [:pirates])
6
- end
3
+ describe "nested finders", :type => :controller do
4
+ setup = lambda {
5
+ class ShipsController < ActionController::Base
6
+ expose_many(:ships, :nested => [:pirates])
7
+ end
8
+
9
+ ActionController::Routing::Routes.draw do |map|
10
+ map.resources :pirates do |pirate|
11
+ pirate.resources :ships
12
+ end
13
+ end
14
+ }
7
15
 
16
+ setup.call
8
17
  controller_name :ships
18
+ Object.remove_class(ShipsController)
9
19
 
10
20
  before(:each) do
21
+ setup.call
11
22
  @controller = ShipsController.new
12
23
  @request = ActionController::TestRequest.new
13
24
  @response = ActionController::TestResponse.new
14
- ActionController::Routing::Routes.draw do |map|
15
- map.resources :pirates do |pirate|
16
- pirate.resources :ships
17
- end
18
- end
19
25
 
20
26
  @pirate = Factory.create(:pirate_with_ships)
21
27
  Pirate.stub(:find => @pirate)
@@ -23,6 +29,10 @@ describe "nested finders", :type => :controller do
23
29
  get(:index, {:pirate_id => 1})
24
30
  end
25
31
 
32
+ after(:each) do
33
+ Object.remove_class(ShipsController)
34
+ end
35
+
26
36
  it { should assign_to(:ships) }
27
37
  it { should assign_to(:resources) }
28
38
 
@@ -1,22 +1,28 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe "flash messages with blocks", :type => :controller do
4
- class PiratesController < ActionController::Base
5
- expose_many(:pirates)
6
- PiratesController.flash_for :create do
7
- "the flash is set to #{@pirate.title}"
8
- end
9
- end
3
+ describe "flash messages with blocks", :type => :controller do
4
+ setup = lambda {
5
+ class PiratesController < ActionController::Base
6
+ expose_many(:pirates)
7
+ PiratesController.flash_for :create do
8
+ "the flash is set to #{@pirate.title}"
9
+ end
10
+ end
11
+ }
12
+ setup.call
13
+
14
+ ActionController::Routing::Routes.draw do |map|
15
+ map.resources :pirates, :collection => {:test => :any}
16
+ end
10
17
 
11
18
  controller_name :pirates
19
+ Object.remove_class(PiratesController)
12
20
 
13
21
  before(:each) do
22
+ setup.call
14
23
  @controller = PiratesController.new
15
24
  @request = ActionController::TestRequest.new
16
25
  @response = ActionController::TestResponse.new
17
- ActionController::Routing::Routes.draw do |map|
18
- map.resources :pirates, :collection => {:test => :any}
19
- end
20
26
 
21
27
  @pirate = Factory.stub(:pirate, {:title => 'Captain'})
22
28
  Pirate.stub(:new => @pirate)
@@ -28,5 +34,9 @@ describe "flash messages with blocks", :type => :controller do
28
34
  post(:create)
29
35
  end
30
36
 
37
+ after(:each) do
38
+ Object.remove_class(PiratesController)
39
+ end
40
+
31
41
  it { should set_the_flash.to(@custom_flash_message) }
32
42
  end
@@ -1,24 +1,29 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe "flash messages with methods", :type => :controller do
4
- class PiratesController < ActionController::Base
5
- expose_many(:pirates)
6
- private
7
- def custom_flash_message
8
- 'the flash was set'
9
- end
10
- end
3
+ describe "flash messages with methods", :type => :controller do
4
+ setup = lambda {
5
+ class PiratesController < ActionController::Base
6
+ expose_many(:pirates)
7
+ private
8
+ def custom_flash_message
9
+ 'the flash was set'
10
+ end
11
+ end
12
+
13
+ ActionController::Routing::Routes.draw do |map|
14
+ map.resources :pirates, :collection => {:test => :any}
15
+ end
16
+ }
11
17
 
18
+ setup.call
12
19
  controller_name :pirates
20
+ Object.remove_class(PiratesController)
13
21
 
14
22
  before(:each) do
23
+ setup.call
15
24
  @controller = PiratesController.new
16
25
  @request = ActionController::TestRequest.new
17
26
  @response = ActionController::TestResponse.new
18
- ActionController::Routing::Routes.draw do |map|
19
- map.resources :pirates, :collection => {:test => :any}
20
- end
21
-
22
27
  @custom_flash_message = 'the flash was set'
23
28
 
24
29
  @pirate = Factory.stub(:pirate)
@@ -26,8 +31,7 @@ describe "flash messages with methods", :type => :controller do
26
31
  end
27
32
 
28
33
  after(:each) do
29
- PiratesController::FlashMessages[true].clear
30
- PiratesController::FlashMessages[false].clear
34
+ Object.remove_class(PiratesController)
31
35
  end
32
36
 
33
37
  describe "responding with a method call" do
@@ -82,5 +86,5 @@ describe "flash messages with methods", :type => :controller do
82
86
  post(:create)
83
87
  should set_the_flash.to(@custom_flash_message)
84
88
  end
85
- end
89
+ end
86
90
  end
@@ -1,19 +1,26 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe "flash messages with procs", :type => :controller do
4
- class PiratesController < ActionController::Base
5
- expose_many(:pirates)
6
- end
3
+ describe "flash messages with procs", :type => :controller do
4
+ setup = lambda {
5
+ class PiratesController < ActionController::Base
6
+ expose_many(:pirates)
7
+ end
8
+ }
9
+ setup.call
10
+
11
+ ActionController::Routing::Routes.draw do |map|
12
+ map.resources :pirates, :collection => {:test => :any}
13
+ end
7
14
 
8
15
  controller_name :pirates
16
+ Object.remove_class(PiratesController)
9
17
 
10
18
  before(:each) do
19
+ setup.call
20
+
11
21
  @controller = PiratesController.new
12
22
  @request = ActionController::TestRequest.new
13
23
  @response = ActionController::TestResponse.new
14
- ActionController::Routing::Routes.draw do |map|
15
- map.resources :pirates, :collection => {:test => :any}
16
- end
17
24
 
18
25
  @custom_flash_message = 'the flash was set'
19
26
  @proc = Proc.new { 'the flash was set' }
@@ -23,8 +30,7 @@ describe "flash messages with procs", :type => :controller do
23
30
  end
24
31
 
25
32
  after(:each) do
26
- PiratesController::FlashMessages[true].clear
27
- PiratesController::FlashMessages[false].clear
33
+ Object.remove_class(PiratesController)
28
34
  end
29
35
 
30
36
  describe "responding with a method call" do