bugsnag 1.2.0.beta → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --backtrace
2
+ --color
3
+ --format doc
data/Gemfile CHANGED
@@ -8,7 +8,7 @@ gem "httparty", ">= 0.5", "< 1.0"
8
8
  # Add dependencies to develop your gem here.
9
9
  # Include everything needed to run rake, tests, features, etc.
10
10
  group :development do
11
- gem "shoulda", ">= 0"
11
+ gem "rspec", "~> 2.11.0"
12
+ gem "rdoc"
12
13
  gem "jeweler", "~> 1.6.4"
13
- gem "rcov", ">= 0"
14
14
  end
@@ -1,28 +1,29 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activesupport (3.2.8)
5
- i18n (~> 0.6)
6
- multi_json (~> 1.0)
4
+ diff-lcs (1.1.3)
7
5
  git (1.2.5)
8
6
  httparty (0.9.0)
9
7
  multi_json (~> 1.0)
10
8
  multi_xml
11
- i18n (0.6.1)
12
9
  jeweler (1.6.4)
13
10
  bundler (~> 1.0)
14
11
  git (>= 1.2.5)
15
12
  rake
13
+ json (1.7.5)
16
14
  multi_json (1.3.6)
17
15
  multi_xml (0.5.1)
18
16
  rake (0.9.2.2)
19
- rcov (1.0.0)
20
- shoulda (3.1.1)
21
- shoulda-context (~> 1.0)
22
- shoulda-matchers (~> 1.2)
23
- shoulda-context (1.0.0)
24
- shoulda-matchers (1.3.0)
25
- activesupport (>= 3.0.0)
17
+ rdoc (3.12)
18
+ json (~> 1.4)
19
+ rspec (2.11.0)
20
+ rspec-core (~> 2.11.0)
21
+ rspec-expectations (~> 2.11.0)
22
+ rspec-mocks (~> 2.11.0)
23
+ rspec-core (2.11.1)
24
+ rspec-expectations (2.11.3)
25
+ diff-lcs (~> 1.1.3)
26
+ rspec-mocks (2.11.3)
26
27
 
27
28
  PLATFORMS
28
29
  ruby
@@ -31,5 +32,5 @@ DEPENDENCIES
31
32
  httparty (>= 0.5, < 1.0)
32
33
  jeweler (~> 1.6.4)
33
34
  multi_json (~> 1.0)
34
- rcov
35
- shoulda
35
+ rdoc
36
+ rspec (~> 2.11.0)
data/Rakefile CHANGED
@@ -24,25 +24,8 @@ Jeweler::Tasks.new do |gem|
24
24
  end
25
25
  Jeweler::RubygemsDotOrgTasks.new
26
26
 
27
- require 'rake/testtask'
28
- Rake::TestTask.new(:test) do |test|
29
- test.libs << 'lib' << 'test'
30
- test.pattern = 'test/**/test_*.rb'
31
- test.verbose = true
32
- end
33
-
34
- require 'rcov/rcovtask'
35
- Rcov::RcovTask.new do |test|
36
- test.libs << 'test'
37
- test.pattern = 'test/**/test_*.rb'
38
- test.verbose = true
39
- test.rcov_opts << '--exclude "gems/*"'
40
- end
41
-
42
- task :default => :test
43
-
44
- require 'rake/rdoctask'
45
- Rake::RDocTask.new do |rdoc|
27
+ require 'rdoc/task'
28
+ RDoc::Task.new do |rdoc|
46
29
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
47
30
 
48
31
  rdoc.rdoc_dir = 'rdoc'
@@ -50,3 +33,12 @@ Rake::RDocTask.new do |rdoc|
50
33
  rdoc.rdoc_files.include('README*')
51
34
  rdoc.rdoc_files.include('lib/**/*.rb')
52
35
  end
36
+
37
+ # RSpec tasks
38
+ require 'rspec/core'
39
+ require "rspec/core/rake_task"
40
+ RSpec::Core::RakeTask.new(:spec) do |spec|
41
+ spec.pattern = FileList['spec/**/*_spec.rb']
42
+ end
43
+
44
+ task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.0.beta
1
+ 1.2.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "bugsnag"
8
- s.version = "1.2.0.beta"
8
+ s.version = "1.2.0"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["James Smith"]
12
- s.date = "2012-09-29"
12
+ s.date = "2012-09-30"
13
13
  s.description = "Ruby notifier for bugsnag.com"
14
14
  s.email = "james@bugsnag.com"
15
15
  s.extra_rdoc_files = [
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
+ ".rspec",
21
22
  "Gemfile",
22
23
  "Gemfile.lock",
23
24
  "LICENSE.txt",
@@ -41,11 +42,14 @@ Gem::Specification.new do |s|
41
42
  "lib/bugsnag/rails/action_controller_rescue.rb",
42
43
  "lib/bugsnag/rails/controller_methods.rb",
43
44
  "lib/bugsnag/railtie.rb",
45
+ "lib/bugsnag/sidekiq.rb",
44
46
  "lib/bugsnag/tasks.rb",
45
47
  "lib/bugsnag/tasks/bugsnag.rake",
46
48
  "lib/bugsnag/version.rb",
47
49
  "lib/resque/failure/bugsnag.rb",
48
50
  "rails/init.rb",
51
+ "spec/notification_spec.rb",
52
+ "spec/spec_helper.rb",
49
53
  "test/helper.rb",
50
54
  "test/test_bugsnag.rb"
51
55
  ]
@@ -61,22 +65,22 @@ Gem::Specification.new do |s|
61
65
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
62
66
  s.add_runtime_dependency(%q<multi_json>, ["~> 1.0"])
63
67
  s.add_runtime_dependency(%q<httparty>, ["< 1.0", ">= 0.5"])
64
- s.add_development_dependency(%q<shoulda>, [">= 0"])
68
+ s.add_development_dependency(%q<rspec>, ["~> 2.11.0"])
69
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
65
70
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
66
- s.add_development_dependency(%q<rcov>, [">= 0"])
67
71
  else
68
72
  s.add_dependency(%q<multi_json>, ["~> 1.0"])
69
73
  s.add_dependency(%q<httparty>, ["< 1.0", ">= 0.5"])
70
- s.add_dependency(%q<shoulda>, [">= 0"])
74
+ s.add_dependency(%q<rspec>, ["~> 2.11.0"])
75
+ s.add_dependency(%q<rdoc>, [">= 0"])
71
76
  s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
72
- s.add_dependency(%q<rcov>, [">= 0"])
73
77
  end
74
78
  else
75
79
  s.add_dependency(%q<multi_json>, ["~> 1.0"])
76
80
  s.add_dependency(%q<httparty>, ["< 1.0", ">= 0.5"])
77
- s.add_dependency(%q<shoulda>, [">= 0"])
81
+ s.add_dependency(%q<rspec>, ["~> 2.11.0"])
82
+ s.add_dependency(%q<rdoc>, [">= 0"])
78
83
  s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
79
- s.add_dependency(%q<rcov>, [">= 0"])
80
84
  end
81
85
  end
82
86
 
@@ -9,6 +9,7 @@ require "bugsnag/rack"
9
9
  require "bugsnag/railtie" if defined?(Rails::Railtie)
10
10
 
11
11
  require "resque/failure/bugsnag" if defined?(Resque)
12
+ require "bugsnag/sidekiq" if defined?(Sidekiq)
12
13
 
13
14
  module Bugsnag
14
15
  LOG_PREFIX = "** [Bugsnag] "
@@ -37,13 +37,26 @@ module Bugsnag
37
37
  hash.inject({}) do |h, (k,v)|
38
38
  if v.is_a?(Hash)
39
39
  h[k] = reduce_hash_size(v)
40
+ elsif v.is_a?(Array) || v.is_a?(Set)
41
+ h[k] = v.map {|el| reduce_hash_size(el) }
40
42
  else
41
- h[k] = v.to_s.slice(0, MAX_STRING_LENGTH)
43
+ h[k] = v.to_s.slice(0, MAX_STRING_LENGTH) + "[TRUNCATED]"
42
44
  end
43
45
 
44
46
  h
45
47
  end
46
48
  end
49
+
50
+ def self.flatten_meta_data(overrides)
51
+ return nil unless overrides
52
+
53
+ meta_data = overrides.delete(:meta_data)
54
+ if meta_data.is_a?(Hash)
55
+ overrides.merge(meta_data)
56
+ else
57
+ overrides
58
+ end
59
+ end
47
60
 
48
61
  # Helper functions to work around MultiJson changes in 1.3+
49
62
  def self.dump_json(object, options={})
@@ -43,7 +43,10 @@ module Bugsnag
43
43
  begin
44
44
  # We reverse them, so we can call "call" on the first middleware
45
45
  middleware_procs.reverse.inject(notify_lambda) { |n,e| e[n] }.call(notification)
46
- rescue Exception => e
46
+ rescue StandardError => e
47
+ # KLUDGE: Since we don't re-raise middleware exceptions, this breaks rspec
48
+ raise if e.class.to_s == "RSpec::Expectations::ExpectationNotMetError"
49
+
47
50
  # We dont notify, as we dont want to loop forever in the case of really broken middleware, we will
48
51
  # still send this notify
49
52
  Bugsnag.warn "Bugsnag middleware error: #{e}"
@@ -10,6 +10,8 @@ module Bugsnag
10
10
  NOTIFIER_VERSION = Bugsnag::VERSION
11
11
  NOTIFIER_URL = "http://www.bugsnag.com"
12
12
 
13
+ API_KEY_REGEX = /[0-9a-f]{32}/i
14
+
13
15
  # HTTParty settings
14
16
  headers "Content-Type" => "application/json"
15
17
  default_timeout 5
@@ -24,21 +26,24 @@ module Bugsnag
24
26
 
25
27
  # If the payload is going to be too long, we trim the hashes to send
26
28
  # a minimal payload instead
27
- if payload_string.length > 512000
28
- payload = Bugsnag::Helpers.reduce_hash_size(payload)
29
+ if payload_string.length > 128000
30
+ payload[:events].each {|e| e[:metaData] = Bugsnag::Helpers.reduce_hash_size(e[:metaData])}
29
31
  payload_string = Bugsnag::Helpers.dump_json(payload)
30
32
  end
31
33
 
32
34
  response = post(endpoint, {:body => payload_string})
33
- rescue Exception => e
34
- Bugsnag.log("Notification to #{endpoint} failed, #{e.inspect}")
35
+ rescue StandardError => e
36
+ # KLUDGE: Since we don't re-raise http exceptions, this breaks rspec
37
+ raise if e.class.to_s == "RSpec::Expectations::ExpectationNotMetError"
38
+
39
+ Bugsnag.warn("Notification to #{endpoint} failed, #{e.inspect}")
35
40
  end
36
41
  end
37
42
  end
38
43
 
39
44
  def initialize(exception, configuration, overrides = nil, request_data = nil)
40
45
  @configuration = configuration
41
- @overrides = overrides || {}
46
+ @overrides = Bugsnag::Helpers.flatten_meta_data(overrides) || {}
42
47
  @request_data = request_data
43
48
  @meta_data = {}
44
49
 
@@ -89,9 +94,12 @@ module Bugsnag
89
94
  return unless @configuration.should_notify?
90
95
 
91
96
  # Check we have at least and api_key
92
- unless @configuration.api_key
97
+ if @configuration.api_key.nil?
93
98
  Bugsnag.warn "No API key configured, couldn't notify"
94
99
  return
100
+ elsif (@configuration.api_key =~ API_KEY_REGEX).nil?
101
+ Bugsnag.warn "Your API key (#{@configuration.api_key}) is not valid, couldn't notify"
102
+ return
95
103
  end
96
104
 
97
105
  @meta_data = {}
@@ -38,11 +38,7 @@ module Bugsnag::Rails
38
38
 
39
39
  private
40
40
  def notify_bugsnag(exception, custom_data=nil)
41
- Bugsnag.warn "DEPRECATED METHOD: notify_bugsnag is deprecated and will be removed in the future. Please use Bugsnag.notify instead" if Bugsnag.configuration.release_stage != "production"
42
-
43
- overrides = {}
44
- overrides[:custom] = custom_data if custom_data
45
- Bugsnag.notify(exception, overrides)
41
+ Bugsnag.notify(exception, custom_data)
46
42
  end
47
43
  end
48
44
  end
@@ -0,0 +1,18 @@
1
+ module Bugsnag
2
+ class Sidekiq
3
+ def call(worker, msg, queue)
4
+ begin
5
+ yield
6
+ rescue => ex
7
+ Bugsnag.notify(ex, :meta_data => {:sidekiq => msg })
8
+ raise
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ ::Sidekiq.configure_server do |config|
15
+ config.server_middleware do |chain|
16
+ chain.add ::Bugsnag::Sidekiq
17
+ end
18
+ end
@@ -0,0 +1,305 @@
1
+ require 'spec_helper'
2
+ require 'bugsnag'
3
+ require 'securerandom'
4
+
5
+ module ActiveRecord; class RecordNotFound < RuntimeError; end; end
6
+ class BugsnagTestException < RuntimeError; end
7
+
8
+ def get_event_from_payload(payload)
9
+ payload[:events].should have(1).items
10
+ payload[:events].first
11
+ end
12
+
13
+ def get_exception_from_payload(payload)
14
+ event = get_event_from_payload(payload)
15
+ event[:exceptions].should have(1).items
16
+ event[:exceptions].last
17
+ end
18
+
19
+ describe Bugsnag::Notification do
20
+ before(:each) do
21
+ Bugsnag.instance_variable_set(:@configuration, Bugsnag::Configuration.new)
22
+ Bugsnag.configure do |config|
23
+ config.api_key = "c9d60ae4c7e70c4b6c4ebd3e8056d2b8"
24
+ end
25
+ end
26
+
27
+ it "should contain an api_key if one is set" do
28
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
29
+ payload[:apiKey].should be == "c9d60ae4c7e70c4b6c4ebd3e8056d2b8"
30
+ end
31
+
32
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
33
+ end
34
+
35
+ it "should not notify if api_key is not set" do
36
+ Bugsnag.configuration.api_key = nil
37
+
38
+ Bugsnag::Notification.should_not_receive(:deliver_exception_payload)
39
+
40
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
41
+ end
42
+
43
+ it "should not notify if api_key is empty" do
44
+ Bugsnag.configuration.api_key = ""
45
+
46
+ Bugsnag::Notification.should_not_receive(:deliver_exception_payload)
47
+
48
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
49
+ end
50
+
51
+ it "should have the right exception class" do
52
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
53
+ exception = get_exception_from_payload(payload)
54
+ exception[:errorClass].should be == "BugsnagTestException"
55
+ end
56
+
57
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
58
+ end
59
+
60
+ it "should have the right exception message" do
61
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
62
+ exception = get_exception_from_payload(payload)
63
+ exception[:message].should be == "It crashed"
64
+ end
65
+
66
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
67
+ end
68
+
69
+ it "should have a valid stacktrace" do
70
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
71
+ exception = get_exception_from_payload(payload)
72
+ exception[:stacktrace].length.should be > 0
73
+ end
74
+
75
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
76
+ end
77
+
78
+ it "should accept tabs in overrides and add them to metaData" do
79
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
80
+ event = get_event_from_payload(payload)
81
+ event[:metaData][:some_tab].should_not be_nil
82
+ event[:metaData][:some_tab][:info].should be == "here"
83
+ event[:metaData][:some_tab][:data].should be == "also here"
84
+ end
85
+
86
+ Bugsnag.notify(BugsnagTestException.new("It crashed"), {
87
+ :some_tab => {
88
+ :info => "here",
89
+ :data => "also here"
90
+ }
91
+ })
92
+ end
93
+
94
+ it "should accept non-hash overrides and add them to the custom tab in metaData" do
95
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
96
+ event = get_event_from_payload(payload)
97
+ event[:metaData][:custom].should_not be_nil
98
+ event[:metaData][:custom][:info].should be == "here"
99
+ event[:metaData][:custom][:data].should be == "also here"
100
+ end
101
+
102
+ Bugsnag.notify(BugsnagTestException.new("It crashed"), {
103
+ :info => "here",
104
+ :data => "also here"
105
+ })
106
+ end
107
+
108
+ it "should accept meta_data in overrides (for backwards compatibility) and merge it into metaData" do
109
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
110
+ event = get_event_from_payload(payload)
111
+ event[:metaData][:some_tab].should_not be_nil
112
+ event[:metaData][:some_tab][:info].should be == "here"
113
+ event[:metaData][:some_tab][:data].should be == "also here"
114
+ end
115
+
116
+ Bugsnag.notify(BugsnagTestException.new("It crashed"), {
117
+ :meta_data => {
118
+ :some_tab => {
119
+ :info => "here",
120
+ :data => "also here"
121
+ }
122
+ }
123
+ })
124
+ end
125
+
126
+ it "should truncate large meta_data before sending" do
127
+ Bugsnag::Notification.should_receive(:post) do |endpoint, opts|
128
+ # Truncated body should be no bigger than
129
+ # 2 truncated hashes (4096*2) + rest of payload (5000)
130
+ opts[:body].length.should be < 4096*2 + 5000
131
+ end
132
+
133
+ Bugsnag.notify(BugsnagTestException.new("It crashed"), {
134
+ :meta_data => {
135
+ :some_tab => {
136
+ :giant => SecureRandom.hex(500_000/2),
137
+ :mega => SecureRandom.hex(500_000/2)
138
+ }
139
+ }
140
+ })
141
+ end
142
+
143
+ it "should accept a context in overrides" do
144
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
145
+ event = get_event_from_payload(payload)
146
+ event[:context].should be == "test_context"
147
+ end
148
+
149
+ Bugsnag.notify(BugsnagTestException.new("It crashed"), {
150
+ :context => "test_context"
151
+ })
152
+ end
153
+
154
+ it "should accept a user_id in overrides" do
155
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
156
+ event = get_event_from_payload(payload)
157
+ event[:userId].should be == "test_user"
158
+ end
159
+
160
+ Bugsnag.notify(BugsnagTestException.new("It crashed"), {
161
+ :user_id => "test_user"
162
+ })
163
+ end
164
+
165
+ it "should not send a notification if auto_notify is false" do
166
+ Bugsnag.configure do |config|
167
+ config.auto_notify = false
168
+ end
169
+
170
+ Bugsnag::Notification.should_not_receive(:deliver_exception_payload)
171
+
172
+ Bugsnag.auto_notify(BugsnagTestException.new("It crashed"))
173
+ end
174
+
175
+ it "should contain a release_stage" do
176
+ Bugsnag.configure do |config|
177
+ config.release_stage = "production"
178
+ end
179
+
180
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
181
+ event = get_event_from_payload(payload)
182
+ event[:releaseStage].should be == "production"
183
+ end
184
+
185
+ Bugsnag.auto_notify(BugsnagTestException.new("It crashed"))
186
+ end
187
+
188
+ it "should respect the notify_release_stages setting by not sending in development" do
189
+ Bugsnag::Notification.should_not_receive(:deliver_exception_payload)
190
+
191
+ Bugsnag.configuration.release_stage = "development"
192
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
193
+ end
194
+
195
+ it "should respect the notify_release_stages setting when set" do
196
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
197
+ exception = get_exception_from_payload(payload)
198
+ end
199
+
200
+ Bugsnag.configuration.release_stage = "development"
201
+ Bugsnag.configuration.notify_release_stages << "development"
202
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
203
+ end
204
+
205
+ it "should use ssl when use_ssl is true" do
206
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
207
+ endpoint.should start_with "https://"
208
+ end
209
+
210
+ Bugsnag.configuration.use_ssl = true
211
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
212
+ end
213
+
214
+ it "should not use ssl when use_ssl is false" do
215
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
216
+ endpoint.should start_with "http://"
217
+ end
218
+
219
+ Bugsnag.configuration.use_ssl = false
220
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
221
+ end
222
+
223
+ it "should not use ssl when use_ssl is unset" do
224
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
225
+ endpoint.should start_with "http://"
226
+ end
227
+
228
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
229
+ end
230
+
231
+ it "should not mark the top-most stacktrace line as inProject if out of project" do
232
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
233
+ exception = get_exception_from_payload(payload)
234
+ exception[:stacktrace].should have_at_least(1).items
235
+ exception[:stacktrace].first[:inProject].should be_nil
236
+ end
237
+
238
+ Bugsnag.configuration.project_root = "/Random/location/here"
239
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
240
+ end
241
+
242
+ it "should mark the top-most stacktrace line as inProject if necessary" do
243
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
244
+ exception = get_exception_from_payload(payload)
245
+ exception[:stacktrace].should have_at_least(1).items
246
+ exception[:stacktrace].first[:inProject].should be == true
247
+ end
248
+
249
+ Bugsnag.configuration.project_root = File.expand_path File.dirname(__FILE__)
250
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
251
+ end
252
+
253
+ it "should add app_version to the payload if it is set" do
254
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
255
+ event = get_event_from_payload(payload)
256
+ event[:appVersion].should be == "1.1.1"
257
+ end
258
+
259
+ Bugsnag.configuration.app_version = "1.1.1"
260
+ Bugsnag.notify(BugsnagTestException.new("It crashed"))
261
+ end
262
+
263
+ it "should filter params from all payload hashes if they are set in default params_filters" do
264
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
265
+ event = get_event_from_payload(payload)
266
+ event[:metaData].should_not be_nil
267
+ event[:metaData][:request].should_not be_nil
268
+ event[:metaData][:request][:params].should_not be_nil
269
+ event[:metaData][:request][:params][:password].should be == "[FILTERED]"
270
+ event[:metaData][:request][:params][:other_password].should be == "[FILTERED]"
271
+ event[:metaData][:request][:params][:other_data].should be == "123456"
272
+ end
273
+
274
+ Bugsnag.notify(BugsnagTestException.new("It crashed"), {:request => {:params => {:password => "1234", :other_password => "12345", :other_data => "123456"}}})
275
+ end
276
+
277
+ it "should filter params from all payload hashes if they are added to params_filters" do
278
+ Bugsnag::Notification.should_receive(:deliver_exception_payload) do |endpoint, payload|
279
+ event = get_event_from_payload(payload)
280
+ event[:metaData].should_not be_nil
281
+ event[:metaData][:request].should_not be_nil
282
+ event[:metaData][:request][:params].should_not be_nil
283
+ event[:metaData][:request][:params][:password].should be == "[FILTERED]"
284
+ event[:metaData][:request][:params][:other_password].should be == "[FILTERED]"
285
+ event[:metaData][:request][:params][:other_data].should be == "[FILTERED]"
286
+ end
287
+
288
+ Bugsnag.configuration.params_filters << "other_data"
289
+ Bugsnag.notify(BugsnagTestException.new("It crashed"), {:request => {:params => {:password => "1234", :other_password => "123456", :other_data => "123456"}}})
290
+ end
291
+
292
+ it "should not notify if the exception class is in the default ignore_classes list" do
293
+ Bugsnag::Notification.should_not_receive(:deliver_exception_payload)
294
+
295
+ Bugsnag.notify_or_ignore(ActiveRecord::RecordNotFound.new("It crashed"))
296
+ end
297
+
298
+ it "should not notify if the non-default exception class is added to the ignore_classes" do
299
+ Bugsnag.configuration.ignore_classes << "BugsnagTestException"
300
+
301
+ Bugsnag::Notification.should_not_receive(:deliver_exception_payload)
302
+
303
+ Bugsnag.notify_or_ignore(BugsnagTestException.new("It crashed"))
304
+ end
305
+ end
File without changes
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bugsnag
3
3
  version: !ruby/object:Gem::Version
4
- hash: -639319559
5
- prerelease: 6
4
+ hash: 31
5
+ prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 2
9
9
  - 0
10
- - beta
11
- version: 1.2.0.beta
10
+ version: 1.2.0
12
11
  platform: ruby
13
12
  authors:
14
13
  - James Smith
@@ -16,7 +15,7 @@ autorequire:
16
15
  bindir: bin
17
16
  cert_chain: []
18
17
 
19
- date: 2012-09-29 00:00:00 Z
18
+ date: 2012-09-30 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  requirement: &id001 !ruby/object:Gem::Requirement
@@ -29,10 +28,10 @@ dependencies:
29
28
  - 1
30
29
  - 0
31
30
  version: "1.0"
32
- version_requirements: *id001
33
- name: multi_json
34
31
  prerelease: false
35
32
  type: :runtime
33
+ name: multi_json
34
+ version_requirements: *id001
36
35
  - !ruby/object:Gem::Dependency
37
36
  requirement: &id002 !ruby/object:Gem::Requirement
38
37
  none: false
@@ -51,12 +50,28 @@ dependencies:
51
50
  - 0
52
51
  - 5
53
52
  version: "0.5"
54
- version_requirements: *id002
55
- name: httparty
56
53
  prerelease: false
57
54
  type: :runtime
55
+ name: httparty
56
+ version_requirements: *id002
58
57
  - !ruby/object:Gem::Dependency
59
58
  requirement: &id003 !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ hash: 35
64
+ segments:
65
+ - 2
66
+ - 11
67
+ - 0
68
+ version: 2.11.0
69
+ prerelease: false
70
+ type: :development
71
+ name: rspec
72
+ version_requirements: *id003
73
+ - !ruby/object:Gem::Dependency
74
+ requirement: &id004 !ruby/object:Gem::Requirement
60
75
  none: false
61
76
  requirements:
62
77
  - - ">="
@@ -65,12 +80,12 @@ dependencies:
65
80
  segments:
66
81
  - 0
67
82
  version: "0"
68
- version_requirements: *id003
69
- name: shoulda
70
83
  prerelease: false
71
84
  type: :development
85
+ name: rdoc
86
+ version_requirements: *id004
72
87
  - !ruby/object:Gem::Dependency
73
- requirement: &id004 !ruby/object:Gem::Requirement
88
+ requirement: &id005 !ruby/object:Gem::Requirement
74
89
  none: false
75
90
  requirements:
76
91
  - - ~>
@@ -81,24 +96,10 @@ dependencies:
81
96
  - 6
82
97
  - 4
83
98
  version: 1.6.4
84
- version_requirements: *id004
85
- name: jeweler
86
99
  prerelease: false
87
100
  type: :development
88
- - !ruby/object:Gem::Dependency
89
- requirement: &id005 !ruby/object:Gem::Requirement
90
- none: false
91
- requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- hash: 3
95
- segments:
96
- - 0
97
- version: "0"
101
+ name: jeweler
98
102
  version_requirements: *id005
99
- name: rcov
100
- prerelease: false
101
- type: :development
102
103
  description: Ruby notifier for bugsnag.com
103
104
  email: james@bugsnag.com
104
105
  executables: []
@@ -110,6 +111,7 @@ extra_rdoc_files:
110
111
  - README.md
111
112
  files:
112
113
  - .document
114
+ - .rspec
113
115
  - Gemfile
114
116
  - Gemfile.lock
115
117
  - LICENSE.txt
@@ -133,11 +135,14 @@ files:
133
135
  - lib/bugsnag/rails/action_controller_rescue.rb
134
136
  - lib/bugsnag/rails/controller_methods.rb
135
137
  - lib/bugsnag/railtie.rb
138
+ - lib/bugsnag/sidekiq.rb
136
139
  - lib/bugsnag/tasks.rb
137
140
  - lib/bugsnag/tasks/bugsnag.rake
138
141
  - lib/bugsnag/version.rb
139
142
  - lib/resque/failure/bugsnag.rb
140
143
  - rails/init.rb
144
+ - spec/notification_spec.rb
145
+ - spec/spec_helper.rb
141
146
  - test/helper.rb
142
147
  - test/test_bugsnag.rb
143
148
  homepage: http://github.com/bugsnag/bugsnag-ruby
@@ -160,14 +165,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
165
  required_rubygems_version: !ruby/object:Gem::Requirement
161
166
  none: false
162
167
  requirements:
163
- - - ">"
168
+ - - ">="
164
169
  - !ruby/object:Gem::Version
165
- hash: 25
170
+ hash: 3
166
171
  segments:
167
- - 1
168
- - 3
169
- - 1
170
- version: 1.3.1
172
+ - 0
173
+ version: "0"
171
174
  requirements: []
172
175
 
173
176
  rubyforge_project: