honeybadger 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. data/Gemfile +13 -0
  2. data/Gemfile.lock +114 -0
  3. data/Guardfile +5 -0
  4. data/MIT-LICENSE +22 -0
  5. data/README.md +271 -0
  6. data/Rakefile +261 -0
  7. data/SUPPORTED_RAILS_VERSIONS +26 -0
  8. data/TESTING.md +33 -0
  9. data/features/metal.feature +18 -0
  10. data/features/rack.feature +56 -0
  11. data/features/rails.feature +211 -0
  12. data/features/rake.feature +27 -0
  13. data/features/sinatra.feature +29 -0
  14. data/features/step_definitions/file_steps.rb +10 -0
  15. data/features/step_definitions/metal_steps.rb +23 -0
  16. data/features/step_definitions/rack_steps.rb +23 -0
  17. data/features/step_definitions/rails_application_steps.rb +394 -0
  18. data/features/step_definitions/rake_steps.rb +17 -0
  19. data/features/support/env.rb +17 -0
  20. data/features/support/honeybadger_shim.rb.template +8 -0
  21. data/features/support/rails.rb +201 -0
  22. data/features/support/rake/Rakefile +68 -0
  23. data/features/support/terminal.rb +107 -0
  24. data/generators/honeybadger/honeybadger_generator.rb +94 -0
  25. data/generators/honeybadger/lib/insert_commands.rb +34 -0
  26. data/generators/honeybadger/lib/rake_commands.rb +24 -0
  27. data/generators/honeybadger/templates/capistrano_hook.rb +6 -0
  28. data/generators/honeybadger/templates/honeybadger_tasks.rake +25 -0
  29. data/generators/honeybadger/templates/initializer.rb +6 -0
  30. data/honeybadger.gemspec +109 -0
  31. data/lib/honeybadger.rb +162 -0
  32. data/lib/honeybadger/backtrace.rb +123 -0
  33. data/lib/honeybadger/capistrano.rb +43 -0
  34. data/lib/honeybadger/configuration.rb +273 -0
  35. data/lib/honeybadger/notice.rb +314 -0
  36. data/lib/honeybadger/rack.rb +55 -0
  37. data/lib/honeybadger/rails.rb +34 -0
  38. data/lib/honeybadger/rails/action_controller_catcher.rb +30 -0
  39. data/lib/honeybadger/rails/controller_methods.rb +69 -0
  40. data/lib/honeybadger/rails/middleware/exceptions_catcher.rb +29 -0
  41. data/lib/honeybadger/rails3_tasks.rb +84 -0
  42. data/lib/honeybadger/railtie.rb +45 -0
  43. data/lib/honeybadger/rake_handler.rb +65 -0
  44. data/lib/honeybadger/sender.rb +120 -0
  45. data/lib/honeybadger/shared_tasks.rb +36 -0
  46. data/lib/honeybadger/tasks.rb +82 -0
  47. data/lib/honeybadger_tasks.rb +65 -0
  48. data/lib/rails/generators/honeybadger/honeybadger_generator.rb +99 -0
  49. data/rails/init.rb +1 -0
  50. data/resources/README.md +34 -0
  51. data/resources/ca-bundle.crt +3376 -0
  52. data/script/integration_test.rb +38 -0
  53. data/test/test_helper.rb +143 -0
  54. data/test/unit/backtrace_test.rb +180 -0
  55. data/test/unit/capistrano_test.rb +34 -0
  56. data/test/unit/configuration_test.rb +201 -0
  57. data/test/unit/honeybadger_tasks_test.rb +163 -0
  58. data/test/unit/logger_test.rb +72 -0
  59. data/test/unit/notice_test.rb +406 -0
  60. data/test/unit/notifier_test.rb +245 -0
  61. data/test/unit/rack_test.rb +56 -0
  62. data/test/unit/rails/action_controller_catcher_test.rb +300 -0
  63. data/test/unit/rails_test.rb +35 -0
  64. data/test/unit/sender_test.rb +257 -0
  65. metadata +315 -0
@@ -0,0 +1,35 @@
1
+ require 'test_helper'
2
+ require 'honeybadger/rails'
3
+
4
+ class RailsInitializerTest < Honeybadger::UnitTest
5
+ include DefinesConstants
6
+
7
+ should "trigger use of Rails' logger if logger isn't set and Rails' logger exists" do
8
+ rails = Module.new do
9
+ def self.logger
10
+ "RAILS LOGGER"
11
+ end
12
+ end
13
+ define_constant("Rails", rails)
14
+ Honeybadger::Rails.initialize
15
+ assert_equal "RAILS LOGGER", Honeybadger.logger
16
+ end
17
+
18
+ should "trigger use of Rails' default logger if logger isn't set and Rails.logger doesn't exist" do
19
+ define_constant("RAILS_DEFAULT_LOGGER", "RAILS DEFAULT LOGGER")
20
+
21
+ Honeybadger::Rails.initialize
22
+ assert_equal "RAILS DEFAULT LOGGER", Honeybadger.logger
23
+ end
24
+
25
+ should "allow overriding of the logger if already assigned" do
26
+ define_constant("RAILS_DEFAULT_LOGGER", "RAILS DEFAULT LOGGER")
27
+ Honeybadger::Rails.initialize
28
+
29
+ Honeybadger.configure(true) do |config|
30
+ config.logger = "OVERRIDDEN LOGGER"
31
+ end
32
+
33
+ assert_equal "OVERRIDDEN LOGGER", Honeybadger.logger
34
+ end
35
+ end
@@ -0,0 +1,257 @@
1
+ require 'test_helper'
2
+
3
+ class SenderTest < Honeybadger::UnitTest
4
+ def setup
5
+ reset_config
6
+ end
7
+
8
+ def build_sender(opts = {})
9
+ Honeybadger.configure do |conf|
10
+ opts.each {|opt, value| conf.send(:"#{opt}=", value) }
11
+ end
12
+ end
13
+
14
+ def send_exception(args = {})
15
+ notice = args.delete(:notice) || build_notice_data
16
+ sender = args.delete(:sender) || build_sender(args)
17
+ sender.send_to_honeybadger(notice)
18
+ end
19
+
20
+ def stub_http(options = {})
21
+ response = stub(:body => options[:body] || 'body')
22
+ http = stub(:post => response,
23
+ :read_timeout= => nil,
24
+ :open_timeout= => nil,
25
+ :ca_file= => nil,
26
+ :verify_mode= => nil,
27
+ :use_ssl= => nil)
28
+ Net::HTTP.stubs(:new => http)
29
+ http
30
+ end
31
+
32
+ should "post to Honeybadger when using an HTTP proxy" do
33
+ response = stub(:body => 'body')
34
+ http = stub(:post => response,
35
+ :read_timeout= => nil,
36
+ :open_timeout= => nil,
37
+ :use_ssl= => nil)
38
+ proxy = stub(:new => http)
39
+ Net::HTTP.stubs(:Proxy => proxy)
40
+
41
+ url = "http://api.honeybadger.io:80#{Honeybadger::Sender::NOTICES_URI}"
42
+ uri = URI.parse(url)
43
+
44
+ proxy_host = 'some.host'
45
+ proxy_port = 88
46
+ proxy_user = 'login'
47
+ proxy_pass = 'passwd'
48
+
49
+ send_exception(:proxy_host => proxy_host,
50
+ :proxy_port => proxy_port,
51
+ :proxy_user => proxy_user,
52
+ :proxy_pass => proxy_pass)
53
+ assert_received(http, :post) do |expect|
54
+ expect.with(uri.path, anything, Honeybadger::HEADERS.merge({ 'X-API-Key' => 'abc123'}))
55
+ end
56
+ assert_received(Net::HTTP, :Proxy) do |expect|
57
+ expect.with(proxy_host, proxy_port, proxy_user, proxy_pass)
58
+ end
59
+ end
60
+
61
+ should "return the created group's id on successful posting" do
62
+ http = stub_http(:body => '{"id":"3799307"}')
63
+ assert_equal "3799307", send_exception(:secure => false)
64
+ end
65
+
66
+ context "when encountering exceptions: " do
67
+ context "HTTP connection setup problems" do
68
+ should "not be rescued" do
69
+ proxy = stub()
70
+ proxy.stubs(:new).raises(NoMemoryError)
71
+ Net::HTTP.stubs(:Proxy => proxy)
72
+
73
+ assert_raise NoMemoryError do
74
+ build_sender.send(:setup_http_connection)
75
+ end
76
+ end
77
+
78
+ should "be logged" do
79
+ proxy = stub()
80
+ proxy.stubs(:new).raises(RuntimeError)
81
+ Net::HTTP.stubs(:Proxy => proxy)
82
+
83
+ sender = build_sender
84
+ sender.expects(:log).with(:error, includes('Failure initializing the HTTP connection'))
85
+
86
+ assert_raise RuntimeError do
87
+ sender.send(:setup_http_connection)
88
+ end
89
+
90
+ end
91
+ end
92
+
93
+ context "unexpected exception sending problems" do
94
+ should "be logged" do
95
+ sender = build_sender
96
+ sender.stubs(:setup_http_connection).raises(RuntimeError.new)
97
+
98
+ sender.expects(:log).with(:error, includes('Cannot send notification. Error'))
99
+ sender.send_to_honeybadger("stuff")
100
+ end
101
+
102
+ should "return nil no matter what" do
103
+ sender = build_sender
104
+ sender.stubs(:setup_http_connection).raises(LocalJumpError)
105
+
106
+ assert_nothing_thrown do
107
+ assert_nil sender.send_to_honeybadger("stuff")
108
+ end
109
+ end
110
+ end
111
+
112
+ should "return nil on failed posting" do
113
+ http = stub_http
114
+ http.stubs(:post).raises(Errno::ECONNREFUSED)
115
+ assert_equal nil, send_exception(:secure => false)
116
+ end
117
+
118
+ should "not fail when posting and a timeout exception occurs" do
119
+ http = stub_http
120
+ http.stubs(:post).raises(TimeoutError)
121
+ assert_nothing_thrown do
122
+ send_exception(:secure => false)
123
+ end
124
+ end
125
+
126
+ should "not fail when posting and a connection refused exception occurs" do
127
+ http = stub_http
128
+ http.stubs(:post).raises(Errno::ECONNREFUSED)
129
+ assert_nothing_thrown do
130
+ send_exception(:secure => false)
131
+ end
132
+ end
133
+
134
+ should "not fail when posting any http exception occurs" do
135
+ http = stub_http
136
+ Honeybadger::Sender::HTTP_ERRORS.each do |error|
137
+ http.stubs(:post).raises(error)
138
+ assert_nothing_thrown do
139
+ send_exception(:secure => false)
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ context "SSL" do
146
+ should "post to the right url for non-ssl" do
147
+ http = stub_http
148
+ url = "http://api.honeybadger.io:80#{Honeybadger::Sender::NOTICES_URI}"
149
+ uri = URI.parse(url)
150
+ send_exception(:secure => false)
151
+ assert_received(http, :post) {|expect| expect.with(uri.path, anything, Honeybadger::HEADERS.merge({ 'X-API-Key' => 'abc123'})) }
152
+ end
153
+
154
+ should "post to the right path for ssl" do
155
+ http = stub_http
156
+ send_exception(:secure => true)
157
+ assert_received(http, :post) {|expect| expect.with(Honeybadger::Sender::NOTICES_URI, anything, Honeybadger::HEADERS.merge({ 'X-API-Key' => 'abc123'})) }
158
+ end
159
+
160
+ should "verify the SSL peer when the use_ssl option is set to true" do
161
+ url = "https://api.honeybadger.io#{Honeybadger::Sender::NOTICES_URI}"
162
+ uri = URI.parse(url)
163
+
164
+ real_http = Net::HTTP.new(uri.host, uri.port)
165
+ real_http.stubs(:post => nil)
166
+ proxy = stub(:new => real_http)
167
+ Net::HTTP.stubs(:Proxy => proxy)
168
+ File.stubs(:exist?).with(OpenSSL::X509::DEFAULT_CERT_FILE).returns(false)
169
+
170
+ send_exception(:secure => true)
171
+ assert(real_http.use_ssl?)
172
+ assert_equal(OpenSSL::SSL::VERIFY_PEER, real_http.verify_mode)
173
+ assert_equal(Honeybadger.configuration.local_cert_path, real_http.ca_file)
174
+ end
175
+
176
+ should "use the default DEFAULT_CERT_FILE if asked to" do
177
+ config = Honeybadger::Configuration.new
178
+ config.use_system_ssl_cert_chain = true
179
+ sender = Honeybadger::Sender.new(config)
180
+
181
+ assert(sender.use_system_ssl_cert_chain?)
182
+
183
+ http = sender.send(:setup_http_connection)
184
+ assert_not_equal http.ca_file, config.local_cert_path
185
+ end
186
+
187
+ should "verify the connection when the use_ssl option is set (VERIFY_PEER)" do
188
+ sender = build_sender(:secure => true)
189
+ http = sender.send(:setup_http_connection)
190
+ assert_equal(OpenSSL::SSL::VERIFY_PEER, http.verify_mode)
191
+ end
192
+
193
+ should "use the default cert (OpenSSL::X509::DEFAULT_CERT_FILE) only if explicitly told to" do
194
+ sender = build_sender(:secure => true)
195
+ http = sender.send(:setup_http_connection)
196
+
197
+ assert_equal(Honeybadger.configuration.local_cert_path, http.ca_file)
198
+
199
+ File.stubs(:exist?).with(OpenSSL::X509::DEFAULT_CERT_FILE).returns(true)
200
+ sender = build_sender(:secure => true, :use_system_ssl_cert_chain => true)
201
+ http = sender.send(:setup_http_connection)
202
+
203
+ assert_not_equal(Honeybadger.configuration.local_cert_path, http.ca_file)
204
+ assert_equal(OpenSSL::X509::DEFAULT_CERT_FILE, http.ca_file)
205
+ end
206
+
207
+ should "connect to the right port for ssl" do
208
+ stub_http
209
+ send_exception(:secure => true)
210
+ assert_received(Net::HTTP, :new) {|expect| expect.with("api.honeybadger.io", 443) }
211
+ end
212
+
213
+ should "connect to the right port for non-ssl" do
214
+ stub_http
215
+ send_exception(:secure => false)
216
+ assert_received(Net::HTTP, :new) {|expect| expect.with("api.honeybadger.io", 80) }
217
+ end
218
+
219
+ should "use ssl if secure" do
220
+ stub_http
221
+ send_exception(:secure => true, :host => 'example.org')
222
+ assert_received(Net::HTTP, :new) {|expect| expect.with('example.org', 443) }
223
+ end
224
+
225
+ should "not use ssl if not secure" do
226
+ stub_http
227
+ send_exception(:secure => false, :host => 'example.org')
228
+ assert_received(Net::HTTP, :new) {|expect| expect.with('example.org', 80) }
229
+ end
230
+ end
231
+
232
+ context "network timeouts" do
233
+ should "default the open timeout to 2 seconds" do
234
+ http = stub_http
235
+ send_exception
236
+ assert_received(http, :open_timeout=) {|expect| expect.with(2) }
237
+ end
238
+
239
+ should "default the read timeout to 5 seconds" do
240
+ http = stub_http
241
+ send_exception
242
+ assert_received(http, :read_timeout=) {|expect| expect.with(5) }
243
+ end
244
+
245
+ should "allow override of the open timeout" do
246
+ http = stub_http
247
+ send_exception(:http_open_timeout => 4)
248
+ assert_received(http, :open_timeout=) {|expect| expect.with(4) }
249
+ end
250
+
251
+ should "allow override of the read timeout" do
252
+ http = stub_http
253
+ send_exception(:http_read_timeout => 10)
254
+ assert_received(http, :read_timeout=) {|expect| expect.with(10) }
255
+ end
256
+ end
257
+ end
metadata ADDED
@@ -0,0 +1,315 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: honeybadger
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Joshua Wood
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: activesupport
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: actionpack
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 2.3.8
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.3.8
62
+ - !ruby/object:Gem::Dependency
63
+ name: activerecord
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 2.3.8
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.3.8
78
+ - !ruby/object:Gem::Dependency
79
+ name: activesupport
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 2.3.8
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 2.3.8
94
+ - !ruby/object:Gem::Dependency
95
+ name: bourne
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '1.0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '1.0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: cucumber
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.10.6
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.10.6
126
+ - !ruby/object:Gem::Dependency
127
+ name: rspec
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 2.6.0
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 2.6.0
142
+ - !ruby/object:Gem::Dependency
143
+ name: fakeweb
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ~>
148
+ - !ruby/object:Gem::Version
149
+ version: 1.3.0
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: 1.3.0
158
+ - !ruby/object:Gem::Dependency
159
+ name: sham_rack
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ~>
164
+ - !ruby/object:Gem::Version
165
+ version: 1.3.0
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: 1.3.0
174
+ - !ruby/object:Gem::Dependency
175
+ name: shoulda
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ~>
180
+ - !ruby/object:Gem::Version
181
+ version: 2.11.3
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ~>
188
+ - !ruby/object:Gem::Version
189
+ version: 2.11.3
190
+ - !ruby/object:Gem::Dependency
191
+ name: capistrano
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ~>
196
+ - !ruby/object:Gem::Version
197
+ version: 2.8.0
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ~>
204
+ - !ruby/object:Gem::Version
205
+ version: 2.8.0
206
+ description: Make managing application errors a more pleasant experience.
207
+ email: josh@honeybadger.io
208
+ executables: []
209
+ extensions: []
210
+ extra_rdoc_files:
211
+ - README.md
212
+ - MIT-LICENSE
213
+ files:
214
+ - Gemfile
215
+ - Gemfile.lock
216
+ - Guardfile
217
+ - MIT-LICENSE
218
+ - README.md
219
+ - Rakefile
220
+ - SUPPORTED_RAILS_VERSIONS
221
+ - TESTING.md
222
+ - features/metal.feature
223
+ - features/rack.feature
224
+ - features/rails.feature
225
+ - features/rake.feature
226
+ - features/sinatra.feature
227
+ - features/step_definitions/file_steps.rb
228
+ - features/step_definitions/metal_steps.rb
229
+ - features/step_definitions/rack_steps.rb
230
+ - features/step_definitions/rails_application_steps.rb
231
+ - features/step_definitions/rake_steps.rb
232
+ - features/support/env.rb
233
+ - features/support/honeybadger_shim.rb.template
234
+ - features/support/rails.rb
235
+ - features/support/rake/Rakefile
236
+ - features/support/terminal.rb
237
+ - generators/honeybadger/honeybadger_generator.rb
238
+ - generators/honeybadger/lib/insert_commands.rb
239
+ - generators/honeybadger/lib/rake_commands.rb
240
+ - generators/honeybadger/templates/capistrano_hook.rb
241
+ - generators/honeybadger/templates/honeybadger_tasks.rake
242
+ - generators/honeybadger/templates/initializer.rb
243
+ - honeybadger.gemspec
244
+ - lib/honeybadger.rb
245
+ - lib/honeybadger/backtrace.rb
246
+ - lib/honeybadger/capistrano.rb
247
+ - lib/honeybadger/configuration.rb
248
+ - lib/honeybadger/notice.rb
249
+ - lib/honeybadger/rack.rb
250
+ - lib/honeybadger/rails.rb
251
+ - lib/honeybadger/rails/action_controller_catcher.rb
252
+ - lib/honeybadger/rails/controller_methods.rb
253
+ - lib/honeybadger/rails/middleware/exceptions_catcher.rb
254
+ - lib/honeybadger/rails3_tasks.rb
255
+ - lib/honeybadger/railtie.rb
256
+ - lib/honeybadger/rake_handler.rb
257
+ - lib/honeybadger/sender.rb
258
+ - lib/honeybadger/shared_tasks.rb
259
+ - lib/honeybadger/tasks.rb
260
+ - lib/honeybadger_tasks.rb
261
+ - lib/rails/generators/honeybadger/honeybadger_generator.rb
262
+ - rails/init.rb
263
+ - resources/README.md
264
+ - resources/ca-bundle.crt
265
+ - script/integration_test.rb
266
+ - test/test_helper.rb
267
+ - test/unit/backtrace_test.rb
268
+ - test/unit/capistrano_test.rb
269
+ - test/unit/configuration_test.rb
270
+ - test/unit/honeybadger_tasks_test.rb
271
+ - test/unit/logger_test.rb
272
+ - test/unit/notice_test.rb
273
+ - test/unit/notifier_test.rb
274
+ - test/unit/rack_test.rb
275
+ - test/unit/rails/action_controller_catcher_test.rb
276
+ - test/unit/rails_test.rb
277
+ - test/unit/sender_test.rb
278
+ homepage: http://www.honeybadger.io
279
+ licenses: []
280
+ post_install_message:
281
+ rdoc_options:
282
+ - --charset=UTF-8
283
+ - --markup tomdoc
284
+ require_paths:
285
+ - lib
286
+ required_ruby_version: !ruby/object:Gem::Requirement
287
+ none: false
288
+ requirements:
289
+ - - ! '>='
290
+ - !ruby/object:Gem::Version
291
+ version: '0'
292
+ required_rubygems_version: !ruby/object:Gem::Requirement
293
+ none: false
294
+ requirements:
295
+ - - ! '>='
296
+ - !ruby/object:Gem::Version
297
+ version: '0'
298
+ requirements: []
299
+ rubyforge_project:
300
+ rubygems_version: 1.8.24
301
+ signing_key:
302
+ specification_version: 2
303
+ summary: Error reports you can be happy about.
304
+ test_files:
305
+ - test/unit/backtrace_test.rb
306
+ - test/unit/capistrano_test.rb
307
+ - test/unit/configuration_test.rb
308
+ - test/unit/honeybadger_tasks_test.rb
309
+ - test/unit/logger_test.rb
310
+ - test/unit/notice_test.rb
311
+ - test/unit/notifier_test.rb
312
+ - test/unit/rack_test.rb
313
+ - test/unit/rails/action_controller_catcher_test.rb
314
+ - test/unit/rails_test.rb
315
+ - test/unit/sender_test.rb