roda 3.49.0 → 3.50.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 +8 -0
- data/doc/release_notes/3.50.0.txt +21 -0
- data/lib/roda/plugins/capture_erb.rb +41 -0
- data/lib/roda/plugins/content_for.rb +7 -13
- data/lib/roda/plugins/hash_routes.rb +16 -4
- data/lib/roda/plugins/inject_erb.rb +33 -0
- data/lib/roda/plugins/render.rb +81 -3
- data/lib/roda/plugins/status_303.rb +1 -2
- data/lib/roda/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9da24f38f427b9256f05e92f40d67fe98bbdefb86419e5b8c13243f88418f8a
|
4
|
+
data.tar.gz: 3acabff7d8879126d6fdf2199e0935c96d0ea1c975feef874122d67d2afe7315
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7535b67bed981d52d337643c24f13b206163392594b3f969e611b79020a8578994b934a34abc186cf07850725c1ce8a99fbcb859b58cce289b8138b329ca4c68
|
7
|
+
data.tar.gz: 3fdbb4aa63d1cd82a7f6cbdfe01a9804388ab8b4461f9dda825332f030a1179737a21be4ea59c9e52fa856f6952d77578e972263397c62de4c42680340472313
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
= 3.50.0 (2021-11-12)
|
2
|
+
|
3
|
+
* Add capture_erb plugin for capturing ERB template blocks, instead of injecting them into the template output (jeremyevans)
|
4
|
+
|
5
|
+
* Add inject_erb plugin for injecting content directly into ERB template output (jeremyevans)
|
6
|
+
|
7
|
+
* Allow hash_branch and hash_path in hash_routes plugin to be called without a block to remove existing handler (jeremyevans)
|
8
|
+
|
1
9
|
= 3.49.0 (2021-10-13)
|
2
10
|
|
3
11
|
* Switch block_given? to defined?(yield) (jeremyevans)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
= New Features
|
2
|
+
|
3
|
+
* An inject_erb plugin has been added, adding an inject_erb method
|
4
|
+
that allows for injecting content directly into the template output
|
5
|
+
for the template currently being rendered. This allows you to more
|
6
|
+
easily wrap blocks in templates, by calling methods that accept
|
7
|
+
template blocks and injecting content before and after the block.
|
8
|
+
|
9
|
+
* A capture_erb plugin has been added, adding a capture_erb method
|
10
|
+
for capturing a template block in an erb template and returning
|
11
|
+
the content appended during the block as a string, instead of
|
12
|
+
having the content of the template block be included directly into
|
13
|
+
the template output. This can be combined with the inject_erb
|
14
|
+
plugin to inject modified versions of captured blocks into template
|
15
|
+
output.
|
16
|
+
|
17
|
+
* The hash_routes plugin now allows calling hash_branch and hash_path
|
18
|
+
without a block in order to remove the existing route handler. This
|
19
|
+
is designed to be used with code reloading libraries, so that if a
|
20
|
+
route file is deleted, the related hash branches/paths are also
|
21
|
+
removed, without having to reload all route files.
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
class Roda
|
5
|
+
module RodaPlugins
|
6
|
+
# The capture_erb plugin allows you to capture the content of a block
|
7
|
+
# in an ERB template, and return it as a value, instead of
|
8
|
+
# injecting the template block into the template output.
|
9
|
+
#
|
10
|
+
# <% value = capture_erb do %>
|
11
|
+
# Some content here.
|
12
|
+
# <% end %>
|
13
|
+
#
|
14
|
+
# +capture_erb+ can be used inside other methods that are called
|
15
|
+
# inside templates. It can be combined with the inject_erb plugin
|
16
|
+
# to wrap template blocks with arbitrary output and then inject the
|
17
|
+
# wrapped output into the template.
|
18
|
+
module CaptureERB
|
19
|
+
def self.load_dependencies(app)
|
20
|
+
app.plugin :render
|
21
|
+
end
|
22
|
+
|
23
|
+
module InstanceMethods
|
24
|
+
# Temporarily replace the ERB output buffer
|
25
|
+
# with an empty string, and then yield to the block.
|
26
|
+
# Return the value of the block, converted to a string.
|
27
|
+
# Restore the previous ERB output buffer before returning.
|
28
|
+
def capture_erb
|
29
|
+
outvar = render_opts[:template_opts][:outvar]
|
30
|
+
buf_was = instance_variable_get(outvar)
|
31
|
+
instance_variable_set(outvar, String.new)
|
32
|
+
yield.to_s
|
33
|
+
ensure
|
34
|
+
instance_variable_set(outvar, buf_was) if outvar && buf_was
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
register_plugin(:capture_erb, CaptureERB)
|
40
|
+
end
|
41
|
+
end
|
@@ -55,10 +55,10 @@ class Roda
|
|
55
55
|
#
|
56
56
|
# plugin :content_for, append: false
|
57
57
|
module ContentFor
|
58
|
-
# Depend on the
|
59
|
-
#
|
58
|
+
# Depend on the capture_erb plugin, since it uses capture_erb
|
59
|
+
# to capture the content.
|
60
60
|
def self.load_dependencies(app, _opts = OPTS)
|
61
|
-
app.plugin :
|
61
|
+
app.plugin :capture_erb
|
62
62
|
end
|
63
63
|
|
64
64
|
# Configure whether to append or overwrite if content_for
|
@@ -72,18 +72,12 @@ class Roda
|
|
72
72
|
# under the given key. If called without a block, retrieve
|
73
73
|
# stored content with the given key, or return nil if there
|
74
74
|
# is no content stored with that key.
|
75
|
-
def content_for(key, value=nil)
|
75
|
+
def content_for(key, value=nil, &block)
|
76
76
|
append = opts[:append_content_for]
|
77
77
|
|
78
|
-
if
|
79
|
-
if
|
80
|
-
|
81
|
-
buf_was = instance_variable_get(outvar)
|
82
|
-
|
83
|
-
# Use temporary output buffer for ERB-based rendering systems
|
84
|
-
instance_variable_set(outvar, String.new)
|
85
|
-
value = yield.to_s
|
86
|
-
instance_variable_set(outvar, buf_was)
|
78
|
+
if block || value
|
79
|
+
if block
|
80
|
+
value = capture_erb(&block)
|
87
81
|
end
|
88
82
|
|
89
83
|
@_content_for ||= {}
|
@@ -394,20 +394,32 @@ class Roda
|
|
394
394
|
dsl
|
395
395
|
end
|
396
396
|
|
397
|
-
# Add branch handler for the given namespace and segment.
|
397
|
+
# Add branch handler for the given namespace and segment. If called without
|
398
|
+
# a block, removes the existing branch handler if it exists.
|
398
399
|
def hash_branch(namespace='', segment, &block)
|
399
400
|
segment = "/#{segment}"
|
400
401
|
routes = opts[:hash_branches][namespace] ||= {}
|
401
|
-
|
402
|
+
if block
|
403
|
+
routes[segment] = define_roda_method(routes[segment] || "hash_branch_#{namespace}_#{segment}", 1, &convert_route_block(block))
|
404
|
+
elsif meth = routes[segment]
|
405
|
+
routes.delete(segment)
|
406
|
+
remove_method(meth)
|
407
|
+
end
|
402
408
|
end
|
403
409
|
|
404
410
|
# Add path handler for the given namespace and path. When the
|
405
411
|
# r.hash_paths method is called, checks the matching namespace
|
406
412
|
# for the full remaining path, and dispatch to that block if
|
407
|
-
# there is one.
|
413
|
+
# there is one. If called without a block, removes the existing
|
414
|
+
# path handler if it exists.
|
408
415
|
def hash_path(namespace='', path, &block)
|
409
416
|
routes = opts[:hash_paths][namespace] ||= {}
|
410
|
-
|
417
|
+
if block
|
418
|
+
routes[path] = define_roda_method(routes[path] || "hash_path_#{namespace}_#{path}", 1, &convert_route_block(block))
|
419
|
+
elsif meth = routes[path]
|
420
|
+
routes.delete(path)
|
421
|
+
remove_method(meth)
|
422
|
+
end
|
411
423
|
end
|
412
424
|
end
|
413
425
|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
class Roda
|
5
|
+
module RodaPlugins
|
6
|
+
# The inject_erb plugin allows you to inject content directly
|
7
|
+
# into the template output:
|
8
|
+
#
|
9
|
+
# <% inject_erb("Some HTML Here") %>
|
10
|
+
#
|
11
|
+
# This will inject <tt>Some HTML Here</tt> into the template output,
|
12
|
+
# even though the tag being used is <tt><%</tt> and not <tt><%=</tt>.
|
13
|
+
#
|
14
|
+
# This method can be used inside methods, such as to wrap calls to
|
15
|
+
# methods that accept template blocks, to inject code before and after
|
16
|
+
# the template blocks.
|
17
|
+
module InjectERB
|
18
|
+
def self.load_dependencies(app)
|
19
|
+
app.plugin :render
|
20
|
+
end
|
21
|
+
|
22
|
+
module InstanceMethods
|
23
|
+
# Inject into the template output for the template currently being
|
24
|
+
# rendered.
|
25
|
+
def inject_erb(value)
|
26
|
+
instance_variable_get(render_opts[:template_opts][:outvar]) << value.to_s
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
register_plugin(:inject_erb, InjectERB)
|
32
|
+
end
|
33
|
+
end
|
data/lib/roda/plugins/render.rb
CHANGED
@@ -47,7 +47,7 @@ class Roda
|
|
47
47
|
# The following plugin options are supported:
|
48
48
|
#
|
49
49
|
# :allowed_paths :: Set the template paths to allow. Attempts to render paths outside
|
50
|
-
# of
|
50
|
+
# of these paths will raise an error. Defaults to the +:views+ directory.
|
51
51
|
# :cache :: nil/false to explicitly disable premanent template caching. By default, permanent
|
52
52
|
# template caching is disabled by default if RACK_ENV is development. When permanent
|
53
53
|
# template caching is disabled, for templates with paths in the file system, the
|
@@ -59,9 +59,9 @@ class Roda
|
|
59
59
|
# templates, defaults to 'erb'.
|
60
60
|
# :escape :: Use Erubi as the ERB template engine, and enable escaping by default,
|
61
61
|
# which makes <tt><%= %></tt> escape output and <tt><%== %></tt> not escape output.
|
62
|
-
# If given, sets the <tt
|
62
|
+
# If given, sets the <tt>escape: true</tt> option for all template engines, which
|
63
63
|
# can break some non-ERB template engines. You can use a string or array of strings
|
64
|
-
# as the value for this option to only set the <tt
|
64
|
+
# as the value for this option to only set the <tt>escape: true</tt> option for those
|
65
65
|
# specific template engines.
|
66
66
|
# :layout :: The base name of the layout file, defaults to 'layout'. This can be provided as a hash
|
67
67
|
# with the :template or :inline options.
|
@@ -130,6 +130,84 @@ class Roda
|
|
130
130
|
# only argument, you can speed things up by specifying a +:cache_key+ option in
|
131
131
|
# the hash, making sure the +:cache_key+ is unique to the template you are
|
132
132
|
# rendering.
|
133
|
+
#
|
134
|
+
# = Accepting Template Blocks in Methods
|
135
|
+
#
|
136
|
+
# If you are used to Rails, you may be surprised that this type of template code
|
137
|
+
# doesn't work in Roda:
|
138
|
+
#
|
139
|
+
# <%= some_method do %>
|
140
|
+
# Some HTML
|
141
|
+
# <% end %>
|
142
|
+
#
|
143
|
+
# The reason this doesn't work is that this is not valid ERB syntax, it is Rails syntax,
|
144
|
+
# and requires attempting to parse the <tt>some_method do</tt> Ruby code with a regular
|
145
|
+
# expression. Since Roda uses ERB syntax, it does not support this.
|
146
|
+
#
|
147
|
+
# In general, these methods are used to wrap the content of the block and
|
148
|
+
# inject the content into the output. To get similar behavior with Roda, you have
|
149
|
+
# a few different options you can use.
|
150
|
+
#
|
151
|
+
# == Directly Inject Template Output
|
152
|
+
#
|
153
|
+
# You can switch from a <tt><%=</tt> tag to using a <tt><%</tt> tag:
|
154
|
+
#
|
155
|
+
# <% some_method do %>
|
156
|
+
# Some HTML
|
157
|
+
# <% end %>
|
158
|
+
#
|
159
|
+
# While this would output <tt>Some HTML</tt> into the template, it would not be able
|
160
|
+
# to inject content before or after the block. However, you can use the inject_erb_plugin
|
161
|
+
# to handle the injection:
|
162
|
+
#
|
163
|
+
# def some_method
|
164
|
+
# inject_erb "content before block"
|
165
|
+
# yield
|
166
|
+
# inject_erb "content after block"
|
167
|
+
# end
|
168
|
+
#
|
169
|
+
# If you need to modify the captured block before injecting it, you can use the
|
170
|
+
# capture_erb plugin to capture content from the template block, and modify that content,
|
171
|
+
# then use inject_erb to inject it into the template output:
|
172
|
+
#
|
173
|
+
# def some_method(&block)
|
174
|
+
# inject_erb "content before block"
|
175
|
+
# inject_erb capture_erb(&block).upcase
|
176
|
+
# inject_erb "content after block"
|
177
|
+
# end
|
178
|
+
#
|
179
|
+
# This is the recommended approach for handling this type of method, if you want to keep
|
180
|
+
# the template block in the same template.
|
181
|
+
#
|
182
|
+
# == Separate Block Output Into Separate Template
|
183
|
+
#
|
184
|
+
# By moving the <tt>Some HTML</tt> into a separate template, you can render that
|
185
|
+
# template inside the block:
|
186
|
+
#
|
187
|
+
# <%= some_method{render('template_name')} %>
|
188
|
+
#
|
189
|
+
# It's also possible to use an inline template:
|
190
|
+
#
|
191
|
+
# <%= some_method do render(:inline=><<-END)
|
192
|
+
# Some HTML
|
193
|
+
# END
|
194
|
+
# end %>
|
195
|
+
#
|
196
|
+
# This approach is useful if it makes sense to separate the template block into its
|
197
|
+
# own template. You lose the ability to use local variable from outside the
|
198
|
+
# template block inside the template block with this approach.
|
199
|
+
#
|
200
|
+
# == Separate Header and Footer
|
201
|
+
#
|
202
|
+
# You can define two separate methods, one that outputs the content before the block,
|
203
|
+
# and one that outputs the content after the block, and use those instead of a single
|
204
|
+
# call:
|
205
|
+
#
|
206
|
+
# <%= some_method_before %>
|
207
|
+
# Some HTML
|
208
|
+
# <%= some_method_after %>
|
209
|
+
#
|
210
|
+
# This is the simplest option to setup, but it is fairly tedious to use.
|
133
211
|
module Render
|
134
212
|
# Support for using compiled methods directly requires Ruby 2.3 for the
|
135
213
|
# method binding to work, and Tilt 1.2 for Tilt::Template#compiled_method.
|
@@ -6,8 +6,7 @@ class Roda
|
|
6
6
|
# The status_303 plugin sets the default redirect status to be 303
|
7
7
|
# rather than 302 when the request is not a GET and the
|
8
8
|
# redirection occurs on an HTTP 1.1 connection as per RFC 7231.
|
9
|
-
#
|
10
|
-
# practice.
|
9
|
+
# There are some frontend frameworks that require this behavior.
|
11
10
|
#
|
12
11
|
# Example:
|
13
12
|
#
|
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.50.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: 2021-
|
11
|
+
date: 2021-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -221,6 +221,7 @@ extra_rdoc_files:
|
|
221
221
|
- doc/release_notes/3.48.0.txt
|
222
222
|
- doc/release_notes/3.49.0.txt
|
223
223
|
- doc/release_notes/3.5.0.txt
|
224
|
+
- doc/release_notes/3.50.0.txt
|
224
225
|
- doc/release_notes/3.6.0.txt
|
225
226
|
- doc/release_notes/3.7.0.txt
|
226
227
|
- doc/release_notes/3.8.0.txt
|
@@ -277,6 +278,7 @@ files:
|
|
277
278
|
- doc/release_notes/3.48.0.txt
|
278
279
|
- doc/release_notes/3.49.0.txt
|
279
280
|
- doc/release_notes/3.5.0.txt
|
281
|
+
- doc/release_notes/3.50.0.txt
|
280
282
|
- doc/release_notes/3.6.0.txt
|
281
283
|
- doc/release_notes/3.7.0.txt
|
282
284
|
- doc/release_notes/3.8.0.txt
|
@@ -294,6 +296,7 @@ files:
|
|
294
296
|
- lib/roda/plugins/backtracking_array.rb
|
295
297
|
- lib/roda/plugins/branch_locals.rb
|
296
298
|
- lib/roda/plugins/caching.rb
|
299
|
+
- lib/roda/plugins/capture_erb.rb
|
297
300
|
- lib/roda/plugins/chunked.rb
|
298
301
|
- lib/roda/plugins/class_level_routing.rb
|
299
302
|
- lib/roda/plugins/class_matchers.rb
|
@@ -329,6 +332,7 @@ files:
|
|
329
332
|
- lib/roda/plugins/hooks.rb
|
330
333
|
- lib/roda/plugins/host_authorization.rb
|
331
334
|
- lib/roda/plugins/indifferent_params.rb
|
335
|
+
- lib/roda/plugins/inject_erb.rb
|
332
336
|
- lib/roda/plugins/json.rb
|
333
337
|
- lib/roda/plugins/json_parser.rb
|
334
338
|
- lib/roda/plugins/mail_processor.rb
|