roda 3.24.0 → 3.25.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc61123e82d5731f6459164ff0e6305115008d22f59607b471021f6d5586646d
4
- data.tar.gz: 3bce436fb87890ef4d593ea97792044f493b3328c6c43cf7d363463f1767050c
3
+ metadata.gz: 4e98660fac24a8bb7b455591674e9427e4fb07521384ae925888b95d7b38509c
4
+ data.tar.gz: 5ca8cec4fbff75633280c63375f9b33b5eeb26f7862d05356b5c3e85f0f1a29a
5
5
  SHA512:
6
- metadata.gz: 11141195b070ccfda0ddafb7b54a81402cddf003b1256ae95cf1c3578f5afdf50afb65ac4449336f9925280901d9e40ac13329fb29435e12bd75d49b66f4130e
7
- data.tar.gz: c561ade16056cd4a6b004b58397fd8ed0c38d7b65b3be116f40553dd8b14af04fbbec7f41dd341c63cbdf48a897075ca97557c2f46710d7c4d09ac3ce9b2e12a
6
+ metadata.gz: 1e1ac389fcaad6a03b0ea9a5b89bf895c49421f971ce3a21eacaa7a24f93e061a1318debfd5cc30f2a41c146fdfbe53bd18785e6e2cc53fed938bde8dc078efa
7
+ data.tar.gz: fc26dccc7384e5619754d5f2ca4fddaf691aa57b301f1e2ea9b8de9a27224a49961ee0b162117363a7805a80860f4f3bb012d6d11ac8ca81f3b25f1505d888ef
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ = 3.25.0 (2019-10-15)
2
+
3
+ * Support change in tilt 2.0.10 private API to continue to support compiled templates, with up to 33% performance improvement (jeremyevans)
4
+
5
+ * Improve render performance with :locals option up to 75% by calling compiled template methods directly (jeremyevans)
6
+
1
7
  = 3.24.0 (2019-09-13)
2
8
 
3
9
  * Fix Proc.new warning in module_include plugin on Ruby 2.7+ (jeremyevans)
@@ -0,0 +1,12 @@
1
+ = Improvements
2
+
3
+ * The new tilt 2.0.10 private API is now supported when using
4
+ compiled template methods, with up to a 33% performance increase.
5
+ The older tilt private API (back to tilt 1.2) is still supported.
6
+
7
+ * The performance of the render and view methods in the render plugin
8
+ when called with only the :locals option are now about 75% faster
9
+ by calling compiled template methods directly.
10
+
11
+ * Keyword argument separation issues are now handled on Ruby 2.7+
12
+ when defining methods with blocks that accept keyword arguments.
@@ -213,7 +213,11 @@ class Roda
213
213
  # Complexity of handling keyword arguments using define_method is too high,
214
214
  # Fallback to instance_exec in this case.
215
215
  b = block
216
- block = lambda{|*a| instance_exec(*a, &b)} # Keyword arguments fallback
216
+ if RUBY_VERSION >= '2.7'
217
+ block = eval('lambda{|*a, **kw| instance_exec(*a, **kw, &b)}', nil, __FILE__, __LINE__) # Keyword arguments fallback
218
+ else
219
+ block = lambda{|*a| instance_exec(*a, &b)} # Keyword arguments fallback
220
+ end
217
221
  else
218
222
  arity_meth = meth
219
223
  meth = :"#{meth}_arity"
@@ -68,7 +68,7 @@ class Roda
68
68
  instance = allocate
69
69
  compile_opts.each do |compile_opt|
70
70
  template = instance.send(:retrieve_template, compile_opt)
71
- template.send(:compiled_method, locals)
71
+ Render.tilt_template_compiled_method(template, locals, self)
72
72
  end
73
73
 
74
74
  nil
@@ -122,7 +122,9 @@ class Roda
122
122
  #
123
123
  # The render/view method calls are optimized for usage with a single symbol/string
124
124
  # argument specifying the template name. So for fastest rendering, pass only a
125
- # symbol/string to render/view.
125
+ # symbol/string to render/view. Next best optimized are template calls with a
126
+ # single :locals option. Use of other options disables the compiled template
127
+ # method optimizations and can be significantly slower.
126
128
  #
127
129
  # If you must pass a hash to render/view, either as a second argument or as the
128
130
  # only argument, you can speed things up by specifying a +:cache_key+ option in
@@ -131,10 +133,20 @@ class Roda
131
133
  module Render
132
134
  # Support for using compiled methods directly requires Ruby 2.3 for the
133
135
  # method binding to work, and Tilt 1.2 for Tilt::Template#compiled_method.
134
- COMPILED_METHOD_SUPPORT = RUBY_VERSION >= '2.3' &&
135
- defined?(Tilt::VERSION) &&
136
- Tilt::VERSION >= '1.2' &&
137
- (Tilt::Template.instance_method(:compiled_method).arity rescue false) == 1
136
+ tilt_compiled_method_support = defined?(Tilt::VERSION) && Tilt::VERSION >= '1.2' &&
137
+ ([1, -2].include?(((compiled_method_arity = Tilt::Template.instance_method(:compiled_method).arity) rescue false)))
138
+ NO_CACHE = {:cache=>false}.freeze
139
+ COMPILED_METHOD_SUPPORT = RUBY_VERSION >= '2.3' && tilt_compiled_method_support
140
+
141
+ if compiled_method_arity == -2
142
+ def self.tilt_template_compiled_method(template, locals_keys, scope_class)
143
+ template.send(:compiled_method, locals_keys, scope_class)
144
+ end
145
+ else
146
+ def self.tilt_template_compiled_method(template, locals_keys, scope_class)
147
+ template.send(:compiled_method, locals_keys)
148
+ end
149
+ end
138
150
 
139
151
  # Setup default rendering options. See Render for details.
140
152
  def self.configure(app, opts=OPTS)
@@ -268,7 +280,7 @@ class Roda
268
280
  mod = roda_class::RodaCompiledTemplates
269
281
  internal_method_name = :"_#{method_name}"
270
282
  begin
271
- mod.send(:define_method, internal_method_name, send(:compiled_method, locals_keys))
283
+ mod.send(:define_method, internal_method_name, send(:compiled_method, locals_keys, roda_class))
272
284
  rescue ::NotImplementedError
273
285
  return false
274
286
  end
@@ -283,8 +295,8 @@ class Roda
283
295
  private
284
296
 
285
297
  # Return the compiled method for the current template object.
286
- def compiled_method(locals_keys=EMPTY_ARRAY)
287
- @template.send(:compiled_method, locals_keys)
298
+ def compiled_method(locals_keys=EMPTY_ARRAY, roda_class=nil)
299
+ Render.tilt_template_compiled_method(@template, locals_keys, roda_class)
288
300
  end
289
301
 
290
302
  # Return the lambda used to define the compiled template method. This
@@ -294,7 +306,7 @@ class Roda
294
306
  mod = roda_class::RodaCompiledTemplates
295
307
  lambda do |locals, &block|
296
308
  if template.modified?
297
- mod.send(:define_method, method_name, template.send(:compiled_method, locals_keys))
309
+ mod.send(:define_method, method_name, Render.tilt_template_compiled_method(template, locals_keys, roda_class))
298
310
  mod.send(:private, method_name)
299
311
  end
300
312
 
@@ -326,9 +338,11 @@ class Roda
326
338
 
327
339
  module InstanceMethods
328
340
  # Render the given template. See Render for details.
329
- def render(template, opts = (optimized_template = _cached_template_method(template); OPTS), &block)
341
+ def render(template, opts = (no_opts = true; optimized_template = _cached_template_method(template); OPTS), &block)
330
342
  if optimized_template
331
343
  send(optimized_template, OPTS, &block)
344
+ elsif !no_opts && opts.length == 1 && (locals = opts[:locals]) && (optimized_template = _optimized_render_method_for_locals(template, locals))
345
+ send(optimized_template, locals, &block)
332
346
  else
333
347
  opts = render_template_opts(template, opts)
334
348
  retrieve_template(opts).render((opts[:scope]||self), (opts[:locals]||OPTS), &block)
@@ -395,6 +409,48 @@ class Roda
395
409
  def _cached_template_method_lookup(method_cache, template)
396
410
  method_cache[template]
397
411
  end
412
+
413
+ # Use an optimized render path for templates with a hash of locals. Returns the result
414
+ # of the template render if the optimized path is used, or nil if the optimized
415
+ # path is not used and the long method needs to be used.
416
+ def _optimized_render_method_for_locals(template, locals)
417
+ return unless method_cache = render_opts[:template_method_cache]
418
+
419
+ locals_keys = locals.keys.sort
420
+ key = [:_render_locals, template, locals_keys]
421
+
422
+ optimized_template = case template
423
+ when String, Symbol
424
+ _cached_template_method_lookup(method_cache, key)
425
+ else
426
+ return
427
+ end
428
+
429
+ case optimized_template
430
+ when Symbol
431
+ optimized_template
432
+ else
433
+ if method_cache_key = _cached_template_method_key(key)
434
+ template_obj = retrieve_template(render_template_opts(template, NO_CACHE))
435
+ method_name = :"_roda_template_locals_#{self.class.object_id}_#{method_cache_key}"
436
+
437
+ method_cache[method_cache_key] = case template_obj
438
+ when Render::TemplateMtimeWrapper
439
+ template_obj.define_compiled_method(self.class, method_name, locals_keys)
440
+ else
441
+ begin
442
+ unbound_method = Render.tilt_template_compiled_method(template_obj, locals_keys, self.class)
443
+ rescue ::NotImplementedError
444
+ false
445
+ else
446
+ self.class::RodaCompiledTemplates.send(:define_method, method_name, unbound_method)
447
+ self.class::RodaCompiledTemplates.send(:private, method_name)
448
+ method_name
449
+ end
450
+ end
451
+ end
452
+ end
453
+ end
398
454
  else
399
455
  # :nocov:
400
456
  def _cached_template_method(template)
@@ -404,6 +460,10 @@ class Roda
404
460
  def _cached_template_method_key(template)
405
461
  nil
406
462
  end
463
+
464
+ def _optimized_render_method_for_locals(_, _)
465
+ nil
466
+ end
407
467
  # :nocov:
408
468
  end
409
469
 
@@ -525,7 +585,7 @@ class Roda
525
585
 
526
586
  if define_compiled_method && cache != false
527
587
  begin
528
- unbound_method = template.send(:compiled_method, EMPTY_ARRAY)
588
+ unbound_method = Render.tilt_template_compiled_method(template, EMPTY_ARRAY, self.class)
529
589
  rescue ::NotImplementedError
530
590
  method_cache[method_cache_key] = false
531
591
  else
@@ -34,8 +34,6 @@ class Roda
34
34
  app.plugin :render
35
35
  end
36
36
 
37
- COMPILED_METHOD_SUPPORT = Render::COMPILED_METHOD_SUPPORT
38
- NO_CACHE = {:cache=>false}.freeze
39
37
  ALLOWED_KEYS = [:locals, :local].freeze
40
38
 
41
39
  module InstanceMethods
@@ -47,40 +45,13 @@ class Roda
47
45
  # set a local variable. If not set, uses the template name.
48
46
  def render_each(enum, template, opts=(no_opts = true; optimized_template = _cached_render_each_template_method(template); OPTS))
49
47
  if optimized_template
50
- as = template.to_s.to_sym
51
- return enum.map{|v| send(optimized_template, as=>v)}.join
48
+ return _optimized_render_each(enum, optimized_template, template.to_s.to_sym, {})
52
49
  elsif opts.has_key?(:local)
53
50
  as = opts[:local]
54
51
  else
55
52
  as = template.to_s.to_sym
56
-
57
- if COMPILED_METHOD_SUPPORT &&
58
- no_opts &&
59
- optimized_template.nil? &&
60
- (method_cache = render_opts[:template_method_cache]) &&
61
- (method_cache_key = _cached_template_method_key([:_render_each, template]))
62
-
63
- template_obj = retrieve_template(render_template_opts(template, NO_CACHE))
64
- method_name = :"_roda_render_each_#{self.class.object_id}_#{method_cache_key}"
65
-
66
- case template_obj
67
- when Render::TemplateMtimeWrapper
68
- optimized_template = method_cache[method_cache_key] = template_obj.define_compiled_method(self.class, method_name, [as])
69
- else
70
- begin
71
- unbound_method = template_obj.send(:compiled_method, [as])
72
- rescue ::NotImplementedError
73
- method_cache[method_cache_key] = false
74
- else
75
- self.class::RodaCompiledTemplates.send(:define_method, method_name, unbound_method)
76
- self.class::RodaCompiledTemplates.send(:private, method_name)
77
- optimized_template = method_cache[method_cache_key] = method_name
78
- end
79
- end
80
-
81
- if optimized_template
82
- return enum.map{|v| send(optimized_template, as=>v)}.join
83
- end
53
+ if no_opts && optimized_template.nil? && (optimized_template = _optimized_render_method_for_locals(template, (locals = {as=>nil})))
54
+ return _optimized_render_each(enum, optimized_template, as, locals)
84
55
  end
85
56
  end
86
57
 
@@ -91,59 +62,10 @@ class Roda
91
62
  else
92
63
  locals = opts[:locals] = {}
93
64
  end
94
- end
95
-
96
- if COMPILED_METHOD_SUPPORT &&
97
- !no_opts &&
98
- as &&
99
- (opts.keys - ALLOWED_KEYS).empty? &&
100
- (method_cache = render_opts[:template_method_cache])
65
+ locals[as] = nil
101
66
 
102
- locals_keys = (locals.keys << as).sort
103
- key = [:_render_each, template, locals_keys]
104
-
105
- optimized_template = case template
106
- when String, Symbol
107
- _cached_template_method_lookup(method_cache, key)
108
- else
109
- false
110
- end
111
-
112
- case optimized_template
113
- when Symbol
114
- return enum.map do |v|
115
- locals[as] = v
116
- send(optimized_template, locals)
117
- end.join
118
- when false
119
- # nothing
120
- else
121
- if method_cache_key = _cached_template_method_key(key)
122
- template_obj = retrieve_template(render_template_opts(template, NO_CACHE))
123
- method_name = :"_roda_render_each_#{self.class.object_id}_#{method_cache_key}"
124
-
125
- case template_obj
126
- when Render::TemplateMtimeWrapper
127
- optimized_template = method_cache[method_cache_key] = template_obj.define_compiled_method(self.class, method_name, locals_keys)
128
- else
129
- begin
130
- unbound_method = template_obj.send(:compiled_method, locals_keys)
131
- rescue ::NotImplementedError
132
- method_cache[method_cache_key] = false
133
- else
134
- self.class::RodaCompiledTemplates.send(:define_method, method_name, unbound_method)
135
- self.class::RodaCompiledTemplates.send(:private, method_name)
136
- optimized_template = method_cache[method_cache_key] = method_name
137
- end
138
- end
139
-
140
- if optimized_template
141
- return enum.map do |v|
142
- locals[as] = v
143
- send(optimized_template, locals)
144
- end.join
145
- end
146
- end
67
+ if (opts.keys - ALLOWED_KEYS).empty? && (optimized_template = _optimized_render_method_for_locals(template, locals))
68
+ return _optimized_render_each(enum, optimized_template, as, locals)
147
69
  end
148
70
  end
149
71
 
@@ -155,7 +77,7 @@ class Roda
155
77
 
156
78
  private
157
79
 
158
- if COMPILED_METHOD_SUPPORT
80
+ if Render::COMPILED_METHOD_SUPPORT
159
81
  # If compiled method support is enabled in the render plugin, return the
160
82
  # method name to call to render the template. Return false if not given
161
83
  # a string or symbol, or if compiled method support for this template has
@@ -164,12 +86,20 @@ class Roda
164
86
  case template
165
87
  when String, Symbol
166
88
  if (method_cache = render_opts[:template_method_cache])
167
- _cached_template_method_lookup(method_cache, [:_render_each, template])
89
+ _cached_template_method_lookup(method_cache, [:_render_locals, template, [template.to_sym]])
168
90
  end
169
91
  else
170
92
  false
171
93
  end
172
94
  end
95
+
96
+ # Use an optimized render for each value in the enum.
97
+ def _optimized_render_each(enum, optimized_template, as, locals)
98
+ enum.map do |v|
99
+ locals[as] = v
100
+ send(optimized_template, locals)
101
+ end.join
102
+ end
173
103
  else
174
104
  # :nocov:
175
105
  def _cached_render_each_template_method(template)
@@ -71,9 +71,9 @@ class Roda
71
71
  # :max_seconds :: The maximum number of seconds to allow for total session lifetime, starting with when
72
72
  # the session was originally created. Default is <tt>86400*30</tt> (30 days). Can be set to
73
73
  # +nil+ to disable session lifetime checks.
74
- # :max_idle_sessions :: The maximum number of seconds to allow since the session was last updated.
75
- # Default is <tt>86400*7</tt> (7 days). Can be set to nil to disable session idleness
76
- # checks.
74
+ # :max_idle_seconds :: The maximum number of seconds to allow since the session was last updated.
75
+ # Default is <tt>86400*7</tt> (7 days). Can be set to nil to disable session idleness
76
+ # checks.
77
77
  # :old_secret :: The previous secret to use, allowing for secret rotation. Must be a string of at least 64
78
78
  # bytes if given.
79
79
  # :pad_size :: Pad session data (after possible compression, before encryption), to a multiple of this
@@ -4,7 +4,7 @@ class Roda
4
4
  RodaMajorVersion = 3
5
5
 
6
6
  # The minor version of Roda, updated for new feature releases of Roda.
7
- RodaMinorVersion = 24
7
+ RodaMinorVersion = 25
8
8
 
9
9
  # The patch version of Roda, updated only for bug fixes from the last
10
10
  # feature release.
@@ -206,6 +206,20 @@ describe "Roda.define_roda_method" do
206
206
  end
207
207
 
208
208
  it "should handle expected_arity :any with keyword arguments" do
209
+ if RUBY_VERSION >= '2.7' && RUBY_VERSION < '3'
210
+ suppress = proc do |&b|
211
+ begin
212
+ stderr = $stderr
213
+ $stderr = StringIO.new
214
+ b.call
215
+ ensure
216
+ $stderr = stderr
217
+ end
218
+ end
219
+ else
220
+ suppress = proc{|&b| b.call}
221
+ end
222
+
209
223
  m = eval('app.define_roda_method("x", :any){|b:2| b}', binding)
210
224
  @scope.send(m).must_equal 2
211
225
  @scope.send(m, 4).must_equal 2
@@ -225,26 +239,26 @@ describe "Roda.define_roda_method" do
225
239
  @scope.send(m, 4, b: 3).must_equal(b: 3)
226
240
 
227
241
  m = eval('app.define_roda_method("x", :any){|x, b:9| [x, b, 1]}', binding)
228
- @scope.send(m).must_equal [nil, 9, 1]
242
+ suppress.call{@scope.send(m)[1..-1]}.must_equal [9, 1]
229
243
  @scope.send(m, 2).must_equal [2, 9, 1]
230
244
  @scope.send(m, 2, 3).must_equal [2, 9, 1]
231
- @scope.send(m, b: 4).must_equal [{b: 4}, 9, 1]
245
+ eval("@scope.send(m, {b: 4}#{', **{}' if RUBY_VERSION > '2'})").must_equal [{b: 4}, 9, 1]
232
246
  @scope.send(m, 2, b: 4).must_equal [2, 4, 1]
233
247
  @scope.send(m, 2, 3, b: 4).must_equal [2, 4, 1]
234
248
 
235
249
  m = eval('app.define_roda_method("x", :any){|x, b:| [x, b, 1]}', binding)
236
- proc{@scope.send(m)}.must_raise ArgumentError
250
+ proc{suppress.call{@scope.send(m)}}.must_raise ArgumentError
237
251
  proc{@scope.send(m, 2)}.must_raise ArgumentError
238
252
  proc{@scope.send(m, 2, 3)}.must_raise ArgumentError
239
- proc{@scope.send(m, b: 4)}.must_raise ArgumentError
253
+ proc{eval("@scope.send(m, {b: 4}#{', **{}' if RUBY_VERSION > '2'})")}.must_raise ArgumentError
240
254
  @scope.send(m, 2, b: 4).must_equal [2, 4, 1]
241
255
  @scope.send(m, 2, 3, b: 4).must_equal [2, 4, 1]
242
256
 
243
257
  m = eval('app.define_roda_method("x", :any){|x, **b| [x, b, 1]}', binding)
244
- @scope.send(m).must_equal [nil, {}, 1]
258
+ suppress.call{@scope.send(m)[1..-1]}.must_equal [{}, 1]
245
259
  @scope.send(m, 2).must_equal [2, {}, 1]
246
260
  @scope.send(m, 2, 3).must_equal [2, {}, 1]
247
- @scope.send(m, b: 4).must_equal [{b: 4}, {}, 1]
261
+ eval("@scope.send(m, {b: 4}#{', **{}' if RUBY_VERSION > '2'})").must_equal [{b: 4}, {}, 1]
248
262
  @scope.send(m, 2, b: 4).must_equal [2, {b: 4}, 1]
249
263
  @scope.send(m, 2, 3, b: 4).must_equal [2, {b: 4}, 1]
250
264
 
@@ -19,8 +19,9 @@ describe "precompile_templates plugin" do
19
19
  app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].must_be_nil
20
20
  app.precompile_templates 'spec/views/iv.erb'
21
21
  app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].wont_equal nil
22
- app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].instance_variable_get(:@compiled_method)[[]].wont_equal nil
22
+ app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].instance_variable_get(:@compiled_method).length.must_equal 1
23
23
  body.strip.must_equal '1'
24
+ app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].instance_variable_get(:@compiled_method).length.must_equal 1
24
25
  end
25
26
 
26
27
  it "adds support for template precompilation with :locals" do
@@ -35,8 +36,9 @@ describe "precompile_templates plugin" do
35
36
  app.render_opts[:cache][File.expand_path('spec/views/about.erb')].must_be_nil
36
37
  app.precompile_templates 'spec/views/about.erb', :locals=>[:title]
37
38
  app.render_opts[:cache][File.expand_path('spec/views/about.erb')].wont_equal nil
38
- app.render_opts[:cache][File.expand_path('spec/views/about.erb')].instance_variable_get(:@compiled_method)[[:title]].wont_equal nil
39
+ app.render_opts[:cache][File.expand_path('spec/views/about.erb')].instance_variable_get(:@compiled_method).length.must_equal 1
39
40
  body.strip.must_equal '<h1>1</h1>'
41
+ app.render_opts[:cache][File.expand_path('spec/views/about.erb')].instance_variable_get(:@compiled_method).length.must_equal 1
40
42
  end
41
43
 
42
44
  it "adds support for template precompilation with :inline" do
@@ -51,8 +53,9 @@ describe "precompile_templates plugin" do
51
53
  app.render_opts[:cache]['a'].must_be_nil
52
54
  app.precompile_templates :inline=>'a', :cache_key=>'a'
53
55
  app.render_opts[:cache]['a'].wont_equal nil
54
- app.render_opts[:cache]['a'].instance_variable_get(:@compiled_method)[[]].wont_equal nil
56
+ app.render_opts[:cache]['a'].instance_variable_get(:@compiled_method).length.must_equal 1
55
57
  body.strip.must_equal "a"
58
+ app.render_opts[:cache]['a'].instance_variable_get(:@compiled_method).length.must_equal 1
56
59
  end
57
60
  end
58
61
  end
@@ -763,22 +763,26 @@ describe "render plugin" do
763
763
  req("/a")
764
764
  req("/c")
765
765
 
766
+ @app = Class.new(app)
766
767
  app.plugin :render, :allowed_paths=>[]
767
768
  proc{req}.must_raise Roda::RodaError
768
769
  proc{req("/a")}.must_raise Roda::RodaError
769
770
  proc{req("/c")}.must_raise Roda::RodaError
770
771
 
772
+ @app = Class.new(app)
771
773
  app.plugin :render, :allowed_paths=>['spec/views/about']
772
774
  proc{req}.must_raise Roda::RodaError
773
775
  proc{req("/a")}.must_raise Roda::RodaError
774
776
  req("/c")
775
777
 
778
+ @app = Class.new(app)
776
779
  app.plugin :render, :allowed_paths=>%w'spec/views/about spec/views/b'
777
780
  body.strip.must_equal "b"
778
781
  proc{req("/a")}.must_raise Roda::RodaError
779
782
  req("/c")
780
783
 
781
784
  render_opts[:check_paths] = true
785
+ @app = Class.new(app)
782
786
  app.plugin :render, :check_paths=>false
783
787
  body.strip.must_equal "b"
784
788
  proc{req("/a")}.must_raise Roda::RodaError
@@ -27,7 +27,7 @@ require "stringio"
27
27
 
28
28
  ENV['MT_NO_PLUGINS'] = '1' # Work around stupid autoloading of plugins
29
29
  gem 'minitest'
30
- require "minitest/autorun"
30
+ require "minitest/global_expectations/autorun"
31
31
 
32
32
  $RODA_WARN = true
33
33
  def (Roda::RodaPlugins).warn(s)
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.24.0
4
+ version: 3.25.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-09-13 00:00:00.000000000 Z
11
+ date: 2019-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 5.7.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-global_expectations
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: tilt
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -221,6 +235,7 @@ extra_rdoc_files:
221
235
  - doc/release_notes/3.22.0.txt
222
236
  - doc/release_notes/3.23.0.txt
223
237
  - doc/release_notes/3.24.0.txt
238
+ - doc/release_notes/3.25.0.txt
224
239
  files:
225
240
  - CHANGELOG
226
241
  - MIT-LICENSE
@@ -281,6 +296,7 @@ files:
281
296
  - doc/release_notes/3.22.0.txt
282
297
  - doc/release_notes/3.23.0.txt
283
298
  - doc/release_notes/3.24.0.txt
299
+ - doc/release_notes/3.25.0.txt
284
300
  - doc/release_notes/3.3.0.txt
285
301
  - doc/release_notes/3.4.0.txt
286
302
  - doc/release_notes/3.5.0.txt