bugsnag 6.10.0 → 6.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +4 -0
  3. data/CHANGELOG.md +20 -0
  4. data/Gemfile +1 -0
  5. data/README.md +1 -0
  6. data/VERSION +1 -1
  7. data/features/fixtures/docker-compose.yml +13 -0
  8. data/features/fixtures/rails3/app/app/controllers/breadcrumbs_controller.rb +19 -0
  9. data/features/fixtures/rails3/app/app/controllers/session_tracking_controller.rb +10 -6
  10. data/features/fixtures/rails3/app/config/initializers/bugsnag.rb +8 -2
  11. data/features/fixtures/rails3/app/config/routes.rb +1 -0
  12. data/features/fixtures/rails4/app/Gemfile +5 -1
  13. data/features/fixtures/rails4/app/app/controllers/breadcrumbs_controller.rb +26 -0
  14. data/features/fixtures/rails4/app/app/controllers/mongo_controller.rb +23 -0
  15. data/features/fixtures/rails4/app/app/controllers/session_tracking_controller.rb +9 -5
  16. data/features/fixtures/rails4/app/app/jobs/application_job.rb +2 -0
  17. data/features/fixtures/rails4/app/app/jobs/notify_job.rb +5 -0
  18. data/features/fixtures/rails4/app/app/models/mongo_model.rb +6 -0
  19. data/features/fixtures/rails4/app/config/initializers/bugsnag.rb +7 -1
  20. data/features/fixtures/rails4/app/config/mongoid.yml +22 -0
  21. data/features/fixtures/rails4/app/config/routes.rb +2 -0
  22. data/features/fixtures/rails5/app/Gemfile +4 -0
  23. data/features/fixtures/rails5/app/app/controllers/breadcrumbs_controller.rb +24 -0
  24. data/features/fixtures/rails5/app/app/controllers/mongo_controller.rb +22 -0
  25. data/features/fixtures/rails5/app/app/controllers/session_tracking_controller.rb +9 -5
  26. data/features/fixtures/rails5/app/app/jobs/notify_job.rb +5 -0
  27. data/features/fixtures/rails5/app/app/models/mongo_model.rb +6 -0
  28. data/features/fixtures/rails5/app/config/initializers/bugsnag.rb +7 -1
  29. data/features/fixtures/rails5/app/config/mongoid.yml +23 -0
  30. data/features/fixtures/rails5/app/config/routes.rb +11 -1
  31. data/features/rails_features/auto_capture_sessions.feature +55 -5
  32. data/features/rails_features/breadcrumbs.feature +135 -0
  33. data/features/rails_features/mongo_breadcrumbs.feature +100 -0
  34. data/features/steps/ruby_notifier_steps.rb +6 -0
  35. data/lib/bugsnag.rb +59 -3
  36. data/lib/bugsnag/breadcrumbs/breadcrumb.rb +76 -0
  37. data/lib/bugsnag/breadcrumbs/breadcrumbs.rb +14 -0
  38. data/lib/bugsnag/breadcrumbs/validator.rb +59 -0
  39. data/lib/bugsnag/configuration.rb +103 -6
  40. data/lib/bugsnag/integrations/mongo.rb +132 -0
  41. data/lib/bugsnag/integrations/rails/rails_breadcrumbs.rb +118 -0
  42. data/lib/bugsnag/integrations/railtie.rb +28 -1
  43. data/lib/bugsnag/middleware/breadcrumbs.rb +21 -0
  44. data/lib/bugsnag/report.rb +30 -1
  45. data/lib/bugsnag/session_tracker.rb +1 -0
  46. data/lib/bugsnag/utility/circular_buffer.rb +62 -0
  47. data/spec/breadcrumbs/breadcrumb_spec.rb +93 -0
  48. data/spec/breadcrumbs/validator_spec.rb +200 -0
  49. data/spec/bugsnag_spec.rb +230 -0
  50. data/spec/configuration_spec.rb +176 -2
  51. data/spec/integrations/mongo_spec.rb +262 -0
  52. data/spec/report_spec.rb +149 -0
  53. data/spec/session_tracker_spec.rb +24 -2
  54. data/spec/utility/circular_buffer_spec.rb +98 -0
  55. metadata +27 -2
@@ -1101,6 +1101,155 @@ describe Bugsnag::Report do
1101
1101
  }
1102
1102
  end
1103
1103
 
1104
+ describe "breadcrumbs" do
1105
+ let(:timestamp_regex) { /^\d{4}\-\d{2}\-\d{2}T\d{2}:\d{2}:[\d\.]+Z$/ }
1106
+
1107
+ it "includes left breadcrumbs" do
1108
+ Bugsnag.leave_breadcrumb("Test breadcrumb")
1109
+ notify_test_exception
1110
+ expect(Bugsnag).to have_sent_notification { |payload, headers|
1111
+ event = get_event_from_payload(payload)
1112
+ expect(event["breadcrumbs"].size).to eq(1)
1113
+ expect(event["breadcrumbs"].first).to match({
1114
+ "name" => "Test breadcrumb",
1115
+ "type" => "manual",
1116
+ "metaData" => {},
1117
+ "timestamp" => match(timestamp_regex)
1118
+ })
1119
+ }
1120
+ end
1121
+
1122
+ it "filters left breadcrumbs" do
1123
+ Bugsnag.leave_breadcrumb("Test breadcrumb", {
1124
+ :forbidden_key => false,
1125
+ :allowed_key => true
1126
+ })
1127
+ Bugsnag.configuration.meta_data_filters << "forbidden"
1128
+ notify_test_exception
1129
+ expect(Bugsnag).to have_sent_notification { |payload, headers|
1130
+ event = get_event_from_payload(payload)
1131
+ expect(event["breadcrumbs"].size).to eq(1)
1132
+ expect(event["breadcrumbs"].first).to match({
1133
+ "name" => "Test breadcrumb",
1134
+ "type" => "manual",
1135
+ "metaData" => {
1136
+ "forbidden_key" => "[FILTERED]",
1137
+ "allowed_key" => true
1138
+ },
1139
+ "timestamp" => match(timestamp_regex)
1140
+ })
1141
+ }
1142
+ end
1143
+
1144
+ it "defaults to an empty array" do
1145
+ notify_test_exception
1146
+ expect(Bugsnag).to have_sent_notification { |payload, headers|
1147
+ event = get_event_from_payload(payload)
1148
+ expect(event["breadcrumbs"].size).to eq(0)
1149
+ }
1150
+ end
1151
+
1152
+ it "allows breadcrumbs to be editted in callbacks" do
1153
+ Bugsnag.leave_breadcrumb("Test breadcrumb")
1154
+ Bugsnag.before_notify_callbacks << Proc.new { |report|
1155
+ breadcrumb = report.breadcrumbs.first
1156
+ breadcrumb.meta_data = {:a => 1, :b => 2}
1157
+ }
1158
+ notify_test_exception
1159
+ expect(Bugsnag).to have_sent_notification { |payload, headers|
1160
+ event = get_event_from_payload(payload)
1161
+ expect(event["breadcrumbs"].size).to eq(1)
1162
+ expect(event["breadcrumbs"].first).to match({
1163
+ "name" => "Test breadcrumb",
1164
+ "type" => "manual",
1165
+ "metaData" => {"a" => 1, "b" => 2},
1166
+ "timestamp" => match(timestamp_regex)
1167
+ })
1168
+ }
1169
+ end
1170
+ end
1171
+
1172
+ describe "#summary" do
1173
+ it "provides a hash of the name, message, and severity" do
1174
+ begin
1175
+ 1/0
1176
+ rescue ZeroDivisionError => e
1177
+ report = Bugsnag::Report.new(e, Bugsnag.configuration)
1178
+
1179
+ expect(report.summary).to eq({
1180
+ :error_class => "ZeroDivisionError",
1181
+ :message => "divided by 0",
1182
+ :severity => "warning"
1183
+ })
1184
+ end
1185
+ end
1186
+
1187
+ it "handles strings" do
1188
+ report = Bugsnag::Report.new("test string", Bugsnag.configuration)
1189
+
1190
+ expect(report.summary).to eq({
1191
+ :error_class => "RuntimeError",
1192
+ :message => "test string",
1193
+ :severity => "warning"
1194
+ })
1195
+ end
1196
+
1197
+ it "handles error edge cases" do
1198
+ report = Bugsnag::Report.new(Timeout::Error, Bugsnag.configuration)
1199
+
1200
+ expect(report.summary).to eq({
1201
+ :error_class => "Timeout::Error",
1202
+ :message => "Timeout::Error",
1203
+ :severity => "warning"
1204
+ })
1205
+ end
1206
+
1207
+ it "handles empty exceptions" do
1208
+ begin
1209
+ 1/0
1210
+ rescue ZeroDivisionError => e
1211
+ report = Bugsnag::Report.new(e, Bugsnag.configuration)
1212
+
1213
+ report.exceptions = []
1214
+
1215
+ expect(report.summary).to eq({
1216
+ :error_class => "Unknown",
1217
+ :severity => "warning"
1218
+ })
1219
+ end
1220
+ end
1221
+
1222
+ it "handles removed exceptions" do
1223
+ begin
1224
+ 1/0
1225
+ rescue ZeroDivisionError => e
1226
+ report = Bugsnag::Report.new(e, Bugsnag.configuration)
1227
+
1228
+ report.exceptions = nil
1229
+
1230
+ expect(report.summary).to eq({
1231
+ :error_class => "Unknown",
1232
+ :severity => "warning"
1233
+ })
1234
+ end
1235
+ end
1236
+
1237
+ it "handles exceptions being replaced" do
1238
+ begin
1239
+ 1/0
1240
+ rescue ZeroDivisionError => e
1241
+ report = Bugsnag::Report.new(e, Bugsnag.configuration)
1242
+
1243
+ report.exceptions = "no one should ever do this"
1244
+
1245
+ expect(report.summary).to eq({
1246
+ :error_class => "Unknown",
1247
+ :severity => "warning"
1248
+ })
1249
+ end
1250
+ end
1251
+ end
1252
+
1104
1253
  if defined?(JRUBY_VERSION)
1105
1254
 
1106
1255
  it "should work with java.lang.Throwables" do
@@ -2,6 +2,14 @@
2
2
  require 'webrick'
3
3
  require 'spec_helper'
4
4
  require 'json'
5
+ require 'concurrent'
6
+
7
+ # Enable reset of session_counts between each example
8
+ module Bugsnag
9
+ class SessionTracker
10
+ attr_accessor :session_counts
11
+ end
12
+ end
5
13
 
6
14
  describe Bugsnag::SessionTracker do
7
15
  server = nil
@@ -19,6 +27,10 @@ describe Bugsnag::SessionTracker do
19
27
  Thread.new{ server.start }
20
28
  end
21
29
 
30
+ after(:each) do
31
+ Bugsnag.instance_variable_set(:@session_tracker, Bugsnag::SessionTracker.new)
32
+ end
33
+
22
34
  after do
23
35
  Bugsnag.configure do |conf|
24
36
  conf.auto_capture_sessions = false
@@ -60,11 +72,21 @@ describe Bugsnag::SessionTracker do
60
72
  expect(session_one[:id]).to_not eq(session_two[:id])
61
73
  end
62
74
 
75
+ it 'will not create sessions if Configuration.enable_sessions is false' do
76
+ Bugsnag.configure do |conf|
77
+ conf.set_endpoints("http://localhost:#{server.config[:Port]}", nil)
78
+ end
79
+ expect(Bugsnag.configuration.enable_sessions).to eq(false)
80
+ expect(Bugsnag.session_tracker.session_counts.size).to eq(0)
81
+ Bugsnag.start_session
82
+ expect(Bugsnag.session_tracker.session_counts.size).to eq(0)
83
+ end
84
+
63
85
  it 'sends sessions when send_sessions is called' do
64
86
  Bugsnag.configure do |conf|
65
87
  conf.auto_capture_sessions = true
66
88
  conf.delivery_method = :synchronous
67
- conf.session_endpoint = "http://localhost:#{server.config[:Port]}"
89
+ conf.set_endpoints("http://localhost:#{server.config[:Port]}", "http://localhost:#{server.config[:Port]}")
68
90
  end
69
91
  WebMock.allow_net_connect!
70
92
  Bugsnag.start_session
@@ -84,7 +106,7 @@ describe Bugsnag::SessionTracker do
84
106
  conf.auto_capture_sessions = true
85
107
  conf.release_stage = "test_stage"
86
108
  conf.delivery_method = :synchronous
87
- conf.session_endpoint = "http://localhost:#{server.config[:Port]}"
109
+ conf.set_endpoints("http://localhost:#{server.config[:Port]}", "http://localhost:#{server.config[:Port]}")
88
110
  end
89
111
  WebMock.allow_net_connect!
90
112
  Bugsnag.start_session
@@ -0,0 +1,98 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'bugsnag/utility/circular_buffer'
5
+
6
+ RSpec.describe Bugsnag::Utility::CircularBuffer do
7
+ describe "#initialize" do
8
+ it "contains no items" do
9
+ buffer = Bugsnag::Utility::CircularBuffer.new
10
+
11
+ expect(buffer.to_a).to eq([])
12
+ end
13
+ end
14
+
15
+ describe "#max_items" do
16
+ it "defaults to 25" do
17
+ buffer = Bugsnag::Utility::CircularBuffer.new
18
+
19
+ expect(buffer.max_items).to equal 25
20
+ end
21
+
22
+ it "can be set during #initialize" do
23
+ buffer = Bugsnag::Utility::CircularBuffer.new(10)
24
+
25
+ expect(buffer.max_items).to equal 10
26
+ end
27
+ end
28
+
29
+ describe "#max_items=" do
30
+ it "changes #max_items" do
31
+ buffer = Bugsnag::Utility::CircularBuffer.new(10)
32
+ buffer.max_items = 17
33
+
34
+ expect(buffer.max_items).to equal(17)
35
+ end
36
+
37
+ it "shifts any excess items when reduced" do
38
+ buffer = Bugsnag::Utility::CircularBuffer.new(10)
39
+ (0...10).each { |x| buffer << x }
40
+ buffer.max_items = 3
41
+
42
+ expect(buffer.to_a).to eq([7, 8, 9])
43
+ end
44
+
45
+ it "increases the maximum capacity" do
46
+ buffer = Bugsnag::Utility::CircularBuffer.new(3)
47
+ buffer << 1
48
+ buffer << 2
49
+ buffer << 3
50
+
51
+ expect(buffer.to_a).to eq([1, 2, 3])
52
+
53
+ buffer.max_items = 5
54
+ buffer << 4
55
+ buffer << 5
56
+
57
+ expect(buffer.to_a).to eq([1, 2, 3, 4, 5])
58
+ end
59
+ end
60
+
61
+ describe "#<<" do
62
+ it "adds items to the buffer" do
63
+ buffer = Bugsnag::Utility::CircularBuffer.new
64
+ buffer << 1
65
+ expect(buffer.to_a).to eq([1])
66
+ end
67
+
68
+ it "shifts items it #max_items is exceeded" do
69
+ buffer = Bugsnag::Utility::CircularBuffer.new(5)
70
+ (0...10).each { |x| buffer << x }
71
+
72
+ expect(buffer.to_a).to eq([5, 6, 7, 8, 9])
73
+ end
74
+
75
+ it "can be chained" do
76
+ buffer = Bugsnag::Utility::CircularBuffer.new
77
+ buffer << 1 << 2 << 3 << 4 << 5
78
+
79
+ expect(buffer.to_a).to eq([1, 2, 3, 4, 5])
80
+ end
81
+ end
82
+
83
+ describe "#each" do
84
+ it "can be iterated over" do
85
+ buffer = Bugsnag::Utility::CircularBuffer.new
86
+ buffer << 1
87
+ buffer << 2
88
+ buffer << 3
89
+
90
+ output = []
91
+ buffer.each do |x|
92
+ output << x
93
+ end
94
+
95
+ expect(output).to eq([1, 2, 3])
96
+ end
97
+ end
98
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bugsnag
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.10.0
4
+ version: 6.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-05 00:00:00.000000000 Z
11
+ date: 2019-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -210,6 +210,7 @@ files:
210
210
  - features/fixtures/rails3/app/app/controllers/application_controller.rb
211
211
  - features/fixtures/rails3/app/app/controllers/auto_notify_controller.rb
212
212
  - features/fixtures/rails3/app/app/controllers/before_notify_controller.rb
213
+ - features/fixtures/rails3/app/app/controllers/breadcrumbs_controller.rb
213
214
  - features/fixtures/rails3/app/app/controllers/handled_controller.rb
214
215
  - features/fixtures/rails3/app/app/controllers/ignore_classes_controller.rb
215
216
  - features/fixtures/rails3/app/app/controllers/metadata_filters_controller.rb
@@ -269,11 +270,13 @@ files:
269
270
  - features/fixtures/rails4/app/app/controllers/application_controller.rb
270
271
  - features/fixtures/rails4/app/app/controllers/auto_notify_controller.rb
271
272
  - features/fixtures/rails4/app/app/controllers/before_notify_controller.rb
273
+ - features/fixtures/rails4/app/app/controllers/breadcrumbs_controller.rb
272
274
  - features/fixtures/rails4/app/app/controllers/concerns/.keep
273
275
  - features/fixtures/rails4/app/app/controllers/devise_controller.rb
274
276
  - features/fixtures/rails4/app/app/controllers/handled_controller.rb
275
277
  - features/fixtures/rails4/app/app/controllers/ignore_classes_controller.rb
276
278
  - features/fixtures/rails4/app/app/controllers/metadata_filters_controller.rb
279
+ - features/fixtures/rails4/app/app/controllers/mongo_controller.rb
277
280
  - features/fixtures/rails4/app/app/controllers/project_root_controller.rb
278
281
  - features/fixtures/rails4/app/app/controllers/release_stage_controller.rb
279
282
  - features/fixtures/rails4/app/app/controllers/send_code_controller.rb
@@ -281,9 +284,12 @@ files:
281
284
  - features/fixtures/rails4/app/app/controllers/session_tracking_controller.rb
282
285
  - features/fixtures/rails4/app/app/controllers/unhandled_controller.rb
283
286
  - features/fixtures/rails4/app/app/helpers/application_helper.rb
287
+ - features/fixtures/rails4/app/app/jobs/application_job.rb
288
+ - features/fixtures/rails4/app/app/jobs/notify_job.rb
284
289
  - features/fixtures/rails4/app/app/mailers/.keep
285
290
  - features/fixtures/rails4/app/app/models/.keep
286
291
  - features/fixtures/rails4/app/app/models/concerns/.keep
292
+ - features/fixtures/rails4/app/app/models/mongo_model.rb
287
293
  - features/fixtures/rails4/app/app/models/user.rb
288
294
  - features/fixtures/rails4/app/app/views/layouts/application.html.erb
289
295
  - features/fixtures/rails4/app/config.ru
@@ -306,6 +312,7 @@ files:
306
312
  - features/fixtures/rails4/app/config/initializers/wrap_parameters.rb
307
313
  - features/fixtures/rails4/app/config/locales/devise.en.yml
308
314
  - features/fixtures/rails4/app/config/locales/en.yml
315
+ - features/fixtures/rails4/app/config/mongoid.yml
309
316
  - features/fixtures/rails4/app/config/routes.rb
310
317
  - features/fixtures/rails4/app/db/migrate/20180420160315_devise_create_users.rb
311
318
  - features/fixtures/rails4/app/db/seeds.rb
@@ -344,11 +351,13 @@ files:
344
351
  - features/fixtures/rails5/app/app/controllers/application_controller.rb
345
352
  - features/fixtures/rails5/app/app/controllers/auto_notify_controller.rb
346
353
  - features/fixtures/rails5/app/app/controllers/before_notify_controller.rb
354
+ - features/fixtures/rails5/app/app/controllers/breadcrumbs_controller.rb
347
355
  - features/fixtures/rails5/app/app/controllers/clearance_controller.rb
348
356
  - features/fixtures/rails5/app/app/controllers/concerns/.keep
349
357
  - features/fixtures/rails5/app/app/controllers/handled_controller.rb
350
358
  - features/fixtures/rails5/app/app/controllers/ignore_classes_controller.rb
351
359
  - features/fixtures/rails5/app/app/controllers/metadata_filters_controller.rb
360
+ - features/fixtures/rails5/app/app/controllers/mongo_controller.rb
352
361
  - features/fixtures/rails5/app/app/controllers/project_root_controller.rb
353
362
  - features/fixtures/rails5/app/app/controllers/release_stage_controller.rb
354
363
  - features/fixtures/rails5/app/app/controllers/send_code_controller.rb
@@ -357,9 +366,11 @@ files:
357
366
  - features/fixtures/rails5/app/app/controllers/unhandled_controller.rb
358
367
  - features/fixtures/rails5/app/app/helpers/application_helper.rb
359
368
  - features/fixtures/rails5/app/app/jobs/application_job.rb
369
+ - features/fixtures/rails5/app/app/jobs/notify_job.rb
360
370
  - features/fixtures/rails5/app/app/mailers/application_mailer.rb
361
371
  - features/fixtures/rails5/app/app/models/application_record.rb
362
372
  - features/fixtures/rails5/app/app/models/concerns/.keep
373
+ - features/fixtures/rails5/app/app/models/mongo_model.rb
363
374
  - features/fixtures/rails5/app/app/models/user.rb
364
375
  - features/fixtures/rails5/app/app/views/layouts/application.html.erb
365
376
  - features/fixtures/rails5/app/app/views/layouts/mailer.html.erb
@@ -387,6 +398,7 @@ files:
387
398
  - features/fixtures/rails5/app/config/initializers/wrap_parameters.rb
388
399
  - features/fixtures/rails5/app/config/locales/devise.en.yml
389
400
  - features/fixtures/rails5/app/config/locales/en.yml
401
+ - features/fixtures/rails5/app/config/mongoid.yml
390
402
  - features/fixtures/rails5/app/config/puma.rb
391
403
  - features/fixtures/rails5/app/config/routes.rb
392
404
  - features/fixtures/rails5/app/config/secrets.yml
@@ -460,9 +472,11 @@ files:
460
472
  - features/rails_features/auto_capture_sessions.feature
461
473
  - features/rails_features/auto_notify.feature
462
474
  - features/rails_features/before_notify.feature
475
+ - features/rails_features/breadcrumbs.feature
463
476
  - features/rails_features/handled.feature
464
477
  - features/rails_features/ignore_classes.feature
465
478
  - features/rails_features/meta_data_filters.feature
479
+ - features/rails_features/mongo_breadcrumbs.feature
466
480
  - features/rails_features/project_root.feature
467
481
  - features/rails_features/release_stage.feature
468
482
  - features/rails_features/send_code.feature
@@ -474,6 +488,9 @@ files:
474
488
  - features/support/env.rb
475
489
  - issue_template.md
476
490
  - lib/bugsnag.rb
491
+ - lib/bugsnag/breadcrumbs/breadcrumb.rb
492
+ - lib/bugsnag/breadcrumbs/breadcrumbs.rb
493
+ - lib/bugsnag/breadcrumbs/validator.rb
477
494
  - lib/bugsnag/cleaner.rb
478
495
  - lib/bugsnag/configuration.rb
479
496
  - lib/bugsnag/delivery.rb
@@ -482,16 +499,19 @@ files:
482
499
  - lib/bugsnag/helpers.rb
483
500
  - lib/bugsnag/integrations/delayed_job.rb
484
501
  - lib/bugsnag/integrations/mailman.rb
502
+ - lib/bugsnag/integrations/mongo.rb
485
503
  - lib/bugsnag/integrations/que.rb
486
504
  - lib/bugsnag/integrations/rack.rb
487
505
  - lib/bugsnag/integrations/rails/active_record_rescue.rb
488
506
  - lib/bugsnag/integrations/rails/controller_methods.rb
507
+ - lib/bugsnag/integrations/rails/rails_breadcrumbs.rb
489
508
  - lib/bugsnag/integrations/railtie.rb
490
509
  - lib/bugsnag/integrations/rake.rb
491
510
  - lib/bugsnag/integrations/resque.rb
492
511
  - lib/bugsnag/integrations/shoryuken.rb
493
512
  - lib/bugsnag/integrations/sidekiq.rb
494
513
  - lib/bugsnag/meta_data.rb
514
+ - lib/bugsnag/middleware/breadcrumbs.rb
495
515
  - lib/bugsnag/middleware/callbacks.rb
496
516
  - lib/bugsnag/middleware/classify_error.rb
497
517
  - lib/bugsnag/middleware/clearance_user.rb
@@ -512,8 +532,11 @@ files:
512
532
  - lib/bugsnag/stacktrace.rb
513
533
  - lib/bugsnag/tasks.rb
514
534
  - lib/bugsnag/tasks/bugsnag.rake
535
+ - lib/bugsnag/utility/circular_buffer.rb
515
536
  - lib/bugsnag/version.rb
516
537
  - lib/generators/bugsnag/bugsnag_generator.rb
538
+ - spec/breadcrumbs/breadcrumb_spec.rb
539
+ - spec/breadcrumbs/validator_spec.rb
517
540
  - spec/bugsnag_spec.rb
518
541
  - spec/cleaner_spec.rb
519
542
  - spec/configuration_spec.rb
@@ -540,6 +563,7 @@ files:
540
563
  - spec/integrations/clearance_user_spec.rb
541
564
  - spec/integrations/logger_spec.rb
542
565
  - spec/integrations/mailman_spec.rb
566
+ - spec/integrations/mongo_spec.rb
543
567
  - spec/integrations/que_spec.rb
544
568
  - spec/integrations/rack_spec.rb
545
569
  - spec/integrations/rails3_request_spec.rb
@@ -555,6 +579,7 @@ files:
555
579
  - spec/session_tracker_spec.rb
556
580
  - spec/spec_helper.rb
557
581
  - spec/stacktrace_spec.rb
582
+ - spec/utility/circular_buffer_spec.rb
558
583
  homepage: https://github.com/bugsnag/bugsnag-ruby
559
584
  licenses:
560
585
  - MIT