bugsnag 6.10.0 → 6.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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