roda 3.31.0 → 3.32.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +10 -0
- data/README.rdoc +4 -0
- data/doc/release_notes/3.31.0.txt +1 -1
- data/doc/release_notes/3.32.0.txt +42 -0
- data/lib/roda.rb +2 -0
- data/lib/roda/plugins/_symbol_regexp_matchers.rb +2 -0
- data/lib/roda/plugins/assets.rb +8 -3
- data/lib/roda/plugins/content_security_policy.rb +2 -0
- data/lib/roda/plugins/default_headers.rb +2 -0
- data/lib/roda/plugins/hash_matcher.rb +1 -1
- data/lib/roda/plugins/indifferent_params.rb +2 -0
- data/lib/roda/plugins/partials.rb +33 -6
- data/lib/roda/plugins/placeholder_string_matchers.rb +2 -0
- data/lib/roda/plugins/render.rb +17 -5
- data/lib/roda/plugins/render_each.rb +11 -3
- data/lib/roda/plugins/symbol_matchers.rb +2 -2
- data/lib/roda/version.rb +1 -1
- 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: 2a342192f0ab697bea9c4e5b55669644f06fe16e161539b1efc3d10f3c6b9947
|
4
|
+
data.tar.gz: cf01944fe14494efd606cd892cbbbae5b5128f5a1d83c5e411bd4c64cc6e4321
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5de72f1385942855bd2c8e1c0f6be5187430d7d83112d7400bc573f045456a445166edfdbb6a7f70779c7b008745e8063bd44274b0111dec95643f87cfe12fe
|
7
|
+
data.tar.gz: b69e2fb41045d19c1f9e79dd2d1a87ca691fcd8de975bd34e37456cd6c5183cd2a6ad6bb59a07594527588d2903ef1bceea5f356a809aef03c01e5f64415246b
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
= 3.32.0 (2020-05-15)
|
2
|
+
|
3
|
+
* Make :dependencies option in assets plugin work correctly with render plugin template caching (jeremyevans) (#191)
|
4
|
+
|
5
|
+
* Support render method :dependencies option for specifying which files to check for modification (jgarth, jeremyevans) (#192)
|
6
|
+
|
7
|
+
* Add each_partial to the partials plugin for rendering a partial for each element in an enumerable (jeremyevans)
|
8
|
+
|
9
|
+
* Make render_each in render_each plugin handle template names with directories and extensions (jeremyevans)
|
10
|
+
|
1
11
|
= 3.31.0 (2020-04-15)
|
2
12
|
|
3
13
|
* Add :relative option to path method in path plugin, for generating a method returning relative paths (jeremyevans)
|
data/README.rdoc
CHANGED
@@ -418,6 +418,10 @@ You can provide an array to specify multiple request methods and match on any of
|
|
418
418
|
{method: :post} # matches POST
|
419
419
|
{method: ['post', 'patch']} # matches POST and PATCH
|
420
420
|
|
421
|
+
=== true
|
422
|
+
|
423
|
+
If +true+ is given directly as a matcher, it always matches.
|
424
|
+
|
421
425
|
=== false, nil
|
422
426
|
|
423
427
|
If +false+ or +nil+ is given directly as a matcher, it doesn't match anything.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
= New Features
|
2
2
|
|
3
|
-
* A
|
3
|
+
* A relative_path plugin has been added, adding a relative_path
|
4
4
|
method that will take an absolute path and make it relative to the
|
5
5
|
current request by prepending an appropriate prefix. This is
|
6
6
|
helpful when using Roda as a static site generator to generate a
|
@@ -0,0 +1,42 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* render_each in the render_each plugin now automatically handles
|
4
|
+
template names with subdirectories and extensions. Previously, these
|
5
|
+
caused issues unless the :local option was provided. So now you
|
6
|
+
can use:
|
7
|
+
|
8
|
+
render_each(foos, "items/foo")
|
9
|
+
|
10
|
+
instead of:
|
11
|
+
|
12
|
+
render_each(foos, "items/foo", :local=>:foo)
|
13
|
+
|
14
|
+
* each_partial has been added to the partials plugin. It operates
|
15
|
+
similarly to render_each, but uses the convention for partial
|
16
|
+
template naming. So this:
|
17
|
+
|
18
|
+
each_partial(foos, "items/foo")
|
19
|
+
|
20
|
+
is the same as:
|
21
|
+
|
22
|
+
render_each(foos, "items/_foo", :local=>:foo)
|
23
|
+
|
24
|
+
= Other Improvements
|
25
|
+
|
26
|
+
* The :dependencies option in the assets plugin now works correctly
|
27
|
+
with compiled templates in the render plugin in uncached mode
|
28
|
+
(the default in development). Previously, modifying a dependency
|
29
|
+
file would not result in recompiling the asset template when
|
30
|
+
requesting the main file.
|
31
|
+
|
32
|
+
* Method visibility issues in the following plugins have been fixed:
|
33
|
+
|
34
|
+
* content_security_policy
|
35
|
+
* default_headers
|
36
|
+
* indifferent_params
|
37
|
+
* placeholder_string_matchers
|
38
|
+
* symbol_matchers
|
39
|
+
|
40
|
+
Previously, these plugins made private methods public by mistake
|
41
|
+
when overriding them. Additionally, Roda.freeze no longer changes
|
42
|
+
the visibility of the set_default_headers private method.
|
data/lib/roda.rb
CHANGED
data/lib/roda/plugins/assets.rb
CHANGED
@@ -405,6 +405,11 @@ class Roda
|
|
405
405
|
opts[s] ||= {}
|
406
406
|
end
|
407
407
|
|
408
|
+
expanded_deps = opts[:expanded_dependencies] = {}
|
409
|
+
opts[:dependencies].each do |file, deps|
|
410
|
+
expanded_deps[File.expand_path(file)] = Array(deps)
|
411
|
+
end
|
412
|
+
|
408
413
|
if headers = opts[:headers]
|
409
414
|
opts[:css_headers] = headers.merge(opts[:css_headers])
|
410
415
|
opts[:js_headers] = headers.merge(opts[:js_headers])
|
@@ -412,7 +417,7 @@ class Roda
|
|
412
417
|
opts[:css_headers]['Content-Type'] ||= "text/css; charset=UTF-8".freeze
|
413
418
|
opts[:js_headers]['Content-Type'] ||= "application/javascript; charset=UTF-8".freeze
|
414
419
|
|
415
|
-
[:css_headers, :js_headers, :css_opts, :js_opts, :dependencies].each do |s|
|
420
|
+
[:css_headers, :js_headers, :css_opts, :js_opts, :dependencies, :expanded_dependencies].each do |s|
|
416
421
|
opts[s].freeze
|
417
422
|
end
|
418
423
|
[:headers, :css, :js].each do |s|
|
@@ -732,7 +737,7 @@ class Roda
|
|
732
737
|
content = if file.end_with?(".#{type}")
|
733
738
|
::File.read(file)
|
734
739
|
else
|
735
|
-
render_asset_file(file, :template_opts=>o[:"#{type}_opts"])
|
740
|
+
render_asset_file(file, :template_opts=>o[:"#{type}_opts"], :dependencies=>o[:expanded_dependencies][file])
|
736
741
|
end
|
737
742
|
|
738
743
|
o[:postprocessor] ? o[:postprocessor].call(file, type, content) : content
|
@@ -762,7 +767,7 @@ class Roda
|
|
762
767
|
# other files, check the modification times of all dependencies and
|
763
768
|
# return the maximum.
|
764
769
|
def asset_last_modified(file)
|
765
|
-
if deps = self.class.assets_opts[:
|
770
|
+
if deps = self.class.assets_opts[:expanded_dependencies][file]
|
766
771
|
([file] + Array(deps)).map{|f| ::File.stat(f).mtime}.max
|
767
772
|
else
|
768
773
|
::File.stat(file).mtime
|
@@ -31,6 +31,8 @@ class Roda
|
|
31
31
|
if owner == Base::ResponseMethods || (owner == response_class && app.opts[:set_default_headers_overridder] == response_class)
|
32
32
|
app.opts[:set_default_headers_overridder] = response_class
|
33
33
|
response_class.class_eval(<<-END, __FILE__, __LINE__+1)
|
34
|
+
private
|
35
|
+
|
34
36
|
def set_default_headers
|
35
37
|
h = @headers
|
36
38
|
#{headers.map{|k,v| "h[#{k.inspect}] ||= #{v.inspect}"}.join('; ')}
|
@@ -18,27 +18,54 @@ class Roda
|
|
18
18
|
# render('_test')
|
19
19
|
# render('dir/_test')
|
20
20
|
#
|
21
|
-
#
|
21
|
+
# To render the same template once for each object in an enumerable,
|
22
|
+
# you can use the +render_partials+ method:
|
23
|
+
#
|
24
|
+
# each_partial([1,2,3], :foo) # uses _foo.erb
|
25
|
+
#
|
26
|
+
# This is basically equivalent to:
|
27
|
+
#
|
28
|
+
# render_each([1,2,3], "_foo", local: :foo)
|
29
|
+
#
|
30
|
+
# This plugin depends on the render and render_each plugins.
|
22
31
|
module Partials
|
23
|
-
# Depend on the render plugin,
|
24
|
-
#
|
32
|
+
# Depend on the render plugin, passing received options to it.
|
33
|
+
# Also depend on the render_each plugin.
|
25
34
|
def self.load_dependencies(app, opts=OPTS)
|
26
35
|
app.plugin :render, opts
|
36
|
+
app.plugin :render_each
|
27
37
|
end
|
28
38
|
|
29
39
|
module InstanceMethods
|
40
|
+
# For each object in the given enumerable, render the given
|
41
|
+
# template (prefixing the template filename with an underscore).
|
42
|
+
def each_partial(enum, template, opts=OPTS)
|
43
|
+
unless opts.has_key?(:local)
|
44
|
+
opts = Hash[opts]
|
45
|
+
opts[:local] = render_each_default_local(template)
|
46
|
+
end
|
47
|
+
render_each(enum, partial_template_name(template.to_s), opts)
|
48
|
+
end
|
49
|
+
|
30
50
|
# Renders the given template without a layout, but
|
31
51
|
# prefixes the template filename to use with an
|
32
52
|
# underscore.
|
33
53
|
def partial(template, opts=OPTS)
|
34
54
|
opts = parse_template_opts(template, opts)
|
35
55
|
if opts[:template]
|
36
|
-
template = opts[:template]
|
37
|
-
template[-1] = "_#{template[-1]}"
|
38
|
-
opts[:template] = template.join('/')
|
56
|
+
opts[:template] = partial_template_name(opts[:template])
|
39
57
|
end
|
40
58
|
render_template(opts)
|
41
59
|
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
# Prefix the template base filename with an underscore.
|
64
|
+
def partial_template_name(template)
|
65
|
+
segments = template.split('/')
|
66
|
+
segments[-1] = "_#{segments[-1]}"
|
67
|
+
segments.join('/')
|
68
|
+
end
|
42
69
|
end
|
43
70
|
end
|
44
71
|
|
data/lib/roda/plugins/render.rb
CHANGED
@@ -241,12 +241,13 @@ class Roda
|
|
241
241
|
# template file has been modified. This is an internal class and
|
242
242
|
# the API is subject to change at any time.
|
243
243
|
class TemplateMtimeWrapper
|
244
|
-
def initialize(template_class, path, *template_args)
|
244
|
+
def initialize(template_class, path, dependencies, *template_args)
|
245
245
|
@template_class = template_class
|
246
246
|
@path = path
|
247
247
|
@template_args = template_args
|
248
|
+
@dependencies = ([path] + Array(dependencies)) if dependencies
|
248
249
|
|
249
|
-
@mtime =
|
250
|
+
@mtime = template_last_modified if File.file?(path)
|
250
251
|
@template = template_class.new(path, *template_args)
|
251
252
|
end
|
252
253
|
|
@@ -257,17 +258,28 @@ class Roda
|
|
257
258
|
@template.render(*args, &block)
|
258
259
|
end
|
259
260
|
|
261
|
+
# Return when the template was last modified. If the template depends on any
|
262
|
+
# other files, check the modification times of all dependencies and
|
263
|
+
# return the maximum.
|
264
|
+
def template_last_modified
|
265
|
+
if deps = @dependencies
|
266
|
+
deps.map{|f| File.mtime(f)}.max
|
267
|
+
else
|
268
|
+
File.mtime(@path)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
260
272
|
# If the template file has been updated, return true and update
|
261
273
|
# the template object and the modification time. Other return false.
|
262
274
|
def modified?
|
263
275
|
begin
|
264
|
-
mtime =
|
276
|
+
mtime = template_last_modified
|
265
277
|
rescue
|
266
278
|
# ignore errors
|
267
279
|
else
|
268
280
|
if mtime != @mtime
|
269
281
|
@mtime = mtime
|
270
|
-
@template = @template_class.new(path, *@template_args)
|
282
|
+
@template = @template_class.new(@path, *@template_args)
|
271
283
|
return true
|
272
284
|
end
|
273
285
|
end
|
@@ -576,7 +588,7 @@ class Roda
|
|
576
588
|
!opts[:inline]
|
577
589
|
|
578
590
|
if render_opts[:check_template_mtime] && !opts[:template_block] && !cache
|
579
|
-
template = TemplateMtimeWrapper.new(opts[:template_class], opts[:path], 1, template_opts)
|
591
|
+
template = TemplateMtimeWrapper.new(opts[:template_class], opts[:path], opts[:dependencies], 1, template_opts)
|
580
592
|
|
581
593
|
if define_compiled_method
|
582
594
|
method_name = :"_roda_template_#{self.class.object_id}_#{method_cache_key}"
|
@@ -26,7 +26,9 @@ class Roda
|
|
26
26
|
#
|
27
27
|
# Will render the +foo+ template, but the local variable used inside
|
28
28
|
# the template will be +bar+. You can use <tt>local: nil</tt> to
|
29
|
-
# not set a local variable inside the template.
|
29
|
+
# not set a local variable inside the template. By default, the
|
30
|
+
# local variable name is based on the template name, with any
|
31
|
+
# directories and file extensions removed.
|
30
32
|
module RenderEach
|
31
33
|
# Load the render plugin before this plugin, since this plugin
|
32
34
|
# calls the render method.
|
@@ -45,11 +47,11 @@ class Roda
|
|
45
47
|
# set a local variable. If not set, uses the template name.
|
46
48
|
def render_each(enum, template, opts=(no_opts = true; optimized_template = _cached_render_each_template_method(template); OPTS))
|
47
49
|
if optimized_template
|
48
|
-
return _optimized_render_each(enum, optimized_template, template
|
50
|
+
return _optimized_render_each(enum, optimized_template, render_each_default_local(template), {})
|
49
51
|
elsif opts.has_key?(:local)
|
50
52
|
as = opts[:local]
|
51
53
|
else
|
52
|
-
as = template
|
54
|
+
as = render_each_default_local(template)
|
53
55
|
if no_opts && optimized_template.nil? && (optimized_template = _optimized_render_method_for_locals(template, (locals = {as=>nil})))
|
54
56
|
return _optimized_render_each(enum, optimized_template, as, locals)
|
55
57
|
end
|
@@ -77,6 +79,12 @@ class Roda
|
|
77
79
|
|
78
80
|
private
|
79
81
|
|
82
|
+
# The default local variable name to use for the template, if the :local option
|
83
|
+
# is not used when calling render_each.
|
84
|
+
def render_each_default_local(template)
|
85
|
+
File.basename(template.to_s).sub(/\..+\z/, '').to_sym
|
86
|
+
end
|
87
|
+
|
80
88
|
if Render::COMPILED_METHOD_SUPPORT
|
81
89
|
# If compiled method support is enabled in the render plugin, return the
|
82
90
|
# method name to call to render the template. Return false if not given
|
@@ -6,7 +6,7 @@ class Roda
|
|
6
6
|
# The symbol_matchers plugin allows you do define custom regexps to use
|
7
7
|
# for specific symbols. For example, if you have a route such as:
|
8
8
|
#
|
9
|
-
# r.on :username do
|
9
|
+
# r.on :username do |username|
|
10
10
|
# # ...
|
11
11
|
# end
|
12
12
|
#
|
@@ -28,7 +28,7 @@ class Roda
|
|
28
28
|
# If the placeholder_string_matchers plugin is loaded, this feature also applies to
|
29
29
|
# placeholders in strings, so the following:
|
30
30
|
#
|
31
|
-
# r.on "users/:username" do
|
31
|
+
# r.on "users/:username" do |username|
|
32
32
|
# # ...
|
33
33
|
# end
|
34
34
|
#
|
data/lib/roda/version.rb
CHANGED
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.32.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: 2020-
|
11
|
+
date: 2020-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -207,6 +207,7 @@ extra_rdoc_files:
|
|
207
207
|
- doc/release_notes/3.29.0.txt
|
208
208
|
- doc/release_notes/3.30.0.txt
|
209
209
|
- doc/release_notes/3.31.0.txt
|
210
|
+
- doc/release_notes/3.32.0.txt
|
210
211
|
files:
|
211
212
|
- CHANGELOG
|
212
213
|
- MIT-LICENSE
|
@@ -239,6 +240,7 @@ files:
|
|
239
240
|
- doc/release_notes/3.3.0.txt
|
240
241
|
- doc/release_notes/3.30.0.txt
|
241
242
|
- doc/release_notes/3.31.0.txt
|
243
|
+
- doc/release_notes/3.32.0.txt
|
242
244
|
- doc/release_notes/3.4.0.txt
|
243
245
|
- doc/release_notes/3.5.0.txt
|
244
246
|
- doc/release_notes/3.6.0.txt
|