coast 0.9.0 → 0.9.1
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.
- data/lib/coast.rb +14 -36
- data/spec/coast_spec.rb +245 -0
- metadata +8 -5
data/lib/coast.rb
CHANGED
@@ -80,23 +80,19 @@ module Coast
|
|
80
80
|
# -----------------------------------------------------------------------------------------------
|
81
81
|
# begin restful actions
|
82
82
|
|
83
|
-
|
84
83
|
# begin UI actions
|
85
84
|
def new
|
86
85
|
invoke_callback(:before_new)
|
87
86
|
@resourceful_item ||= resourceful_model.new
|
88
87
|
send(self.class.authorize_method, :new, @resourceful_item, request)
|
89
88
|
init_instance_variables
|
90
|
-
|
91
89
|
invoke_callback(:respond_to_new)
|
92
90
|
unless performed?
|
93
91
|
respond_to do |format|
|
94
92
|
format.html { render :new }
|
95
|
-
format
|
96
|
-
format.json { render :json => { :message => "Format not supported! Use the html format." } }
|
93
|
+
format_json_and_xml(format, :message => "Format not supported! Use the html format.")
|
97
94
|
end
|
98
95
|
end
|
99
|
-
|
100
96
|
invoke_callback(:after_new)
|
101
97
|
end
|
102
98
|
|
@@ -106,36 +102,29 @@ module Coast
|
|
106
102
|
send(self.class.authorize_method, :edit, @resourceful_item, request)
|
107
103
|
init_instance_variables
|
108
104
|
invoke_callback(:respond_to_edit)
|
109
|
-
|
110
105
|
unless performed?
|
111
106
|
respond_to do |format|
|
112
107
|
format.html { render :edit }
|
113
|
-
format
|
114
|
-
format.json { render :json => { :message => "Format not supported! Use the html format." } }
|
108
|
+
format_json_and_xml(format, :message => "Format not supported! Use the html format.")
|
115
109
|
end
|
116
110
|
end
|
117
|
-
|
118
111
|
invoke_callback(:after_edit)
|
119
112
|
end
|
120
113
|
# end UI actions
|
121
114
|
|
122
|
-
|
123
115
|
# begin READ actions
|
124
116
|
def index
|
125
117
|
invoke_callback(:before_index)
|
126
118
|
@resourceful_list ||= resourceful_model.all
|
127
119
|
send(self.class.authorize_method, :index, @resourceful_list, request)
|
128
120
|
init_instance_variables
|
129
|
-
|
130
121
|
invoke_callback(:respond_to_index)
|
131
122
|
unless performed?
|
132
123
|
respond_to do |format|
|
133
124
|
format.html { render :index }
|
134
|
-
format
|
135
|
-
format.json { render :json => @resourceful_list }
|
125
|
+
format_json_and_xml(format, @resourceful_list)
|
136
126
|
end
|
137
127
|
end
|
138
|
-
|
139
128
|
invoke_callback(:after_index)
|
140
129
|
end
|
141
130
|
|
@@ -144,21 +133,17 @@ module Coast
|
|
144
133
|
@resourceful_item ||= resourceful_model.find(params[:id])
|
145
134
|
send(self.class.authorize_method, :show, @resourceful_item, request)
|
146
135
|
init_instance_variables
|
147
|
-
|
148
136
|
invoke_callback(:respond_to_show)
|
149
137
|
unless performed?
|
150
138
|
respond_to do |format|
|
151
139
|
format.html { render :show }
|
152
|
-
format
|
153
|
-
format.json { render :json => @resourceful_item }
|
140
|
+
format_json_and_xml(format, @resourceful_item)
|
154
141
|
end
|
155
142
|
end
|
156
|
-
|
157
143
|
invoke_callback(:after_show)
|
158
144
|
end
|
159
145
|
# end READ actions
|
160
146
|
|
161
|
-
|
162
147
|
# begin MUTATING actions
|
163
148
|
def create
|
164
149
|
invoke_callback(:before_create)
|
@@ -166,23 +151,19 @@ module Coast
|
|
166
151
|
send(self.class.authorize_method, :create, @resourceful_item, request)
|
167
152
|
init_instance_variables
|
168
153
|
success = @skip_db_create || @resourceful_item.save
|
169
|
-
|
170
154
|
invoke_callback(:respond_to_create)
|
171
155
|
unless performed?
|
172
156
|
respond_to do |format|
|
173
157
|
if success
|
174
158
|
flash[:notice] = "#{resourceful_model.name} was successfully created."
|
175
159
|
format.html { redirect_to(@resourceful_item) }
|
176
|
-
format
|
177
|
-
format.json { render :json => @resourceful_item, :status => :created, :location => @resourceful_item }
|
160
|
+
format_json_and_xml(format, @resourceful_item, :status => :created, :location => @resourceful_item)
|
178
161
|
else
|
179
162
|
format.html { render :action => "new" }
|
180
|
-
format
|
181
|
-
format.json { render :json => @resourceful_item.errors, :status => :unprocessable_entity }
|
163
|
+
format_json_and_xml(format, @resourceful_item.errors, :status => :unprocessable_entity)
|
182
164
|
end
|
183
165
|
end
|
184
166
|
end
|
185
|
-
|
186
167
|
invoke_callback(:after_create)
|
187
168
|
end
|
188
169
|
|
@@ -192,23 +173,19 @@ module Coast
|
|
192
173
|
send(self.class.authorize_method, :update, @resourceful_item, request)
|
193
174
|
init_instance_variables
|
194
175
|
success = @skip_db_update || @resourceful_item.update_attributes(params[resourceful_model.name.underscore])
|
195
|
-
|
196
176
|
invoke_callback(:respond_to_update)
|
197
177
|
unless performed?
|
198
178
|
respond_to do |format|
|
199
179
|
if success
|
200
180
|
flash[:notice] = "#{resourceful_model.name} was successfully updated."
|
201
181
|
format.html { redirect_to(@resourceful_item) }
|
202
|
-
format
|
203
|
-
format.json { render :json => @resourceful_item }
|
182
|
+
format_json_and_xml(format, @resourceful_item)
|
204
183
|
else
|
205
184
|
format.html { render :action => "edit" }
|
206
|
-
format
|
207
|
-
format.json { render :json => @resourceful_item.errors, :status => :unprocessable_entity }
|
185
|
+
format_json_and_xml(format, @resourceful_item.errors, :status => :unprocessable_entity)
|
208
186
|
end
|
209
187
|
end
|
210
188
|
end
|
211
|
-
|
212
189
|
invoke_callback(:after_update)
|
213
190
|
end
|
214
191
|
|
@@ -218,17 +195,14 @@ module Coast
|
|
218
195
|
send(self.class.authorize_method, :destroy, @resourceful_item, request)
|
219
196
|
init_instance_variables
|
220
197
|
@resourceful_item.destroy unless @skip_db_destroy
|
221
|
-
|
222
198
|
invoke_callback(:respond_to_destroy)
|
223
199
|
unless performed?
|
224
200
|
flash[:notice] = "#{resourceful_model.name} was successfully destroyed" if @resourceful_item.destroyed?
|
225
201
|
respond_to do |format|
|
226
202
|
format.html { redirect_to root_url }
|
227
|
-
format
|
228
|
-
format.json { render :json => @resourceful_item }
|
203
|
+
format_json_and_xml(format, @resourceful_item)
|
229
204
|
end
|
230
205
|
end
|
231
|
-
|
232
206
|
invoke_callback(:after_destroy)
|
233
207
|
end
|
234
208
|
# end MUTATING actions
|
@@ -250,7 +224,6 @@ module Coast
|
|
250
224
|
def item_instance_var_name
|
251
225
|
return @item_instance_var_name if @item_instance_var_name
|
252
226
|
name = resourceful_model.name.underscore.gsub("/", "_")
|
253
|
-
puts name
|
254
227
|
@item_instance_var_name ||= "@#{name}"
|
255
228
|
end
|
256
229
|
|
@@ -264,4 +237,9 @@ module Coast
|
|
264
237
|
send(name) if respond_to?(name)
|
265
238
|
end
|
266
239
|
|
240
|
+
def format_json_and_xml(format, data, options={})
|
241
|
+
format.xml { render({:xml => data}.merge(options)) }
|
242
|
+
format.json { render({:json => data}.merge(options)) }
|
243
|
+
end
|
244
|
+
|
267
245
|
end
|
data/spec/coast_spec.rb
ADDED
@@ -0,0 +1,245 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
|
3
|
+
# fix MiniTest issue with 1.9
|
4
|
+
unless defined? Gem::Deprecate
|
5
|
+
module Gem
|
6
|
+
Deprecate = Module.new do
|
7
|
+
include Deprecate
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require "bundler/setup"
|
13
|
+
require "minitest/autorun"
|
14
|
+
require "active_support/all"
|
15
|
+
require "turn"
|
16
|
+
require "pry"
|
17
|
+
|
18
|
+
dirname = File.dirname(__FILE__)
|
19
|
+
require File.join(dirname, "mock")
|
20
|
+
Dir.glob(File.join(dirname, "..", "lib", "*.rb")) { |f| require f }
|
21
|
+
MODEL_PATH = File.join(dirname, "testable_model.rb")
|
22
|
+
CONTROLLER_PATH = File.join(dirname, "testable_controller.rb")
|
23
|
+
load MODEL_PATH
|
24
|
+
load CONTROLLER_PATH
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
describe Coast do
|
30
|
+
RESTFUL_METHODS = %w(index show new edit create update destroy)
|
31
|
+
ITEM_METHODS = %w(show new edit create update destroy)
|
32
|
+
UI_METHODS = %w(new edit)
|
33
|
+
READ_METHODS = %w(index show)
|
34
|
+
MUTATE_METHODS = %w(create update destroy)
|
35
|
+
|
36
|
+
# Resets the mock class defs.
|
37
|
+
def reset
|
38
|
+
Coast.send(:remove_const, :TestableController)
|
39
|
+
Coast.send(:remove_const, :TestableModel)
|
40
|
+
load MODEL_PATH
|
41
|
+
load CONTROLLER_PATH
|
42
|
+
Coast::TestableController.set_resourceful_model Coast::TestableModel
|
43
|
+
end
|
44
|
+
|
45
|
+
# class method tests ============================================================================
|
46
|
+
|
47
|
+
describe :set_authorize_method do
|
48
|
+
it "sets the method used to perform authorization checks" do
|
49
|
+
reset
|
50
|
+
Coast::TestableController.set_authorize_method :authorize!
|
51
|
+
assert Coast::TestableController.authorize_method == :authorize!
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe :authorize_method= do
|
56
|
+
it "sets the method used to perform authorization checks" do
|
57
|
+
reset
|
58
|
+
Coast::TestableController.authorize_method = :authorize!
|
59
|
+
assert Coast::TestableController.authorize_method == :authorize!
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe :set_resourceful_model do
|
64
|
+
it "sets the model that the controller manages" do
|
65
|
+
reset
|
66
|
+
model = Object.new
|
67
|
+
Coast::TestableController.set_resourceful_model model
|
68
|
+
assert Coast::TestableController.resourceful_model == model
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe :resourceful_model= do
|
73
|
+
it "sets the model that the controller manages" do
|
74
|
+
reset
|
75
|
+
model = Object.new
|
76
|
+
Coast::TestableController.resourceful_model = model
|
77
|
+
assert Coast::TestableController.resourceful_model == model
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def verify_callback_setter(event, action)
|
82
|
+
reset
|
83
|
+
Coast::TestableController.send(event, action, &(lambda {}))
|
84
|
+
assert Coast::TestableController.new.respond_to?("#{event}_#{action}")
|
85
|
+
end
|
86
|
+
|
87
|
+
describe :before do
|
88
|
+
it "stores a before callback for all RESTful actions" do
|
89
|
+
RESTFUL_METHODS.each { |m| verify_callback_setter :before, m }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe :respond_to do
|
94
|
+
it "stores a respond_to callback for all RESTful actions" do
|
95
|
+
RESTFUL_METHODS.each { |m| verify_callback_setter :respond_to, m }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe :after do
|
100
|
+
it "stores an after callback for all RESTful actions" do
|
101
|
+
RESTFUL_METHODS.each { |m| verify_callback_setter :after, m }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
# instance method tests =========================================================================
|
116
|
+
|
117
|
+
|
118
|
+
it "supports all RESTful methods" do
|
119
|
+
reset
|
120
|
+
controller = Coast::TestableController.new
|
121
|
+
RESTFUL_METHODS.each { |m| controller.must_respond_to m }
|
122
|
+
end
|
123
|
+
|
124
|
+
# %w(index show new).each do |method|
|
125
|
+
RESTFUL_METHODS.each do |method|
|
126
|
+
describe "##{method}" do
|
127
|
+
before do
|
128
|
+
reset
|
129
|
+
end
|
130
|
+
|
131
|
+
it "responds and renders" do
|
132
|
+
controller = Coast::TestableController.new
|
133
|
+
controller.send(method)
|
134
|
+
assert controller.responded?, "Did not respond"
|
135
|
+
assert controller.rendered?, "Did not render"
|
136
|
+
end
|
137
|
+
|
138
|
+
it "renders for the formats html, xml, json" do
|
139
|
+
controller = Coast::TestableController.new
|
140
|
+
controller.send(method)
|
141
|
+
assert controller.html, "Did not respond to the html format"
|
142
|
+
assert controller.xml, "Did not respond to the xml format"
|
143
|
+
assert controller.json, "Did not respond to the json format"
|
144
|
+
end
|
145
|
+
|
146
|
+
it "invokes the callbacks before, respond_to, after" do
|
147
|
+
callbacks = []
|
148
|
+
|
149
|
+
Coast::TestableController.class_eval do
|
150
|
+
before(method) { callbacks << :before }
|
151
|
+
respond_to(method) { callbacks << :respond_to }
|
152
|
+
after(method) { callbacks << :after }
|
153
|
+
end
|
154
|
+
|
155
|
+
controller = Coast::TestableController.new
|
156
|
+
controller.send(method)
|
157
|
+
assert callbacks.include?(:before), "Did not invoke the before callback"
|
158
|
+
assert callbacks.include?(:respond_to), "Did not invoke the respond_to callback"
|
159
|
+
assert callbacks.include?(:after), "Did not invoke the after callback"
|
160
|
+
end
|
161
|
+
|
162
|
+
it "allows :respond_to callback to perform the render" do
|
163
|
+
Coast::TestableController.respond_to(method) { @performed = true }
|
164
|
+
controller = Coast::TestableController.new
|
165
|
+
controller.send(method)
|
166
|
+
assert controller.responded? == false, "Did not allow :respond_to callback to perform the render"
|
167
|
+
end
|
168
|
+
|
169
|
+
it "invokes the authorize_method when set" do
|
170
|
+
Coast::TestableController.authorize_method = :authorize!
|
171
|
+
controller = Coast::TestableController.new
|
172
|
+
controller.send(:index)
|
173
|
+
assert controller.authorize_invoked?, "Did not invoke the authorize_method"
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
ITEM_METHODS.each do |method|
|
180
|
+
describe "##{method}" do
|
181
|
+
before do
|
182
|
+
reset
|
183
|
+
end
|
184
|
+
|
185
|
+
it "allows :before callback to set the item" do
|
186
|
+
item = Object.new
|
187
|
+
Coast::TestableController.before(:index) { @resourceful_item = item }
|
188
|
+
controller = Coast::TestableController.new
|
189
|
+
controller.index
|
190
|
+
assert controller.instance_eval { @resourceful_item } == item, "Did not allow :before callback to set the resourceful_item"
|
191
|
+
end
|
192
|
+
|
193
|
+
it "sets a custom named instance variable for the item" do
|
194
|
+
item = Object.new
|
195
|
+
Coast::TestableController.before(:index) { @resourceful_item = item }
|
196
|
+
controller = Coast::TestableController.new
|
197
|
+
controller.index
|
198
|
+
variable = controller.instance_eval { instance_variable_get(item_instance_var_name) }
|
199
|
+
assert variable != nil, "Did not set a custom instance variable for the item"
|
200
|
+
assert variable == item, "Did not set a custom instance variable for the item to the correct value"
|
201
|
+
end
|
202
|
+
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
MUTATE_METHODS.each do |method|
|
207
|
+
describe "##{method}" do
|
208
|
+
before do
|
209
|
+
reset
|
210
|
+
end
|
211
|
+
|
212
|
+
it "redirects" do
|
213
|
+
controller = Coast::TestableController.new
|
214
|
+
controller.send(method)
|
215
|
+
assert controller.redirected?, "Did not redirect"
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
describe "#index" do
|
222
|
+
before do
|
223
|
+
reset
|
224
|
+
end
|
225
|
+
|
226
|
+
it "allows :before callback to set the list" do
|
227
|
+
list = [ Object.new ]
|
228
|
+
Coast::TestableController.before(:index) { @resourceful_list = list }
|
229
|
+
controller = Coast::TestableController.new
|
230
|
+
controller.index
|
231
|
+
assert controller.instance_eval { @resourceful_list } == list, "Did not allow :before callback to set the resourceful_list"
|
232
|
+
end
|
233
|
+
|
234
|
+
it "sets a custom named instance variable for the item" do
|
235
|
+
list = [ Object.new ]
|
236
|
+
Coast::TestableController.before(:index) { @resourceful_list = list }
|
237
|
+
controller = Coast::TestableController.new
|
238
|
+
controller.index
|
239
|
+
variable = controller.instance_eval { instance_variable_get(list_instance_var_name) }
|
240
|
+
assert variable != nil, "Did not set a custom instance variable for the item"
|
241
|
+
assert variable == list, "Did not set a custom instance variable for the item to the correct value"
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-04-06 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement: &
|
16
|
+
requirement: &2160361220 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,14 +21,16 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2160361220
|
25
25
|
description: Resourceful behavior for Rails controllers with a Sinatra like DSL.
|
26
|
-
email:
|
26
|
+
email:
|
27
|
+
- nate.hop@gmail.com
|
27
28
|
executables: []
|
28
29
|
extensions: []
|
29
30
|
extra_rdoc_files: []
|
30
31
|
files:
|
31
32
|
- lib/coast.rb
|
33
|
+
- spec/coast_spec.rb
|
32
34
|
homepage: https://github.com/hopsoft/coast
|
33
35
|
licenses:
|
34
36
|
- MIT
|
@@ -54,4 +56,5 @@ rubygems_version: 1.8.10
|
|
54
56
|
signing_key:
|
55
57
|
specification_version: 3
|
56
58
|
summary: Coast
|
57
|
-
test_files:
|
59
|
+
test_files:
|
60
|
+
- spec/coast_spec.rb
|