honeybadger 1.16.2 → 1.16.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ## Honeybadger 1.16.3 ##
2
+
3
+ * Handle `nil` session in Rails controllers (i.e., when the `session_off` gem is
4
+ enabled).
5
+
6
+ *Joshua Wood*
7
+
8
+ * Add `unwrap_exceptions` configuration option; when `false`, exceptions will
9
+ not be unwrapped (default: `true`).
10
+
11
+ *Joshua Wood*
12
+
13
+ * Prevent `binding_of_caller` from being loaded automatically (requires
14
+ `send_local_variables == true`).
15
+
16
+ *Joshua Wood*
17
+
1
18
  ## Honeybadger 1.16.2 ##
2
19
 
3
20
  * Fix a bug where #match was called on nil when instrumenting Net::HTTP
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- honeybadger (1.16.2)
4
+ honeybadger (1.16.3)
5
5
  json
6
6
 
7
7
  GEM
@@ -86,7 +86,7 @@ Then /^I should receive (.+) Honeybadger notifications?$/ do |number|
86
86
  when 'two' then 2
87
87
  else number end
88
88
 
89
- all_output.scan(/\[Honeybadger\] Response from Honeybadger:/).size.should == number
89
+ all_output.scan(/\[Honeybadger\] Success: Net::HTTPOK/).size.should == number
90
90
  step %(the output should contain "123456789")
91
91
  end
92
92
 
data/honeybadger.gemspec CHANGED
@@ -4,8 +4,8 @@ Gem::Specification.new do |s|
4
4
  s.rubygems_version = '1.3.5'
5
5
 
6
6
  s.name = 'honeybadger'
7
- s.version = '1.16.2'
8
- s.date = '2014-07-16'
7
+ s.version = '1.16.3'
8
+ s.date = '2014-07-21'
9
9
 
10
10
  s.summary = 'Error reports you can be happy about.'
11
11
  s.description = 'Make managing application errors a more pleasant experience.'
@@ -96,10 +96,10 @@ Gem::Specification.new do |s|
96
96
  lib/honeybadger/capistrano/tasks.rake
97
97
  lib/honeybadger/configuration.rb
98
98
  lib/honeybadger/dependency.rb
99
- lib/honeybadger/exception_extensions.rb
100
99
  lib/honeybadger/integrations.rb
101
100
  lib/honeybadger/integrations/delayed_job.rb
102
101
  lib/honeybadger/integrations/delayed_job/plugin.rb
102
+ lib/honeybadger/integrations/local_variables.rb
103
103
  lib/honeybadger/integrations/net_http.rb
104
104
  lib/honeybadger/integrations/passenger.rb
105
105
  lib/honeybadger/integrations/sidekiq.rb
@@ -140,8 +140,8 @@ Gem::Specification.new do |s|
140
140
  spec/honeybadger/capistrano_spec.rb
141
141
  spec/honeybadger/configuration_spec.rb
142
142
  spec/honeybadger/dependency_spec.rb
143
- spec/honeybadger/exception_extensions_spec.rb
144
143
  spec/honeybadger/integrations/delayed_job_spec.rb
144
+ spec/honeybadger/integrations/local_variables_spec.rb
145
145
  spec/honeybadger/integrations/net_http_spec.rb
146
146
  spec/honeybadger/integrations/passenger_spec.rb
147
147
  spec/honeybadger/integrations/sidekiq_spec.rb
data/lib/honeybadger.rb CHANGED
@@ -14,13 +14,12 @@ require 'honeybadger/stats'
14
14
  require 'honeybadger/user_informer'
15
15
  require 'honeybadger/user_feedback'
16
16
  require 'honeybadger/integrations'
17
- require 'honeybadger/exception_extensions'
18
17
 
19
18
  require 'honeybadger/railtie' if defined?(Rails::Railtie)
20
19
  require 'honeybadger/monitor'
21
20
 
22
21
  module Honeybadger
23
- VERSION = '1.16.2'.freeze
22
+ VERSION = '1.16.3'.freeze
24
23
  LOG_PREFIX = "** [Honeybadger] ".freeze
25
24
 
26
25
  HEADERS = {
@@ -191,6 +190,7 @@ module Honeybadger
191
190
  end
192
191
 
193
192
  def unwrap_exception(exception)
193
+ return exception unless configuration.unwrap_exceptions
194
194
  exception.respond_to?(:original_exception) && exception.original_exception ||
195
195
  exception.respond_to?(:continued_exception) && exception.continued_exception ||
196
196
  exception.respond_to?(:cause) && exception.cause ||
@@ -9,7 +9,8 @@ module Honeybadger
9
9
  :proxy_port, :proxy_user, :secure, :use_system_ssl_cert_chain, :framework,
10
10
  :user_information, :feedback, :rescue_rake_exceptions, :source_extract_radius,
11
11
  :send_request_session, :debug, :fingerprint, :hostname, :features, :metrics,
12
- :log_exception_on_send_failure, :send_local_variables, :traces, :trace_threshold].freeze
12
+ :log_exception_on_send_failure, :send_local_variables, :traces,
13
+ :trace_threshold, :unwrap_exceptions].freeze
13
14
 
14
15
  # The API key for your project, found on the project edit form.
15
16
  attr_accessor :api_key
@@ -107,6 +108,9 @@ module Honeybadger
107
108
  # +true+ to send local variables, +false+ to exclude
108
109
  attr_accessor :send_local_variables
109
110
 
111
+ # +true+ to unwrap exceptions
112
+ attr_accessor :unwrap_exceptions
113
+
110
114
  # +true+ to log extra debug info, +false+ to suppress
111
115
  attr_accessor :debug
112
116
 
@@ -195,6 +199,7 @@ module Honeybadger
195
199
  @limit = nil
196
200
  @feedback = true
197
201
  @trace_threshold = 2000
202
+ @unwrap_exceptions = true
198
203
  end
199
204
 
200
205
  # Public: Takes a block and adds it to the list of backtrace filters. When
@@ -6,3 +6,4 @@ require 'honeybadger/integrations/thor'
6
6
  require 'honeybadger/integrations/net_http'
7
7
  require 'honeybadger/integrations/passenger'
8
8
  require 'honeybadger/integrations/unicorn'
9
+ require 'honeybadger/integrations/local_variables'
@@ -0,0 +1,36 @@
1
+ module Honeybadger
2
+ module Integrations
3
+ module LocalVariables
4
+ module ExceptionExtension
5
+ def self.included(base)
6
+ base.send(:alias_method, :set_backtrace_without_honeybadger, :set_backtrace)
7
+ base.send(:alias_method, :set_backtrace, :set_backtrace_with_honeybadger)
8
+ end
9
+
10
+ def set_backtrace_with_honeybadger(*args, &block)
11
+ if caller.none? { |loc| loc.match(::Honeybadger::Backtrace::Line::INPUT_FORMAT) && Regexp.last_match(1) == __FILE__ }
12
+ @__honeybadger_bindings_stack = binding.callers.drop(1)
13
+ end
14
+
15
+ set_backtrace_without_honeybadger(*args, &block)
16
+ end
17
+
18
+ def __honeybadger_bindings_stack
19
+ @__honeybadger_bindings_stack || []
20
+ end
21
+ end
22
+
23
+ Dependency.register do
24
+ requirement { ::Honeybadger.configuration.send_local_variables }
25
+ requirement { defined?(::BindingOfCaller) }
26
+ requirement { !::Exception.included_modules.include?(ExceptionExtension) }
27
+
28
+ injection { Honeybadger.write_verbose_log('Installing local variables integration') }
29
+
30
+ injection do
31
+ ::Exception.send(:include, ExceptionExtension)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -8,7 +8,7 @@ module Honeybadger
8
8
  response = send_request('/v1/metrics', data.to_json)
9
9
 
10
10
  if Net::HTTPSuccess === response
11
- log(:info, "Metrics Success: #{response.class}", response, data) if Honeybadger.configuration.debug
11
+ log(:info, "Metrics Success: #{response.class}", response) if Honeybadger.configuration.debug
12
12
  true
13
13
  else
14
14
  Honeybadger.configuration.features['metrics'] = false if Net::HTTPForbidden === response
@@ -27,7 +27,7 @@ module Honeybadger
27
27
  response = send_request('/v1/traces', data.to_json)
28
28
 
29
29
  if Net::HTTPSuccess === response
30
- log(:info, "Traces Success: #{response.class}", response, data) if Honeybadger.configuration.debug
30
+ log(:info, "Traces Success: #{response.class}", response) if Honeybadger.configuration.debug
31
31
  true
32
32
  else
33
33
  Honeybadger.configuration.features['traces'] = false if Net::HTTPForbidden === response
@@ -402,6 +402,7 @@ module Honeybadger
402
402
  # Returns a Hash of local variables
403
403
  def local_variables_from_exception(exception)
404
404
  return {} unless Exception === exception
405
+ return {} unless exception.respond_to?(:__honeybadger_bindings_stack)
405
406
  return {} if exception.__honeybadger_bindings_stack.empty?
406
407
 
407
408
  if project_root
@@ -55,6 +55,7 @@ module Honeybadger
55
55
  end
56
56
 
57
57
  def honeybadger_session_data
58
+ return {} unless session
58
59
  if session.respond_to?(:to_hash)
59
60
  session.to_hash
60
61
  else
@@ -68,10 +68,11 @@ module Honeybadger
68
68
  def ping(data = {})
69
69
  return nil unless api_key_ok?
70
70
 
71
- response = send_request('/v1/ping/', data.to_json)
71
+ data = data.to_json
72
+ response = send_request('/v1/ping/', data)
72
73
 
73
74
  if Net::HTTPSuccess === response
74
- log(Honeybadger.configuration.debug ? :info : :debug, "Ping Success: #{response.class}", response, data)
75
+ log(Honeybadger.configuration.debug ? :info : :debug, "Ping Success: #{response.class}", response)
75
76
  JSON.parse(response.body)
76
77
  else
77
78
  log(:error, "Ping Failure: #{response.class}", response, data)
@@ -31,6 +31,7 @@ describe Honeybadger::Configuration do
31
31
  assert_config_default :async, nil
32
32
  assert_config_default :send_request_session, true
33
33
  assert_config_default :send_local_variables, false
34
+ assert_config_default :unwrap_exceptions, true
34
35
  assert_config_default :debug, false
35
36
  assert_config_default :log_exception_on_send_failure, false
36
37
  assert_config_default :fingerprint, nil
@@ -138,7 +139,7 @@ describe Honeybadger::Configuration do
138
139
  :proxy_host, :proxy_pass, :proxy_port, :proxy_user, :secure,
139
140
  :source_extract_radius, :async, :send_request_session, :debug,
140
141
  :fingerprint, :hostname, :features, :metrics, :feedback,
141
- :log_exception_on_send_failure].each do |option|
142
+ :log_exception_on_send_failure, :unwrap_exceptions].each do |option|
142
143
  expect(hash[option]).to eq config[option]
143
144
  end
144
145
  end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Local variables integration" do
4
+ before do
5
+ Honeybadger.configuration.send_local_variables = config_enabled
6
+ Honeybadger::Dependency.inject!
7
+ end
8
+
9
+ subject { Exception.new }
10
+
11
+ context "when binding_of_caller isn't installed", :unless => defined?(::BindingOfCaller) do
12
+ let(:config_enabled) { true }
13
+ it { should_not respond_to :__honeybadger_bindings_stack }
14
+ end
15
+
16
+ context "when binding_of_caller is installed", :if => defined?(::BindingOfCaller) do
17
+ context "and disabled by configuration" do
18
+ let(:config_enabled) { false }
19
+ it { should_not respond_to :__honeybadger_bindings_stack }
20
+ end
21
+
22
+ context "and enabled by configuration" do
23
+ let(:config_enabled) { true }
24
+
25
+ it { should respond_to :__honeybadger_bindings_stack }
26
+
27
+ describe "#set_backtrace" do
28
+ context "call stack does not match current file" do
29
+ it "changes the bindings stack" do
30
+ expect { subject.set_backtrace(['foo.rb:1']) }.to change(subject, :__honeybadger_bindings_stack).from([])
31
+ end
32
+ end
33
+
34
+ context "call stack includes current file" do
35
+ before do
36
+ subject.stub(:caller).and_return(["#{File.expand_path('../../../../lib/honeybadger/integrations/local_variables.rb', __FILE__)}:1"])
37
+ end
38
+
39
+ it "does not change the bindings stack" do
40
+ expect { subject.set_backtrace(['foo.rb:1']) }.not_to change(subject, :__honeybadger_bindings_stack).from([])
41
+ end
42
+ end
43
+
44
+ context "call stack includes a non-matching line" do
45
+ before do
46
+ subject.stub(:caller).and_return(['(foo)'])
47
+ end
48
+
49
+ it "skips the non-matching line" do
50
+ expect { subject.set_backtrace(['foo.rb:1']) }.not_to raise_error
51
+ end
52
+
53
+ it "changes the bindings stack" do
54
+ expect { subject.set_backtrace(['foo.rb:1']) }.to change(subject, :__honeybadger_bindings_stack).from([])
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -233,7 +233,7 @@ describe 'Honeybadger' do
233
233
  config_opts = { 'one' => 'two', 'three' => 'four' }
234
234
  stub_notice!
235
235
  stub_sender!
236
- Honeybadger.configuration = double('config', :merge => config_opts, :public? => true, :async? => false)
236
+ Honeybadger.configuration = double('config', :merge => config_opts, :public? => true, :async? => false, :unwrap_exceptions => false)
237
237
 
238
238
  Honeybadger::Notice.should_receive(:new).with(hash_including(config_opts))
239
239
  Honeybadger.notify(exception)
@@ -299,6 +299,15 @@ describe 'Honeybadger' do
299
299
  @hash = Honeybadger.build_lookup_hash_for(@exception)
300
300
  expect(@hash[:error_class]).to eq "OriginalException"
301
301
  end
302
+
303
+ context "but unwrapping exceptions is disabled" do
304
+ before { Honeybadger.configuration.unwrap_exceptions = false }
305
+
306
+ it "doesn't unwrap the exception" do
307
+ @hash = Honeybadger.build_lookup_hash_for(@exception)
308
+ expect(@hash[:error_class]).not_to eq "OriginalException"
309
+ end
310
+ end
302
311
  end
303
312
 
304
313
  context "when an exception that provides #continued_exception is raised" do
@@ -131,7 +131,11 @@ begin
131
131
  end
132
132
 
133
133
  opts[:request].query_parameters = opts[:request].query_parameters.merge(opts[:params] || {})
134
- opts[:request].session = ActionController::TestSession.new(opts[:session] || {})
134
+ opts[:request].session = if opts.include?(:session) && opts[:session].nil?
135
+ nil
136
+ else
137
+ ActionController::TestSession.new(opts[:session] || {})
138
+ end
135
139
  # Prevents request.fullpath from crashing Rails in tests
136
140
  opts[:request].env['REQUEST_URI'] = opts[:request].request_uri
137
141
 
@@ -240,6 +244,11 @@ begin
240
244
  assert_sent_hash(data) { |h| h['request']['session'] }
241
245
  end
242
246
 
247
+ it "fails gracefully when session isn nil" do
248
+ process_action_with_automatic_notification(:session => nil)
249
+ assert_sent_hash({}) { |h| h['request']['session'] }
250
+ end
251
+
243
252
  it "send request data for manual notification" do
244
253
  params = { 'controller' => "honeybadger_test", 'action' => "index" }
245
254
  controller = process_action_with_manual_notification(:params => params)
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,12 @@
1
1
  require 'rspec'
2
2
  require 'honeybadger'
3
3
 
4
+ begin
5
+ require 'binding_of_caller'
6
+ rescue LoadError
7
+ nil
8
+ end
9
+
4
10
  # Require files in spec/support/ and its subdirectories.
5
11
  Dir[File.expand_path('../../spec/support/**/*.rb', __FILE__)].each {|f| require f}
6
12
 
metadata CHANGED
@@ -1,195 +1,222 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeybadger
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.16.2
4
+ version: 1.16.3
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Joshua Wood
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-07-16 00:00:00.000000000 Z
12
+ date: 2014-07-21 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: json
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - ">="
19
+ - - ! '>='
18
20
  - !ruby/object:Gem::Version
19
21
  version: '0'
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - ">="
27
+ - - ! '>='
25
28
  - !ruby/object:Gem::Version
26
29
  version: '0'
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: cucumber
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
- - - "~>"
35
+ - - ~>
32
36
  - !ruby/object:Gem::Version
33
37
  version: 1.3.10
34
38
  type: :development
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
- - - "~>"
43
+ - - ~>
39
44
  - !ruby/object:Gem::Version
40
45
  version: 1.3.10
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: rspec
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
- - - "~>"
51
+ - - ~>
46
52
  - !ruby/object:Gem::Version
47
53
  version: 2.14.0
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
- - - "~>"
59
+ - - ~>
53
60
  - !ruby/object:Gem::Version
54
61
  version: 2.14.0
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: sham_rack
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
- - - "~>"
67
+ - - ~>
60
68
  - !ruby/object:Gem::Version
61
69
  version: 1.3.0
62
70
  type: :development
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
- - - "~>"
75
+ - - ~>
67
76
  - !ruby/object:Gem::Version
68
77
  version: 1.3.0
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: capistrano
71
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
- - - "~>"
83
+ - - ~>
74
84
  - !ruby/object:Gem::Version
75
85
  version: '2.0'
76
86
  type: :development
77
87
  prerelease: false
78
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
79
90
  requirements:
80
- - - "~>"
91
+ - - ~>
81
92
  - !ruby/object:Gem::Version
82
93
  version: '2.0'
83
94
  - !ruby/object:Gem::Dependency
84
95
  name: guard
85
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
86
98
  requirements:
87
- - - "~>"
99
+ - - ~>
88
100
  - !ruby/object:Gem::Version
89
101
  version: 1.8.3
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
93
106
  requirements:
94
- - - "~>"
107
+ - - ~>
95
108
  - !ruby/object:Gem::Version
96
109
  version: 1.8.3
97
110
  - !ruby/object:Gem::Dependency
98
111
  name: guard-rspec
99
112
  requirement: !ruby/object:Gem::Requirement
113
+ none: false
100
114
  requirements:
101
- - - ">="
115
+ - - ! '>='
102
116
  - !ruby/object:Gem::Version
103
117
  version: '0'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
107
122
  requirements:
108
- - - ">="
123
+ - - ! '>='
109
124
  - !ruby/object:Gem::Version
110
125
  version: '0'
111
126
  - !ruby/object:Gem::Dependency
112
127
  name: rake
113
128
  requirement: !ruby/object:Gem::Requirement
129
+ none: false
114
130
  requirements:
115
- - - ">="
131
+ - - ! '>='
116
132
  - !ruby/object:Gem::Version
117
133
  version: '0'
118
134
  type: :development
119
135
  prerelease: false
120
136
  version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
121
138
  requirements:
122
- - - ">="
139
+ - - ! '>='
123
140
  - !ruby/object:Gem::Version
124
141
  version: '0'
125
142
  - !ruby/object:Gem::Dependency
126
143
  name: sinatra
127
144
  requirement: !ruby/object:Gem::Requirement
145
+ none: false
128
146
  requirements:
129
- - - ">="
147
+ - - ! '>='
130
148
  - !ruby/object:Gem::Version
131
149
  version: '0'
132
150
  type: :development
133
151
  prerelease: false
134
152
  version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
135
154
  requirements:
136
- - - ">="
155
+ - - ! '>='
137
156
  - !ruby/object:Gem::Version
138
157
  version: '0'
139
158
  - !ruby/object:Gem::Dependency
140
159
  name: aruba
141
160
  requirement: !ruby/object:Gem::Requirement
161
+ none: false
142
162
  requirements:
143
- - - ">="
163
+ - - ! '>='
144
164
  - !ruby/object:Gem::Version
145
165
  version: '0'
146
166
  type: :development
147
167
  prerelease: false
148
168
  version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
149
170
  requirements:
150
- - - ">="
171
+ - - ! '>='
151
172
  - !ruby/object:Gem::Version
152
173
  version: '0'
153
174
  - !ruby/object:Gem::Dependency
154
175
  name: appraisal
155
176
  requirement: !ruby/object:Gem::Requirement
177
+ none: false
156
178
  requirements:
157
- - - ">="
179
+ - - ! '>='
158
180
  - !ruby/object:Gem::Version
159
181
  version: '0'
160
182
  type: :development
161
183
  prerelease: false
162
184
  version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
163
186
  requirements:
164
- - - ">="
187
+ - - ! '>='
165
188
  - !ruby/object:Gem::Version
166
189
  version: '0'
167
190
  - !ruby/object:Gem::Dependency
168
191
  name: fuubar
169
192
  requirement: !ruby/object:Gem::Requirement
193
+ none: false
170
194
  requirements:
171
- - - ">="
195
+ - - ! '>='
172
196
  - !ruby/object:Gem::Version
173
197
  version: '0'
174
198
  type: :development
175
199
  prerelease: false
176
200
  version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
177
202
  requirements:
178
- - - ">="
203
+ - - ! '>='
179
204
  - !ruby/object:Gem::Version
180
205
  version: '0'
181
206
  - !ruby/object:Gem::Dependency
182
207
  name: growl
183
208
  requirement: !ruby/object:Gem::Requirement
209
+ none: false
184
210
  requirements:
185
- - - ">="
211
+ - - ! '>='
186
212
  - !ruby/object:Gem::Version
187
213
  version: '0'
188
214
  type: :development
189
215
  prerelease: false
190
216
  version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
191
218
  requirements:
192
- - - ">="
219
+ - - ! '>='
193
220
  - !ruby/object:Gem::Version
194
221
  version: '0'
195
222
  description: Make managing application errors a more pleasant experience.
@@ -257,10 +284,10 @@ files:
257
284
  - lib/honeybadger/capistrano/tasks.rake
258
285
  - lib/honeybadger/configuration.rb
259
286
  - lib/honeybadger/dependency.rb
260
- - lib/honeybadger/exception_extensions.rb
261
287
  - lib/honeybadger/integrations.rb
262
288
  - lib/honeybadger/integrations/delayed_job.rb
263
289
  - lib/honeybadger/integrations/delayed_job/plugin.rb
290
+ - lib/honeybadger/integrations/local_variables.rb
264
291
  - lib/honeybadger/integrations/net_http.rb
265
292
  - lib/honeybadger/integrations/passenger.rb
266
293
  - lib/honeybadger/integrations/sidekiq.rb
@@ -301,8 +328,8 @@ files:
301
328
  - spec/honeybadger/capistrano_spec.rb
302
329
  - spec/honeybadger/configuration_spec.rb
303
330
  - spec/honeybadger/dependency_spec.rb
304
- - spec/honeybadger/exception_extensions_spec.rb
305
331
  - spec/honeybadger/integrations/delayed_job_spec.rb
332
+ - spec/honeybadger/integrations/local_variables_spec.rb
306
333
  - spec/honeybadger/integrations/net_http_spec.rb
307
334
  - spec/honeybadger/integrations/passenger_spec.rb
308
335
  - spec/honeybadger/integrations/sidekiq_spec.rb
@@ -330,26 +357,30 @@ files:
330
357
  - spec/support/helpers.rb
331
358
  homepage: http://www.honeybadger.io
332
359
  licenses: []
333
- metadata: {}
334
360
  post_install_message:
335
361
  rdoc_options:
336
- - "--charset=UTF-8"
337
- - "--markup tomdoc"
362
+ - --charset=UTF-8
363
+ - --markup tomdoc
338
364
  require_paths:
339
365
  - lib
340
366
  required_ruby_version: !ruby/object:Gem::Requirement
367
+ none: false
341
368
  requirements:
342
- - - ">="
369
+ - - ! '>='
343
370
  - !ruby/object:Gem::Version
344
371
  version: '0'
372
+ segments:
373
+ - 0
374
+ hash: 3175357828774041606
345
375
  required_rubygems_version: !ruby/object:Gem::Requirement
376
+ none: false
346
377
  requirements:
347
- - - ">="
378
+ - - ! '>='
348
379
  - !ruby/object:Gem::Version
349
380
  version: '0'
350
381
  requirements: []
351
382
  rubyforge_project:
352
- rubygems_version: 2.2.2
383
+ rubygems_version: 1.8.23
353
384
  signing_key:
354
385
  specification_version: 2
355
386
  summary: Error reports you can be happy about.
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 86f0d9ed43c1f392c2eed8701f7dcc311df00c2e
4
- data.tar.gz: 2154070bb26a86dd27e17d7893748ebbd7838d37
5
- SHA512:
6
- metadata.gz: eb0c4089da555f08d4f753abb25809fa1c6def54a276768d1b6e4a14c326da46a2069108caa8a115efb328250670137929e9229b8d190f24db69845f740d151b
7
- data.tar.gz: 9d298e5339abc7a3ebd7a7c53e8d35b606b007d30c092817b6d3a4c38145a8d26df74701344c21a0821ab3e40617dd5d2244e7b25fbd3dce75423ee687384f92
@@ -1,35 +0,0 @@
1
- module Honeybadger
2
- module ExceptionExtensions
3
- module Bindings
4
- def self.included(base)
5
- base.send(:alias_method, :set_backtrace_without_honeybadger, :set_backtrace)
6
- base.send(:alias_method, :set_backtrace, :set_backtrace_with_honeybadger)
7
- end
8
-
9
- def set_backtrace_with_honeybadger(*args, &block)
10
- if caller.none? { |loc| loc.match(Honeybadger::Backtrace::Line::INPUT_FORMAT) && Regexp.last_match(1) == __FILE__ }
11
- @__honeybadger_bindings_stack = binding.callers.drop(1)
12
- end
13
-
14
- set_backtrace_without_honeybadger(*args, &block)
15
- end
16
-
17
- def __honeybadger_bindings_stack
18
- @__honeybadger_bindings_stack || []
19
- end
20
- end
21
-
22
- module NullBindings
23
- def __honeybadger_bindings_stack
24
- []
25
- end
26
- end
27
- end
28
- end
29
-
30
- begin
31
- require 'binding_of_caller'
32
- Exception.send(:include, Honeybadger::ExceptionExtensions::Bindings)
33
- rescue LoadError
34
- Exception.send(:include, Honeybadger::ExceptionExtensions::NullBindings)
35
- end
@@ -1,40 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Exception, :unless => defined?(BindingOfCaller) do
4
- should { respond_to :__honeybadger_bindings_stack }
5
- its(:__honeybadger_bindings_stack) { should eq([]) }
6
- end
7
-
8
- describe Exception, :if => defined?(BindingOfCaller) do
9
- describe "#set_backtrace" do
10
- context "call stack does not match current file" do
11
- it "changes the bindings stack" do
12
- expect { subject.set_backtrace(['foo.rb:1']) }.to change(subject, :__honeybadger_bindings_stack).from([])
13
- end
14
- end
15
-
16
- context "call stack includes current file" do
17
- before do
18
- subject.stub(:caller).and_return(["#{File.expand_path('../../../lib/honeybadger/exception_extensions.rb', __FILE__)}:1"])
19
- end
20
-
21
- it "does not change the bindings stack" do
22
- expect { subject.set_backtrace(['foo.rb:1']) }.not_to change(subject, :__honeybadger_bindings_stack).from([])
23
- end
24
- end
25
-
26
- context "call stack includes a non-matching line" do
27
- before do
28
- subject.stub(:caller).and_return(['(foo)'])
29
- end
30
-
31
- it "skips the non-matching line" do
32
- expect { subject.set_backtrace(['foo.rb:1']) }.not_to raise_error
33
- end
34
-
35
- it "changes the bindings stack" do
36
- expect { subject.set_backtrace(['foo.rb:1']) }.to change(subject, :__honeybadger_bindings_stack).from([])
37
- end
38
- end
39
- end
40
- end