airbrake 3.1.2 → 3.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/CHANGELOG +56 -0
  2. data/Gemfile +0 -9
  3. data/README.md +71 -3
  4. data/SUPPORTED_RAILS_VERSIONS +15 -0
  5. data/TESTING.md +8 -0
  6. data/airbrake.gemspec +10 -5
  7. data/features/rack.feature +4 -0
  8. data/features/rails.feature +66 -5
  9. data/features/step_definitions/rails_application_steps.rb +52 -7
  10. data/features/support/airbrake_shim.rb.template +5 -0
  11. data/generators/airbrake/lib/rake_commands.rb +1 -1
  12. data/generators/airbrake/templates/airbrake_tasks.rake +1 -1
  13. data/lib/airbrake.rb +14 -10
  14. data/lib/airbrake/backtrace.rb +8 -0
  15. data/lib/airbrake/capistrano.rb +0 -1
  16. data/lib/airbrake/configuration.rb +31 -4
  17. data/lib/airbrake/notice.rb +51 -9
  18. data/lib/airbrake/rack.rb +0 -1
  19. data/lib/airbrake/rails/controller_methods.rb +18 -7
  20. data/lib/airbrake/rails/javascript_notifier.rb +0 -1
  21. data/lib/airbrake/rails/middleware/exceptions_catcher.rb +10 -6
  22. data/lib/airbrake/rails3_tasks.rb +1 -2
  23. data/lib/airbrake/rake_handler.rb +3 -4
  24. data/lib/airbrake/sender.rb +35 -23
  25. data/lib/airbrake/shared_tasks.rb +2 -1
  26. data/lib/airbrake/version.rb +1 -1
  27. data/test/{airbrake_2_2.xsd → airbrake_2_3.xsd} +11 -1
  28. data/test/airbrake_tasks_test.rb +3 -3
  29. data/test/backtrace_test.rb +2 -2
  30. data/test/capistrano_test.rb +6 -6
  31. data/test/catcher_test.rb +2 -2
  32. data/test/configuration_test.rb +17 -2
  33. data/test/helper.rb +14 -14
  34. data/test/javascript_notifier_test.rb +1 -2
  35. data/test/logger_test.rb +8 -2
  36. data/test/notice_test.rb +98 -76
  37. data/test/notifier_test.rb +34 -4
  38. data/test/rack_test.rb +1 -1
  39. data/test/rails_initializer_test.rb +1 -1
  40. data/test/recursion_test.rb +1 -1
  41. data/test/sender_test.rb +22 -21
  42. data/test/user_informer_test.rb +1 -1
  43. metadata +176 -31
@@ -1,4 +1,4 @@
1
- require File.expand_path( File.join(File.dirname(__FILE__), 'helper') )
1
+ require File.expand_path '../helper', __FILE__
2
2
 
3
3
  class NotifierTest < Test::Unit::TestCase
4
4
 
@@ -17,8 +17,7 @@ class NotifierTest < Test::Unit::TestCase
17
17
 
18
18
  def assert_sent(notice, notice_args)
19
19
  assert_received(Airbrake::Notice, :new) {|expect| expect.with(has_entries(notice_args)) }
20
- assert_received(notice, :to_xml)
21
- assert_received(Airbrake.sender, :send_to_airbrake) {|expect| expect.with(notice.to_xml) }
20
+ assert_received(Airbrake.sender, :send_to_airbrake) {|expect| expect.with(notice) }
22
21
  end
23
22
 
24
23
  def set_public_env
@@ -140,6 +139,37 @@ class NotifierTest < Test::Unit::TestCase
140
139
  assert_received(sender, :send_to_airbrake) {|expect| expect.never }
141
140
  end
142
141
 
142
+ should "deliver exception in async-mode" do
143
+ Airbrake.configure do |config|
144
+ config.environment_name = 'production'
145
+ config.async do |notice|
146
+ Airbrake.sender.send_to_airbrake(notice)
147
+ end
148
+ end
149
+ exception = build_exception
150
+ sender = stub_sender!
151
+ notice = stub_notice!
152
+
153
+ Airbrake.notify(exception)
154
+
155
+ assert_sent(notice, :exception => exception)
156
+ end
157
+
158
+ should "pass notice in async-mode" do
159
+ received_notice = nil
160
+ Airbrake.configure do |config|
161
+ config.environment_name = 'production'
162
+ config.async {|notice| received_notice = notice}
163
+ end
164
+ exception = build_exception
165
+ sender = stub_sender!
166
+ notice = stub_notice!
167
+
168
+ Airbrake.notify(exception)
169
+
170
+ assert_equal received_notice, notice
171
+ end
172
+
143
173
  should "deliver an ignored exception when notifying manually" do
144
174
  set_public_env
145
175
  exception = build_exception
@@ -157,7 +187,7 @@ class NotifierTest < Test::Unit::TestCase
157
187
  config_opts = { 'one' => 'two', 'three' => 'four' }
158
188
  notice = stub_notice!
159
189
  stub_sender!
160
- Airbrake.configuration = stub('config', :merge => config_opts, :public? => true)
190
+ Airbrake.configuration = stub('config', :merge => config_opts, :public? => true,:async? => nil)
161
191
 
162
192
  Airbrake.notify(exception)
163
193
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/helper'
1
+ require File.expand_path '../helper', __FILE__
2
2
 
3
3
  class RackTest < Test::Unit::TestCase
4
4
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/helper'
1
+ require File.expand_path '../helper', __FILE__
2
2
 
3
3
  require 'airbrake/rails'
4
4
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/helper'
1
+ require File.expand_path '../helper', __FILE__
2
2
 
3
3
  class RecursionTest < Test::Unit::TestCase
4
4
  should "not allow infinite recursion" do
@@ -1,4 +1,4 @@
1
- require File.expand_path( File.join(File.dirname(__FILE__), 'helper') )
1
+ require File.expand_path '../helper', __FILE__
2
2
 
3
3
  class SenderTest < Test::Unit::TestCase
4
4
 
@@ -14,6 +14,7 @@ class SenderTest < Test::Unit::TestCase
14
14
 
15
15
  def send_exception(args = {})
16
16
  notice = args.delete(:notice) || build_notice_data
17
+ notice.stubs(:to_xml)
17
18
  sender = args.delete(:sender) || build_sender(args)
18
19
  sender.send_to_airbrake(notice)
19
20
  end
@@ -51,7 +52,7 @@ class SenderTest < Test::Unit::TestCase
51
52
  :proxy_port => proxy_port,
52
53
  :proxy_user => proxy_user,
53
54
  :proxy_pass => proxy_pass)
54
- assert_received(http, :post) do |expect|
55
+ assert_received(http, :post) do |expect|
55
56
  expect.with(uri.path, anything, Airbrake::HEADERS)
56
57
  end
57
58
  assert_received(Net::HTTP, :Proxy) do |expect|
@@ -70,19 +71,19 @@ class SenderTest < Test::Unit::TestCase
70
71
  proxy = stub()
71
72
  proxy.stubs(:new).raises(NoMemoryError)
72
73
  Net::HTTP.stubs(:Proxy => proxy)
73
-
74
+
74
75
  assert_raise NoMemoryError do
75
76
  build_sender.send(:setup_http_connection)
76
77
  end
77
78
  end
78
-
79
+
79
80
  should "be logged" do
80
81
  proxy = stub()
81
82
  proxy.stubs(:new).raises(RuntimeError)
82
83
  Net::HTTP.stubs(:Proxy => proxy)
83
-
84
+
84
85
  sender = build_sender
85
- sender.expects(:log).with(:error, includes('Failure initializing the HTTP connection'))
86
+ sender.expects(:log)
86
87
 
87
88
  assert_raise RuntimeError do
88
89
  sender.send(:setup_http_connection)
@@ -90,26 +91,26 @@ class SenderTest < Test::Unit::TestCase
90
91
 
91
92
  end
92
93
  end
93
-
94
+
94
95
  context "unexpected exception sending problems" do
95
96
  should "be logged" do
96
97
  sender = build_sender
97
98
  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")
99
+
100
+ sender.expects(:log)
101
+ send_exception(:sender => sender)
101
102
  end
102
-
103
+
103
104
  should "return nil no matter what" do
104
105
  sender = build_sender
105
106
  sender.stubs(:setup_http_connection).raises(LocalJumpError)
106
-
107
+
107
108
  assert_nothing_thrown do
108
- assert_nil sender.send_to_airbrake("stuff")
109
+ assert_nil sender.send_to_airbrake(build_notice_data)
109
110
  end
110
111
  end
111
112
  end
112
-
113
+
113
114
  should "return nil on failed posting" do
114
115
  http = stub_http
115
116
  http.stubs(:post).raises(Errno::ECONNREFUSED)
@@ -173,7 +174,7 @@ class SenderTest < Test::Unit::TestCase
173
174
  assert_equal(OpenSSL::SSL::VERIFY_PEER, real_http.verify_mode)
174
175
  assert_equal(Airbrake.configuration.local_cert_path, real_http.ca_file)
175
176
  end
176
-
177
+
177
178
  should "use the default DEFAULT_CERT_FILE if asked to" do
178
179
  config = Airbrake::Configuration.new
179
180
  config.use_system_ssl_cert_chain = true
@@ -184,23 +185,23 @@ class SenderTest < Test::Unit::TestCase
184
185
  http = sender.send(:setup_http_connection)
185
186
  assert_not_equal http.ca_file, config.local_cert_path
186
187
  end
187
-
188
+
188
189
  should "verify the connection when the use_ssl option is set (VERIFY_PEER)" do
189
190
  sender = build_sender(:secure => true)
190
191
  http = sender.send(:setup_http_connection)
191
192
  assert_equal(OpenSSL::SSL::VERIFY_PEER, http.verify_mode)
192
193
  end
193
-
194
+
194
195
  should "use the default cert (OpenSSL::X509::DEFAULT_CERT_FILE) only if explicitly told to" do
195
196
  sender = build_sender(:secure => true)
196
197
  http = sender.send(:setup_http_connection)
197
-
198
+
198
199
  assert_equal(Airbrake.configuration.local_cert_path, http.ca_file)
199
200
 
200
201
  File.stubs(:exist?).with(OpenSSL::X509::DEFAULT_CERT_FILE).returns(true)
201
202
  sender = build_sender(:secure => true, :use_system_ssl_cert_chain => true)
202
203
  http = sender.send(:setup_http_connection)
203
-
204
+
204
205
  assert_not_equal(Airbrake.configuration.local_cert_path, http.ca_file)
205
206
  assert_equal(OpenSSL::X509::DEFAULT_CERT_FILE, http.ca_file)
206
207
  end
@@ -229,9 +230,9 @@ class SenderTest < Test::Unit::TestCase
229
230
  assert_received(Net::HTTP, :new) {|expect| expect.with('example.org', 80) }
230
231
  end
231
232
 
232
-
233
+
233
234
  end
234
-
235
+
235
236
  context "network timeouts" do
236
237
  should "default the open timeout to 2 seconds" do
237
238
  http = stub_http
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/helper'
1
+ require File.expand_path '../helper', __FILE__
2
2
 
3
3
  class UserInformerTest < Test::Unit::TestCase
4
4
  should "modify output if there is an airbrake id" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airbrake
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.2
4
+ version: 3.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-29 00:00:00.000000000Z
12
+ date: 2012-09-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: builder
16
- requirement: &70111147519640 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,31 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70111147519640
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: activesupport
27
- requirement: &70111147517460 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: girl_friday
48
+ requirement: !ruby/object:Gem::Requirement
28
49
  none: false
29
50
  requirements:
30
51
  - - ! '>='
@@ -32,10 +53,15 @@ dependencies:
32
53
  version: '0'
33
54
  type: :runtime
34
55
  prerelease: false
35
- version_requirements: *70111147517460
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
36
62
  - !ruby/object:Gem::Dependency
37
63
  name: actionpack
38
- requirement: &70111147515340 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
39
65
  none: false
40
66
  requirements:
41
67
  - - ~>
@@ -43,10 +69,15 @@ dependencies:
43
69
  version: 2.3.8
44
70
  type: :development
45
71
  prerelease: false
46
- version_requirements: *70111147515340
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.3.8
47
78
  - !ruby/object:Gem::Dependency
48
79
  name: activerecord
49
- requirement: &70111147514720 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
50
81
  none: false
51
82
  requirements:
52
83
  - - ~>
@@ -54,21 +85,47 @@ dependencies:
54
85
  version: 2.3.8
55
86
  type: :development
56
87
  prerelease: false
57
- version_requirements: *70111147514720
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 2.3.8
58
94
  - !ruby/object:Gem::Dependency
59
95
  name: activesupport
60
- requirement: &70111147514140 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 2.3.8
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
61
105
  none: false
62
106
  requirements:
63
107
  - - ~>
64
108
  - !ruby/object:Gem::Version
65
109
  version: 2.3.8
110
+ - !ruby/object:Gem::Dependency
111
+ name: mocha
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.10.5
66
118
  type: :development
67
119
  prerelease: false
68
- version_requirements: *70111147514140
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - '='
124
+ - !ruby/object:Gem::Version
125
+ version: 0.10.5
69
126
  - !ruby/object:Gem::Dependency
70
127
  name: bourne
71
- requirement: &70111147513560 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
72
129
  none: false
73
130
  requirements:
74
131
  - - ! '>='
@@ -76,10 +133,15 @@ dependencies:
76
133
  version: '1.0'
77
134
  type: :development
78
135
  prerelease: false
79
- version_requirements: *70111147513560
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '1.0'
80
142
  - !ruby/object:Gem::Dependency
81
143
  name: cucumber
82
- requirement: &70111147512980 !ruby/object:Gem::Requirement
144
+ requirement: !ruby/object:Gem::Requirement
83
145
  none: false
84
146
  requirements:
85
147
  - - ~>
@@ -87,10 +149,15 @@ dependencies:
87
149
  version: 0.10.6
88
150
  type: :development
89
151
  prerelease: false
90
- version_requirements: *70111147512980
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: 0.10.6
91
158
  - !ruby/object:Gem::Dependency
92
159
  name: fakeweb
93
- requirement: &70111147494720 !ruby/object:Gem::Requirement
160
+ requirement: !ruby/object:Gem::Requirement
94
161
  none: false
95
162
  requirements:
96
163
  - - ~>
@@ -98,10 +165,15 @@ dependencies:
98
165
  version: 1.3.0
99
166
  type: :development
100
167
  prerelease: false
101
- version_requirements: *70111147494720
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: 1.3.0
102
174
  - !ruby/object:Gem::Dependency
103
175
  name: nokogiri
104
- requirement: &70111147494200 !ruby/object:Gem::Requirement
176
+ requirement: !ruby/object:Gem::Requirement
105
177
  none: false
106
178
  requirements:
107
179
  - - ~>
@@ -109,10 +181,15 @@ dependencies:
109
181
  version: 1.4.3.1
110
182
  type: :development
111
183
  prerelease: false
112
- version_requirements: *70111147494200
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ~>
188
+ - !ruby/object:Gem::Version
189
+ version: 1.4.3.1
113
190
  - !ruby/object:Gem::Dependency
114
191
  name: rspec
115
- requirement: &70111147493680 !ruby/object:Gem::Requirement
192
+ requirement: !ruby/object:Gem::Requirement
116
193
  none: false
117
194
  requirements:
118
195
  - - ~>
@@ -120,10 +197,15 @@ dependencies:
120
197
  version: 2.6.0
121
198
  type: :development
122
199
  prerelease: false
123
- version_requirements: *70111147493680
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ~>
204
+ - !ruby/object:Gem::Version
205
+ version: 2.6.0
124
206
  - !ruby/object:Gem::Dependency
125
207
  name: sham_rack
126
- requirement: &70111147493100 !ruby/object:Gem::Requirement
208
+ requirement: !ruby/object:Gem::Requirement
127
209
  none: false
128
210
  requirements:
129
211
  - - ~>
@@ -131,10 +213,15 @@ dependencies:
131
213
  version: 1.3.0
132
214
  type: :development
133
215
  prerelease: false
134
- version_requirements: *70111147493100
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ~>
220
+ - !ruby/object:Gem::Version
221
+ version: 1.3.0
135
222
  - !ruby/object:Gem::Dependency
136
223
  name: shoulda
137
- requirement: &70111147492520 !ruby/object:Gem::Requirement
224
+ requirement: !ruby/object:Gem::Requirement
138
225
  none: false
139
226
  requirements:
140
227
  - - ~>
@@ -142,18 +229,76 @@ dependencies:
142
229
  version: 2.11.3
143
230
  type: :development
144
231
  prerelease: false
145
- version_requirements: *70111147492520
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - ~>
236
+ - !ruby/object:Gem::Version
237
+ version: 2.11.3
146
238
  - !ruby/object:Gem::Dependency
147
239
  name: capistrano
148
- requirement: &70111147491960 !ruby/object:Gem::Requirement
240
+ requirement: !ruby/object:Gem::Requirement
241
+ none: false
242
+ requirements:
243
+ - - ~>
244
+ - !ruby/object:Gem::Version
245
+ version: 2.8.0
246
+ type: :development
247
+ prerelease: false
248
+ version_requirements: !ruby/object:Gem::Requirement
149
249
  none: false
150
250
  requirements:
151
251
  - - ~>
152
252
  - !ruby/object:Gem::Version
153
253
  version: 2.8.0
254
+ - !ruby/object:Gem::Dependency
255
+ name: guard
256
+ requirement: !ruby/object:Gem::Requirement
257
+ none: false
258
+ requirements:
259
+ - - ! '>='
260
+ - !ruby/object:Gem::Version
261
+ version: '0'
154
262
  type: :development
155
263
  prerelease: false
156
- version_requirements: *70111147491960
264
+ version_requirements: !ruby/object:Gem::Requirement
265
+ none: false
266
+ requirements:
267
+ - - ! '>='
268
+ - !ruby/object:Gem::Version
269
+ version: '0'
270
+ - !ruby/object:Gem::Dependency
271
+ name: guard-test
272
+ requirement: !ruby/object:Gem::Requirement
273
+ none: false
274
+ requirements:
275
+ - - ! '>='
276
+ - !ruby/object:Gem::Version
277
+ version: '0'
278
+ type: :development
279
+ prerelease: false
280
+ version_requirements: !ruby/object:Gem::Requirement
281
+ none: false
282
+ requirements:
283
+ - - ! '>='
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ - !ruby/object:Gem::Dependency
287
+ name: simplecov
288
+ requirement: !ruby/object:Gem::Requirement
289
+ none: false
290
+ requirements:
291
+ - - ! '>='
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ type: :development
295
+ prerelease: false
296
+ version_requirements: !ruby/object:Gem::Requirement
297
+ none: false
298
+ requirements:
299
+ - - ! '>='
300
+ - !ruby/object:Gem::Version
301
+ version: '0'
157
302
  description:
158
303
  email: support@airbrake.io
159
304
  executables: []
@@ -206,7 +351,7 @@ files:
206
351
  - TESTING.md
207
352
  - SUPPORTED_RAILS_VERSIONS
208
353
  - install.rb
209
- - test/airbrake_2_2.xsd
354
+ - test/airbrake_2_3.xsd
210
355
  - test/airbrake_tasks_test.rb
211
356
  - test/backtrace_test.rb
212
357
  - test/capistrano_test.rb
@@ -260,12 +405,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
260
405
  version: '0'
261
406
  requirements: []
262
407
  rubyforge_project:
263
- rubygems_version: 1.8.11
408
+ rubygems_version: 1.8.24
264
409
  signing_key:
265
410
  specification_version: 3
266
411
  summary: Send your application errors to our hosted service and reclaim your inbox.
267
412
  test_files:
268
- - test/airbrake_2_2.xsd
413
+ - test/airbrake_2_3.xsd
269
414
  - test/airbrake_tasks_test.rb
270
415
  - test/backtrace_test.rb
271
416
  - test/capistrano_test.rb