honeybadger 1.13.2 → 1.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/Appraisals +60 -45
  3. data/CHANGELOG.md +30 -1
  4. data/Gemfile.lock +1 -1
  5. data/MIT-LICENSE +2 -1
  6. data/Rakefile +8 -4
  7. data/features/standalone.feature +73 -0
  8. data/features/step_definitions/rack_steps.rb +1 -2
  9. data/features/step_definitions/standalone_steps.rb +12 -0
  10. data/features/step_definitions/thor_steps.rb +4 -0
  11. data/features/support/env.rb +2 -0
  12. data/features/support/test.thor +22 -0
  13. data/features/thor.feature +5 -0
  14. data/gemfiles/binding_of_caller.gemfile +8 -0
  15. data/gemfiles/rails.gemfile +11 -0
  16. data/gemfiles/rake.gemfile +1 -1
  17. data/gemfiles/standalone.gemfile +7 -0
  18. data/gemfiles/thor.gemfile +8 -0
  19. data/honeybadger.gemspec +27 -11
  20. data/lib/honeybadger.rb +15 -10
  21. data/lib/honeybadger/configuration.rb +9 -4
  22. data/lib/honeybadger/dependency.rb +65 -0
  23. data/lib/honeybadger/exception_extensions.rb +35 -0
  24. data/lib/honeybadger/integrations.rb +5 -0
  25. data/lib/honeybadger/integrations/delayed_job.rb +20 -0
  26. data/lib/honeybadger/integrations/delayed_job/plugin.rb +31 -0
  27. data/lib/honeybadger/integrations/sidekiq.rb +17 -9
  28. data/lib/honeybadger/integrations/thor.rb +29 -0
  29. data/lib/honeybadger/notice.rb +47 -99
  30. data/lib/honeybadger/payload.rb +101 -0
  31. data/lib/honeybadger/rack.rb +8 -54
  32. data/lib/honeybadger/rack/error_notifier.rb +60 -0
  33. data/lib/honeybadger/rack/user_feedback.rb +74 -0
  34. data/lib/honeybadger/rack/user_informer.rb +28 -0
  35. data/lib/honeybadger/rails.rb +5 -4
  36. data/lib/honeybadger/railtie.rb +4 -3
  37. data/lib/honeybadger/user_feedback.rb +3 -67
  38. data/lib/honeybadger/user_informer.rb +3 -21
  39. data/spec/honeybadger/configuration_spec.rb +5 -1
  40. data/spec/honeybadger/dependency_spec.rb +134 -0
  41. data/spec/honeybadger/exception_extensions_spec.rb +40 -0
  42. data/spec/honeybadger/integrations/delayed_job_spec.rb +48 -0
  43. data/spec/honeybadger/integrations/sidekiq_spec.rb +60 -0
  44. data/spec/honeybadger/integrations/thor_spec.rb +29 -0
  45. data/spec/honeybadger/notice_spec.rb +137 -127
  46. data/spec/honeybadger/payload_spec.rb +162 -0
  47. data/spec/honeybadger/rack_spec.rb +6 -6
  48. data/spec/honeybadger/rails/action_controller_spec.rb +2 -0
  49. data/spec/honeybadger/rails_spec.rb +4 -2
  50. data/spec/honeybadger/user_feedback_spec.rb +2 -2
  51. data/spec/honeybadger/user_informer_spec.rb +3 -3
  52. metadata +49 -66
  53. data/gemfiles/rack.gemfile.lock +0 -125
  54. data/gemfiles/rails2.3.gemfile.lock +0 -141
  55. data/gemfiles/rails3.0.gemfile.lock +0 -193
  56. data/gemfiles/rails3.1.gemfile.lock +0 -203
  57. data/gemfiles/rails3.2.gemfile.lock +0 -201
  58. data/gemfiles/rails4.0.gemfile.lock +0 -197
  59. data/gemfiles/rails4.1.gemfile.lock +0 -202
  60. data/gemfiles/rake.gemfile.lock +0 -124
  61. data/gemfiles/sinatra.gemfile.lock +0 -124
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+
3
+ describe Honeybadger::Payload do
4
+ its(:max_depth) { should eq 20 }
5
+
6
+ context "when max_depth option is passed to #initialize" do
7
+ subject { described_class.new({}, :max_depth => 5) }
8
+ its(:max_depth) { should eq 5 }
9
+
10
+ context "when initialized with a bad object" do
11
+ it "raises ArgumentError" do
12
+ expect { described_class.new([], :max_depth => 5) }.to raise_error(ArgumentError)
13
+ end
14
+ end
15
+ end
16
+
17
+ describe "#sanitize" do
18
+ let(:deep_hash) { {}.tap {|h| 30.times.each {|i| h = h[i.to_s] = {:string => 'string'} }} }
19
+ let(:expected_hash) { {}.tap {|h| max_depth.times.each {|i| h = h[i.to_s] = (i < max_depth-1 ? {:string => 'string'} : '[max depth reached]') }} }
20
+ let(:sanitized_hash) { described_class.new(deep_hash, :max_depth => max_depth) }
21
+ let(:max_depth) { 10 }
22
+
23
+ it "truncates nested hashes to max_depth" do
24
+ expect(sanitized_hash['0']).to eq(expected_hash['0'])
25
+ end
26
+
27
+ it "does not allow infinite recursion" do
28
+ hash = {:a => :a}
29
+ hash[:hash] = hash
30
+ payload = described_class.new(:request => {:params => hash})
31
+ expect(payload.request[:params][:hash]).to eq "[possible infinite recursion halted]"
32
+ end
33
+
34
+ it "converts unserializable objects to strings" do
35
+ assert_serializes(:request, :parameters)
36
+ assert_serializes(:request, :cgi_data)
37
+ assert_serializes(:request, :session_data)
38
+ assert_serializes(:request, :local_variables)
39
+ end
40
+
41
+ it "ensures #to_hash is called on objects that support it" do
42
+ expect { described_class.new(:session => { :object => double(:to_hash => {}) }) }.not_to raise_error
43
+ end
44
+
45
+ it "ensures #to_ary is called on objects that support it" do
46
+ expect { described_class.new(:session => { :object => double(:to_ary => {}) }) }.not_to raise_error
47
+ end
48
+ end
49
+
50
+ it "filters parameters" do
51
+ assert_filters_request(:params)
52
+ end
53
+
54
+ it "filters cgi data" do
55
+ assert_filters_request(:cgi_data)
56
+ end
57
+
58
+ it "filters session" do
59
+ assert_filters_request(:session)
60
+ end
61
+
62
+ it "filters local_variables" do
63
+ assert_filters_request(:local_variables)
64
+ end
65
+
66
+ context 'filtered parameters in query string' do
67
+ let(:params_filters) { [:foo, :bar] }
68
+
69
+ describe '#url' do
70
+ subject { described_class.new({:request => {:url => 'https://www.honeybadger.io/?foo=1&bar=2&baz=3'}}, :filters => params_filters).request[:url] }
71
+
72
+ it 'filters query' do
73
+ expect(subject).to eq 'https://www.honeybadger.io/?foo=[FILTERED]&bar=[FILTERED]&baz=3'
74
+ end
75
+ end
76
+
77
+ describe '#cgi_data' do
78
+ let(:cgi_data) { { 'QUERY_STRING' => 'foo=1&bar=2&baz=3', 'ORIGINAL_FULLPATH' => '/?foo=1&bar=2&baz=3' } }
79
+
80
+ subject { described_class.new({:request => {:cgi_data => cgi_data}}, :filters => params_filters).request[:cgi_data] }
81
+
82
+ it 'filters QUERY_STRING key' do
83
+ expect(subject['QUERY_STRING']).to eq 'foo=[FILTERED]&bar=[FILTERED]&baz=3'
84
+ end
85
+
86
+ it 'filters ORIGINAL_FULLPATH key' do
87
+ expect(subject['ORIGINAL_FULLPATH']).to eq '/?foo=[FILTERED]&bar=[FILTERED]&baz=3'
88
+ end
89
+ end
90
+ end
91
+
92
+ describe '#filter_url!' do
93
+ subject { described_class.new.send(:filter_url!, url) }
94
+
95
+ context 'malformed query' do
96
+ let(:url) { 'https://www.honeybadger.io/?foobar12' }
97
+ it { should eq url }
98
+ end
99
+
100
+ context 'no query' do
101
+ let(:url) { 'https://www.honeybadger.io' }
102
+ it { should eq url }
103
+ end
104
+
105
+ context 'malformed url' do
106
+ let(:url) { 'http s ! honeybadger' }
107
+ before { expect { URI.parse(url) }.to raise_error }
108
+ it { should eq url }
109
+ end
110
+
111
+ context 'complex url' do
112
+ let(:url) { 'https://foo:bar@www.honeybadger.io:123/asdf/?foo=1&bar=2&baz=3' }
113
+ it { should eq url }
114
+ end
115
+ end
116
+
117
+ def assert_serializes(*keys)
118
+ [File.open(__FILE__), Proc.new { puts "boo!" }, Module.new].each do |object|
119
+ hash = {
120
+ :strange_object => object,
121
+ :sub_hash => {
122
+ :sub_object => object
123
+ },
124
+ :array => [object]
125
+ }
126
+
127
+ payload_keys = keys.dup
128
+ last_key = payload_keys.pop
129
+ payload = described_class.new(payload_keys.reverse.reduce({last_key => hash}) { |a,k| {k => a} })
130
+
131
+ first_key = keys.shift
132
+ hash = keys.reduce(payload[first_key]) {|a,k| a[k] }
133
+
134
+ expect(hash[:strange_object]).to eq object.to_s # objects should be serialized
135
+ expect(hash[:sub_hash]).to be_a Hash # subhashes should be kept
136
+ expect(hash[:sub_hash][:sub_object]).to eq object.to_s # subhash members should be serialized
137
+ expect(hash[:array]).to be_a Array # arrays should be kept
138
+ expect(hash[:array].first).to eq object.to_s # array members should be serialized
139
+ end
140
+ end
141
+
142
+ def assert_filters_request(attribute)
143
+ filters = ["abc", :def, /private/, /^foo_.*$/]
144
+ original = { 'abc' => "123", 'def' => "456", 'ghi' => "789", 'nested' => { 'abc' => '100' },
145
+ 'something_with_abc' => 'match the entire string', 'private_param' => 'prra',
146
+ 'foo_param' => 'bar', 'not_foo_param' => 'baz', 'nested_foo' => { 'foo_nested' => 'bla'} }
147
+ filtered = { 'abc' => "[FILTERED]",
148
+ 'def' => "[FILTERED]",
149
+ 'something_with_abc' => "match the entire string",
150
+ 'ghi' => "789",
151
+ 'nested' => { 'abc' => '[FILTERED]' },
152
+ 'private_param' => '[FILTERED]',
153
+ 'foo_param' => '[FILTERED]',
154
+ 'not_foo_param' => 'baz',
155
+ 'nested_foo' => { 'foo_nested' => '[FILTERED]'}
156
+ }
157
+
158
+ payload = described_class.new({:request => {attribute => original}}, {:filters => filters})
159
+
160
+ expect(payload.request[attribute]).to eq filtered
161
+ end
162
+ end
@@ -1,11 +1,11 @@
1
1
  require 'spec_helper'
2
2
  require 'rack'
3
3
 
4
- describe Honeybadger::Rack do
4
+ describe Honeybadger::Rack::ErrorNotifier do
5
5
  it "calls the upstream app with the environment" do
6
6
  environment = { 'key' => 'value' }
7
7
  app = lambda { |env| ['response', {}, env] }
8
- stack = Honeybadger::Rack.new(app)
8
+ stack = Honeybadger::Rack::ErrorNotifier.new(app)
9
9
 
10
10
  response = stack.call(environment)
11
11
 
@@ -24,7 +24,7 @@ describe Honeybadger::Rack do
24
24
  Honeybadger.should_receive(:notify_or_ignore).with(exception, :rack_env => environment)
25
25
 
26
26
  begin
27
- stack = Honeybadger::Rack.new(app)
27
+ stack = Honeybadger::Rack::ErrorNotifier.new(app)
28
28
  stack.call(environment)
29
29
  rescue Exception => raised
30
30
  expect(raised).to eq exception
@@ -43,7 +43,7 @@ describe Honeybadger::Rack do
43
43
  env['rack.exception'] = exception
44
44
  response
45
45
  end
46
- stack = Honeybadger::Rack.new(app)
46
+ stack = Honeybadger::Rack::ErrorNotifier.new(app)
47
47
 
48
48
  Honeybadger.should_receive(:notify_or_ignore).with(exception, :rack_env => environment)
49
49
 
@@ -62,7 +62,7 @@ describe Honeybadger::Rack do
62
62
  env['sinatra.error'] = exception
63
63
  response
64
64
  end
65
- stack = Honeybadger::Rack.new(app)
65
+ stack = Honeybadger::Rack::ErrorNotifier.new(app)
66
66
 
67
67
  Honeybadger.should_receive(:notify_or_ignore).with(exception, :rack_env => environment)
68
68
 
@@ -76,7 +76,7 @@ describe Honeybadger::Rack do
76
76
  expect(Thread.current[:honeybadger_context]).to eq({ :foo => :bar })
77
77
 
78
78
  app = lambda { |env| ['response', {}, env] }
79
- stack = Honeybadger::Rack.new(app)
79
+ stack = Honeybadger::Rack::ErrorNotifier.new(app)
80
80
 
81
81
  stack.call({})
82
82
 
@@ -52,6 +52,8 @@ begin
52
52
  data.collect do |value|
53
53
  stringify_array_elements(value)
54
54
  end
55
+ elsif Honeybadger::Payload::OBJECT_WHITELIST.any? {|c| data.kind_of?(c) }
56
+ data
55
57
  else
56
58
  data.to_s
57
59
  end
@@ -1,7 +1,9 @@
1
1
  require 'spec_helper'
2
- require 'honeybadger/rails'
3
2
 
4
- describe Honeybadger::Rails do
3
+ # This test should be run only when Rails is not bundled
4
+ require 'honeybadger/rails' unless defined?(ActionController::Base)
5
+
6
+ describe 'Honeybadger::Rails', :unless => defined?(ActionController::Base) do
5
7
  include DefinesConstants
6
8
 
7
9
  it "triggers use of Rails' logger if logger isn't set and Rails' logger exists" do
@@ -1,14 +1,14 @@
1
1
  require 'spec_helper'
2
2
  require 'sham_rack'
3
3
 
4
- describe Honeybadger::UserFeedback do
4
+ describe Honeybadger::Rack::UserFeedback do
5
5
  let(:main_app) do
6
6
  lambda do |env|
7
7
  env['honeybadger.error_id'] = honeybadger_id if defined?(honeybadger_id)
8
8
  [200, {}, ["<!-- HONEYBADGER FEEDBACK -->"]]
9
9
  end
10
10
  end
11
- let(:informer_app) { Honeybadger::UserFeedback.new(main_app) }
11
+ let(:informer_app) { Honeybadger::Rack::UserFeedback.new(main_app) }
12
12
  let(:response) { Net::HTTP.get_response(URI.parse("http://example.com/")) }
13
13
 
14
14
  before do
@@ -1,13 +1,13 @@
1
1
  require 'spec_helper'
2
2
  require 'sham_rack'
3
3
 
4
- describe Honeybadger::UserInformer do
4
+ describe Honeybadger::Rack::UserInformer do
5
5
  it 'modifies output if there is a honeybadger id' do
6
6
  main_app = lambda do |env|
7
7
  env['honeybadger.error_id'] = 1
8
8
  [200, {}, ["<!-- HONEYBADGER ERROR -->"]]
9
9
  end
10
- informer_app = Honeybadger::UserInformer.new(main_app)
10
+ informer_app = Honeybadger::Rack::UserInformer.new(main_app)
11
11
 
12
12
  ShamRack.mount(informer_app, "example.com")
13
13
 
@@ -20,7 +20,7 @@ describe Honeybadger::UserInformer do
20
20
  main_app = lambda do |env|
21
21
  [200, {}, ["<!-- HONEYBADGER ERROR -->"]]
22
22
  end
23
- informer_app = Honeybadger::UserInformer.new(main_app)
23
+ informer_app = Honeybadger::Rack::UserInformer.new(main_app)
24
24
 
25
25
  ShamRack.mount(informer_app, "example.com")
26
26
 
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeybadger
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.13.2
5
- prerelease:
4
+ version: 1.14.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Joshua Wood
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-05-22 00:00:00.000000000 Z
11
+ date: 2014-05-28 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: json
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: cucumber
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: sham_rack
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: capistrano
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ~>
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ~>
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: guard
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ~>
108
95
  - !ruby/object:Gem::Version
@@ -110,129 +97,113 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: guard-rspec
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: rake
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - '>='
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - '>='
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: sinatra
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
- - - ! '>='
129
+ - - '>='
148
130
  - !ruby/object:Gem::Version
149
131
  version: '0'
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
- - - ! '>='
136
+ - - '>='
156
137
  - !ruby/object:Gem::Version
157
138
  version: '0'
158
139
  - !ruby/object:Gem::Dependency
159
140
  name: aruba
160
141
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
142
  requirements:
163
- - - ! '>='
143
+ - - '>='
164
144
  - !ruby/object:Gem::Version
165
145
  version: '0'
166
146
  type: :development
167
147
  prerelease: false
168
148
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
149
  requirements:
171
- - - ! '>='
150
+ - - '>='
172
151
  - !ruby/object:Gem::Version
173
152
  version: '0'
174
153
  - !ruby/object:Gem::Dependency
175
154
  name: appraisal
176
155
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
156
  requirements:
179
- - - ! '>='
157
+ - - '>='
180
158
  - !ruby/object:Gem::Version
181
159
  version: '0'
182
160
  type: :development
183
161
  prerelease: false
184
162
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
163
  requirements:
187
- - - ! '>='
164
+ - - '>='
188
165
  - !ruby/object:Gem::Version
189
166
  version: '0'
190
167
  - !ruby/object:Gem::Dependency
191
168
  name: fuubar
192
169
  requirement: !ruby/object:Gem::Requirement
193
- none: false
194
170
  requirements:
195
- - - ! '>='
171
+ - - '>='
196
172
  - !ruby/object:Gem::Version
197
173
  version: '0'
198
174
  type: :development
199
175
  prerelease: false
200
176
  version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
177
  requirements:
203
- - - ! '>='
178
+ - - '>='
204
179
  - !ruby/object:Gem::Version
205
180
  version: '0'
206
181
  - !ruby/object:Gem::Dependency
207
182
  name: growl
208
183
  requirement: !ruby/object:Gem::Requirement
209
- none: false
210
184
  requirements:
211
- - - ! '>='
185
+ - - '>='
212
186
  - !ruby/object:Gem::Version
213
187
  version: '0'
214
188
  type: :development
215
189
  prerelease: false
216
190
  version_requirements: !ruby/object:Gem::Requirement
217
- none: false
218
191
  requirements:
219
- - - ! '>='
192
+ - - '>='
220
193
  - !ruby/object:Gem::Version
221
194
  version: '0'
222
195
  - !ruby/object:Gem::Dependency
223
196
  name: webmock
224
197
  requirement: !ruby/object:Gem::Requirement
225
- none: false
226
198
  requirements:
227
- - - ! '>='
199
+ - - '>='
228
200
  - !ruby/object:Gem::Version
229
201
  version: '0'
230
202
  type: :development
231
203
  prerelease: false
232
204
  version_requirements: !ruby/object:Gem::Requirement
233
- none: false
234
205
  requirements:
235
- - - ! '>='
206
+ - - '>='
236
207
  - !ruby/object:Gem::Version
237
208
  version: '0'
238
209
  description: Make managing application errors a more pleasant experience.
@@ -257,33 +228,33 @@ files:
257
228
  - features/rails3.x.feature
258
229
  - features/rake.feature
259
230
  - features/sinatra.feature
231
+ - features/standalone.feature
260
232
  - features/step_definitions/metal_steps.rb
261
233
  - features/step_definitions/rack_steps.rb
262
234
  - features/step_definitions/rails_steps.rb
263
235
  - features/step_definitions/rake_steps.rb
236
+ - features/step_definitions/standalone_steps.rb
237
+ - features/step_definitions/thor_steps.rb
264
238
  - features/support/env.rb
265
239
  - features/support/honeybadger_failure_shim.rb.template
266
240
  - features/support/honeybadger_shim.rb.template
267
241
  - features/support/rails.rb
268
242
  - features/support/rake/Rakefile
243
+ - features/support/test.thor
244
+ - features/thor.feature
245
+ - gemfiles/binding_of_caller.gemfile
269
246
  - gemfiles/rack.gemfile
270
- - gemfiles/rack.gemfile.lock
247
+ - gemfiles/rails.gemfile
271
248
  - gemfiles/rails2.3.gemfile
272
- - gemfiles/rails2.3.gemfile.lock
273
249
  - gemfiles/rails3.0.gemfile
274
- - gemfiles/rails3.0.gemfile.lock
275
250
  - gemfiles/rails3.1.gemfile
276
- - gemfiles/rails3.1.gemfile.lock
277
251
  - gemfiles/rails3.2.gemfile
278
- - gemfiles/rails3.2.gemfile.lock
279
252
  - gemfiles/rails4.0.gemfile
280
- - gemfiles/rails4.0.gemfile.lock
281
253
  - gemfiles/rails4.1.gemfile
282
- - gemfiles/rails4.1.gemfile.lock
283
254
  - gemfiles/rake.gemfile
284
- - gemfiles/rake.gemfile.lock
285
255
  - gemfiles/sinatra.gemfile
286
- - gemfiles/sinatra.gemfile.lock
256
+ - gemfiles/standalone.gemfile
257
+ - gemfiles/thor.gemfile
287
258
  - generators/honeybadger/honeybadger_generator.rb
288
259
  - generators/honeybadger/lib/insert_commands.rb
289
260
  - generators/honeybadger/lib/rake_commands.rb
@@ -298,13 +269,23 @@ files:
298
269
  - lib/honeybadger/capistrano/legacy.rb
299
270
  - lib/honeybadger/capistrano/tasks.rake
300
271
  - lib/honeybadger/configuration.rb
272
+ - lib/honeybadger/dependency.rb
273
+ - lib/honeybadger/exception_extensions.rb
274
+ - lib/honeybadger/integrations.rb
275
+ - lib/honeybadger/integrations/delayed_job.rb
276
+ - lib/honeybadger/integrations/delayed_job/plugin.rb
301
277
  - lib/honeybadger/integrations/sidekiq.rb
278
+ - lib/honeybadger/integrations/thor.rb
302
279
  - lib/honeybadger/monitor.rb
303
280
  - lib/honeybadger/monitor/railtie.rb
304
281
  - lib/honeybadger/monitor/sender.rb
305
282
  - lib/honeybadger/monitor/worker.rb
306
283
  - lib/honeybadger/notice.rb
284
+ - lib/honeybadger/payload.rb
307
285
  - lib/honeybadger/rack.rb
286
+ - lib/honeybadger/rack/error_notifier.rb
287
+ - lib/honeybadger/rack/user_feedback.rb
288
+ - lib/honeybadger/rack/user_informer.rb
308
289
  - lib/honeybadger/rails.rb
309
290
  - lib/honeybadger/rails/action_controller_catcher.rb
310
291
  - lib/honeybadger/rails/controller_methods.rb
@@ -328,10 +309,16 @@ files:
328
309
  - spec/honeybadger/backtrace_spec.rb
329
310
  - spec/honeybadger/capistrano_spec.rb
330
311
  - spec/honeybadger/configuration_spec.rb
312
+ - spec/honeybadger/dependency_spec.rb
313
+ - spec/honeybadger/exception_extensions_spec.rb
314
+ - spec/honeybadger/integrations/delayed_job_spec.rb
315
+ - spec/honeybadger/integrations/sidekiq_spec.rb
316
+ - spec/honeybadger/integrations/thor_spec.rb
331
317
  - spec/honeybadger/logger_spec.rb
332
318
  - spec/honeybadger/monitor/worker_spec.rb
333
319
  - spec/honeybadger/notice_spec.rb
334
320
  - spec/honeybadger/notifier_spec.rb
321
+ - spec/honeybadger/payload_spec.rb
335
322
  - spec/honeybadger/rack_spec.rb
336
323
  - spec/honeybadger/rails/action_controller_spec.rb
337
324
  - spec/honeybadger/rails_spec.rb
@@ -348,6 +335,7 @@ files:
348
335
  - spec/support/helpers.rb
349
336
  homepage: http://www.honeybadger.io
350
337
  licenses: []
338
+ metadata: {}
351
339
  post_install_message:
352
340
  rdoc_options:
353
341
  - --charset=UTF-8
@@ -355,23 +343,18 @@ rdoc_options:
355
343
  require_paths:
356
344
  - lib
357
345
  required_ruby_version: !ruby/object:Gem::Requirement
358
- none: false
359
346
  requirements:
360
- - - ! '>='
347
+ - - '>='
361
348
  - !ruby/object:Gem::Version
362
349
  version: '0'
363
- segments:
364
- - 0
365
- hash: 2811727937091942835
366
350
  required_rubygems_version: !ruby/object:Gem::Requirement
367
- none: false
368
351
  requirements:
369
- - - ! '>='
352
+ - - '>='
370
353
  - !ruby/object:Gem::Version
371
354
  version: '0'
372
355
  requirements: []
373
356
  rubyforge_project:
374
- rubygems_version: 1.8.23
357
+ rubygems_version: 2.1.5
375
358
  signing_key:
376
359
  specification_version: 2
377
360
  summary: Error reports you can be happy about.