roda 2.20.0 → 2.21.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
  SHA1:
3
- metadata.gz: eef2a8e61f61ef63c53b1086d69a56ebfe6d8634
4
- data.tar.gz: 9803c11eb51c8588d8ba7c8b8c9026045ee769f4
3
+ metadata.gz: 9e6b3cac6d9da3a5df41af141588ad921d4708d8
4
+ data.tar.gz: 345a82534b2994081e0fde6e7e9552d1d28af295
5
5
  SHA512:
6
- metadata.gz: 82c6579b2995baf018e9115ce50dc32bb672cf9ecf7b26c82b895062e5cf86537ac2c07cd978936d64a5421989e332dfb24f2fea7fd45d07a8a5953b8eba93e6
7
- data.tar.gz: c41e5dcc24f4dc2c5528556fb4c583f486e64eb7c04f988a9851d72e53ec99ea760782637084e9d83369db27a7cc3e83a37a3622e4c248654a639472ffdbc76c
6
+ metadata.gz: 44fa6264003e578c1d694737d9658d9b78a7d26274542ddc1fe8057e42684cd2f6dae884cccda81ddcebf0e76310f3ee9b5f283fe48cafd4c5256bb529b0a0b7
7
+ data.tar.gz: d3b536a7846bd36832d58968192f2bc031215dae669eb09b8351d135aa3ccaffa195032dd429315d40b564c5b61f1e9540678637c6ef57db351e9a8b1c5cfc3c
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ = 2.21.0 (2016-12-16)
2
+
3
+ * Add handle_stream_error method to streaming plugin, for handling errors when using stream(:loop=>true) (jeremyevans)
4
+
1
5
  = 2.20.0 (2016-11-13)
2
6
 
3
7
  * Support :escape=>:erubi option in the render plugin to use the erubi template engine (jeremyevans)
data/Rakefile CHANGED
@@ -86,9 +86,10 @@ end
86
86
 
87
87
  desc "Run specs with -w, some warnings filtered"
88
88
  task "spec_w" do
89
- ENV['RUBYOPT'] ? (ENV['RUBYOPT'] += " -w") : (ENV['RUBYOPT'] = '-w')
90
- rake = ENV['RAKE'] || "#{FileUtils::RUBY} -S rake"
91
- sh %{#{rake} 2>&1 | egrep -v \": warning: instance variable @.* not initialized|: warning: method redefined; discarding old|: warning: previous definition of|: warning: statement not reached"}
89
+ rubyopt = ENV['RUBYOPT']
90
+ ENV['RUBYOPT'] = "#{rubyopt} -w"
91
+ spec.call('WARNING'=>'1')
92
+ ENV['RUBYOPT'] = rubyopt
92
93
  end
93
94
 
94
95
  ### Other
@@ -0,0 +1,17 @@
1
+ = New Features
2
+
3
+ * The streaming plugin now supports a handle_stream_error method to
4
+ handle exceptions when using stream(:loop=>true). This method
5
+ takes the exception and the stream object, and can be used to log
6
+ errors, output errors into the stream, close the stream, ignore
7
+ errors, or any other error handling.
8
+
9
+ = Other Improvements
10
+
11
+ * A couple of unused variable assignments have been removed, providing
12
+ a minor speedup.
13
+
14
+ * The specs no longer produce deprecation warnings when using Minitest
15
+ 5.10.
16
+
17
+ * Some verbose warnings have been removed from the specs.
@@ -616,7 +616,7 @@ class Roda
616
616
 
617
617
  url_prefix = request.script_name if self.class.opts[:add_script_name]
618
618
 
619
- if compiled = o[:compiled]
619
+ if o[:compiled]
620
620
  if ukey = _compiled_assets_hash(type, true)
621
621
  ["#{o[:compiled_asset_host]}#{url_prefix}/#{o[:"compiled_#{stype}_prefix"]}.#{ukey}.#{stype}"]
622
622
  else
@@ -35,6 +35,7 @@ class Roda
35
35
  INDIFFERENT_PROC = lambda{|h,k| h[k.to_s] if k.is_a?(Symbol)}
36
36
 
37
37
  if Rack.release > '2'
38
+ # :nocov:
38
39
  class QueryParser < Rack::QueryParser
39
40
  # Work around for invalid optimization in rack
40
41
  def parse_nested_query(qs, d=nil)
@@ -65,6 +66,7 @@ class Roda
65
66
  @_request.params
66
67
  end
67
68
  end
69
+ # :nocov:
68
70
  else
69
71
  module InstanceMethods
70
72
  # A copy of the request params that will automatically
@@ -106,7 +106,6 @@ class Roda
106
106
  # instead having the routing tree handle the request.
107
107
  def call
108
108
  r = @_request
109
- path_info = r.env['PATH_INFO']
110
109
  if route = self.class.static_route_for(r.request_method, r.path_info)
111
110
  catch(:halt){r.static_route(&route)}
112
111
  else
@@ -26,6 +26,25 @@ class Roda
26
26
  # :loop :: Whether to call the stream block continuously until
27
27
  # the connection is closed.
28
28
  #
29
+ # If the :loop option is used, you can override the
30
+ # handle_stream_error method to change how exceptions
31
+ # are handled during streaming. This method is passed the
32
+ # exception and the stream. By default, this method
33
+ # just reraises the exception, but you can choose to output
34
+ # the an error message to the stream, before raising:
35
+ #
36
+ # def handle_stream_error(e, out)
37
+ # out << 'ERROR!'
38
+ # raise e
39
+ # end
40
+ #
41
+ # Ignore errors completely while streaming:
42
+ #
43
+ # def handle_stream_error(e, out)
44
+ # end
45
+ #
46
+ # or handle the errors in some other way.
47
+ #
29
48
  # The implementation was originally taken from Sinatra,
30
49
  # which is also released under the MIT License:
31
50
  #
@@ -159,13 +178,22 @@ class Roda
159
178
  if opts[:loop]
160
179
  block = proc do |out|
161
180
  until out.closed?
162
- yield(out)
181
+ begin
182
+ yield(out)
183
+ rescue => e
184
+ handle_stream_error(e, out)
185
+ end
163
186
  end
164
187
  end
165
188
  end
166
189
 
167
190
  throw :halt, @_response.finish_with_body(Stream.new(opts, &block))
168
191
  end
192
+
193
+ # Handle exceptions raised while streaming when using :loop
194
+ def handle_stream_error(e, out)
195
+ raise e
196
+ end
169
197
  end
170
198
  end
171
199
 
data/lib/roda/version.rb CHANGED
@@ -4,7 +4,7 @@ class Roda
4
4
  RodaMajorVersion = 2
5
5
 
6
6
  # The minor version of Roda, updated for new feature releases of Roda.
7
- RodaMinorVersion = 20
7
+ RodaMinorVersion = 21
8
8
 
9
9
  # The patch version of Roda, updated only for bug fixes from the last
10
10
  # feature release.
@@ -174,7 +174,7 @@ describe "integration" do
174
174
  end
175
175
 
176
176
  it "should have app return the rack application to call" do
177
- app(:bare){}.app.must_equal nil
177
+ app(:bare){}.app.must_be_nil
178
178
  app.route{|r|}
179
179
  app.app.must_be_kind_of(Proc)
180
180
  c = Class.new{def initialize(app) @app = app end; def call(env) @app.call(env) end}
@@ -12,7 +12,7 @@ describe 'response.cache_control' do
12
12
  app(:caching) do |r|
13
13
  response.cache_control({})
14
14
  end
15
- header('Cache-Control').must_equal nil
15
+ header('Cache-Control').must_be_nil
16
16
  end
17
17
  end
18
18
 
@@ -39,8 +39,8 @@ describe 'response.finish' do
39
39
  app(:caching) do |r|
40
40
  response.status = 304
41
41
  end
42
- header('Content-Type').must_equal nil
43
- header('Content-Length').must_equal nil
42
+ header('Content-Type').must_be_nil
43
+ header('Content-Length').must_be_nil
44
44
  end
45
45
 
46
46
  it 'does not change non-304 responses' do
@@ -57,7 +57,7 @@ describe 'request.last_modified' do
57
57
  app(:caching) do |r|
58
58
  r.last_modified nil
59
59
  end
60
- header('Last-Modified').must_equal nil
60
+ header('Last-Modified').must_be_nil
61
61
  end
62
62
 
63
63
  it 'does not change a status other than 200' do
@@ -31,6 +31,7 @@ describe "chunked plugin" do
31
31
 
32
32
  it "accepts a block that is called after layout yielding but before content when streaming" do
33
33
  app(:chunked) do |r|
34
+ @h = nil
34
35
  chunked(:inline=>'m<%= @h %>', :layout=>{:inline=>'<%= @h %><%= yield %>t'}) do
35
36
  @h = 'h'
36
37
  end
@@ -113,7 +114,7 @@ describe "chunked plugin" do
113
114
  response.write chunked(:inline=>'m', :layout=>{:inline=>'h<%= yield %>t'})
114
115
  end
115
116
 
116
- header('Content-Length', 'HTTP_VERSION'=>'HTTP/1.1').must_equal nil
117
+ header('Content-Length', 'HTTP_VERSION'=>'HTTP/1.1').must_be_nil
117
118
  header('Content-Length', 'HTTP_VERSION'=>'HTTP/1.0').must_equal '4'
118
119
  end
119
120
 
@@ -135,7 +136,7 @@ describe "chunked plugin" do
135
136
  end
136
137
 
137
138
  header('Transfer-Encoding', 'HTTP_VERSION'=>'HTTP/1.1').must_equal 'chunked'
138
- header('Transfer-Encoding', 'HTTP_VERSION'=>'HTTP/1.0').must_equal nil
139
+ header('Transfer-Encoding', 'HTTP_VERSION'=>'HTTP/1.0').must_be_nil
139
140
  end
140
141
 
141
142
  it "uses given :headers when chunking" do
@@ -147,7 +148,7 @@ describe "chunked plugin" do
147
148
  end
148
149
 
149
150
  header('Foo', 'HTTP_VERSION'=>'HTTP/1.1').must_equal 'bar'
150
- header('Foo', 'HTTP_VERSION'=>'HTTP/1.0').must_equal nil
151
+ header('Foo', 'HTTP_VERSION'=>'HTTP/1.0').must_be_nil
151
152
  end
152
153
 
153
154
  it "handles multiple arguments to chunked" do
@@ -3,7 +3,7 @@ require File.expand_path("spec_helper", File.dirname(File.dirname(__FILE__)))
3
3
  describe "delay_build plugin" do
4
4
  it "does not build rack app until app is called" do
5
5
  app(:delay_build){"a"}
6
- app.instance_variable_get(:@app).must_equal nil
6
+ app.instance_variable_get(:@app).must_be_nil
7
7
  body.must_equal "a"
8
8
  # Work around minitest bug
9
9
  refute_equal app.instance_variable_get(:@app), nil
@@ -9,8 +9,8 @@ describe "drop_body plugin" do
9
9
 
10
10
  [101, 102, 204, 205, 304].each do |i|
11
11
  body(i.to_s).must_equal ''
12
- header('Content-Type', i.to_s).must_equal nil
13
- header('Content-Length', i.to_s).must_equal nil
12
+ header('Content-Type', i.to_s).must_be_nil
13
+ header('Content-Length', i.to_s).must_be_nil
14
14
  end
15
15
 
16
16
  body('200').must_equal 'a'
@@ -115,7 +115,7 @@ describe "error_handler plugin" do
115
115
  end
116
116
 
117
117
  header('Content-Type').must_equal 'text/html'
118
- header('Foo').must_equal nil
118
+ header('Foo').must_be_nil
119
119
  end
120
120
 
121
121
  it "can set error via the plugin block" do
@@ -57,7 +57,7 @@ describe "hooks plugin" do
57
57
 
58
58
  proc{req}.must_raise(Roda::RodaError)
59
59
  a.pop.must_be_kind_of(Roda::RodaError)
60
- a.pop.must_equal nil
60
+ a.pop.must_be_nil
61
61
  end
62
62
 
63
63
  it "handles multiple before and after blocks correctly" do
@@ -84,8 +84,8 @@ describe "mailer plugin" do
84
84
  end
85
85
  end
86
86
 
87
- app.mail('/foo', 1, 2).must_equal nil
88
- app.sendmail('/foo', 1, 2).must_equal nil
87
+ app.mail('/foo', 1, 2).must_be_nil
88
+ app.sendmail('/foo', 1, 2).must_be_nil
89
89
  deliveries.must_equal []
90
90
  end
91
91
 
@@ -64,7 +64,7 @@ describe "not_found plugin" do
64
64
  end
65
65
 
66
66
  header('Content-Type').must_equal 'text/html'
67
- header('Foo').must_equal nil
67
+ header('Foo').must_be_nil
68
68
  end
69
69
 
70
70
  it "does not modify behavior if not_found is not called" do
@@ -16,7 +16,7 @@ describe "precompile_templates plugin" do
16
16
  end
17
17
  end
18
18
 
19
- app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].must_equal nil
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
22
  app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].instance_variable_get(:@compiled_method)[[]].wont_equal nil
@@ -32,7 +32,7 @@ describe "precompile_templates plugin" do
32
32
  end
33
33
  end
34
34
 
35
- app.render_opts[:cache][File.expand_path('spec/views/about.erb')].must_equal nil
35
+ app.render_opts[:cache][File.expand_path('spec/views/about.erb')].must_be_nil
36
36
  app.precompile_templates 'spec/views/about.erb', :locals=>[:title]
37
37
  app.render_opts[:cache][File.expand_path('spec/views/about.erb')].wont_equal nil
38
38
  app.render_opts[:cache][File.expand_path('spec/views/about.erb')].instance_variable_get(:@compiled_method)[[:title]].wont_equal nil
@@ -48,7 +48,7 @@ describe "precompile_templates plugin" do
48
48
  end
49
49
  end
50
50
 
51
- app.render_opts[:cache][File.expand_path('spec/views/home.erb')].must_equal nil
51
+ app.render_opts[:cache][File.expand_path('spec/views/home.erb')].must_be_nil
52
52
  app.precompile_templates 'spec/views/h*.erb', :locals=>[:title, :name]
53
53
  app.render_opts[:cache][File.expand_path('spec/views/home.erb')].wont_equal nil
54
54
  app.render_opts[:cache][File.expand_path('spec/views/home.erb')].instance_variable_get(:@compiled_method)[[:name, :title]].wont_equal nil
@@ -64,7 +64,7 @@ describe "precompile_templates plugin" do
64
64
  end
65
65
  end
66
66
 
67
- app.render_opts[:cache]['a'].must_equal nil
67
+ app.render_opts[:cache]['a'].must_be_nil
68
68
  app.precompile_templates :inline=>'a', :cache_key=>'a'
69
69
  app.render_opts[:cache]['a'].wont_equal nil
70
70
  app.render_opts[:cache]['a'].instance_variable_get(:@compiled_method)[[]].wont_equal nil
@@ -43,10 +43,10 @@ describe "public plugin" do
43
43
  end
44
44
 
45
45
  body('/about/_test.erb').must_equal File.read('spec/views/about/_test.erb')
46
- header('Content-Encoding', '/about/_test.erb').must_equal nil
46
+ header('Content-Encoding', '/about/_test.erb').must_be_nil
47
47
 
48
48
  body('/about.erb').must_equal File.read('spec/views/about.erb')
49
- header('Content-Encoding', '/about.erb').must_equal nil
49
+ header('Content-Encoding', '/about.erb').must_be_nil
50
50
 
51
51
  meth = RUBY_VERSION >= '1.9' ? :binread : :read
52
52
  body('/about/_test.erb', 'HTTP_ACCEPT_ENCODING'=>'deflate, gzip').must_equal File.send(meth, 'spec/views/about/_test.erb.gz')
@@ -69,8 +69,6 @@ describe "render plugin" do
69
69
  end
70
70
 
71
71
  describe "render plugin with :layout_opts=>{:merge_locals=>true}" do
72
- h = {:a=>1, :b=>2, :c=>3, :d=>4}
73
-
74
72
  before do
75
73
  app(:bare) do
76
74
  plugin :render, :views=>"./spec/views", :check_paths=>true, :locals=>{:a=>1, :b=>2, :c=>3, :d=>4, :e=>5}, :layout_opts=>{:inline=>'<%= a %>|<%= b %>|<%= c %>|<%= d %>|<%= e %>|<%= f %>|<%= yield %>', :merge_locals=>true, :locals=>{:a=>-1, :f=>6}}
@@ -269,6 +267,7 @@ describe "render plugin" do
269
267
  app(:bare) do
270
268
  plugin :render, :engine_opts=>{'a.erb'=>{:outvar=>'@a'}}
271
269
  route do |r|
270
+ @a = nil
272
271
  r.is('a') do
273
272
  render(:inline=>'<%= @a.class.name %>', :engine=>'a.erb')
274
273
  end
@@ -344,6 +343,7 @@ describe "render plugin" do
344
343
  render(:inline=>template.dup, :locals=>{:b=>2, :c=>4})
345
344
  end
346
345
  r.is "c" do
346
+ @a = nil
347
347
  render(:inline=>template.dup, :locals=>{:c=>3})
348
348
  end
349
349
  end
@@ -357,7 +357,7 @@ describe "render plugin" do
357
357
  with_rack_env('development') do
358
358
  app(:render){}
359
359
  end
360
- app.render_opts[:cache].must_equal nil
360
+ app.render_opts[:cache].must_be_nil
361
361
  app(:render){}
362
362
  app.render_opts[:cache].wont_equal nil
363
363
  end
@@ -374,7 +374,7 @@ describe "render plugin" do
374
374
  end
375
375
 
376
376
  body('/a').strip.must_equal "a"
377
- app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].must_equal nil
377
+ app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].must_be_nil
378
378
  body('/b').strip.must_equal "a"
379
379
  app.render_opts[:cache][File.expand_path('spec/views/iv.erb')].wont_equal nil
380
380
  end
@@ -403,7 +403,7 @@ describe "render plugin" do
403
403
  end
404
404
 
405
405
  body('/a').strip.must_equal "iv-a"
406
- app.render_opts[:cache][['iv', c, nil, nil, proca]].must_equal nil
406
+ app.render_opts[:cache][['iv', c, nil, nil, proca]].must_be_nil
407
407
  body('/b').strip.must_equal "iv-a"
408
408
  app.render_opts[:cache][['iv', c, nil, nil, proca]].wont_equal nil
409
409
  end
@@ -378,7 +378,7 @@ describe "sinatra_helpers plugin" do
378
378
  end
379
379
 
380
380
  it "does not set the Content-Disposition header by default" do
381
- header('Content-Disposition').must_equal nil
381
+ header('Content-Disposition').must_be_nil
382
382
  end
383
383
 
384
384
  it "sets the Content-Disposition header when :disposition set to 'attachment'" do
@@ -68,7 +68,7 @@ describe "status_handler plugin" do
68
68
  end
69
69
 
70
70
  header('Content-Type').must_equal 'text/html'
71
- header('Foo').must_equal nil
71
+ header('Foo').must_be_nil
72
72
  end
73
73
 
74
74
  it "does not modify behavior if status_handler is not called" do
@@ -49,4 +49,73 @@ describe "streaming plugin" do
49
49
  proc{b.each{|v| a << v}}.must_raise(Roda::RodaError)
50
50
  a.must_equal %w'a b e d'
51
51
  end
52
+
53
+ it "uses handle_stream_error for handling errors when streaming" do
54
+ a = []
55
+ app(:streaming) do |r|
56
+ b = %w'a b c'
57
+ stream(:loop=>true, :callback=>proc{a << 'e'}) do |out|
58
+ out << b.shift
59
+ raise Roda::RodaError, 'foo' if b.length == 1
60
+ end
61
+ end
62
+
63
+ app.send(:define_method, :handle_stream_error) do |error, out|
64
+ out << '1'
65
+ raise error
66
+ end
67
+
68
+ s, h, b = req
69
+ s.must_equal 200
70
+ h.must_equal('Content-Type'=>'text/html')
71
+ b.callback{a << 'd'}
72
+ proc{b.each{|v| a << v}}.must_raise(Roda::RodaError)
73
+ a.must_equal %w'a b 1 e d'
74
+ end
75
+
76
+ it "should allow closing the stream when handling an error" do
77
+ a = []
78
+ app(:streaming) do |r|
79
+ b = %w'a b c'
80
+ stream(:loop=>true, :callback=>proc{a << 'e'}) do |out|
81
+ out << b.shift
82
+ raise Roda::RodaError, 'foo' if b.length == 1
83
+ end
84
+ end
85
+
86
+ app.send(:define_method, :handle_stream_error) do |error, out|
87
+ out.close
88
+ end
89
+
90
+ s, h, b = req
91
+ s.must_equal 200
92
+ h.must_equal('Content-Type'=>'text/html')
93
+ b.callback{a << 'd'}
94
+ b.each{|v| a << v}
95
+ a.must_equal %w'a b e d'
96
+ end
97
+
98
+ it "should allow ignoring errors when streaming" do
99
+ a = []
100
+ b2 = %w'a b c'
101
+
102
+ app(:streaming) do |r|
103
+ stream(:loop=>true, :callback=>proc{a << 'e'}) do |out|
104
+ out << b2.shift
105
+ raise Roda::RodaError
106
+ end
107
+ end
108
+
109
+ app.send(:define_method, :handle_stream_error) do |error, out|
110
+ out << '1'
111
+ out.close if b2.empty?
112
+ end
113
+
114
+ s, h, b = req
115
+ s.must_equal 200
116
+ h.must_equal('Content-Type'=>'text/html')
117
+ b.callback{a << 'd'}
118
+ b.each{|v| a << v}
119
+ a.must_equal %w'a 1 b 1 c 1 e d'
120
+ end
52
121
  end
@@ -52,7 +52,6 @@ describe "type_routing plugin" do
52
52
 
53
53
  it "works correctly in sub apps" do
54
54
  sup_app = app
55
- b = sup_app.route_block
56
55
  @app = Class.new(sup_app)
57
56
  app.route do |r|
58
57
  r.run(sup_app)
@@ -4,7 +4,7 @@ describe "unescape_path_path plugin" do
4
4
  it "decodes URL-encoded routing path" do
5
5
  app(:unescape_path) do |r|
6
6
  r.on 'b' do
7
- r.get /(.)/ do |a|
7
+ r.get(/(.)/) do |a|
8
8
  "#{a}-b"
9
9
  end
10
10
  end
data/spec/plugin_spec.rb CHANGED
@@ -48,7 +48,7 @@ describe "plugins" do
48
48
  end
49
49
 
50
50
  app(:bare) do
51
- plugin(c, "Foo ").must_equal nil
51
+ plugin(c, "Foo ").must_be_nil
52
52
 
53
53
  route do |r|
54
54
  r.hello do
@@ -58,7 +58,7 @@ describe "response #finish" do
58
58
  it "should set Content-Length header" do
59
59
  app do |r|
60
60
  response.write 'a'
61
- response['Content-Length'].must_equal nil
61
+ response['Content-Length'].must_be_nil
62
62
  throw :halt, response.finish
63
63
  end
64
64
 
@@ -71,8 +71,8 @@ describe "response #finish" do
71
71
  throw :halt, response.finish
72
72
  end
73
73
 
74
- header('Content-Type').must_equal nil
75
- header('Content-Length').must_equal nil
74
+ header('Content-Type').must_be_nil
75
+ header('Content-Length').must_be_nil
76
76
  end
77
77
 
78
78
  it "should not overwrite existing status" do
@@ -106,11 +106,11 @@ describe "response #finish_with_body" do
106
106
  it "should not set Content-Length header" do
107
107
  app do |r|
108
108
  response.write 'a'
109
- response['Content-Length'].must_equal nil
109
+ response['Content-Length'].must_be_nil
110
110
  throw :halt, response.finish_with_body(['123'])
111
111
  end
112
112
 
113
- header('Content-Length').must_equal nil
113
+ header('Content-Length').must_be_nil
114
114
  end
115
115
 
116
116
  it "should not overwrite existing status" do
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,11 @@ $:.unshift(File.expand_path("../lib", File.dirname(__FILE__)))
2
2
 
3
3
  require "rubygems"
4
4
 
5
+ if ENV['WARNING']
6
+ require 'warning'
7
+ Warning.ignore([:missing_ivar, :method_redefined, :not_reached], File.dirname(File.dirname(__FILE__)))
8
+ end
9
+
5
10
  if ENV['COVERAGE']
6
11
  require 'coverage'
7
12
  require 'simplecov'
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: 2.20.0
4
+ version: 2.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: 2016-11-13 00:00:00.000000000 Z
11
+ date: 2016-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -200,6 +200,7 @@ extra_rdoc_files:
200
200
  - doc/release_notes/2.18.0.txt
201
201
  - doc/release_notes/2.19.0.txt
202
202
  - doc/release_notes/2.20.0.txt
203
+ - doc/release_notes/2.21.0.txt
203
204
  files:
204
205
  - CHANGELOG
205
206
  - MIT-LICENSE
@@ -224,6 +225,7 @@ files:
224
225
  - doc/release_notes/2.19.0.txt
225
226
  - doc/release_notes/2.2.0.txt
226
227
  - doc/release_notes/2.20.0.txt
228
+ - doc/release_notes/2.21.0.txt
227
229
  - doc/release_notes/2.3.0.txt
228
230
  - doc/release_notes/2.4.0.txt
229
231
  - doc/release_notes/2.5.0.txt
@@ -438,7 +440,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
438
440
  version: '0'
439
441
  requirements: []
440
442
  rubyforge_project:
441
- rubygems_version: 2.6.6
443
+ rubygems_version: 2.5.2
442
444
  signing_key:
443
445
  specification_version: 4
444
446
  summary: Routing tree web toolkit