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.
- data/Gemfile +13 -0
- data/Gemfile.lock +114 -0
- data/Guardfile +5 -0
- data/MIT-LICENSE +22 -0
- data/README.md +271 -0
- data/Rakefile +261 -0
- data/SUPPORTED_RAILS_VERSIONS +26 -0
- data/TESTING.md +33 -0
- data/features/metal.feature +18 -0
- data/features/rack.feature +56 -0
- data/features/rails.feature +211 -0
- data/features/rake.feature +27 -0
- data/features/sinatra.feature +29 -0
- data/features/step_definitions/file_steps.rb +10 -0
- data/features/step_definitions/metal_steps.rb +23 -0
- data/features/step_definitions/rack_steps.rb +23 -0
- data/features/step_definitions/rails_application_steps.rb +394 -0
- data/features/step_definitions/rake_steps.rb +17 -0
- data/features/support/env.rb +17 -0
- data/features/support/honeybadger_shim.rb.template +8 -0
- data/features/support/rails.rb +201 -0
- data/features/support/rake/Rakefile +68 -0
- data/features/support/terminal.rb +107 -0
- data/generators/honeybadger/honeybadger_generator.rb +94 -0
- data/generators/honeybadger/lib/insert_commands.rb +34 -0
- data/generators/honeybadger/lib/rake_commands.rb +24 -0
- data/generators/honeybadger/templates/capistrano_hook.rb +6 -0
- data/generators/honeybadger/templates/honeybadger_tasks.rake +25 -0
- data/generators/honeybadger/templates/initializer.rb +6 -0
- data/honeybadger.gemspec +109 -0
- data/lib/honeybadger.rb +162 -0
- data/lib/honeybadger/backtrace.rb +123 -0
- data/lib/honeybadger/capistrano.rb +43 -0
- data/lib/honeybadger/configuration.rb +273 -0
- data/lib/honeybadger/notice.rb +314 -0
- data/lib/honeybadger/rack.rb +55 -0
- data/lib/honeybadger/rails.rb +34 -0
- data/lib/honeybadger/rails/action_controller_catcher.rb +30 -0
- data/lib/honeybadger/rails/controller_methods.rb +69 -0
- data/lib/honeybadger/rails/middleware/exceptions_catcher.rb +29 -0
- data/lib/honeybadger/rails3_tasks.rb +84 -0
- data/lib/honeybadger/railtie.rb +45 -0
- data/lib/honeybadger/rake_handler.rb +65 -0
- data/lib/honeybadger/sender.rb +120 -0
- data/lib/honeybadger/shared_tasks.rb +36 -0
- data/lib/honeybadger/tasks.rb +82 -0
- data/lib/honeybadger_tasks.rb +65 -0
- data/lib/rails/generators/honeybadger/honeybadger_generator.rb +99 -0
- data/rails/init.rb +1 -0
- data/resources/README.md +34 -0
- data/resources/ca-bundle.crt +3376 -0
- data/script/integration_test.rb +38 -0
- data/test/test_helper.rb +143 -0
- data/test/unit/backtrace_test.rb +180 -0
- data/test/unit/capistrano_test.rb +34 -0
- data/test/unit/configuration_test.rb +201 -0
- data/test/unit/honeybadger_tasks_test.rb +163 -0
- data/test/unit/logger_test.rb +72 -0
- data/test/unit/notice_test.rb +406 -0
- data/test/unit/notifier_test.rb +245 -0
- data/test/unit/rack_test.rb +56 -0
- data/test/unit/rails/action_controller_catcher_test.rb +300 -0
- data/test/unit/rails_test.rb +35 -0
- data/test/unit/sender_test.rb +257 -0
- metadata +315 -0
data/TESTING.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
Running the suite
|
2
|
+
=================
|
3
|
+
|
4
|
+
Since the notifier must run on many versions of Rails, running its test suite is slightly different than you may be used to.
|
5
|
+
|
6
|
+
You should start by trusting the .rvmrc file. We come in peace.
|
7
|
+
|
8
|
+
Then execute the following command:
|
9
|
+
|
10
|
+
rake vendor_test_gems
|
11
|
+
# NOT: bundle exec rake vendor_test_gems
|
12
|
+
|
13
|
+
This command will download the various versions of Rails and other gems that the notifier must be tested against.
|
14
|
+
|
15
|
+
Then, to start the suite, run
|
16
|
+
|
17
|
+
rake
|
18
|
+
# NOT: bundle exec rake
|
19
|
+
|
20
|
+
Finally, this test suite runs against many rails versions. If you
|
21
|
+
prefer to run it against specific version hit
|
22
|
+
|
23
|
+
rake cucumber:rails:<VERSION>
|
24
|
+
|
25
|
+
|
26
|
+
For Maintainers
|
27
|
+
================
|
28
|
+
|
29
|
+
When developing the Honeybadger gem, be sure to use the integration test against an existing project on staging before pushing to master.
|
30
|
+
|
31
|
+
./script/integration_test.rb <test project's api key> <staging server hostname>
|
32
|
+
|
33
|
+
./script/integration_test.rb <test project's api key> <staging server hostname> secure
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Feature: Rescue errors in Rails middleware
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I have built and installed the "honeybadger" gem
|
5
|
+
And I generate a new Rails application
|
6
|
+
And I configure the Honeybadger shim
|
7
|
+
And I configure my application to require the "honeybadger" gem
|
8
|
+
And I run the honeybadger generator with "-k myapikey"
|
9
|
+
|
10
|
+
Scenario: Rescue an exception in the dispatcher
|
11
|
+
When I define a Metal endpoint called "Exploder":
|
12
|
+
"""
|
13
|
+
def self.call(env)
|
14
|
+
raise "Explode"
|
15
|
+
end
|
16
|
+
"""
|
17
|
+
When I perform a request to "http://example.com:123/metal/index?param=value"
|
18
|
+
Then I should receive a Honeybadger notification
|
@@ -0,0 +1,56 @@
|
|
1
|
+
Feature: Use the notifier in a plain Rack app
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I have built and installed the "honeybadger" gem
|
5
|
+
|
6
|
+
Scenario: Rescue and exception in a Rack app
|
7
|
+
Given the following Rack app:
|
8
|
+
"""
|
9
|
+
require 'rack'
|
10
|
+
require 'honeybadger'
|
11
|
+
|
12
|
+
Honeybadger.configure do |config|
|
13
|
+
config.api_key = 'my_api_key'
|
14
|
+
end
|
15
|
+
|
16
|
+
app = Rack::Builder.app do
|
17
|
+
use Honeybadger::Rack
|
18
|
+
run lambda { |env| raise "Rack down" }
|
19
|
+
end
|
20
|
+
"""
|
21
|
+
When I perform a Rack request to "http://example.com:123/test/index?param=value"
|
22
|
+
Then I should receive a Honeybadger notification
|
23
|
+
|
24
|
+
Scenario: Ignore user agents
|
25
|
+
Given the following Rack app:
|
26
|
+
"""
|
27
|
+
require 'rack'
|
28
|
+
require 'honeybadger'
|
29
|
+
|
30
|
+
Honeybadger.configure do |config|
|
31
|
+
config.api_key = 'my_api_key'
|
32
|
+
config.ignore_user_agent << /ignore/
|
33
|
+
end
|
34
|
+
|
35
|
+
class Mock
|
36
|
+
class AppendUserAgent
|
37
|
+
def initialize(app)
|
38
|
+
@app = app
|
39
|
+
end
|
40
|
+
|
41
|
+
def call(env)
|
42
|
+
env["HTTP_USER_AGENT"] = "ignore"
|
43
|
+
@app.call(env)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
app = Rack::Builder.app do
|
49
|
+
use Honeybadger::Rack
|
50
|
+
use Mock::AppendUserAgent
|
51
|
+
run lambda { |env| raise "Rack down" }
|
52
|
+
end
|
53
|
+
"""
|
54
|
+
When I perform a Rack request to "http://example.com:123/test/index?param=value"
|
55
|
+
Then I should not see "** [Honeybadger] Response from Honeybadger:"
|
56
|
+
|
@@ -0,0 +1,211 @@
|
|
1
|
+
Feature: Install the Gem in a Rails application
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I have built and installed the "honeybadger" gem
|
5
|
+
And I generate a new Rails application
|
6
|
+
|
7
|
+
Scenario: Use the gem without vendoring the gem in a Rails application
|
8
|
+
When I configure the Honeybadger shim
|
9
|
+
And I configure my application to require the "honeybadger" gem
|
10
|
+
And I run the honeybadger generator with "-k myapikey"
|
11
|
+
Then the command should have run successfully
|
12
|
+
And I should receive a Honeybadger notification
|
13
|
+
And I should see the Rails version
|
14
|
+
|
15
|
+
Scenario: vendor the gem and uninstall
|
16
|
+
When I configure the Honeybadger shim
|
17
|
+
And I configure my application to require the "honeybadger" gem
|
18
|
+
And I unpack the "honeybadger" gem
|
19
|
+
And I run the honeybadger generator with "-k myapikey"
|
20
|
+
Then the command should have run successfully
|
21
|
+
When I uninstall the "honeybadger" gem
|
22
|
+
And I install cached gems
|
23
|
+
And I run "rake honeybadger:test"
|
24
|
+
Then I should see "** [Honeybadger] Response from Honeybadger:"
|
25
|
+
And I should receive two Honeybadger notifications
|
26
|
+
|
27
|
+
Scenario: Configure the notifier by hand
|
28
|
+
When I configure the Honeybadger shim
|
29
|
+
And I configure the notifier to use "myapikey" as an API key
|
30
|
+
And I configure my application to require the "honeybadger" gem
|
31
|
+
And I run the honeybadger generator with ""
|
32
|
+
Then I should receive a Honeybadger notification
|
33
|
+
|
34
|
+
Scenario: Configuration within initializer isn't overridden by Railtie
|
35
|
+
When I configure the Honeybadger shim
|
36
|
+
And I configure usage of Honeybadger
|
37
|
+
Then the command should have run successfully
|
38
|
+
When I configure the notifier to use the following configuration lines:
|
39
|
+
"""
|
40
|
+
config.api_key = "myapikey"
|
41
|
+
config.project_root = "argle/bargle"
|
42
|
+
"""
|
43
|
+
And I define a response for "TestController#index":
|
44
|
+
"""
|
45
|
+
session[:value] = "test"
|
46
|
+
raise RuntimeError, "some message"
|
47
|
+
"""
|
48
|
+
And I route "/test/index" to "test#index"
|
49
|
+
And I perform a request to "http://example.com:123/test/index?param=value"
|
50
|
+
Then I should receive a Honeybadger notification
|
51
|
+
|
52
|
+
Scenario: Try to install without an api key
|
53
|
+
When I configure my application to require the "honeybadger" gem
|
54
|
+
And I run the honeybadger generator with ""
|
55
|
+
Then I should see "Must pass --api-key or --heroku or create config/initializers/honeybadger.rb"
|
56
|
+
|
57
|
+
Scenario: Configure and deploy using only installed gem
|
58
|
+
When I run "capify ."
|
59
|
+
And I configure the Honeybadger shim
|
60
|
+
And I configure my application to require the "honeybadger" gem
|
61
|
+
And I run the honeybadger generator with "-k myapikey"
|
62
|
+
And I configure my application to require the "capistrano" gem if necessary
|
63
|
+
And I run "cap -T"
|
64
|
+
Then I should see "honeybadger:deploy"
|
65
|
+
|
66
|
+
Scenario: Configure and deploy using only vendored gem
|
67
|
+
When I run "capify ."
|
68
|
+
And I configure the Honeybadger shim
|
69
|
+
And I configure my application to require the "honeybadger" gem
|
70
|
+
And I unpack the "honeybadger" gem
|
71
|
+
And I run the honeybadger generator with "-k myapikey"
|
72
|
+
And I uninstall the "honeybadger" gem
|
73
|
+
And I install cached gems
|
74
|
+
And I configure my application to require the "capistrano" gem if necessary
|
75
|
+
And I run "cap -T"
|
76
|
+
Then I should see "honeybadger:deploy"
|
77
|
+
|
78
|
+
Scenario: Try to install when the honeybadger plugin still exists
|
79
|
+
When I install the "honeybadger" plugin
|
80
|
+
And I configure the Honeybadger shim
|
81
|
+
And I configure the notifier to use "myapikey" as an API key
|
82
|
+
And I configure my application to require the "honeybadger" gem
|
83
|
+
And I run the honeybadger generator with ""
|
84
|
+
Then I should see "You must first remove the honeybadger plugin. Please run: script/plugin remove honeybadger"
|
85
|
+
|
86
|
+
Scenario: Rescue an exception in a controller
|
87
|
+
When I configure the Honeybadger shim
|
88
|
+
And I configure usage of Honeybadger
|
89
|
+
And I define a response for "TestController#index":
|
90
|
+
"""
|
91
|
+
session[:value] = "test"
|
92
|
+
raise RuntimeError, "some message"
|
93
|
+
"""
|
94
|
+
And I route "/test/index" to "test#index"
|
95
|
+
And I perform a request to "http://example.com:123/test/index?param=value"
|
96
|
+
Then I should receive a Honeybadger notification
|
97
|
+
|
98
|
+
Scenario: The gem should not be considered a framework gem
|
99
|
+
When I configure the Honeybadger shim
|
100
|
+
And I configure my application to require the "honeybadger" gem
|
101
|
+
And I run the honeybadger generator with "-k myapikey"
|
102
|
+
And I run "rake gems"
|
103
|
+
Then I should see that "honeybadger" is not considered a framework gem
|
104
|
+
|
105
|
+
Scenario: The app uses Vlad instead of Capistrano
|
106
|
+
When I configure the Honeybadger shim
|
107
|
+
And I configure my application to require the "honeybadger" gem
|
108
|
+
And I run "touch config/deploy.rb"
|
109
|
+
And I run "rm Capfile"
|
110
|
+
And I run the honeybadger generator with "-k myapikey"
|
111
|
+
Then "config/deploy.rb" should not contain "capistrano"
|
112
|
+
|
113
|
+
Scenario: Support the Heroku addon in the generator
|
114
|
+
When I configure the Honeybadger shim
|
115
|
+
And I configure the Heroku rake shim
|
116
|
+
And I configure the Heroku gem shim with "myapikey"
|
117
|
+
And I configure my application to require the "honeybadger" gem
|
118
|
+
And I run the honeybadger generator with "--heroku"
|
119
|
+
Then the command should have run successfully
|
120
|
+
And I should receive a Honeybadger notification
|
121
|
+
And I should see the Rails version
|
122
|
+
And my Honeybadger configuration should contain the following line:
|
123
|
+
"""
|
124
|
+
config.api_key = ENV['HONEYBADGER_API_KEY']
|
125
|
+
"""
|
126
|
+
|
127
|
+
Scenario: Support the --app option for the Heroku addon in the generator
|
128
|
+
When I configure the Honeybadger shim
|
129
|
+
And I configure the Heroku rake shim
|
130
|
+
And I configure the Heroku gem shim with "myapikey" and multiple app support
|
131
|
+
And I configure my application to require the "honeybadger" gem
|
132
|
+
And I run the honeybadger generator with "--heroku -a myapp"
|
133
|
+
Then the command should have run successfully
|
134
|
+
And I should receive a Honeybadger notification
|
135
|
+
And I should see the Rails version
|
136
|
+
And my Honeybadger configuration should contain the following line:
|
137
|
+
"""
|
138
|
+
config.api_key = ENV['HONEYBADGER_API_KEY']
|
139
|
+
"""
|
140
|
+
|
141
|
+
Scenario: Filtering parameters in a controller
|
142
|
+
When I configure the Honeybadger shim
|
143
|
+
And I configure usage of Honeybadger
|
144
|
+
When I configure the notifier to use the following configuration lines:
|
145
|
+
"""
|
146
|
+
config.api_key = "myapikey"
|
147
|
+
config.params_filters << "credit_card_number"
|
148
|
+
"""
|
149
|
+
And I define a response for "TestController#index":
|
150
|
+
"""
|
151
|
+
params[:credit_card_number] = "red23"
|
152
|
+
raise RuntimeError, "some message"
|
153
|
+
"""
|
154
|
+
And I route "/test/index" to "test#index"
|
155
|
+
And I perform a request to "http://example.com:123/test/index?param=value"
|
156
|
+
Then I should receive a Honeybadger notification
|
157
|
+
|
158
|
+
Scenario: Filtering session in a controller
|
159
|
+
When I configure the Honeybadger shim
|
160
|
+
And I configure usage of Honeybadger
|
161
|
+
When I configure the notifier to use the following configuration lines:
|
162
|
+
"""
|
163
|
+
config.api_key = "myapikey"
|
164
|
+
config.params_filters << "secret"
|
165
|
+
"""
|
166
|
+
And I define a response for "TestController#index":
|
167
|
+
"""
|
168
|
+
session["secret"] = "blue42"
|
169
|
+
raise RuntimeError, "some message"
|
170
|
+
"""
|
171
|
+
And I route "/test/index" to "test#index"
|
172
|
+
And I perform a request to "http://example.com:123/test/index?param=value"
|
173
|
+
Then I should receive a Honeybadger notification
|
174
|
+
|
175
|
+
Scenario: Filtering session and params based on Rails parameter filters
|
176
|
+
When I configure the Honeybadger shim
|
177
|
+
And I configure usage of Honeybadger
|
178
|
+
And I configure the application to filter parameter "secret"
|
179
|
+
And I define a response for "TestController#index":
|
180
|
+
"""
|
181
|
+
params["secret"] = "red23"
|
182
|
+
session["secret"] = "blue42"
|
183
|
+
raise RuntimeError, "some message"
|
184
|
+
"""
|
185
|
+
And I route "/test/index" to "test#index"
|
186
|
+
And I perform a request to "http://example.com:123/test/index?param=value"
|
187
|
+
Then I should receive a Honeybadger notification
|
188
|
+
|
189
|
+
Scenario: Notify honeybadger within the controller
|
190
|
+
When I configure the Honeybadger shim
|
191
|
+
And I configure usage of Honeybadger
|
192
|
+
And I define a response for "TestController#index":
|
193
|
+
"""
|
194
|
+
session[:value] = "test"
|
195
|
+
notify_honeybadger(RuntimeError.new("some message"))
|
196
|
+
render :nothing => true
|
197
|
+
"""
|
198
|
+
And I route "/test/index" to "test#index"
|
199
|
+
And I perform a request to "http://example.com:123/test/index?param=value"
|
200
|
+
Then I should receive a Honeybadger notification
|
201
|
+
|
202
|
+
Scenario: Reporting 404s
|
203
|
+
When I configure the Honeybadger shim
|
204
|
+
And I configure usage of Honeybadger
|
205
|
+
And I configure the notifier to use the following configuration lines:
|
206
|
+
"""
|
207
|
+
config.ignore_only = []
|
208
|
+
"""
|
209
|
+
And I perform a request to "http://example.com:123/this/route/does/not/exist"
|
210
|
+
Then I should see "The page you were looking for doesn't exist."
|
211
|
+
And I should receive a Honeybadger notification
|
@@ -0,0 +1,27 @@
|
|
1
|
+
Feature: Use the Gem to catch errors in a Rake application
|
2
|
+
Background:
|
3
|
+
Given I have built and installed the "honeybadger" gem
|
4
|
+
|
5
|
+
Scenario: Catching exceptions in Rake
|
6
|
+
When I run rake with honeybadger
|
7
|
+
Then Honeybadger should catch the exception
|
8
|
+
|
9
|
+
Scenario: Falling back to default handler before Honeybadger is configured
|
10
|
+
When I run rake with honeybadger not yet configured
|
11
|
+
Then Honeybadger should not catch the exception
|
12
|
+
|
13
|
+
Scenario: Disabling Rake exception catcher
|
14
|
+
When I run rake with honeybadger disabled
|
15
|
+
Then Honeybadger should not catch the exception
|
16
|
+
|
17
|
+
Scenario: Autodetect, running from terminal
|
18
|
+
When I run rake with honeybadger autodetect from terminal
|
19
|
+
Then Honeybadger should not catch the exception
|
20
|
+
|
21
|
+
Scenario: Autodetect, not running from terminal
|
22
|
+
When I run rake with honeybadger autodetect not from terminal
|
23
|
+
Then Honeybadger should catch the exception
|
24
|
+
|
25
|
+
Scenario: Sending the correct component name
|
26
|
+
When I run rake with honeybadger
|
27
|
+
Then Honeybadger should send the rake command line as the component name
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Feature: Use the notifier in a Sinatra app
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I have built and installed the "honeybadger" gem
|
5
|
+
|
6
|
+
Scenario: Rescue an exception in a Sinatra app
|
7
|
+
Given the following Rack app:
|
8
|
+
"""
|
9
|
+
require 'sinatra/base'
|
10
|
+
require 'honeybadger'
|
11
|
+
|
12
|
+
Honeybadger.configure do |config|
|
13
|
+
config.api_key = 'my_api_key'
|
14
|
+
end
|
15
|
+
|
16
|
+
class FontaneApp < Sinatra::Base
|
17
|
+
use Honeybadger::Rack
|
18
|
+
enable :raise_errors
|
19
|
+
|
20
|
+
get "/test/index" do
|
21
|
+
raise "Sinatra has left the building"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
app = FontaneApp
|
26
|
+
"""
|
27
|
+
When I perform a Rack request to "http://example.com:123/test/index?param=value"
|
28
|
+
Then I should receive a Honeybadger notification
|
29
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Then /^"([^\"]*)" should not contain text of "([^\"]*)"$/ do |target_file, contents_file|
|
2
|
+
notifier_root = File.join(File.dirname(__FILE__), '..', '..')
|
3
|
+
full_path_contents = File.join(notifier_root, contents_file)
|
4
|
+
contents_text = File.open(full_path_contents).read
|
5
|
+
|
6
|
+
full_path_target = File.join(rails_root, target_file)
|
7
|
+
target_text = File.open(full_path_target).read
|
8
|
+
|
9
|
+
target_text.should_not include(contents_text)
|
10
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
When /^I define a Metal endpoint called "([^\"]*)":$/ do |class_name, definition|
|
2
|
+
FileUtils.mkdir_p(File.join(rails_root, 'app', 'metal'))
|
3
|
+
file_name = File.join(rails_root, 'app', 'metal', "#{class_name.underscore}.rb")
|
4
|
+
File.open(file_name, "w") do |file|
|
5
|
+
file.puts "class #{class_name}"
|
6
|
+
file.puts definition
|
7
|
+
file.puts "end"
|
8
|
+
end
|
9
|
+
When %{the metal endpoint "#{class_name}" is mounted in the Rails 3 routes.rb} if rails3?
|
10
|
+
end
|
11
|
+
|
12
|
+
When /^the metal endpoint "([^\"]*)" is mounted in the Rails 3 routes.rb$/ do |class_name|
|
13
|
+
routesrb = File.join(rails_root, "config", "routes.rb")
|
14
|
+
routes = IO.readlines(routesrb)
|
15
|
+
rack_route = "match '/metal(/*other)' => #{class_name}"
|
16
|
+
routes = routes[0..-2] + [rack_route, routes[-1]]
|
17
|
+
File.open(routesrb, "w") do |f|
|
18
|
+
f.puts "require 'app/metal/#{class_name.underscore}'"
|
19
|
+
routes.each do |route_line|
|
20
|
+
f.puts route_line
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|