airbrake 3.0.5 → 3.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,93 @@
1
+ Version 3.0.6 - Mon Dec 05 16:41:39 +0100 2011
2
+ ===============================================================================
3
+
4
+ Benjamin Quorning (1):
5
+ README updated to reflect name change from Hoptoad to Airbrake
6
+
7
+ Darcy Laycock (1):
8
+ Explicitly scope calls to Rails.env and such to prevent loading issues when manually requiring parts of airbrake.
9
+
10
+ David (1):
11
+ Merge pull request #42 from Playhem/fix-issue-34-cherrypicked
12
+
13
+ David Czarnecki (6):
14
+ Using the Capistrano logger for great justice
15
+ Using the Capistrano logger for great justice
16
+ Re-organized capistrano task to allow for testing
17
+ Fixing conflict
18
+ Fixed the name of the capistrano task in the test to be correct. Updated the cucumber feature to look for the right task name.
19
+ Change airbrake:notify to airbrake:deploy to be more clear that it is a deploy notification
20
+
21
+ David Palm (8):
22
+ Removes support for Rails v2.3.12
23
+ Documentation glitch
24
+ Documenting workaround for issue #39
25
+ Using guard&spork for testing
26
+ Adding Guardfile
27
+ Moves #assert_logged to test helper
28
+ Moves http setup code to own method
29
+ Not sporking yet
30
+
31
+ Florent Guilleux (1):
32
+ Change Hoptoad references to Airbrake.
33
+
34
+ Gabe Berke-Williams (1):
35
+ Merge pull request #10 from Florent2/patch-1
36
+
37
+ Harold Giménez (10):
38
+ Heroku is still using HOPTOAD_API_KEY, so expect that for now
39
+ Bumping to version 3.0
40
+ Bumping to version 3.0.1
41
+ Fix bug in defining the Airbrake javascript object
42
+ Bumping to version 3.0.2
43
+ Ensure a valid configuration object is always available on Airbrake.configuration
44
+ Merge remote-tracking branch 'agoragames/master'
45
+ Bumping to version 3.0.3
46
+ Minor fix to Gemfile instructions on README
47
+ Bumping to version 3.0.4
48
+
49
+ Jonathan Siegel (16):
50
+ Removed class-level caching per jkraemer: Hi,
51
+ Integrated pulls and updated tests.
52
+ Integrated: https://github.com/thoughtbot/hoptoad_notifier/pull/37
53
+ Corrected test.
54
+ Consistent operation.
55
+ Consistent callout during test generation.
56
+ Fixed typo.
57
+ Refreshed supported.
58
+ Resolved: http://help.airbrakeapp.com/discussions/questions/587-airbrake_javascript_notifier-is-escaped-rails-31-haml
59
+ Now running airbrake deploy notifications on the REMOTE machine.
60
+ Added first rev of PEER cert resolution.
61
+ Bumped 3.0.5
62
+ Updated README, fixed JS rescue template missed HT reference.
63
+ Crosslinked docs...
64
+ Fixes for tests.
65
+ Bumping to version 3.0.5
66
+
67
+ Leonid Shevtsov (3):
68
+ fixed rake handler failing when exception happens before Airbrake has been configured (for example, when running an unknown Rake task)
69
+ fix issue #34 'undefined method to_backtrace for Hash'
70
+ test case for issue #34
71
+
72
+ Matt Fawcett (1):
73
+ Call #close on the old body after building the new body to prevent thread joining errors
74
+
75
+ Roman Shterenzon (1):
76
+ Use either Airbrake or Hoptoad object.
77
+
78
+ Stuart Chaney (1):
79
+ point towards airbrake.io
80
+
81
+ Thomas Jachmann (1):
82
+ handles exceptions with #to_hash properly
83
+
84
+ usiegj00 (4):
85
+ Merge pull request #21 from mattfawcett/master
86
+ Merge pull request #12 from leonid-shevtsov/master
87
+ Merge pull request #14 from thomasjachmann/master
88
+ Merge pull request #28 from Sutto/patch-1
89
+
90
+
1
91
  Version 3.0.5 - 2011-11-08 23:02:07 -0800
2
92
  ===============================================================================
3
93
 
@@ -520,3 +610,4 @@ Nick Quaranto (3):
520
610
  Adding rake changeling:push
521
611
 
522
612
 
613
+
data/Gemfile CHANGED
@@ -1,3 +1,10 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gemspec
4
+
5
+ if true
6
+ group :test do
7
+ gem 'guard'
8
+ gem 'guard-test'
9
+ end
10
+ end
data/Guardfile ADDED
@@ -0,0 +1,6 @@
1
+ guard :test do
2
+ watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
3
+ watch(%r{^test/.+_test\.rb$})
4
+ watch('test/helper.rb') { "test" }
5
+ end
6
+
data/README.md CHANGED
@@ -43,7 +43,7 @@ Add the airbrake gem to your Gemfile. In Gemfile:
43
43
  Then from your project's RAILS_ROOT, and in your development environment, run:
44
44
 
45
45
  bundle install
46
- script/rails generate airbrake --api-key your_key_here
46
+ rails generate airbrake --api-key your_key_here
47
47
 
48
48
  That's it!
49
49
 
@@ -125,7 +125,7 @@ You can then continue to install normally. If you don't remove the rake file,
125
125
  you will be unable to unpack this gem (Rails will think it's part of the
126
126
  framework).
127
127
 
128
- ### Testing it out
128
+
129
129
 
130
130
  You can test that Airbrake is working in your production environment by using
131
131
  this rake task (from RAILS_ROOT):
@@ -135,6 +135,18 @@ this rake task (from RAILS_ROOT):
135
135
  If everything is configured properly, that task will send a notice to Airbrake
136
136
  which will be visible immediately.
137
137
 
138
+
139
+ Non-rails apps using Bundler
140
+ ----------------------------
141
+ There is an undocumented dependency in `activesupport` where the `i18n` gem is
142
+ required only if the core classes extensions are used (`active_support/core_ext`).
143
+ This can lead to a confusing `LoadError` exception when using Airbrake. Until
144
+ this is fixed in `activesupport` the workaround is to add `i18n` to the Gemfile
145
+ for your Sinatra/Rack/pure ruby application:
146
+
147
+ gem 'i18n'
148
+ gem 'airbrake'
149
+
138
150
  Rack
139
151
  ----
140
152
 
@@ -157,23 +169,19 @@ middleware:
157
169
  Sinatra
158
170
  -------
159
171
 
160
- Using airbrake in a Sinatra app is just like a Rack app, but you have
161
- to disable Sinatra's error rescuing functionality:
172
+ Using airbrake in a Sinatra app is just like a Rack app:
162
173
 
163
- require 'sinatra/base'
174
+ require 'sinatra'
164
175
  require 'airbrake'
165
176
 
166
177
  Airbrake.configure do |config|
167
- config.api_key = 'my_api_key'
178
+ config.api_key = 'my api key'
168
179
  end
169
180
 
170
- class MyApp < Sinatra::Default
171
- use Airbrake::Rack
172
- enable :raise_errors
181
+ use Airbrake::Rack
173
182
 
174
- get "/" do
175
- raise "Sinatra has left the building"
176
- end
183
+ get '/' do
184
+ raise "Sinatra has left the building"
177
185
  end
178
186
 
179
187
  Usage
@@ -317,8 +325,7 @@ configuration block.
317
325
  config.ignore << "ActiveRecord::IgnoreThisError"
318
326
  end
319
327
 
320
- To ignore *only* certain errors (and override the defaults), use the
321
- #ignore_only attribute.
328
+ To ignore *only* certain errors (and override the defaults), use the #ignore_only attribute.
322
329
 
323
330
  Airbrake.configure do |config|
324
331
  config.api_key = '1234567890abcdef'
@@ -1,4 +1,3 @@
1
- 2.3.12
2
1
  2.3.14
3
2
  3.0.0
4
3
  3.0.1
data/lib/airbrake.rb CHANGED
@@ -137,7 +137,7 @@ module Airbrake
137
137
 
138
138
  def build_notice_for(exception, opts = {})
139
139
  exception = unwrap_exception(exception)
140
- opts = opts.merge(:exception => exception)
140
+ opts = opts.merge(:exception => exception) if exception.is_a?(Exception)
141
141
  opts = opts.merge(exception.to_hash) if exception.respond_to?(:to_hash)
142
142
  Notice.new(configuration.merge(opts))
143
143
  end
@@ -23,27 +23,7 @@ module Airbrake
23
23
  #
24
24
  # @param [String] data The XML notice to be sent off
25
25
  def send_to_airbrake(data)
26
- logger.debug { "Sending request to #{url.to_s}:\n#{data}" } if logger
27
-
28
- http =
29
- Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass).
30
- new(url.host, url.port)
31
-
32
- http.read_timeout = http_read_timeout
33
- http.open_timeout = http_open_timeout
34
-
35
- if secure
36
- http.use_ssl = true
37
- if File.exist?(OpenSSL::X509::DEFAULT_CERT_FILE)
38
- http.ca_file = OpenSSL::X509::DEFAULT_CERT_FILE
39
- else
40
- # ca-bundle.crt built from source, see resources/README.md
41
- http.ca_file = Sender.local_cert_path
42
- end
43
- http.verify_mode = OpenSSL::SSL::VERIFY_PEER
44
- else
45
- http.use_ssl = false
46
- end
26
+ http = setup_http_connection
47
27
 
48
28
  response = begin
49
29
  http.post(url.path, data, HEADERS)
@@ -63,6 +43,9 @@ module Airbrake
63
43
  error_id = response.body.match(%r{<error-id[^>]*>(.*?)</error-id>})
64
44
  error_id[1] if error_id
65
45
  end
46
+ rescue => e
47
+ log :error, "[Airbrake::Sender#send_to_airbrake] Cannot send notification. Error: #{e.class} - #{e.message}\nBacktrace:\n#{e.backtrace.join("\n\t")}"
48
+ nil
66
49
  end
67
50
 
68
51
 
@@ -90,6 +73,33 @@ module Airbrake
90
73
  def logger
91
74
  Airbrake.logger
92
75
  end
76
+
77
+ def setup_http_connection
78
+ http =
79
+ Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass).
80
+ new(url.host, url.port)
81
+
82
+ http.read_timeout = http_read_timeout
83
+ http.open_timeout = http_open_timeout
84
+
85
+ if secure
86
+ http.use_ssl = true
87
+ if File.exist?(OpenSSL::X509::DEFAULT_CERT_FILE)
88
+ http.ca_file = OpenSSL::X509::DEFAULT_CERT_FILE
89
+ else
90
+ # ca-bundle.crt built from source, see resources/README.md
91
+ http.ca_file = Sender.local_cert_path
92
+ end
93
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
94
+ else
95
+ http.use_ssl = false
96
+ end
97
+
98
+ http
99
+ rescue => e
100
+ log :error, "[Airbrake::Sender#setup_http_connection] Failure initializing the HTTP connection.\nError: #{e.class} - #{e.message}\nBacktrace:\n#{e.backtrace.join("\n\t")}"
101
+ raise e
102
+ end
93
103
 
94
104
  end
95
105
  end
@@ -1,3 +1,3 @@
1
1
  module Airbrake
2
- VERSION = "3.0.5".freeze
2
+ VERSION = "3.0.6".freeze
3
3
  end
data/test/helper.rb CHANGED
@@ -189,6 +189,20 @@ class Test::Unit::TestCase
189
189
  "but found #{nodes.map { |n| n.content }} in #{nodes.size} matching nodes." +
190
190
  "Document:\n#{document.to_s}"
191
191
  end
192
+
193
+ def assert_logged(expected)
194
+ assert_received(Airbrake, :write_verbose_log) do |expect|
195
+ expect.with {|actual| actual =~ expected }
196
+ end
197
+ end
198
+
199
+ def assert_not_logged(expected)
200
+ assert_received(Airbrake, :write_verbose_log) do |expect|
201
+ expect.with {|actual| actual =~ expected }.never
202
+ end
203
+ end
204
+
205
+
192
206
  end
193
207
 
194
208
  module DefinesConstants
data/test/logger_test.rb CHANGED
@@ -18,18 +18,6 @@ class LoggerTest < Test::Unit::TestCase
18
18
  Airbrake.stubs(:write_verbose_log)
19
19
  end
20
20
 
21
- def assert_logged(expected)
22
- assert_received(Airbrake, :write_verbose_log) do |expect|
23
- expect.with {|actual| actual =~ expected }
24
- end
25
- end
26
-
27
- def assert_not_logged(expected)
28
- assert_received(Airbrake, :write_verbose_log) do |expect|
29
- expect.with {|actual| actual =~ expected }.never
30
- end
31
- end
32
-
33
21
  def configure
34
22
  Airbrake.configure { |config| }
35
23
  end
@@ -82,6 +82,17 @@ class NotifierTest < Test::Unit::TestCase
82
82
  assert_sent(notice, notice_args)
83
83
  end
84
84
 
85
+ should "not pass the hash as an exception when sending a notice for it" do
86
+ set_public_env
87
+ notice = stub_notice!
88
+ notice_args = { :error_message => 'uh oh' }
89
+ stub_sender!
90
+
91
+ Airbrake.notify(notice_args)
92
+
93
+ assert_received(Airbrake::Notice, :new) {|expect| expect.with(Not(has_key(:exception))) }
94
+ end
95
+
85
96
  should "create and send a notice for an exception that responds to to_hash" do
86
97
  set_public_env
87
98
  exception = build_exception
data/test/sender_test.rb CHANGED
@@ -64,130 +64,183 @@ class SenderTest < Test::Unit::TestCase
64
64
  assert_equal "3799307", send_exception(:secure => false)
65
65
  end
66
66
 
67
- should "return nil on failed posting" do
68
- http = stub_http
69
- http.stubs(:post).raises(Errno::ECONNREFUSED)
70
- assert_equal nil, send_exception(:secure => false)
71
- end
72
-
73
- should "not fail when posting and a timeout exception occurs" do
74
- http = stub_http
75
- http.stubs(:post).raises(TimeoutError)
76
- assert_nothing_thrown do
77
- send_exception(:secure => false)
67
+ context "exceptions" do
68
+ context "HTTP connection setup problems" do
69
+ should "not be rescued" do
70
+ http = stub(:new => NoMemoryError.new)
71
+ proxy = stub(:new => http)
72
+ Net::HTTP.stubs(:Proxy => proxy)
73
+
74
+ assert_raise do
75
+ build_sender.send(:setup_http_connection)
76
+ end
77
+ end
78
+
79
+ should "be logged" do
80
+ http = stub(:new => NoMemoryError.new)
81
+ proxy = stub(:new => http)
82
+ Net::HTTP.stubs(:Proxy => proxy)
83
+
84
+ sender = build_sender
85
+
86
+ assert_raise do
87
+ sender.expects(:log).with(:error, includes('Failure initializing the HTTP connection'))
88
+
89
+ sender.send(:setup_http_connection)
90
+ end
91
+ end
92
+ end
93
+
94
+ context "unexpected exception sending problems" do
95
+ should "be logged" do
96
+ sender = build_sender
97
+ sender.stubs(:setup_http_connection).raises(RuntimeError.new)
98
+
99
+ sender.expects(:log).with(:error, includes('Cannot send notification. Error'))
100
+ sender.send_to_airbrake("stuff")
101
+ end
102
+
103
+ should "return nil no matter what" do
104
+ sender = build_sender
105
+ sender.stubs(:setup_http_connection).raises(SystemExit.new)
106
+
107
+ assert_nothing_thrown do
108
+ assert_nil sender.send_to_airbrake("stuff")
109
+ end
110
+ end
111
+ end
112
+
113
+ should "return nil on failed posting" do
114
+ http = stub_http
115
+ http.stubs(:post).raises(Errno::ECONNREFUSED)
116
+ assert_equal nil, send_exception(:secure => false)
78
117
  end
79
- end
80
118
 
81
- should "not fail when posting and a connection refused exception occurs" do
82
- http = stub_http
83
- http.stubs(:post).raises(Errno::ECONNREFUSED)
84
- assert_nothing_thrown do
85
- send_exception(:secure => false)
119
+ should "not fail when posting and a timeout exception occurs" do
120
+ http = stub_http
121
+ http.stubs(:post).raises(TimeoutError)
122
+ assert_nothing_thrown do
123
+ send_exception(:secure => false)
124
+ end
86
125
  end
87
- end
88
126
 
89
- should "not fail when posting any http exception occurs" do
90
- http = stub_http
91
- Airbrake::Sender::HTTP_ERRORS.each do |error|
92
- http.stubs(:post).raises(error)
127
+ should "not fail when posting and a connection refused exception occurs" do
128
+ http = stub_http
129
+ http.stubs(:post).raises(Errno::ECONNREFUSED)
93
130
  assert_nothing_thrown do
94
131
  send_exception(:secure => false)
95
132
  end
96
133
  end
97
- end
98
134
 
99
- should "post to the right url for non-ssl" do
100
- http = stub_http
101
- url = "http://airbrake.io:80#{Airbrake::Sender::NOTICES_URI}"
102
- uri = URI.parse(url)
103
- send_exception(:secure => false)
104
- assert_received(http, :post) {|expect| expect.with(uri.path, anything, Airbrake::HEADERS) }
135
+ should "not fail when posting any http exception occurs" do
136
+ http = stub_http
137
+ Airbrake::Sender::HTTP_ERRORS.each do |error|
138
+ http.stubs(:post).raises(error)
139
+ assert_nothing_thrown do
140
+ send_exception(:secure => false)
141
+ end
142
+ end
143
+ end
105
144
  end
106
145
 
107
- should "post to the right path for ssl" do
108
- http = stub_http
109
- send_exception(:secure => true)
110
- assert_received(http, :post) {|expect| expect.with(Airbrake::Sender::NOTICES_URI, anything, Airbrake::HEADERS) }
111
- end
146
+ context "SSL" do
147
+ should "post to the right url for non-ssl" do
148
+ http = stub_http
149
+ url = "http://airbrake.io:80#{Airbrake::Sender::NOTICES_URI}"
150
+ uri = URI.parse(url)
151
+ send_exception(:secure => false)
152
+ assert_received(http, :post) {|expect| expect.with(uri.path, anything, Airbrake::HEADERS) }
153
+ end
112
154
 
113
- should "verify the SSL peer when the use_ssl option is set to true" do
114
- url = "https://airbrake.io#{Airbrake::Sender::NOTICES_URI}"
115
- uri = URI.parse(url)
155
+ should "post to the right path for ssl" do
156
+ http = stub_http
157
+ send_exception(:secure => true)
158
+ assert_received(http, :post) {|expect| expect.with(Airbrake::Sender::NOTICES_URI, anything, Airbrake::HEADERS) }
159
+ end
116
160
 
117
- real_http = Net::HTTP.new(uri.host, uri.port)
118
- real_http.stubs(:post => nil)
119
- proxy = stub(:new => real_http)
120
- Net::HTTP.stubs(:Proxy => proxy)
121
- File.stubs(:exist?).with(OpenSSL::X509::DEFAULT_CERT_FILE).returns(false)
161
+ should "verify the SSL peer when the use_ssl option is set to true" do
162
+ url = "https://airbrake.io#{Airbrake::Sender::NOTICES_URI}"
163
+ uri = URI.parse(url)
122
164
 
123
- send_exception(:secure => true)
124
- assert(real_http.use_ssl?)
125
- assert_equal(OpenSSL::SSL::VERIFY_PEER, real_http.verify_mode)
126
- assert_equal(Airbrake::Sender.local_cert_path, real_http.ca_file)
127
- end
165
+ real_http = Net::HTTP.new(uri.host, uri.port)
166
+ real_http.stubs(:post => nil)
167
+ proxy = stub(:new => real_http)
168
+ Net::HTTP.stubs(:Proxy => proxy)
169
+ File.stubs(:exist?).with(OpenSSL::X509::DEFAULT_CERT_FILE).returns(false)
128
170
 
129
- should "verify the SSL peer when the use_ssl option is set to true and the default cert exists" do
130
- url = "https://airbrake.io#{Airbrake::Sender::NOTICES_URI}"
131
- uri = URI.parse(url)
171
+ send_exception(:secure => true)
172
+ assert(real_http.use_ssl?)
173
+ assert_equal(OpenSSL::SSL::VERIFY_PEER, real_http.verify_mode)
174
+ assert_equal(Airbrake::Sender.local_cert_path, real_http.ca_file)
175
+ end
132
176
 
133
- real_http = Net::HTTP.new(uri.host, uri.port)
134
- real_http.stubs(:post => nil)
135
- proxy = stub(:new => real_http)
136
- Net::HTTP.stubs(:Proxy => proxy)
137
- File.stubs(:exist?).with(OpenSSL::X509::DEFAULT_CERT_FILE).returns(true)
177
+ should "verify the SSL peer when the use_ssl option is set to true and the default cert exists" do
178
+ url = "https://airbrake.io#{Airbrake::Sender::NOTICES_URI}"
179
+ uri = URI.parse(url)
138
180
 
139
- send_exception(:secure => true)
140
- assert(real_http.use_ssl?)
141
- assert_equal(OpenSSL::SSL::VERIFY_PEER, real_http.verify_mode)
142
- assert_equal(OpenSSL::X509::DEFAULT_CERT_FILE, real_http.ca_file)
143
- end
181
+ real_http = Net::HTTP.new(uri.host, uri.port)
182
+ real_http.stubs(:post => nil)
183
+ proxy = stub(:new => real_http)
184
+ Net::HTTP.stubs(:Proxy => proxy)
185
+ File.stubs(:exist?).with(OpenSSL::X509::DEFAULT_CERT_FILE).returns(true)
144
186
 
145
- should "default the open timeout to 2 seconds" do
146
- http = stub_http
147
- send_exception
148
- assert_received(http, :open_timeout=) {|expect| expect.with(2) }
149
- end
187
+ send_exception(:secure => true)
188
+ assert(real_http.use_ssl?)
189
+ assert_equal(OpenSSL::SSL::VERIFY_PEER, real_http.verify_mode)
190
+ assert_equal(OpenSSL::X509::DEFAULT_CERT_FILE, real_http.ca_file)
191
+ end
192
+
193
+ should "connect to the right port for ssl" do
194
+ stub_http
195
+ send_exception(:secure => true)
196
+ assert_received(Net::HTTP, :new) {|expect| expect.with("airbrake.io", 443) }
197
+ end
150
198
 
151
- should "default the read timeout to 5 seconds" do
152
- http = stub_http
153
- send_exception
154
- assert_received(http, :read_timeout=) {|expect| expect.with(5) }
155
- end
199
+ should "connect to the right port for non-ssl" do
200
+ stub_http
201
+ send_exception(:secure => false)
202
+ assert_received(Net::HTTP, :new) {|expect| expect.with("airbrake.io", 80) }
203
+ end
156
204
 
157
- should "allow override of the open timeout" do
158
- http = stub_http
159
- send_exception(:http_open_timeout => 4)
160
- assert_received(http, :open_timeout=) {|expect| expect.with(4) }
161
- end
205
+ should "use ssl if secure" do
206
+ stub_http
207
+ send_exception(:secure => true, :host => 'example.org')
208
+ assert_received(Net::HTTP, :new) {|expect| expect.with('example.org', 443) }
209
+ end
162
210
 
163
- should "allow override of the read timeout" do
164
- http = stub_http
165
- send_exception(:http_read_timeout => 10)
166
- assert_received(http, :read_timeout=) {|expect| expect.with(10) }
167
- end
211
+ should "not use ssl if not secure" do
212
+ stub_http
213
+ send_exception(:secure => false, :host => 'example.org')
214
+ assert_received(Net::HTTP, :new) {|expect| expect.with('example.org', 80) }
215
+ end
168
216
 
169
- should "connect to the right port for ssl" do
170
- stub_http
171
- send_exception(:secure => true)
172
- assert_received(Net::HTTP, :new) {|expect| expect.with("airbrake.io", 443) }
217
+
173
218
  end
219
+
220
+ context "network timeouts" do
221
+ should "default the open timeout to 2 seconds" do
222
+ http = stub_http
223
+ send_exception
224
+ assert_received(http, :open_timeout=) {|expect| expect.with(2) }
225
+ end
174
226
 
175
- should "connect to the right port for non-ssl" do
176
- stub_http
177
- send_exception(:secure => false)
178
- assert_received(Net::HTTP, :new) {|expect| expect.with("airbrake.io", 80) }
179
- end
227
+ should "default the read timeout to 5 seconds" do
228
+ http = stub_http
229
+ send_exception
230
+ assert_received(http, :read_timeout=) {|expect| expect.with(5) }
231
+ end
180
232
 
181
- should "use ssl if secure" do
182
- stub_http
183
- send_exception(:secure => true, :host => 'example.org')
184
- assert_received(Net::HTTP, :new) {|expect| expect.with('example.org', 443) }
185
- end
233
+ should "allow override of the open timeout" do
234
+ http = stub_http
235
+ send_exception(:http_open_timeout => 4)
236
+ assert_received(http, :open_timeout=) {|expect| expect.with(4) }
237
+ end
186
238
 
187
- should "not use ssl if not secure" do
188
- stub_http
189
- send_exception(:secure => false, :host => 'example.org')
190
- assert_received(Net::HTTP, :new) {|expect| expect.with('example.org', 80) }
239
+ should "allow override of the read timeout" do
240
+ http = stub_http
241
+ send_exception(:http_read_timeout => 10)
242
+ assert_received(http, :read_timeout=) {|expect| expect.with(10) }
243
+ end
191
244
  end
192
245
 
193
246
  end
metadata CHANGED
@@ -1,169 +1,240 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: airbrake
3
- version: !ruby/object:Gem::Version
4
- version: 3.0.5
3
+ version: !ruby/object:Gem::Version
4
+ hash: 11
5
5
  prerelease:
6
+ segments:
7
+ - 3
8
+ - 0
9
+ - 6
10
+ version: 3.0.6
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - thoughtbot, inc
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2011-11-09 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2011-12-06 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: builder
16
- requirement: &70183356319840 !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
17
24
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
22
32
  type: :runtime
23
- prerelease: false
24
- version_requirements: *70183356319840
25
- - !ruby/object:Gem::Dependency
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
26
35
  name: activesupport
27
- requirement: &70183356319180 !ruby/object:Gem::Requirement
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
28
38
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
33
46
  type: :runtime
34
- prerelease: false
35
- version_requirements: *70183356319180
36
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
37
49
  name: actionpack
38
- requirement: &70183356318180 !ruby/object:Gem::Requirement
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
39
52
  none: false
40
- requirements:
53
+ requirements:
41
54
  - - ~>
42
- - !ruby/object:Gem::Version
55
+ - !ruby/object:Gem::Version
56
+ hash: 19
57
+ segments:
58
+ - 2
59
+ - 3
60
+ - 8
43
61
  version: 2.3.8
44
62
  type: :development
45
- prerelease: false
46
- version_requirements: *70183356318180
47
- - !ruby/object:Gem::Dependency
63
+ version_requirements: *id003
64
+ - !ruby/object:Gem::Dependency
48
65
  name: activerecord
49
- requirement: &70183356317420 !ruby/object:Gem::Requirement
66
+ prerelease: false
67
+ requirement: &id004 !ruby/object:Gem::Requirement
50
68
  none: false
51
- requirements:
69
+ requirements:
52
70
  - - ~>
53
- - !ruby/object:Gem::Version
71
+ - !ruby/object:Gem::Version
72
+ hash: 19
73
+ segments:
74
+ - 2
75
+ - 3
76
+ - 8
54
77
  version: 2.3.8
55
78
  type: :development
56
- prerelease: false
57
- version_requirements: *70183356317420
58
- - !ruby/object:Gem::Dependency
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
59
81
  name: activesupport
60
- requirement: &70183356316420 !ruby/object:Gem::Requirement
82
+ prerelease: false
83
+ requirement: &id005 !ruby/object:Gem::Requirement
61
84
  none: false
62
- requirements:
85
+ requirements:
63
86
  - - ~>
64
- - !ruby/object:Gem::Version
87
+ - !ruby/object:Gem::Version
88
+ hash: 19
89
+ segments:
90
+ - 2
91
+ - 3
92
+ - 8
65
93
  version: 2.3.8
66
94
  type: :development
67
- prerelease: false
68
- version_requirements: *70183356316420
69
- - !ruby/object:Gem::Dependency
95
+ version_requirements: *id005
96
+ - !ruby/object:Gem::Dependency
70
97
  name: bourne
71
- requirement: &70183356312020 !ruby/object:Gem::Requirement
98
+ prerelease: false
99
+ requirement: &id006 !ruby/object:Gem::Requirement
72
100
  none: false
73
- requirements:
74
- - - ! '>='
75
- - !ruby/object:Gem::Version
76
- version: '1.0'
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ hash: 15
105
+ segments:
106
+ - 1
107
+ - 0
108
+ version: "1.0"
77
109
  type: :development
78
- prerelease: false
79
- version_requirements: *70183356312020
80
- - !ruby/object:Gem::Dependency
110
+ version_requirements: *id006
111
+ - !ruby/object:Gem::Dependency
81
112
  name: cucumber
82
- requirement: &70183356311240 !ruby/object:Gem::Requirement
113
+ prerelease: false
114
+ requirement: &id007 !ruby/object:Gem::Requirement
83
115
  none: false
84
- requirements:
116
+ requirements:
85
117
  - - ~>
86
- - !ruby/object:Gem::Version
118
+ - !ruby/object:Gem::Version
119
+ hash: 59
120
+ segments:
121
+ - 0
122
+ - 10
123
+ - 6
87
124
  version: 0.10.6
88
125
  type: :development
89
- prerelease: false
90
- version_requirements: *70183356311240
91
- - !ruby/object:Gem::Dependency
126
+ version_requirements: *id007
127
+ - !ruby/object:Gem::Dependency
92
128
  name: fakeweb
93
- requirement: &70183356310280 !ruby/object:Gem::Requirement
129
+ prerelease: false
130
+ requirement: &id008 !ruby/object:Gem::Requirement
94
131
  none: false
95
- requirements:
132
+ requirements:
96
133
  - - ~>
97
- - !ruby/object:Gem::Version
134
+ - !ruby/object:Gem::Version
135
+ hash: 27
136
+ segments:
137
+ - 1
138
+ - 3
139
+ - 0
98
140
  version: 1.3.0
99
141
  type: :development
100
- prerelease: false
101
- version_requirements: *70183356310280
102
- - !ruby/object:Gem::Dependency
142
+ version_requirements: *id008
143
+ - !ruby/object:Gem::Dependency
103
144
  name: nokogiri
104
- requirement: &70183356309460 !ruby/object:Gem::Requirement
145
+ prerelease: false
146
+ requirement: &id009 !ruby/object:Gem::Requirement
105
147
  none: false
106
- requirements:
148
+ requirements:
107
149
  - - ~>
108
- - !ruby/object:Gem::Version
150
+ - !ruby/object:Gem::Version
151
+ hash: 113
152
+ segments:
153
+ - 1
154
+ - 4
155
+ - 3
156
+ - 1
109
157
  version: 1.4.3.1
110
158
  type: :development
111
- prerelease: false
112
- version_requirements: *70183356309460
113
- - !ruby/object:Gem::Dependency
159
+ version_requirements: *id009
160
+ - !ruby/object:Gem::Dependency
114
161
  name: rspec
115
- requirement: &70183356308000 !ruby/object:Gem::Requirement
162
+ prerelease: false
163
+ requirement: &id010 !ruby/object:Gem::Requirement
116
164
  none: false
117
- requirements:
165
+ requirements:
118
166
  - - ~>
119
- - !ruby/object:Gem::Version
167
+ - !ruby/object:Gem::Version
168
+ hash: 23
169
+ segments:
170
+ - 2
171
+ - 6
172
+ - 0
120
173
  version: 2.6.0
121
174
  type: :development
122
- prerelease: false
123
- version_requirements: *70183356308000
124
- - !ruby/object:Gem::Dependency
175
+ version_requirements: *id010
176
+ - !ruby/object:Gem::Dependency
125
177
  name: sham_rack
126
- requirement: &70183356307040 !ruby/object:Gem::Requirement
178
+ prerelease: false
179
+ requirement: &id011 !ruby/object:Gem::Requirement
127
180
  none: false
128
- requirements:
181
+ requirements:
129
182
  - - ~>
130
- - !ruby/object:Gem::Version
183
+ - !ruby/object:Gem::Version
184
+ hash: 27
185
+ segments:
186
+ - 1
187
+ - 3
188
+ - 0
131
189
  version: 1.3.0
132
190
  type: :development
133
- prerelease: false
134
- version_requirements: *70183356307040
135
- - !ruby/object:Gem::Dependency
191
+ version_requirements: *id011
192
+ - !ruby/object:Gem::Dependency
136
193
  name: shoulda
137
- requirement: &70183356306320 !ruby/object:Gem::Requirement
194
+ prerelease: false
195
+ requirement: &id012 !ruby/object:Gem::Requirement
138
196
  none: false
139
- requirements:
197
+ requirements:
140
198
  - - ~>
141
- - !ruby/object:Gem::Version
199
+ - !ruby/object:Gem::Version
200
+ hash: 37
201
+ segments:
202
+ - 2
203
+ - 11
204
+ - 3
142
205
  version: 2.11.3
143
206
  type: :development
144
- prerelease: false
145
- version_requirements: *70183356306320
146
- - !ruby/object:Gem::Dependency
207
+ version_requirements: *id012
208
+ - !ruby/object:Gem::Dependency
147
209
  name: capistrano
148
- requirement: &70183356305220 !ruby/object:Gem::Requirement
210
+ prerelease: false
211
+ requirement: &id013 !ruby/object:Gem::Requirement
149
212
  none: false
150
- requirements:
213
+ requirements:
151
214
  - - ~>
152
- - !ruby/object:Gem::Version
215
+ - !ruby/object:Gem::Version
216
+ hash: 47
217
+ segments:
218
+ - 2
219
+ - 8
220
+ - 0
153
221
  version: 2.8.0
154
222
  type: :development
155
- prerelease: false
156
- version_requirements: *70183356305220
223
+ version_requirements: *id013
157
224
  description:
158
225
  email: support@airbrake.io
159
226
  executables: []
227
+
160
228
  extensions: []
229
+
161
230
  extra_rdoc_files: []
162
- files:
231
+
232
+ files:
163
233
  - .gitignore
164
234
  - .yardopts
165
235
  - CHANGELOG
166
236
  - Gemfile
237
+ - Guardfile
167
238
  - INSTALL
168
239
  - MIT-LICENSE
169
240
  - README.md
@@ -243,35 +314,38 @@ files:
243
314
  - test/user_informer_test.rb
244
315
  homepage: http://www.airbrake.io
245
316
  licenses: []
317
+
246
318
  post_install_message:
247
319
  rdoc_options: []
248
- require_paths:
320
+
321
+ require_paths:
249
322
  - lib
250
- required_ruby_version: !ruby/object:Gem::Requirement
323
+ required_ruby_version: !ruby/object:Gem::Requirement
251
324
  none: false
252
- requirements:
253
- - - ! '>='
254
- - !ruby/object:Gem::Version
255
- version: '0'
256
- segments:
325
+ requirements:
326
+ - - ">="
327
+ - !ruby/object:Gem::Version
328
+ hash: 3
329
+ segments:
257
330
  - 0
258
- hash: 3313650858108623652
259
- required_rubygems_version: !ruby/object:Gem::Requirement
331
+ version: "0"
332
+ required_rubygems_version: !ruby/object:Gem::Requirement
260
333
  none: false
261
- requirements:
262
- - - ! '>='
263
- - !ruby/object:Gem::Version
264
- version: '0'
265
- segments:
334
+ requirements:
335
+ - - ">="
336
+ - !ruby/object:Gem::Version
337
+ hash: 3
338
+ segments:
266
339
  - 0
267
- hash: 3313650858108623652
340
+ version: "0"
268
341
  requirements: []
342
+
269
343
  rubyforge_project:
270
- rubygems_version: 1.8.11
344
+ rubygems_version: 1.8.10
271
345
  signing_key:
272
346
  specification_version: 3
273
347
  summary: Send your application errors to our hosted service and reclaim your inbox.
274
- test_files:
348
+ test_files:
275
349
  - features/metal.feature
276
350
  - features/rack.feature
277
351
  - features/rails.feature