rory 0.5.0 → 0.5.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.
- checksums.yaml +4 -4
- data/lib/rory/controller.rb +1 -1
- data/lib/rory/support.rb +17 -0
- data/lib/rory/version.rb +1 -1
- data/spec/lib/rory/controller_spec.rb +100 -119
- data/spec/lib/rory/support_spec.rb +20 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f460afe6851a0ebbff77cd5459bf5dc2e4637c6c
|
4
|
+
data.tar.gz: f22a44a3d6141f2db251415ce18724e172fb9ca1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 101bc4e7b9de76e550b74eae963664d84f04a70e497d3016f6f117b74ef0140a9939362b6a338fadb6b82558b430682a6a677550c9513341b103723ab176325a
|
7
|
+
data.tar.gz: afc2f14d5c59c4e4ba834813b3c2e82f5f6cbec9f8518c8a7f29e90c28dc9dc135904e70aa79da71189e5765b9e9826d24c5faba2dcae2766be8f5b94cafe227
|
data/lib/rory/controller.rb
CHANGED
data/lib/rory/support.rb
CHANGED
@@ -29,5 +29,22 @@ module Rory
|
|
29
29
|
require file
|
30
30
|
end
|
31
31
|
end
|
32
|
+
|
33
|
+
def encode_as_json(object)
|
34
|
+
hashed = if object.is_a?(Array)
|
35
|
+
object.map { |o| try_to_hash(o) }
|
36
|
+
else
|
37
|
+
try_to_hash(object)
|
38
|
+
end
|
39
|
+
hashed.to_json
|
40
|
+
end
|
41
|
+
|
42
|
+
def try_to_hash(object)
|
43
|
+
if object.respond_to?(:to_hash)
|
44
|
+
object.to_hash
|
45
|
+
else
|
46
|
+
object
|
47
|
+
end
|
48
|
+
end
|
32
49
|
end
|
33
50
|
end
|
data/lib/rory/version.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
describe Rory::Controller do
|
2
|
+
subject { Rory::Controller.new(@request, @routing) }
|
3
|
+
|
2
4
|
before :each do
|
3
5
|
@routing = {
|
4
6
|
:route => Rory::Route.new('', :to => 'test#letsgo')
|
@@ -18,15 +20,13 @@ describe Rory::Controller do
|
|
18
20
|
|
19
21
|
describe '#layout' do
|
20
22
|
it 'defaults to nil' do
|
21
|
-
|
22
|
-
expect(controller.layout).to be_nil
|
23
|
+
expect(subject.layout).to be_nil
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
26
27
|
describe '#params' do
|
27
28
|
it 'returns params from request, converted for indifferent key access' do
|
28
|
-
|
29
|
-
expect(controller.params).to eq({
|
29
|
+
expect(subject.params).to eq({
|
30
30
|
'violet' => 'invisibility',
|
31
31
|
'dash' => 'superspeed',
|
32
32
|
:violet => 'invisibility',
|
@@ -39,8 +39,7 @@ describe Rory::Controller do
|
|
39
39
|
it "delegates to dispatcher from request" do
|
40
40
|
@routing[:dispatcher] = dispatcher = double
|
41
41
|
expect(dispatcher).to receive(:redirect).with(:whatever)
|
42
|
-
|
43
|
-
controller.redirect(:whatever)
|
42
|
+
subject.redirect(:whatever)
|
44
43
|
end
|
45
44
|
end
|
46
45
|
|
@@ -48,117 +47,109 @@ describe Rory::Controller do
|
|
48
47
|
it "delegates to dispatcher from request" do
|
49
48
|
@routing[:dispatcher] = dispatcher = double
|
50
49
|
expect(dispatcher).to receive(:render_not_found)
|
51
|
-
|
52
|
-
controller.render_not_found
|
50
|
+
subject.render_not_found
|
53
51
|
end
|
54
52
|
end
|
55
53
|
|
56
54
|
describe "#base_path" do
|
57
55
|
it "returns script_name from request" do
|
58
|
-
|
59
|
-
expect(controller.base_path).to eq 'script_root'
|
56
|
+
expect(subject.base_path).to eq 'script_root'
|
60
57
|
end
|
61
58
|
end
|
62
59
|
|
63
60
|
describe "#present" do
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
61
|
+
context "with filters" do
|
62
|
+
subject { FilteredController.new(@request, @routing) }
|
63
|
+
|
64
|
+
it "calls filters and action from route if exists on controller" do
|
65
|
+
[:pickle_something, :make_it_tasty, :letsgo, :rub_tummy, :sleep, :render].each do |m|
|
66
|
+
expect(subject).to receive(m).ordered
|
67
|
+
end
|
68
|
+
subject.present
|
68
69
|
end
|
69
|
-
controller.present
|
70
|
-
end
|
71
70
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
71
|
+
it "short circuits if a before_action generates a response" do
|
72
|
+
def subject.pickle_something
|
73
|
+
@response = 'stuff'
|
74
|
+
end
|
75
|
+
[:make_it_tasty, :letsgo, :rub_tummy, :sleep, :render].each do |m|
|
76
|
+
expect(subject).to receive(m).never
|
77
|
+
end
|
78
|
+
subject.present
|
79
79
|
end
|
80
|
-
controller.present
|
81
|
-
end
|
82
80
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
81
|
+
it "does not short circuit after_actions if action generates response" do
|
82
|
+
def subject.letsgo
|
83
|
+
@response = 'stuff'
|
84
|
+
end
|
85
|
+
expect(subject).to receive(:pickle_something).ordered
|
86
|
+
expect(subject).to receive(:make_it_tasty).ordered
|
87
|
+
expect(subject).to receive(:letsgo).ordered.and_call_original
|
88
|
+
expect(subject).to receive(:rub_tummy).ordered
|
89
|
+
expect(subject).to receive(:sleep).ordered
|
90
|
+
expect(subject).to receive(:render).never
|
91
|
+
subject.present
|
87
92
|
end
|
88
|
-
expect(controller).to receive(:pickle_something).ordered
|
89
|
-
expect(controller).to receive(:make_it_tasty).ordered
|
90
|
-
expect(controller).to receive(:letsgo).ordered.and_call_original
|
91
|
-
expect(controller).to receive(:rub_tummy).ordered
|
92
|
-
expect(controller).to receive(:sleep).ordered
|
93
|
-
expect(controller).to receive(:render).never
|
94
|
-
controller.present
|
95
|
-
end
|
96
93
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
94
|
+
it "doesn't try to call action from route if nonexistent on controller" do
|
95
|
+
allow(@routing[:route]).to receive(:action).and_return('no worries')
|
96
|
+
[:pickle_something, :make_it_tasty, :rub_tummy, :sleep, :render].each do |m|
|
97
|
+
expect(subject).to receive(m).ordered
|
98
|
+
end
|
99
|
+
expect { subject.present }.not_to raise_error
|
102
100
|
end
|
103
|
-
expect { controller.present }.not_to raise_error
|
104
|
-
end
|
105
101
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
end
|
102
|
+
it "filters before and after actions on :only and :except" do
|
103
|
+
@routing[:route] = Rory::Route.new('', :to => 'test#eat')
|
104
|
+
expect(subject).to receive(:make_it_tasty).ordered
|
105
|
+
expect(subject).to receive(:make_it_nutritious).ordered
|
106
|
+
expect(subject).to receive(:eat).ordered
|
107
|
+
expect(subject).to receive(:rub_tummy).ordered
|
108
|
+
expect(subject).to receive(:smile).ordered
|
109
|
+
expect(subject).to receive(:sleep).never
|
110
|
+
expect(subject).to receive(:render).ordered
|
111
|
+
subject.present
|
112
|
+
end
|
118
113
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
114
|
+
it "filters before and after actions on :if and :unless" do
|
115
|
+
@routing[:route] = Rory::Route.new('', :to => 'test#eat')
|
116
|
+
@request = double('Rack::Request', {
|
117
|
+
:params => { 'horses' => 'missing' },
|
118
|
+
:script_name => 'script_root'
|
119
|
+
})
|
120
|
+
expect(subject).to receive(:make_it_tasty).never
|
121
|
+
expect(subject).to receive(:make_it_nutritious).ordered
|
122
|
+
expect(subject).to receive(:eat).ordered
|
123
|
+
expect(subject).to receive(:rub_tummy).never
|
124
|
+
expect(subject).to receive(:smile).ordered
|
125
|
+
expect(subject).to receive(:sleep).never
|
126
|
+
expect(subject).to receive(:render).ordered
|
127
|
+
subject.present
|
128
|
+
end
|
134
129
|
end
|
135
130
|
|
136
131
|
it "just returns a response if @response exists" do
|
137
|
-
|
138
|
-
|
139
|
-
expect(controller.present).to eq('Forced response')
|
132
|
+
subject.instance_variable_set(:@response, 'Forced response')
|
133
|
+
expect(subject.present).to eq('Forced response')
|
140
134
|
end
|
141
135
|
|
142
136
|
it "sends a previously set @body to render" do
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
expect(controller.present).to eq('Forced response')
|
137
|
+
subject.instance_variable_set(:@body, 'Forced body')
|
138
|
+
allow(subject).to receive(:render).with(:body => 'Forced body').and_return("Forced response")
|
139
|
+
expect(subject.present).to eq('Forced response')
|
147
140
|
end
|
148
141
|
|
149
142
|
it "returns the result of render" do
|
150
|
-
|
151
|
-
|
152
|
-
expect(controller.present).to eq('The response')
|
143
|
+
allow(subject).to receive(:render).with(:body => nil).and_return("The response")
|
144
|
+
expect(subject.present).to eq('The response')
|
153
145
|
end
|
154
146
|
end
|
155
147
|
|
156
148
|
describe "#render" do
|
157
149
|
it "returns the result of #generate_body_for_render as a rack response" do
|
158
|
-
|
159
|
-
allow(
|
160
|
-
|
161
|
-
expect(controller.render).to eq([
|
150
|
+
allow(subject).to receive(:default_content_type).and_return("a prison")
|
151
|
+
allow(subject).to receive(:generate_for_render).and_return("Valoop!")
|
152
|
+
expect(subject.render).to eq([
|
162
153
|
200,
|
163
154
|
{'Content-type' => 'a prison', 'charset' => 'UTF-8'},
|
164
155
|
["Valoop!"]
|
@@ -166,9 +157,8 @@ describe Rory::Controller do
|
|
166
157
|
end
|
167
158
|
|
168
159
|
it "returns given body as a rack response" do
|
169
|
-
|
170
|
-
|
171
|
-
expect(controller.render(:body => 'Forced body')).to eq([
|
160
|
+
allow(subject).to receive(:default_content_type).and_return("snooj/woz")
|
161
|
+
expect(subject.render(:body => 'Forced body')).to eq([
|
172
162
|
200,
|
173
163
|
{'Content-type' => 'snooj/woz', 'charset' => 'UTF-8'},
|
174
164
|
["Forced body"]
|
@@ -178,58 +168,51 @@ describe Rory::Controller do
|
|
178
168
|
|
179
169
|
describe "#json_requested?" do
|
180
170
|
it "delegates to dispatcher" do
|
181
|
-
|
182
|
-
|
183
|
-
expect(controller.json_requested?).to eq(:snakes)
|
171
|
+
allow(subject).to receive(:dispatcher).and_return(double(:json_requested? => :snakes))
|
172
|
+
expect(subject.json_requested?).to eq(:snakes)
|
184
173
|
end
|
185
174
|
end
|
186
175
|
|
187
176
|
describe "#generate_for_render" do
|
188
177
|
it "renders and returns the default template if not json" do
|
189
|
-
|
190
|
-
|
191
|
-
expect(controller.generate_for_render).to eq("Whee")
|
178
|
+
allow(subject).to receive(:generate_body_from_template).with("test/letsgo", {}).and_return("Whee")
|
179
|
+
expect(subject.generate_for_render).to eq("Whee")
|
192
180
|
end
|
193
181
|
|
194
182
|
it "renders and returns the given template if not json" do
|
195
|
-
|
196
|
-
|
197
|
-
expect(controller.generate_for_render(:template => 'engines')).to eq("Oh dear")
|
183
|
+
allow(subject).to receive(:generate_body_from_template).with("engines", {}).and_return("Oh dear")
|
184
|
+
expect(subject.generate_for_render(:template => 'engines')).to eq("Oh dear")
|
198
185
|
end
|
199
186
|
|
200
187
|
it "returns json version of given json object if json" do
|
201
|
-
|
202
|
-
|
203
|
-
expect(controller.generate_for_render(:json => :an_object)).to eq("Oh dear")
|
188
|
+
allow(subject).to receive(:generate_json_from_object).with(:an_object, {}).and_return("Oh dear")
|
189
|
+
expect(subject.generate_for_render(:json => :an_object)).to eq("Oh dear")
|
204
190
|
end
|
205
191
|
end
|
206
192
|
|
207
193
|
describe "#generate_json_from_object" do
|
208
|
-
it "
|
209
|
-
|
210
|
-
|
211
|
-
expect(controller.generate_json_from_object(object)).to eq(:jsonified)
|
194
|
+
it "encodes given object as json" do
|
195
|
+
allow(Rory::Support).to receive(:encode_as_json).with(:foo).and_return(:encoded_foo)
|
196
|
+
expect(subject.generate_json_from_object(:foo)).to eq(:encoded_foo)
|
212
197
|
end
|
213
198
|
end
|
214
199
|
|
215
200
|
describe "#generate_body_from_template" do
|
216
201
|
it "returns rendered template with given name" do
|
217
|
-
|
218
|
-
expect(controller.generate_body_from_template('test/letsgo')).to eq("Let's go content")
|
202
|
+
expect(subject.generate_body_from_template('test/letsgo')).to eq("Let's go content")
|
219
203
|
end
|
220
204
|
|
221
205
|
it "returns renderer output" do
|
222
|
-
controller = Rory::Controller.new(@request, @routing)
|
223
206
|
allow(Rory::Renderer).to receive(:new).
|
224
|
-
with('not/real',
|
207
|
+
with('not/real', subject.default_renderer_options).
|
225
208
|
and_return(double('Renderer', :render => 'Here ya go'))
|
226
|
-
expect(
|
209
|
+
expect(subject.generate_body_from_template('not/real')).to eq('Here ya go')
|
227
210
|
end
|
228
211
|
|
229
212
|
it "passes layout, exposed locals, and app to renderer" do
|
230
|
-
|
231
|
-
|
232
|
-
allow(
|
213
|
+
subject = Rory::Controller.new(@request, @routing, :scooby)
|
214
|
+
subject.expose(:a => 1)
|
215
|
+
allow(subject).to receive(:layout).and_return('pretend')
|
233
216
|
renderer_options = {
|
234
217
|
:layout => 'pretend',
|
235
218
|
:locals => { :a => 1 },
|
@@ -239,21 +222,19 @@ describe Rory::Controller do
|
|
239
222
|
allow(Rory::Renderer).to receive(:new).
|
240
223
|
with('also/fake', renderer_options).
|
241
224
|
and_return(double('Renderer', :render => 'Scamazing!'))
|
242
|
-
expect(
|
225
|
+
expect(subject.generate_body_from_template('also/fake')).to eq('Scamazing!')
|
243
226
|
end
|
244
227
|
end
|
245
228
|
|
246
229
|
describe "#default_content_type" do
|
247
230
|
it "returns 'text/html' if not json" do
|
248
|
-
|
249
|
-
|
250
|
-
expect(controller.default_content_type).to eq('text/html')
|
231
|
+
allow(subject).to receive(:json_requested?).and_return(false)
|
232
|
+
expect(subject.default_content_type).to eq('text/html')
|
251
233
|
end
|
252
234
|
|
253
235
|
it "returns 'application/json' if json requested" do
|
254
|
-
|
255
|
-
|
256
|
-
expect(controller.default_content_type).to eq('application/json')
|
236
|
+
allow(subject).to receive(:json_requested?).and_return(true)
|
237
|
+
expect(subject.default_content_type).to eq('application/json')
|
257
238
|
end
|
258
239
|
end
|
259
240
|
end
|
@@ -64,4 +64,24 @@ describe Rory::Support do
|
|
64
64
|
expect(described_class.tokenize(:yourFaceIsNice)).to eq('your_face_is_nice')
|
65
65
|
end
|
66
66
|
end
|
67
|
+
|
68
|
+
describe ".encode_as_json" do
|
69
|
+
it "returns given object as json" do
|
70
|
+
object = double(:to_json => :jsonified)
|
71
|
+
expect(described_class.encode_as_json(object)).to eq(:jsonified)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "calls to_hash first if object responds to it" do
|
75
|
+
object = double(:to_hash => { 'april' => 'friday' })
|
76
|
+
expect(described_class.encode_as_json(object)).to eq({ 'april' => 'friday' }.to_json)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "converts each member of an array" do
|
80
|
+
object = [
|
81
|
+
double(:to_hash => :smurf),
|
82
|
+
double(:to_hash => :nerf)
|
83
|
+
]
|
84
|
+
expect(described_class.encode_as_json(object)).to eq([:smurf, :nerf].to_json)
|
85
|
+
end
|
86
|
+
end
|
67
87
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ravi Gadad
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|