roda 2.28.0 → 2.29.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 +46 -0
- data/README.rdoc +25 -7
- data/doc/release_notes/2.29.0.txt +156 -0
- data/lib/roda.rb +25 -3
- data/lib/roda/plugins/_erubis_escaping.rb +2 -0
- data/lib/roda/plugins/_symbol_regexp_matchers.rb +22 -0
- data/lib/roda/plugins/assets.rb +3 -2
- data/lib/roda/plugins/branch_locals.rb +74 -0
- data/lib/roda/plugins/caching.rb +15 -7
- data/lib/roda/plugins/chunked.rb +10 -7
- data/lib/roda/plugins/content_for.rb +4 -1
- data/lib/roda/plugins/drop_body.rb +3 -2
- data/lib/roda/plugins/error_email.rb +3 -2
- data/lib/roda/plugins/error_mail.rb +3 -2
- data/lib/roda/plugins/head.rb +2 -1
- data/lib/roda/plugins/header_matchers.rb +3 -0
- data/lib/roda/plugins/heartbeat.rb +3 -2
- data/lib/roda/plugins/json.rb +5 -3
- data/lib/roda/plugins/json_parser.rb +3 -2
- data/lib/roda/plugins/mailer.rb +3 -3
- data/lib/roda/plugins/match_affix.rb +6 -0
- data/lib/roda/plugins/multi_route.rb +3 -1
- data/lib/roda/plugins/padrino_render.rb +3 -2
- data/lib/roda/plugins/params_capturing.rb +3 -3
- data/lib/roda/plugins/partials.rb +3 -3
- data/lib/roda/plugins/path.rb +4 -2
- data/lib/roda/plugins/path_rewriter.rb +2 -2
- data/lib/roda/plugins/per_thread_caching.rb +2 -0
- data/lib/roda/plugins/placeholder_string_matchers.rb +42 -0
- data/lib/roda/plugins/precompile_templates.rb +3 -2
- data/lib/roda/plugins/render.rb +86 -37
- data/lib/roda/plugins/render_each.rb +2 -1
- data/lib/roda/plugins/render_locals.rb +102 -0
- data/lib/roda/plugins/run_append_slash.rb +2 -1
- data/lib/roda/plugins/run_handler.rb +2 -1
- data/lib/roda/plugins/sinatra_helpers.rb +4 -4
- data/lib/roda/plugins/static_path_info.rb +2 -0
- data/lib/roda/plugins/static_routing.rb +1 -1
- data/lib/roda/plugins/streaming.rb +9 -4
- data/lib/roda/plugins/symbol_matchers.rb +23 -20
- data/lib/roda/plugins/view_options.rb +63 -28
- data/lib/roda/plugins/view_subdirs.rb +1 -0
- data/lib/roda/plugins/websockets.rb +2 -0
- data/lib/roda/version.rb +1 -1
- data/spec/composition_spec.rb +2 -2
- data/spec/matchers_spec.rb +6 -5
- data/spec/plugin/_erubis_escaping_spec.rb +5 -5
- data/spec/plugin/backtracking_array_spec.rb +0 -2
- data/spec/plugin/branch_locals_spec.rb +88 -0
- data/spec/plugin/content_for_spec.rb +8 -2
- data/spec/plugin/halt_spec.rb +8 -0
- data/spec/plugin/header_matchers_spec.rb +20 -5
- data/spec/plugin/multi_route_spec.rb +1 -1
- data/spec/plugin/named_templates_spec.rb +2 -2
- data/spec/plugin/params_capturing_spec.rb +1 -1
- data/spec/plugin/per_thread_caching_spec.rb +1 -1
- data/spec/plugin/placeholder_string_matchers_spec.rb +159 -0
- data/spec/plugin/render_locals_spec.rb +114 -0
- data/spec/plugin/render_spec.rb +83 -8
- data/spec/plugin/streaming_spec.rb +104 -4
- data/spec/plugin/symbol_matchers_spec.rb +1 -1
- data/spec/plugin/view_options_spec.rb +83 -7
- data/spec/plugin/websockets_spec.rb +7 -8
- data/spec/spec_helper.rb +22 -2
- metadata +11 -2
|
@@ -22,11 +22,12 @@ class Roda
|
|
|
22
22
|
# # GET /a/ => App gets "/" as PATH_INFO
|
|
23
23
|
module RunAppendSlash
|
|
24
24
|
OPTS = {}.freeze
|
|
25
|
+
RodaPlugins.deprecate_constant(self, :OPTS)
|
|
25
26
|
|
|
26
27
|
# Set plugin specific options. Options:
|
|
27
28
|
# :use_redirects :: Whether to issue 302 redirects when appending the
|
|
28
29
|
# trailing slash.
|
|
29
|
-
def self.configure(app, opts=OPTS)
|
|
30
|
+
def self.configure(app, opts=RodaPlugins::OPTS)
|
|
30
31
|
app.opts[:run_append_slash_redirect] = !!opts[:use_redirects]
|
|
31
32
|
end
|
|
32
33
|
|
|
@@ -26,6 +26,7 @@ class Roda
|
|
|
26
26
|
# end
|
|
27
27
|
module RunHandler
|
|
28
28
|
OPTS = {}.freeze
|
|
29
|
+
RodaPlugins.deprecate_constant(self, :OPTS)
|
|
29
30
|
|
|
30
31
|
module RequestMethods
|
|
31
32
|
# If a block is given, yield the rack response array to it. The response can
|
|
@@ -34,7 +35,7 @@ class Roda
|
|
|
34
35
|
# If the <tt>:not_found=>:pass</tt> option is given, and the rack response
|
|
35
36
|
# returned by the app is a 404 response, do not return the response, continue
|
|
36
37
|
# routing normally.
|
|
37
|
-
def run(app, opts=OPTS)
|
|
38
|
+
def run(app, opts=RodaPlugins::OPTS)
|
|
38
39
|
res = catch(:halt){super(app)}
|
|
39
40
|
yield res if block_given?
|
|
40
41
|
throw(:halt, res) unless opts[:not_found] == :pass && res[0] == 404
|
|
@@ -212,7 +212,7 @@ class Roda
|
|
|
212
212
|
# OTHER DEALINGS IN THE SOFTWARE.
|
|
213
213
|
module SinatraHelpers
|
|
214
214
|
OPTS = {}.freeze
|
|
215
|
-
|
|
215
|
+
RodaPlugins.deprecate_constant(self, :OPTS)
|
|
216
216
|
CONTENT_TYPE = "Content-Type".freeze
|
|
217
217
|
RodaPlugins.deprecate_constant(self, :CONTENT_TYPE)
|
|
218
218
|
CONTENT_DISPOSITION = "Content-Disposition".freeze
|
|
@@ -248,7 +248,7 @@ class Roda
|
|
|
248
248
|
# Add delegate methods to the route block scope
|
|
249
249
|
# calling request or response methods, unless the
|
|
250
250
|
# :delegate option is false.
|
|
251
|
-
def self.configure(app, opts=OPTS)
|
|
251
|
+
def self.configure(app, opts=RodaPlugins::OPTS)
|
|
252
252
|
app.send(:include, DelegateMethods) unless opts[:delegate] == false
|
|
253
253
|
end
|
|
254
254
|
|
|
@@ -339,7 +339,7 @@ class Roda
|
|
|
339
339
|
end
|
|
340
340
|
|
|
341
341
|
# Use the contents of the file at +path+ as the response body. See plugin documentation for options.
|
|
342
|
-
def send_file(path, opts = OPTS)
|
|
342
|
+
def send_file(path, opts = RodaPlugins::OPTS)
|
|
343
343
|
res = response
|
|
344
344
|
headers = res.headers
|
|
345
345
|
if opts[:type] || !headers["Content-Type"]
|
|
@@ -441,7 +441,7 @@ class Roda
|
|
|
441
441
|
|
|
442
442
|
# Set the Content-Type of the response body given a media type or file
|
|
443
443
|
# extension. See plugin documentation for options.
|
|
444
|
-
def content_type(type = (return @headers["Content-Type"]; nil), opts = OPTS)
|
|
444
|
+
def content_type(type = (return @headers["Content-Type"]; nil), opts = RodaPlugins::OPTS)
|
|
445
445
|
unless (mime_type = mime_type(type) || opts[:default])
|
|
446
446
|
raise RodaError, "Unknown media type: #{type}"
|
|
447
447
|
end
|
|
@@ -47,7 +47,7 @@ class Roda
|
|
|
47
47
|
# method call takes precedence over the static_route method call for /foo.
|
|
48
48
|
# As shown above, you can use Roda's routing tree methods inside the
|
|
49
49
|
# static_route block to have shared behavior for different request methods,
|
|
50
|
-
# while still
|
|
50
|
+
# while still handling the request methods differently.
|
|
51
51
|
#
|
|
52
52
|
# Note that if you want to use the static_routing plugin and the hooks
|
|
53
53
|
# plugin at the same time, you should load the hooks plugin first.
|
|
@@ -73,6 +73,7 @@ class Roda
|
|
|
73
73
|
# OTHER DEALINGS IN THE SOFTWARE.
|
|
74
74
|
module Streaming
|
|
75
75
|
OPTS = {}.freeze
|
|
76
|
+
RodaPlugins.deprecate_constant(self, :OPTS)
|
|
76
77
|
|
|
77
78
|
# Class of the response body in case you use #stream.
|
|
78
79
|
#
|
|
@@ -109,7 +110,7 @@ class Roda
|
|
|
109
110
|
end
|
|
110
111
|
|
|
111
112
|
# Handle streaming options, see Streaming for details.
|
|
112
|
-
def initialize(opts=OPTS, &back)
|
|
113
|
+
def initialize(opts=RodaPlugins::OPTS, &back)
|
|
113
114
|
@scheduler = opts[:scheduler] || Scheduler.new(self)
|
|
114
115
|
@back = back.to_proc
|
|
115
116
|
@keep_open = opts[:keep_open]
|
|
@@ -117,7 +118,7 @@ class Roda
|
|
|
117
118
|
@closed = false
|
|
118
119
|
|
|
119
120
|
if opts[:callback]
|
|
120
|
-
|
|
121
|
+
@callbacks << opts[:callback]
|
|
121
122
|
end
|
|
122
123
|
end
|
|
123
124
|
|
|
@@ -134,6 +135,7 @@ class Roda
|
|
|
134
135
|
|
|
135
136
|
# Add the given block as a callback to call when the block closes.
|
|
136
137
|
def callback(&block)
|
|
138
|
+
RodaPlugins.warn 'Stream#callback in the streaming plugin is deprecated and will be removed in Roda 3. Specify callback at initialization using the stream method :callback option.'
|
|
137
139
|
return yield if closed?
|
|
138
140
|
@callbacks << block
|
|
139
141
|
end
|
|
@@ -172,8 +174,11 @@ class Roda
|
|
|
172
174
|
# Immediately return a streaming response using the current response
|
|
173
175
|
# status and headers, calling the block to get the streaming response.
|
|
174
176
|
# See Streaming for details.
|
|
175
|
-
def stream(opts=OPTS, &block)
|
|
176
|
-
|
|
177
|
+
def stream(opts=RodaPlugins::OPTS, &block)
|
|
178
|
+
if !opts.has_key?(:scheduler) && env['async.callback']
|
|
179
|
+
RodaPlugins.warn 'The automatic support for EventMachine in the streaming plugin is deprecated and will be removed in Roda 3.'
|
|
180
|
+
opts = opts.merge(:scheduler=>EventMachine)
|
|
181
|
+
end
|
|
177
182
|
|
|
178
183
|
if opts[:loop]
|
|
179
184
|
block = proc do |out|
|
|
@@ -25,8 +25,8 @@ class Roda
|
|
|
25
25
|
# :rest :: <tt>/(.*)/</tt>, all remaining characters, if any
|
|
26
26
|
# :w :: <tt>/(\w+)/</tt>, a alphanumeric segment
|
|
27
27
|
#
|
|
28
|
-
# If
|
|
29
|
-
#
|
|
28
|
+
# If the placeholder_string_matchers plugin is loaded, this feature also applies to
|
|
29
|
+
# placeholders in strings, so the following:
|
|
30
30
|
#
|
|
31
31
|
# r.on "users/:username" do
|
|
32
32
|
# # ...
|
|
@@ -35,33 +35,36 @@ class Roda
|
|
|
35
35
|
# Would match +/users/foobar123+, but not +/users/foo+, +/users/FooBar123+,
|
|
36
36
|
# or +/users/foobar_123+.
|
|
37
37
|
#
|
|
38
|
-
# If placeholder string matchers are supported, it also adds the following
|
|
39
|
-
# symbol matchers:
|
|
40
|
-
#
|
|
41
|
-
# :format :: <tt>/(?:\.(\w+))?/</tt>, an optional format/extension
|
|
42
|
-
# :opt :: <tt>/(?:\/([^\/]+))?</tt>, an optional segment
|
|
43
|
-
# :optd :: <tt>/(?:\/(\d+))?</tt>, an optional decimal segment
|
|
44
|
-
#
|
|
45
|
-
# These are only added when placeholder string matchers are supported,
|
|
46
|
-
# because they only make sense when used inside of a string, due to how
|
|
47
|
-
# segment matching works. Example:
|
|
48
|
-
#
|
|
49
|
-
# r.is "album:opt" do |id| end
|
|
50
|
-
# # matches /album (yielding nil) and /album/foo (yielding "foo")
|
|
51
|
-
# # does not match /album/ or /album/foo/bar
|
|
52
|
-
#
|
|
53
38
|
# If using this plugin with the params_capturing plugin, this plugin should
|
|
54
39
|
# be loaded first.
|
|
55
40
|
module SymbolMatchers
|
|
41
|
+
def self.load_dependencies(app)
|
|
42
|
+
app.plugin :_symbol_regexp_matchers
|
|
43
|
+
end
|
|
44
|
+
|
|
56
45
|
def self.configure(app)
|
|
57
46
|
app.symbol_matcher(:d, /(\d+)/)
|
|
58
47
|
app.symbol_matcher(:w, /(\w+)/)
|
|
59
48
|
app.symbol_matcher(:rest, /(.*)/)
|
|
60
49
|
|
|
61
50
|
if !app.opts[:verbatim_string_matcher]
|
|
62
|
-
|
|
63
|
-
app.
|
|
64
|
-
|
|
51
|
+
# RODA3: Remove
|
|
52
|
+
app::RodaRequest.class_eval do
|
|
53
|
+
def match_symbol_format
|
|
54
|
+
Roda::RodaPlugins.warn('Implicit use of the :format symbol matcher is deprecated and will be removed in Roda 3. If you want to use the :format symbol matcher, add the following code to your Roda class: symbol_matcher(:format, /(?:\.(\w+))?/)')
|
|
55
|
+
/(?:\.(\w+))?/
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def match_symbol_opt
|
|
59
|
+
Roda::RodaPlugins.warn('Implicit use of the :opt symbol matcher is deprecated and will be removed in Roda 3. If you want to use the :opt symbol matcher, add the following code to your Roda class: symbol_matcher(:opt, /(?:\/([^\/]+))?/)')
|
|
60
|
+
/(?:\/([^\/]+))?/
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def match_symbol_optd
|
|
64
|
+
Roda::RodaPlugins.warn('Implicit use of the :optd symbol matcher is deprecated and will be removed in Roda 3. If you want to use the :optd symbol matcher, add the following code to your Roda class: symbol_matcher(:optd, /(?:\/(\d+))?/)')
|
|
65
|
+
/(?:\/(\d+))?/
|
|
66
|
+
end
|
|
67
|
+
end
|
|
65
68
|
end
|
|
66
69
|
end
|
|
67
70
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
class Roda
|
|
5
5
|
module RodaPlugins
|
|
6
6
|
# The view_options plugin allows you to override view and layout
|
|
7
|
-
# options
|
|
7
|
+
# options for specific branches and routes.
|
|
8
8
|
#
|
|
9
9
|
# plugin :render
|
|
10
10
|
# plugin :view_options
|
|
@@ -12,15 +12,14 @@ class Roda
|
|
|
12
12
|
# route do |r|
|
|
13
13
|
# r.on "users" do
|
|
14
14
|
# set_layout_options :template=>'users_layout'
|
|
15
|
-
# set_layout_locals :title=>'Users'
|
|
16
15
|
# set_view_options :engine=>'haml'
|
|
17
|
-
# set_view_locals :footer=>'(c) Roda'
|
|
18
16
|
#
|
|
19
17
|
# # ...
|
|
20
18
|
# end
|
|
21
19
|
# end
|
|
22
20
|
#
|
|
23
|
-
# The options
|
|
21
|
+
# The options you specify via the set_view_options and
|
|
22
|
+
# set_layout_options methods have higher precedence than
|
|
24
23
|
# the render plugin options, but lower precedence than options
|
|
25
24
|
# you directly pass to the view/render methods.
|
|
26
25
|
#
|
|
@@ -60,22 +59,22 @@ class Roda
|
|
|
60
59
|
#
|
|
61
60
|
# If you have an existing Roda application that doesn't use
|
|
62
61
|
# automatic HTML escaping for <tt><%= %></tt> tags via the
|
|
63
|
-
# :render plugin's :escape option, but you want to switch to
|
|
62
|
+
# :render plugin's :escape=>:erubi option, but you want to switch to
|
|
64
63
|
# using the :escape option, you can now do so without making
|
|
65
64
|
# all changes at once. With set_view_options, you can now
|
|
66
65
|
# specify escaping or not on a per branch basis in the routing
|
|
67
66
|
# tree:
|
|
68
67
|
#
|
|
69
|
-
# plugin :render, :escape
|
|
68
|
+
# plugin :render, :escape=>:erubi
|
|
70
69
|
# plugin :view_options
|
|
71
70
|
#
|
|
72
71
|
# route do |r|
|
|
73
72
|
# # Don't escape <%= %> by default
|
|
74
|
-
# set_view_options :template_opts=>{:
|
|
73
|
+
# set_view_options :template_opts=>{:escape=>false}
|
|
75
74
|
#
|
|
76
75
|
# r.on "users" do
|
|
77
76
|
# # Escape <%= %> in this branch
|
|
78
|
-
# set_view_options :template_opts=>{:
|
|
77
|
+
# set_view_options :template_opts=>{:escape=>true}
|
|
79
78
|
# end
|
|
80
79
|
# end
|
|
81
80
|
module ViewOptions
|
|
@@ -85,27 +84,7 @@ class Roda
|
|
|
85
84
|
app.plugin :render
|
|
86
85
|
end
|
|
87
86
|
|
|
88
|
-
# The following methods are created via metaprogramming:
|
|
89
|
-
# set_layout_locals :: Set locals to use in the layout
|
|
90
|
-
# set_layout_options :: Set options to use when rendering the layout
|
|
91
|
-
# set_view_locals :: Set locals to use in the view
|
|
92
|
-
# set_view_options :: Set options to use when rendering the view
|
|
93
87
|
module InstanceMethods
|
|
94
|
-
%w'layout view'.each do |type|
|
|
95
|
-
%w'locals options'.each do |var|
|
|
96
|
-
v = "_#{type}_#{var}"
|
|
97
|
-
module_eval(<<-END, __FILE__, __LINE__+1)
|
|
98
|
-
def set#{v}(opts)
|
|
99
|
-
if @#{v}
|
|
100
|
-
@#{v} = Hash[@#{v}].merge!(opts)
|
|
101
|
-
else
|
|
102
|
-
@#{v} = opts
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
END
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
|
|
109
88
|
# Append a view subdirectory to use. If there hasn't already
|
|
110
89
|
# been a view subdirectory set, this just sets it to the argument.
|
|
111
90
|
# If there has already been a view subdirectory set, this sets
|
|
@@ -125,8 +104,62 @@ class Roda
|
|
|
125
104
|
@_view_subdir = v
|
|
126
105
|
end
|
|
127
106
|
|
|
107
|
+
# Set branch/route options to use when rendering the layout
|
|
108
|
+
def set_layout_options(opts)
|
|
109
|
+
if options = @_layout_options
|
|
110
|
+
@_layout_options = Hash[options].merge!(opts)
|
|
111
|
+
else
|
|
112
|
+
@_layout_options = opts
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Set branch/route options to use when rendering the view
|
|
117
|
+
def set_view_options(opts)
|
|
118
|
+
if options = @_view_options
|
|
119
|
+
@_view_options = Hash[options].merge!(opts)
|
|
120
|
+
else
|
|
121
|
+
@_view_options = opts
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# RODA3: Remove
|
|
126
|
+
def set_layout_locals(opts)
|
|
127
|
+
RodaPlugins.warn "The set_layout_locals method in the view_options plugin is deprecated and will be removed in Roda 3. This feature has been moved to the branch_locals plugin."
|
|
128
|
+
if locals = @_layout_locals
|
|
129
|
+
@_layout_locals = Hash[locals].merge!(opts)
|
|
130
|
+
else
|
|
131
|
+
@_layout_locals = opts
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# RODA3: Remove
|
|
136
|
+
def set_view_locals(opts)
|
|
137
|
+
RodaPlugins.warn "The set_view_locals method in the view_options plugin is deprecated and will be removed in Roda 3. This feature has been moved to the branch_locals plugin."
|
|
138
|
+
if locals = @_view_locals
|
|
139
|
+
@_view_locals = Hash[locals].merge!(opts)
|
|
140
|
+
else
|
|
141
|
+
@_view_locals = opts
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
128
145
|
private
|
|
129
146
|
|
|
147
|
+
def render_locals
|
|
148
|
+
locals = super
|
|
149
|
+
if @_view_locals
|
|
150
|
+
locals = Hash[locals].merge!(@_view_locals)
|
|
151
|
+
end
|
|
152
|
+
locals
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def layout_locals
|
|
156
|
+
locals = super
|
|
157
|
+
if @_view_locals
|
|
158
|
+
locals = Hash[locals].merge!(@_layout_locals)
|
|
159
|
+
end
|
|
160
|
+
locals
|
|
161
|
+
end
|
|
162
|
+
|
|
130
163
|
# If view options or locals have been set and this
|
|
131
164
|
# template isn't a layout template, merge the options
|
|
132
165
|
# and locals into the returned hash.
|
|
@@ -138,6 +171,7 @@ class Roda
|
|
|
138
171
|
t_opts.merge!(v_opts)
|
|
139
172
|
end
|
|
140
173
|
|
|
174
|
+
# RODA3: Remove
|
|
141
175
|
if v_locals = @_view_locals
|
|
142
176
|
t_opts[:locals] = if t_locals = t_opts[:locals]
|
|
143
177
|
Hash[v_locals].merge!(t_locals)
|
|
@@ -159,6 +193,7 @@ class Roda
|
|
|
159
193
|
opts.merge!(l_opts)
|
|
160
194
|
end
|
|
161
195
|
|
|
196
|
+
# RODA3: Remove
|
|
162
197
|
if l_locals = @_layout_locals
|
|
163
198
|
opts[:locals] = if o_locals = opts[:locals]
|
|
164
199
|
Hash[o_locals].merge!(l_locals)
|
|
@@ -3,4 +3,5 @@
|
|
|
3
3
|
# make attempts to load the view_subdirs plugin load the
|
|
4
4
|
# view_options plugin instead.
|
|
5
5
|
require 'roda/plugins/view_options'
|
|
6
|
+
Roda::RodaPlugins.warn "The view_subdirs plugin is a deprecated alias for the view_options plugin that will be removed in Roda 3. Use the view_options plugin instead."
|
|
6
7
|
Roda::RodaPlugins.register_plugin(:view_subdirs, Roda::RodaPlugins::ViewOptions)
|
|
@@ -4,6 +4,8 @@ require 'faye/websocket'
|
|
|
4
4
|
|
|
5
5
|
class Roda
|
|
6
6
|
module RodaPlugins
|
|
7
|
+
warn "The websockets plugin is deprecated and will be removed in Roda 3. Consider maintaining the plugin as a separate gem if you would like to keep using it."
|
|
8
|
+
|
|
7
9
|
# The websocket plugin adds integration support for websockets.
|
|
8
10
|
# Currently, only 'faye-websocket' is supported, so eventmachine
|
|
9
11
|
# is required for websockets. See the
|
data/lib/roda/version.rb
CHANGED
data/spec/composition_spec.rb
CHANGED
|
@@ -19,13 +19,13 @@ describe "r.run" do
|
|
|
19
19
|
|
|
20
20
|
it "modifies SCRIPT_NAME/PATH_INFO when calling run" do
|
|
21
21
|
a = app{|r| "#{r.script_name}|#{r.path_info}"}
|
|
22
|
-
app
|
|
22
|
+
app{|r| r.on("a"){r.run a}}
|
|
23
23
|
body("/a/b").must_equal "/a|/b"
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
it "restores SCRIPT_NAME/PATH_INFO before returning from run" do
|
|
27
27
|
a = app{|r| "#{r.script_name}|#{r.path_info}"}
|
|
28
|
-
app
|
|
28
|
+
app{|r| s = catch(:halt){r.on("a"){r.run a}}; "#{s[2].join}%#{r.script_name}|#{r.path_info}"}
|
|
29
29
|
body("/a/b").must_equal "/a|/b%|/a/b"
|
|
30
30
|
end
|
|
31
31
|
end
|
data/spec/matchers_spec.rb
CHANGED
|
@@ -158,7 +158,7 @@ describe "r.is" do
|
|
|
158
158
|
end
|
|
159
159
|
|
|
160
160
|
describe "matchers" do
|
|
161
|
-
|
|
161
|
+
deprecated "should handle string with embedded param" do
|
|
162
162
|
app do |r|
|
|
163
163
|
r.on "posts/:id" do |id|
|
|
164
164
|
id
|
|
@@ -185,6 +185,7 @@ describe "matchers" do
|
|
|
185
185
|
'2'
|
|
186
186
|
end
|
|
187
187
|
end
|
|
188
|
+
# RODA3: remove option
|
|
188
189
|
app.opts[:verbatim_string_matcher] = true
|
|
189
190
|
|
|
190
191
|
status('/post/123').must_equal 404
|
|
@@ -194,7 +195,7 @@ describe "matchers" do
|
|
|
194
195
|
body('/responses-:id').must_equal '2'
|
|
195
196
|
end
|
|
196
197
|
|
|
197
|
-
|
|
198
|
+
deprecated "should handle multiple params in single string" do
|
|
198
199
|
app do |r|
|
|
199
200
|
r.on "u/:uid/posts/:id" do |uid, id|
|
|
200
201
|
uid + id
|
|
@@ -206,7 +207,7 @@ describe "matchers" do
|
|
|
206
207
|
status("/u/jdoe/pots/123").must_equal 404
|
|
207
208
|
end
|
|
208
209
|
|
|
209
|
-
|
|
210
|
+
deprecated "should escape regexp metacharaters in string" do
|
|
210
211
|
app do |r|
|
|
211
212
|
r.on "u/:uid/posts?/:id" do |uid, id|
|
|
212
213
|
uid + id
|
|
@@ -218,7 +219,7 @@ describe "matchers" do
|
|
|
218
219
|
status("/u/jdoe/post/123").must_equal 404
|
|
219
220
|
end
|
|
220
221
|
|
|
221
|
-
|
|
222
|
+
deprecated "should handle colons by themselves" do
|
|
222
223
|
app do |r|
|
|
223
224
|
r.on "u/:/:uid/posts/::id" do |uid, id|
|
|
224
225
|
uid + id
|
|
@@ -394,7 +395,7 @@ describe "r.on" do
|
|
|
394
395
|
status.must_equal 404
|
|
395
396
|
end
|
|
396
397
|
|
|
397
|
-
|
|
398
|
+
deprecated "executes on arbitrary object" do
|
|
398
399
|
app do |r|
|
|
399
400
|
r.on Object.new do
|
|
400
401
|
"+1"
|