honeybadger 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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