roda 3.20.0 → 3.21.0
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/CHANGELOG +4 -0
- data/Rakefile +1 -1
- data/doc/release_notes/3.21.0.txt +5 -0
- data/lib/roda/plugins/render.rb +47 -10
- data/lib/roda/version.rb +1 -1
- data/spec/plugin/render_spec.rb +86 -39
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34a644ccaa69bc1913eb1f54315437ce4b215bd5925e82f720d0fda007895224
|
4
|
+
data.tar.gz: 9a85847e46720f4fa2f7a050febd5b0f6ef7db528c8fbd09836113148944f87c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 739c2a26ea80aeca2bbb4b3b51c4cabf93100309956fe594b61cc66a72f6d3e2f23ab0356c81f12e4a461bf82eb1d7f9cc2d0dc5fecbef88348bd17aca17c33a
|
7
|
+
data.tar.gz: 65ef8401849ee398968ccfce12ccbf203914f7a76721c8cb0ef31b5ab9051fd7f8460361dd96abb495dfa25c5acb50141611448b7065a5be3340b8ca51cc70ff
|
data/CHANGELOG
CHANGED
data/Rakefile
CHANGED
@@ -7,7 +7,7 @@ VERS = lambda do
|
|
7
7
|
require_relative 'lib/roda/version'
|
8
8
|
Roda::RodaVersion
|
9
9
|
end
|
10
|
-
CLEAN.include ["#{NAME}-*.gem", "rdoc", "coverage", "www/public/*.html", "www/public/rdoc", "spec/assets/app.*.css", "spec/assets/app.*.js", "spec/assets/app.*.css.gz", "spec/assets/app.*.js.gz"]
|
10
|
+
CLEAN.include ["#{NAME}-*.gem", "rdoc", "coverage", "www/public/*.html", "www/public/rdoc", "spec/assets/app.*.css", "spec/assets/app.*.js", "spec/assets/app.*.css.gz", "spec/assets/app.*.js.gz", "spec/iv.erb"]
|
11
11
|
|
12
12
|
# Gem Packaging and Release
|
13
13
|
|
data/lib/roda/plugins/render.rb
CHANGED
@@ -48,8 +48,11 @@ class Roda
|
|
48
48
|
#
|
49
49
|
# :allowed_paths :: Set the template paths to allow. Attempts to render paths outside
|
50
50
|
# of this directory will raise an error. Defaults to the +:views+ directory.
|
51
|
-
# :cache :: nil/false to disable template caching
|
52
|
-
# is disabled by default if RACK_ENV is development.
|
51
|
+
# :cache :: nil/false to explicitly disable premanent template caching. By default, permanent
|
52
|
+
# template caching is disabled by default if RACK_ENV is development. When permanent
|
53
|
+
# template caching is disabled, for templates with paths in the file system, the
|
54
|
+
# modification time of the file will be checked on every render, and if it has changed,
|
55
|
+
# a new template will be created for the current content of the file.
|
53
56
|
# :cache_class :: A class to use as the template cache instead of the default.
|
54
57
|
# :check_paths :: Can be set to false to turn off template path checking.
|
55
58
|
# :engine :: The tilt engine to use for rendering, also the default file extension for
|
@@ -83,7 +86,7 @@ class Roda
|
|
83
86
|
#
|
84
87
|
# :cache :: Set to false to not cache this template, even when
|
85
88
|
# caching is on by default. Set to true to force caching for
|
86
|
-
# this template, even when the default is to not cache (e.g.
|
89
|
+
# this template, even when the default is to not permantently cache (e.g.
|
87
90
|
# when using the :template_block option).
|
88
91
|
# :cache_key :: Explicitly set the hash key to use when caching.
|
89
92
|
# :content :: Only respected by +view+, provides the content to render
|
@@ -152,11 +155,11 @@ class Roda
|
|
152
155
|
opts[:allowed_paths] = opts[:allowed_paths].map{|f| app.expand_path(f, nil)}.uniq.freeze
|
153
156
|
opts[:check_paths] = true unless opts.has_key?(:check_paths)
|
154
157
|
|
155
|
-
unless opts.has_key?(:
|
156
|
-
opts[:
|
157
|
-
ENV['RACK_ENV'] == 'development'
|
158
|
-
else
|
158
|
+
unless opts.has_key?(:check_template_mtime)
|
159
|
+
opts[:check_template_mtime] = if opts[:cache] == false || opts[:explicit_cache]
|
159
160
|
true
|
161
|
+
else
|
162
|
+
ENV['RACK_ENV'] == 'development'
|
160
163
|
end
|
161
164
|
end
|
162
165
|
|
@@ -211,6 +214,34 @@ class Roda
|
|
211
214
|
opts.freeze
|
212
215
|
end
|
213
216
|
|
217
|
+
# Wrapper object for the Tilt template, that checks the modified
|
218
|
+
# time of the template file, and rebuilds the template if the
|
219
|
+
# template file has been modified.
|
220
|
+
class TemplateMtimeWrapper
|
221
|
+
def initialize(template_class, path, *template_args)
|
222
|
+
@template_class = template_class
|
223
|
+
@path = path
|
224
|
+
@template_args = template_args
|
225
|
+
|
226
|
+
@mtime = (File.mtime(path) if File.file?(path))
|
227
|
+
@template = template_class.new(path, *template_args)
|
228
|
+
end
|
229
|
+
|
230
|
+
# If the template file exists and the modification time has
|
231
|
+
# changed, rebuild the template file, then call render on it.
|
232
|
+
def render(*args, &block)
|
233
|
+
if File.file?(path = @path)
|
234
|
+
mtime = File.mtime(path)
|
235
|
+
if mtime != @mtime
|
236
|
+
@mtime = mtime
|
237
|
+
@template = @template_class.new(path, *@template_args)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
@template.render(*args, &block)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
214
245
|
module ClassMethods
|
215
246
|
# Copy the rendering options into the subclass, duping
|
216
247
|
# them as necessary to prevent changes in the subclass
|
@@ -268,7 +299,7 @@ class Roda
|
|
268
299
|
# If caching templates, attempt to retrieve the template from the cache. Otherwise, just yield
|
269
300
|
# to get the template.
|
270
301
|
def cached_template(opts, &block)
|
271
|
-
if
|
302
|
+
if key = opts[:cache_key]
|
272
303
|
cache = render_opts[:cache]
|
273
304
|
unless template = cache[key]
|
274
305
|
template = cache[key] = yield
|
@@ -335,7 +366,8 @@ class Roda
|
|
335
366
|
|
336
367
|
# Retrieve the Tilt::Template object for the given template and opts.
|
337
368
|
def retrieve_template(opts)
|
338
|
-
|
369
|
+
cache = opts[:cache]
|
370
|
+
if !opts[:cache_key] || cache == false
|
339
371
|
found_template_opts = opts = find_template(opts)
|
340
372
|
end
|
341
373
|
cached_template(opts) do
|
@@ -347,7 +379,12 @@ class Roda
|
|
347
379
|
if current_template_opts = opts[:template_opts]
|
348
380
|
template_opts = template_opts.merge(current_template_opts)
|
349
381
|
end
|
350
|
-
|
382
|
+
|
383
|
+
if render_opts[:check_template_mtime] && !opts[:template_block] && !cache
|
384
|
+
TemplateMtimeWrapper.new(opts[:template_class], opts[:path], 1, template_opts)
|
385
|
+
else
|
386
|
+
opts[:template_class].new(opts[:path], 1, template_opts, &opts[:template_block])
|
387
|
+
end
|
351
388
|
end
|
352
389
|
end
|
353
390
|
|
data/lib/roda/version.rb
CHANGED
data/spec/plugin/render_spec.rb
CHANGED
@@ -61,6 +61,66 @@ describe "render plugin" do
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
+
describe "render plugin" do
|
65
|
+
file = 'spec/iv.erb'
|
66
|
+
before do
|
67
|
+
File.binwrite(file, File.binread('spec/views/iv.erb'))
|
68
|
+
end
|
69
|
+
after do
|
70
|
+
File.delete(file) if File.file?(file)
|
71
|
+
end
|
72
|
+
|
73
|
+
[{:cache=>false}, {:explicit_cache=>true}, {:check_template_mtime=>true}].each do |cache_plugin_opts|
|
74
|
+
it "checks mtime if #{cache_plugin_opts} plugin option is used" do
|
75
|
+
app(:bare) do
|
76
|
+
plugin :render, {:views=>"./spec"}.merge!(cache_plugin_opts)
|
77
|
+
|
78
|
+
route do |r|
|
79
|
+
@a = 'a'
|
80
|
+
render('iv')
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
t = Time.now
|
85
|
+
body.strip.must_equal "a"
|
86
|
+
|
87
|
+
File.binwrite(file, File.binread(file) + "b")
|
88
|
+
File.utime(t, t+1, file)
|
89
|
+
body.gsub("\n", '').must_equal "ab"
|
90
|
+
|
91
|
+
File.binwrite(file, File.binread(file) + "c")
|
92
|
+
File.utime(t, t+2, file)
|
93
|
+
body.gsub("\n", '').must_equal "abc"
|
94
|
+
|
95
|
+
mtime = File.mtime(file)
|
96
|
+
File.binwrite(file, File.binread(file) + "d")
|
97
|
+
File.utime(t, mtime, file)
|
98
|
+
body.gsub("\n", '').must_equal "abc"
|
99
|
+
|
100
|
+
File.delete(file)
|
101
|
+
body.gsub("\n", '').must_equal "abc"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
it "does not check mtime if :cache render option is used" do
|
106
|
+
app(:bare) do
|
107
|
+
plugin :render, :views=>"./spec", :cache=>false
|
108
|
+
|
109
|
+
route do |r|
|
110
|
+
@a = 'a'
|
111
|
+
render('iv', :cache=>true)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
t = Time.now+1
|
116
|
+
body.strip.must_equal "a"
|
117
|
+
|
118
|
+
File.binwrite(file, File.binread(file) + "b")
|
119
|
+
File.utime(t, t+1, file)
|
120
|
+
body.gsub("\n", '').must_equal "a"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
64
124
|
describe "render plugin" do
|
65
125
|
it "simple layout support" do
|
66
126
|
app(:bare) do
|
@@ -322,13 +382,13 @@ describe "render plugin" do
|
|
322
382
|
body('/c').must_equal "3"
|
323
383
|
end
|
324
384
|
|
325
|
-
it "Default to :
|
385
|
+
it "Default to :check_template_mtime=>true in development mode" do
|
326
386
|
with_rack_env('development') do
|
327
387
|
app(:render){}
|
328
388
|
end
|
329
|
-
app.render_opts[:
|
389
|
+
app.render_opts[:check_template_mtime].must_equal true
|
330
390
|
app(:render){}
|
331
|
-
app.render_opts[:
|
391
|
+
app.render_opts[:check_template_mtime].must_equal false
|
332
392
|
end
|
333
393
|
|
334
394
|
it "Support :cache=>false plugin option to disable template caching by default, except :cache=>true method option is given" do
|
@@ -365,7 +425,7 @@ describe "render plugin" do
|
|
365
425
|
body('/a').strip.must_equal "a"
|
366
426
|
app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].must_be_nil
|
367
427
|
body('/b').strip.must_equal "a"
|
368
|
-
app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].
|
428
|
+
app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].wont_be_nil
|
369
429
|
end
|
370
430
|
|
371
431
|
it "Support :cache=>false option to disable template caching even when :cache_key is given" do
|
@@ -382,41 +442,28 @@ describe "render plugin" do
|
|
382
442
|
body('/a').strip.must_equal "a"
|
383
443
|
app.render_opts[:cache][:foo].must_be_nil
|
384
444
|
body('/b').strip.must_equal "a"
|
385
|
-
app.render_opts[:cache][:foo].
|
445
|
+
app.render_opts[:cache][:foo].wont_be_nil
|
386
446
|
end
|
387
447
|
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
r.is('a'){render('iv')}
|
395
|
-
render('iv', :cache=>true)
|
396
|
-
end
|
397
|
-
end
|
398
|
-
|
399
|
-
body('/a').strip.must_equal "a"
|
400
|
-
app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].must_be_nil
|
401
|
-
body('/b').strip.must_equal "a"
|
402
|
-
app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].wont_equal nil
|
403
|
-
end
|
448
|
+
[{}, {:cache=>true}].each do |cache_val_opts|
|
449
|
+
[{}, {:cache_key=>:foo}].each do |cache_key_opts|
|
450
|
+
cache_opts = cache_key_opts.merge(cache_val_opts)
|
451
|
+
it "Support :explicit_cache plugin option with #{cache_opts} render option" do
|
452
|
+
app(:bare) do
|
453
|
+
plugin :render, :views=>"./spec/views", :explicit_cache=>true
|
404
454
|
|
405
|
-
|
406
|
-
|
407
|
-
|
455
|
+
route do |r|
|
456
|
+
@a = 'a'
|
457
|
+
render('iv', cache_opts)
|
458
|
+
end
|
459
|
+
end
|
408
460
|
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
461
|
+
body('/a').strip.must_equal "a"
|
462
|
+
template = app.render_opts[:cache][cache_opts[:cache_key] || File.expand_path("spec/views/iv.erb")]
|
463
|
+
template.must_be_kind_of(cache_val_opts.empty? ? Roda::RodaPlugins::Render::TemplateMtimeWrapper : Tilt::Template)
|
464
|
+
body('/a').strip.must_equal "a"
|
413
465
|
end
|
414
466
|
end
|
415
|
-
|
416
|
-
body('/a').strip.must_equal "a"
|
417
|
-
app.render_opts[:cache][:foo].must_be_nil
|
418
|
-
body('/b').strip.must_equal "a"
|
419
|
-
app.render_opts[:cache][:foo].wont_equal nil
|
420
467
|
end
|
421
468
|
|
422
469
|
it "Support :cache=>true option to enable template caching when :template_block is used" do
|
@@ -445,7 +492,7 @@ describe "render plugin" do
|
|
445
492
|
body('/a').strip.must_equal "iv-a"
|
446
493
|
app.render_opts[:cache][['iv', c, nil, nil, proca]].must_be_nil
|
447
494
|
body('/b').strip.must_equal "iv-a"
|
448
|
-
app.render_opts[:cache][['iv', c, nil, nil, proca]].
|
495
|
+
app.render_opts[:cache][['iv', c, nil, nil, proca]].wont_be_nil
|
449
496
|
end
|
450
497
|
|
451
498
|
it "Support :cache_key option to force the key used when caching, unless :cache=>false option is used" do
|
@@ -500,17 +547,17 @@ describe "render plugin" do
|
|
500
547
|
c = Class.new(Roda)
|
501
548
|
c.plugin :render
|
502
549
|
cache = c.render_opts[:cache]
|
503
|
-
c.render_opts[:
|
550
|
+
c.render_opts[:check_template_mtime].must_equal false
|
504
551
|
c.plugin :render
|
505
552
|
c.render_opts[:cache].must_be_same_as cache
|
506
|
-
c.render_opts[:
|
553
|
+
c.render_opts[:check_template_mtime].must_equal false
|
507
554
|
|
508
555
|
c.plugin :render, :cache=>false
|
509
556
|
c.render_opts[:cache].must_be_same_as cache
|
510
|
-
c.render_opts[:
|
557
|
+
c.render_opts[:check_template_mtime].must_equal true
|
511
558
|
c.plugin :render
|
512
559
|
c.render_opts[:cache].must_be_same_as cache
|
513
|
-
c.render_opts[:
|
560
|
+
c.render_opts[:check_template_mtime].must_equal true
|
514
561
|
end
|
515
562
|
|
516
563
|
it "render plugin call should not override existing options" do
|
@@ -530,7 +577,7 @@ describe "render plugin" do
|
|
530
577
|
end
|
531
578
|
|
532
579
|
body("/inline").strip.must_equal "Hello Agent Smith"
|
533
|
-
Class.new(app).render_opts[:
|
580
|
+
Class.new(app).render_opts[:check_template_mtime].must_equal true
|
534
581
|
end
|
535
582
|
|
536
583
|
it "with :check_paths=>true plugin option used" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.21.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -217,6 +217,7 @@ extra_rdoc_files:
|
|
217
217
|
- doc/release_notes/3.18.0.txt
|
218
218
|
- doc/release_notes/3.19.0.txt
|
219
219
|
- doc/release_notes/3.20.0.txt
|
220
|
+
- doc/release_notes/3.21.0.txt
|
220
221
|
files:
|
221
222
|
- CHANGELOG
|
222
223
|
- MIT-LICENSE
|
@@ -273,6 +274,7 @@ files:
|
|
273
274
|
- doc/release_notes/3.19.0.txt
|
274
275
|
- doc/release_notes/3.2.0.txt
|
275
276
|
- doc/release_notes/3.20.0.txt
|
277
|
+
- doc/release_notes/3.21.0.txt
|
276
278
|
- doc/release_notes/3.3.0.txt
|
277
279
|
- doc/release_notes/3.4.0.txt
|
278
280
|
- doc/release_notes/3.5.0.txt
|