roda 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +34 -0
- data/Rakefile +22 -46
- data/doc/release_notes/2.3.0.txt +109 -0
- data/lib/roda/plugins/assets.rb +2 -1
- data/lib/roda/plugins/caching.rb +1 -1
- data/lib/roda/plugins/chunked.rb +1 -1
- data/lib/roda/plugins/error_email.rb +1 -1
- data/lib/roda/plugins/head.rb +6 -0
- data/lib/roda/plugins/heartbeat.rb +40 -0
- data/lib/roda/plugins/json.rb +23 -3
- data/lib/roda/plugins/json_parser.rb +72 -0
- data/lib/roda/plugins/mailer.rb +22 -5
- data/lib/roda/plugins/named_templates.rb +2 -2
- data/lib/roda/plugins/path_rewriter.rb +82 -0
- data/lib/roda/plugins/precompile_templates.rb +87 -0
- data/lib/roda/plugins/render.rb +111 -43
- data/lib/roda/plugins/render_each.rb +1 -1
- data/lib/roda/plugins/shared_vars.rb +1 -1
- data/lib/roda/plugins/view_options.rb +28 -3
- data/lib/roda/version.rb +1 -1
- data/spec/composition_spec.rb +3 -3
- data/spec/env_spec.rb +1 -1
- data/spec/freeze_spec.rb +6 -6
- data/spec/integration_spec.rb +16 -15
- data/spec/matchers_spec.rb +110 -110
- data/spec/opts_spec.rb +8 -8
- data/spec/plugin/_erubis_escaping_spec.rb +34 -3
- data/spec/plugin/all_verbs_spec.rb +8 -8
- data/spec/plugin/assets_spec.rb +164 -150
- data/spec/plugin/backtracking_array_spec.rb +18 -18
- data/spec/plugin/caching_spec.rb +70 -70
- data/spec/plugin/chunked_spec.rb +38 -38
- data/spec/plugin/class_level_routing_spec.rb +78 -78
- data/spec/plugin/content_for_spec.rb +2 -2
- data/spec/plugin/cookies_spec.rb +4 -4
- data/spec/plugin/csrf_spec.rb +8 -8
- data/spec/plugin/default_headers_spec.rb +6 -6
- data/spec/plugin/delay_build_spec.rb +7 -6
- data/spec/plugin/delegate_spec.rb +2 -2
- data/spec/plugin/delete_empty_headers_spec.rb +2 -2
- data/spec/plugin/drop_body_spec.rb +6 -6
- data/spec/plugin/empty_root_spec.rb +3 -3
- data/spec/plugin/environments_spec.rb +7 -7
- data/spec/plugin/error_email_spec.rb +23 -23
- data/spec/plugin/error_handler_spec.rb +14 -14
- data/spec/plugin/flash_spec.rb +30 -29
- data/spec/plugin/h_spec.rb +1 -1
- data/spec/plugin/halt_spec.rb +16 -16
- data/spec/plugin/hash_matcher_spec.rb +5 -5
- data/spec/plugin/head_spec.rb +10 -10
- data/spec/plugin/header_matchers_spec.rb +13 -13
- data/spec/plugin/heartbeat_spec.rb +74 -0
- data/spec/plugin/hooks_spec.rb +20 -20
- data/spec/plugin/indifferent_params_spec.rb +1 -1
- data/spec/plugin/json_parser_spec.rb +72 -0
- data/spec/plugin/json_spec.rb +22 -9
- data/spec/plugin/mailer_spec.rb +72 -58
- data/spec/plugin/match_affix_spec.rb +2 -2
- data/spec/plugin/middleware_spec.rb +7 -7
- data/spec/plugin/module_include_spec.rb +4 -4
- data/spec/plugin/multi_route_spec.rb +66 -66
- data/spec/plugin/multi_run_spec.rb +21 -21
- data/spec/plugin/named_templates_spec.rb +6 -6
- data/spec/plugin/not_allowed_spec.rb +17 -17
- data/spec/plugin/not_found_spec.rb +14 -14
- data/spec/plugin/padrino_render_spec.rb +2 -2
- data/spec/plugin/param_matchers_spec.rb +6 -6
- data/spec/plugin/partials_spec.rb +3 -3
- data/spec/plugin/pass_spec.rb +7 -7
- data/spec/plugin/path_matchers_spec.rb +6 -6
- data/spec/plugin/path_rewriter_spec.rb +37 -0
- data/spec/plugin/path_spec.rb +41 -40
- data/spec/plugin/per_thread_caching_spec.rb +6 -6
- data/spec/plugin/precompile_templates_spec.rb +74 -0
- data/spec/plugin/render_each_spec.rb +4 -4
- data/spec/plugin/render_spec.rb +179 -76
- data/spec/plugin/shared_vars_spec.rb +4 -4
- data/spec/plugin/sinatra_helpers_spec.rb +121 -121
- data/spec/plugin/slash_path_empty_spec.rb +10 -10
- data/spec/plugin/static_spec.rb +4 -4
- data/spec/plugin/streaming_spec.rb +11 -11
- data/spec/plugin/symbol_matchers_spec.rb +24 -24
- data/spec/plugin/symbol_views_spec.rb +3 -3
- data/spec/plugin/view_options_spec.rb +10 -10
- data/spec/plugin_spec.rb +2 -2
- data/spec/redirect_spec.rb +10 -10
- data/spec/request_spec.rb +8 -8
- data/spec/response_spec.rb +23 -23
- data/spec/session_spec.rb +4 -4
- data/spec/spec_helper.rb +5 -19
- data/spec/version_spec.rb +4 -4
- data/spec/views/iv.erb +1 -0
- metadata +16 -5
@@ -32,10 +32,10 @@ describe "render_each plugin" do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
body.
|
36
|
-
body("/a").
|
37
|
-
body("/b").
|
38
|
-
body("/c").
|
35
|
+
body.must_equal 'rfoo1 rfoo2 rfoo3 '
|
36
|
+
body("/a").must_equal 'rbar14 rbar24 rbar34 '
|
37
|
+
body("/b").must_equal 'rbar rbar rbar '
|
38
|
+
body("/c").must_equal 'rbar41 rbar42 rbar43 '
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
data/spec/plugin/render_spec.rb
CHANGED
@@ -36,35 +36,35 @@ describe "render plugin" do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
it "default actions" do
|
39
|
-
body("/about").strip.
|
40
|
-
body("/home").strip.
|
41
|
-
body("/inline").strip.
|
42
|
-
body("/path").strip.
|
43
|
-
body("/content").strip.
|
39
|
+
body("/about").strip.must_equal "<h1>About Roda</h1>"
|
40
|
+
body("/home").strip.must_equal "<title>Roda: Home</title>\n<h1>Home</h1>\n<p>Hello Agent Smith</p>"
|
41
|
+
body("/inline").strip.must_equal "Hello Agent Smith"
|
42
|
+
body("/path").strip.must_equal "<h1>Path</h1>"
|
43
|
+
body("/content").strip.must_equal "<title>Roda: Home</title>\nbar"
|
44
44
|
end
|
45
45
|
|
46
46
|
it "with str as engine" do
|
47
47
|
app.plugin :render, :engine => "str"
|
48
|
-
body("/about").strip.
|
49
|
-
body("/home").strip.
|
50
|
-
body("/inline").strip.
|
48
|
+
body("/about").strip.must_equal "<h1>About Roda</h1>"
|
49
|
+
body("/home").strip.must_equal "<title>Roda: Home</title>\n<h1>Home</h1>\n<p>Hello Agent Smith</p>"
|
50
|
+
body("/inline").strip.must_equal "Hello <%= name %>"
|
51
51
|
end
|
52
52
|
|
53
53
|
it "with str as ext" do
|
54
54
|
app.plugin :render, :ext => "str"
|
55
|
-
body("/about").strip.
|
56
|
-
body("/home").strip.
|
57
|
-
body("/inline").strip.
|
55
|
+
body("/about").strip.must_equal "<h1>About Roda</h1>"
|
56
|
+
body("/home").strip.must_equal "<title>Roda: Home</title>\n<h1>Home</h1>\n<p>Hello Agent Smith</p>"
|
57
|
+
body("/inline").strip.must_equal "Hello <%= name %>"
|
58
58
|
end
|
59
59
|
|
60
60
|
it "custom default layout support" do
|
61
61
|
app.plugin :render, :layout => "layout-alternative"
|
62
|
-
body("/home").strip.
|
62
|
+
body("/home").strip.must_equal "<title>Alternative Layout: Home</title>\n<h1>Home</h1>\n<p>Hello Agent Smith</p>"
|
63
63
|
end
|
64
64
|
|
65
65
|
it "using hash for :layout" do
|
66
66
|
app.plugin :render, :layout => {:inline=> 'a<%= yield %>b'}
|
67
|
-
body("/home").strip.
|
67
|
+
body("/home").strip.must_equal "a<h1>Home</h1>\n<p>Hello Agent Smith</p>\nb"
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
@@ -80,7 +80,7 @@ describe "render plugin" do
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
body.gsub(/\n+/, "\n").
|
83
|
+
body.gsub(/\n+/, "\n").must_equal "Header\nThis is the actual content.\nFooter\n"
|
84
84
|
end
|
85
85
|
|
86
86
|
it "views without default layouts" do
|
@@ -92,7 +92,7 @@ describe "render plugin" do
|
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
|
-
body.strip.
|
95
|
+
body.strip.must_equal "<h1>Home</h1>\n<p>Hello Agent Smith</p>"
|
96
96
|
end
|
97
97
|
|
98
98
|
it "layout overrides" do
|
@@ -104,7 +104,7 @@ describe "render plugin" do
|
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
107
|
-
body.strip.
|
107
|
+
body.strip.must_equal "<title>Alternative Layout: Home</title>\n<h1>Home</h1>\n<p>Hello Agent Smith</p>"
|
108
108
|
end
|
109
109
|
|
110
110
|
it "locals overrides" do
|
@@ -116,7 +116,7 @@ describe "render plugin" do
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
-
body.strip.
|
119
|
+
body.strip.must_equal "Roda:AA::Home:BB"
|
120
120
|
end
|
121
121
|
|
122
122
|
it ":layout=>true/false/string/hash/not-present respects plugin layout switch and template" do
|
@@ -133,73 +133,73 @@ describe "render plugin" do
|
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
|
-
body.gsub("\n", '').
|
137
|
-
body('/a').gsub("\n", '').
|
138
|
-
body('/f').gsub("\n", '').
|
139
|
-
body('/s').gsub("\n", '').
|
140
|
-
body('/h').gsub("\n", '').
|
136
|
+
body.gsub("\n", '').must_equal "HeaderbarFooter"
|
137
|
+
body('/a').gsub("\n", '').must_equal "HeaderbarFooter"
|
138
|
+
body('/f').gsub("\n", '').must_equal "bar"
|
139
|
+
body('/s').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
140
|
+
body('/h').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
141
141
|
|
142
142
|
app.plugin :render
|
143
|
-
body.gsub("\n", '').
|
144
|
-
body('/a').gsub("\n", '').
|
145
|
-
body('/f').gsub("\n", '').
|
146
|
-
body('/s').gsub("\n", '').
|
147
|
-
body('/h').gsub("\n", '').
|
143
|
+
body.gsub("\n", '').must_equal "HeaderbarFooter"
|
144
|
+
body('/a').gsub("\n", '').must_equal "HeaderbarFooter"
|
145
|
+
body('/f').gsub("\n", '').must_equal "bar"
|
146
|
+
body('/s').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
147
|
+
body('/h').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
148
148
|
|
149
149
|
app.plugin :render, :layout=>true
|
150
|
-
body.gsub("\n", '').
|
151
|
-
body('/a').gsub("\n", '').
|
152
|
-
body('/f').gsub("\n", '').
|
153
|
-
body('/s').gsub("\n", '').
|
154
|
-
body('/h').gsub("\n", '').
|
150
|
+
body.gsub("\n", '').must_equal "HeaderbarFooter"
|
151
|
+
body('/a').gsub("\n", '').must_equal "HeaderbarFooter"
|
152
|
+
body('/f').gsub("\n", '').must_equal "bar"
|
153
|
+
body('/s').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
154
|
+
body('/h').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
155
155
|
|
156
156
|
app.plugin :render, :layout=>'layout-alternative'
|
157
|
-
body.gsub("\n", '').
|
158
|
-
body('/a').gsub("\n", '').
|
159
|
-
body('/f').gsub("\n", '').
|
160
|
-
body('/s').gsub("\n", '').
|
161
|
-
body('/h').gsub("\n", '').
|
157
|
+
body.gsub("\n", '').must_equal "<title>Alternative Layout: a</title>bar"
|
158
|
+
body('/a').gsub("\n", '').must_equal "<title>Alternative Layout: a</title>bar"
|
159
|
+
body('/f').gsub("\n", '').must_equal "bar"
|
160
|
+
body('/s').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
161
|
+
body('/h').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
162
162
|
|
163
163
|
app.plugin :render, :layout=>nil
|
164
|
-
body.gsub("\n", '').
|
165
|
-
body('/a').gsub("\n", '').
|
166
|
-
body('/f').gsub("\n", '').
|
167
|
-
body('/s').gsub("\n", '').
|
168
|
-
body('/h').gsub("\n", '').
|
164
|
+
body.gsub("\n", '').must_equal "HeaderbarFooter"
|
165
|
+
body('/a').gsub("\n", '').must_equal "bar"
|
166
|
+
body('/f').gsub("\n", '').must_equal "bar"
|
167
|
+
body('/s').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
168
|
+
body('/h').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
169
169
|
|
170
170
|
app.plugin :render, :layout=>false
|
171
|
-
body.gsub("\n", '').
|
172
|
-
body('/a').gsub("\n", '').
|
173
|
-
body('/f').gsub("\n", '').
|
174
|
-
body('/s').gsub("\n", '').
|
175
|
-
body('/h').gsub("\n", '').
|
171
|
+
body.gsub("\n", '').must_equal "HeaderbarFooter"
|
172
|
+
body('/a').gsub("\n", '').must_equal "bar"
|
173
|
+
body('/f').gsub("\n", '').must_equal "bar"
|
174
|
+
body('/s').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
175
|
+
body('/h').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
176
176
|
|
177
177
|
app.plugin :render, :layout_opts=>{:template=>'layout-alternative', :locals=>{:title=>'a'}}
|
178
|
-
body.gsub("\n", '').
|
179
|
-
body('/a').gsub("\n", '').
|
180
|
-
body('/f').gsub("\n", '').
|
181
|
-
body('/s').gsub("\n", '').
|
182
|
-
body('/h').gsub("\n", '').
|
178
|
+
body.gsub("\n", '').must_equal "<title>Alternative Layout: a</title>bar"
|
179
|
+
body('/a').gsub("\n", '').must_equal "bar"
|
180
|
+
body('/f').gsub("\n", '').must_equal "bar"
|
181
|
+
body('/s').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
182
|
+
body('/h').gsub("\n", '').must_equal "<title>Roda: a</title>bar"
|
183
183
|
end
|
184
184
|
|
185
185
|
it "app :root option affects :views default" do
|
186
186
|
app
|
187
187
|
app.plugin :render
|
188
|
-
app.render_opts[:views].
|
188
|
+
app.render_opts[:views].must_equal File.join(Dir.pwd, 'views')
|
189
189
|
|
190
190
|
app.opts[:root] = '/foo'
|
191
191
|
app.plugin :render
|
192
|
-
app.render_opts[:views].
|
192
|
+
app.render_opts[:views].must_equal '/foo/views'
|
193
193
|
|
194
194
|
app.opts[:root] = '/foo/bar'
|
195
195
|
app.plugin :render
|
196
|
-
app.render_opts[:views].
|
196
|
+
app.render_opts[:views].must_equal '/foo/bar/views'
|
197
197
|
|
198
198
|
app.opts[:root] = nil
|
199
199
|
app.plugin :render
|
200
|
-
app.render_opts[:views].
|
200
|
+
app.render_opts[:views].must_equal File.join(Dir.pwd, 'views')
|
201
201
|
app.plugin :render, :views=>'bar'
|
202
|
-
app.render_opts[:views].
|
202
|
+
app.render_opts[:views].must_equal File.join(Dir.pwd, 'bar')
|
203
203
|
end
|
204
204
|
|
205
205
|
it "inline layouts and inline views" do
|
@@ -207,7 +207,7 @@ describe "render plugin" do
|
|
207
207
|
view({:inline=>'bar'}, :layout=>{:inline=>'Foo: <%= yield %>'})
|
208
208
|
end
|
209
209
|
|
210
|
-
body.strip.
|
210
|
+
body.strip.must_equal "Foo: bar"
|
211
211
|
end
|
212
212
|
|
213
213
|
it "inline renders with opts" do
|
@@ -215,7 +215,7 @@ describe "render plugin" do
|
|
215
215
|
render({:inline=>'<%= bar %>'}, {:engine=>'str'})
|
216
216
|
end
|
217
217
|
|
218
|
-
body.strip.
|
218
|
+
body.strip.must_equal '<%= bar %>'
|
219
219
|
end
|
220
220
|
|
221
221
|
it "template renders with :template opts" do
|
@@ -225,7 +225,7 @@ describe "render plugin" do
|
|
225
225
|
render(:template=>"about", :locals=>{:title => "About Roda"})
|
226
226
|
end
|
227
227
|
end
|
228
|
-
body.strip.
|
228
|
+
body.strip.must_equal "<h1>About Roda</h1>"
|
229
229
|
end
|
230
230
|
|
231
231
|
it "template renders with :template_class opts" do
|
@@ -233,7 +233,22 @@ describe "render plugin" do
|
|
233
233
|
@a = 1
|
234
234
|
render(:inline=>'i#{@a}', :template_class=>::Tilt[:str])
|
235
235
|
end
|
236
|
-
body.
|
236
|
+
body.must_equal "i1"
|
237
|
+
end
|
238
|
+
|
239
|
+
it "can specify engine-specific options via :engine_opts" do
|
240
|
+
app(:bare) do
|
241
|
+
plugin :render, :engine_opts=>{'a.erb'=>{:outvar=>'@a'}}
|
242
|
+
route do |r|
|
243
|
+
r.is('a') do
|
244
|
+
render(:inline=>'<%= @a.class.name %>', :engine=>'a.erb')
|
245
|
+
end
|
246
|
+
render(:inline=>'<%= @a.class.name %>')
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
body('/a').must_equal "String"
|
251
|
+
body.must_equal "NilClass"
|
237
252
|
end
|
238
253
|
|
239
254
|
it "template cache respects :template_opts" do
|
@@ -256,32 +271,120 @@ describe "render plugin" do
|
|
256
271
|
end
|
257
272
|
end
|
258
273
|
|
259
|
-
body('/a').
|
260
|
-
body('/b').
|
274
|
+
body('/a').must_equal "i-a"
|
275
|
+
body('/b').must_equal "i-b"
|
261
276
|
end
|
262
277
|
|
263
|
-
it "template cache respects :
|
278
|
+
it "template cache respects :template_block" do
|
264
279
|
c = Class.new do
|
265
|
-
def initialize(path,
|
280
|
+
def initialize(path, *, &block)
|
266
281
|
@path = path
|
267
|
-
@
|
282
|
+
@block = block
|
268
283
|
end
|
269
284
|
def render(*)
|
270
|
-
"#{@path}-#{@
|
285
|
+
"#{@path}-#{@block.call}"
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
proca = proc{'a'}
|
290
|
+
procb = proc{'b'}
|
291
|
+
|
292
|
+
app(:render) do |r|
|
293
|
+
r.is "a" do
|
294
|
+
render(:path=>"i", :template_class=>c, :template_block=>proca)
|
295
|
+
end
|
296
|
+
r.is "b" do
|
297
|
+
render(:path=>"i", :template_class=>c, :template_block=>procb)
|
271
298
|
end
|
272
299
|
end
|
273
300
|
|
301
|
+
body('/a').must_equal "i-a"
|
302
|
+
body('/b').must_equal "i-b"
|
303
|
+
end
|
304
|
+
|
305
|
+
it "template cache respects :locals" do
|
306
|
+
template = '<%= @a ? b : c %>'
|
307
|
+
|
274
308
|
app(:render) do |r|
|
275
309
|
r.is "a" do
|
276
|
-
|
310
|
+
@a = true
|
311
|
+
render(:inline=>template.dup, :locals=>{:b=>1})
|
277
312
|
end
|
278
313
|
r.is "b" do
|
279
|
-
|
314
|
+
@a = true
|
315
|
+
render(:inline=>template.dup, :locals=>{:b=>2, :c=>4})
|
316
|
+
end
|
317
|
+
r.is "c" do
|
318
|
+
render(:inline=>template.dup, :locals=>{:c=>3})
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
body('/a').must_equal "1"
|
323
|
+
body('/b').must_equal "2"
|
324
|
+
body('/c').must_equal "3"
|
325
|
+
end
|
326
|
+
|
327
|
+
it "Support :cache=>false option to disable template caching" do
|
328
|
+
app(:bare) do
|
329
|
+
plugin :render, :views=>"./spec/views"
|
330
|
+
|
331
|
+
route do |r|
|
332
|
+
@a = 'a'
|
333
|
+
r.is('a'){render('iv', :cache=>false)}
|
334
|
+
render('iv')
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
body('/a').strip.must_equal "a"
|
339
|
+
app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].must_equal nil
|
340
|
+
body('/b').strip.must_equal "a"
|
341
|
+
app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].wont_equal nil
|
342
|
+
end
|
343
|
+
|
344
|
+
it "Support :cache=>true option to enable template caching when :template_block is used" do
|
345
|
+
c = Class.new do
|
346
|
+
def initialize(path, *, &block)
|
347
|
+
@path = path
|
348
|
+
@block = block
|
349
|
+
end
|
350
|
+
def render(*)
|
351
|
+
"#{@path}-#{@block.call}"
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
proca = proc{'a'}
|
356
|
+
|
357
|
+
app(:bare) do
|
358
|
+
plugin :render, :views=>"./spec/views"
|
359
|
+
|
360
|
+
route do |r|
|
361
|
+
@a = 'a'
|
362
|
+
r.is('a'){render(:path=>'iv', :template_class=>c, :template_block=>proca)}
|
363
|
+
render(:path=>'iv', :template_class=>c, :template_block=>proca, :cache=>true)
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
body('/a').strip.must_equal "iv-a"
|
368
|
+
app.render_opts[:cache][['iv', c, nil, nil, proca]].must_equal nil
|
369
|
+
body('/b').strip.must_equal "iv-a"
|
370
|
+
app.render_opts[:cache][['iv', c, nil, nil, proca]].wont_equal nil
|
371
|
+
end
|
372
|
+
|
373
|
+
it "Support :cache_key option to force the key used when caching" do
|
374
|
+
app(:bare) do
|
375
|
+
plugin :render, :views=>"./spec/views"
|
376
|
+
|
377
|
+
route do |r|
|
378
|
+
@a = 'a'
|
379
|
+
r.is('a'){render('iv', :cache_key=>:a)}
|
380
|
+
r.is('about'){render('about', :cache_key=>:a, :cache=>false, :locals=>{:title=>'a'})}
|
381
|
+
render('about', :cache_key=>:a)
|
280
382
|
end
|
281
383
|
end
|
282
384
|
|
283
|
-
body('/a').
|
284
|
-
body('/b').
|
385
|
+
body('/a').strip.must_equal "a"
|
386
|
+
body('/b').strip.must_equal "a"
|
387
|
+
body('/about').strip.must_equal "<h1>a</h1>"
|
285
388
|
end
|
286
389
|
|
287
390
|
it "render_opts inheritance" do
|
@@ -289,15 +392,15 @@ describe "render plugin" do
|
|
289
392
|
c.plugin :render
|
290
393
|
sc = Class.new(c)
|
291
394
|
|
292
|
-
c.render_opts.
|
293
|
-
c.render_opts[:cache].
|
395
|
+
c.render_opts.wont_be_same_as(sc.render_opts)
|
396
|
+
c.render_opts[:cache].wont_be_same_as(sc.render_opts[:cache])
|
294
397
|
end
|
295
398
|
|
296
399
|
it "render plugin call should not override options" do
|
297
400
|
c = Class.new(Roda)
|
298
401
|
c.plugin :render, :layout=>:foo
|
299
402
|
c.plugin :render
|
300
|
-
c.render_opts[:layout].
|
403
|
+
c.render_opts[:layout].must_equal :foo
|
301
404
|
end
|
302
405
|
|
303
406
|
it "with caching disabled" do
|
@@ -309,9 +412,9 @@ describe "render plugin" do
|
|
309
412
|
end
|
310
413
|
end
|
311
414
|
|
312
|
-
body("/inline").strip.
|
415
|
+
body("/inline").strip.must_equal "Hello Agent Smith: false"
|
313
416
|
|
314
|
-
Class.new(app).render_opts[:cache].
|
417
|
+
Class.new(app).render_opts[:cache].must_equal false
|
315
418
|
end
|
316
419
|
end
|
317
420
|
end
|
@@ -9,7 +9,7 @@ describe "shared_vars plugin" do
|
|
9
9
|
r.run old_app
|
10
10
|
end
|
11
11
|
|
12
|
-
body.
|
12
|
+
body.must_equal 'c'
|
13
13
|
end
|
14
14
|
|
15
15
|
it "adds shared with hash merges the hash into the shared vars" do
|
@@ -18,7 +18,7 @@ describe "shared_vars plugin" do
|
|
18
18
|
shared[:c]
|
19
19
|
end
|
20
20
|
|
21
|
-
body.
|
21
|
+
body.must_equal 'c'
|
22
22
|
end
|
23
23
|
|
24
24
|
it "calling shared with hash and a block sets shared variables only for that block" do
|
@@ -33,13 +33,13 @@ describe "shared_vars plugin" do
|
|
33
33
|
"#{shared[:c]}:#{shared[:d]}:#{c}:#{d}"
|
34
34
|
end
|
35
35
|
|
36
|
-
body.
|
36
|
+
body.must_equal 'b::c:d'
|
37
37
|
end
|
38
38
|
|
39
39
|
it "calling shared with no arguments and a block raises an error" do
|
40
40
|
app(:shared_vars) do |r|
|
41
41
|
shared{}
|
42
42
|
end
|
43
|
-
proc{body}.
|
43
|
+
proc{body}.must_raise(Roda::RodaError)
|
44
44
|
end
|
45
45
|
end
|