honeybadger 5.29.0 → 6.0.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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/lib/honeybadger/agent.rb +36 -35
  4. data/lib/honeybadger/backend/base.rb +11 -11
  5. data/lib/honeybadger/backend/debug.rb +4 -4
  6. data/lib/honeybadger/backend/null.rb +2 -2
  7. data/lib/honeybadger/backend/server.rb +11 -11
  8. data/lib/honeybadger/backend/test.rb +2 -2
  9. data/lib/honeybadger/backend.rb +6 -6
  10. data/lib/honeybadger/backtrace.rb +27 -22
  11. data/lib/honeybadger/breadcrumbs/active_support.rb +9 -9
  12. data/lib/honeybadger/breadcrumbs/breadcrumb.rb +1 -2
  13. data/lib/honeybadger/breadcrumbs/collector.rb +4 -4
  14. data/lib/honeybadger/breadcrumbs/logging.rb +11 -14
  15. data/lib/honeybadger/breadcrumbs.rb +3 -3
  16. data/lib/honeybadger/cli/deploy.rb +7 -7
  17. data/lib/honeybadger/cli/exec.rb +41 -41
  18. data/lib/honeybadger/cli/helpers.rb +18 -18
  19. data/lib/honeybadger/cli/heroku.rb +36 -36
  20. data/lib/honeybadger/cli/install.rb +44 -44
  21. data/lib/honeybadger/cli/main.rb +107 -107
  22. data/lib/honeybadger/cli/notify.rb +13 -13
  23. data/lib/honeybadger/cli/test.rb +109 -94
  24. data/lib/honeybadger/cli.rb +3 -3
  25. data/lib/honeybadger/config/defaults.rb +218 -223
  26. data/lib/honeybadger/config/env.rb +5 -5
  27. data/lib/honeybadger/config/ruby.rb +19 -19
  28. data/lib/honeybadger/config/yaml.rb +12 -12
  29. data/lib/honeybadger/config.rb +76 -89
  30. data/lib/honeybadger/const.rb +4 -4
  31. data/lib/honeybadger/context_manager.rb +1 -2
  32. data/lib/honeybadger/conversions.rb +9 -6
  33. data/lib/honeybadger/counter.rb +4 -4
  34. data/lib/honeybadger/event.rb +3 -3
  35. data/lib/honeybadger/events_worker.rb +33 -33
  36. data/lib/honeybadger/gauge.rb +2 -2
  37. data/lib/honeybadger/histogram.rb +4 -4
  38. data/lib/honeybadger/init/hanami.rb +5 -5
  39. data/lib/honeybadger/init/rails.rb +14 -14
  40. data/lib/honeybadger/init/rake.rb +19 -21
  41. data/lib/honeybadger/init/ruby.rb +4 -4
  42. data/lib/honeybadger/init/sinatra.rb +11 -12
  43. data/lib/honeybadger/instrumentation.rb +26 -31
  44. data/lib/honeybadger/instrumentation_helper.rb +11 -12
  45. data/lib/honeybadger/karafka.rb +55 -56
  46. data/lib/honeybadger/logging.rb +22 -21
  47. data/lib/honeybadger/metric.rb +2 -2
  48. data/lib/honeybadger/metrics_worker.rb +12 -10
  49. data/lib/honeybadger/notice.rb +55 -58
  50. data/lib/honeybadger/notification_subscriber.rb +14 -14
  51. data/lib/honeybadger/plugin.rb +16 -18
  52. data/lib/honeybadger/plugins/active_job.rb +11 -9
  53. data/lib/honeybadger/plugins/autotuner.rb +5 -5
  54. data/lib/honeybadger/plugins/breadcrumbs.rb +7 -7
  55. data/lib/honeybadger/plugins/delayed_job/plugin.rb +36 -37
  56. data/lib/honeybadger/plugins/delayed_job.rb +4 -4
  57. data/lib/honeybadger/plugins/faktory.rb +9 -9
  58. data/lib/honeybadger/plugins/karafka.rb +3 -3
  59. data/lib/honeybadger/plugins/lambda.rb +9 -11
  60. data/lib/honeybadger/plugins/local_variables.rb +4 -4
  61. data/lib/honeybadger/plugins/net_http.rb +10 -10
  62. data/lib/honeybadger/plugins/passenger.rb +4 -4
  63. data/lib/honeybadger/plugins/rails.rb +13 -9
  64. data/lib/honeybadger/plugins/resque.rb +7 -7
  65. data/lib/honeybadger/plugins/shoryuken.rb +6 -6
  66. data/lib/honeybadger/plugins/sidekiq.rb +61 -57
  67. data/lib/honeybadger/plugins/solid_queue.rb +3 -3
  68. data/lib/honeybadger/plugins/sucker_punch.rb +5 -5
  69. data/lib/honeybadger/plugins/system.rb +3 -3
  70. data/lib/honeybadger/plugins/thor.rb +5 -5
  71. data/lib/honeybadger/plugins/warden.rb +4 -4
  72. data/lib/honeybadger/rack/error_notifier.rb +14 -14
  73. data/lib/honeybadger/rack/user_feedback.rb +11 -12
  74. data/lib/honeybadger/rack/user_informer.rb +6 -6
  75. data/lib/honeybadger/registry.rb +2 -2
  76. data/lib/honeybadger/registry_execution.rb +1 -1
  77. data/lib/honeybadger/ruby.rb +2 -2
  78. data/lib/honeybadger/singleton.rb +49 -48
  79. data/lib/honeybadger/tasks.rb +3 -3
  80. data/lib/honeybadger/timer.rb +1 -1
  81. data/lib/honeybadger/util/http.rb +27 -27
  82. data/lib/honeybadger/util/request_hash.rb +11 -11
  83. data/lib/honeybadger/util/request_payload.rb +2 -2
  84. data/lib/honeybadger/util/revision.rb +14 -6
  85. data/lib/honeybadger/util/sanitizer.rb +22 -22
  86. data/lib/honeybadger/util/stats.rb +6 -3
  87. data/lib/honeybadger/version.rb +1 -1
  88. data/lib/honeybadger/worker.rb +31 -29
  89. data/lib/honeybadger.rb +5 -5
  90. data/lib/puma/plugin/honeybadger.rb +12 -8
  91. metadata +4 -4
@@ -1,6 +1,6 @@
1
- require 'set'
1
+ require "set"
2
2
 
3
- require 'honeybadger/conversions'
3
+ require "honeybadger/conversions"
4
4
 
5
5
  module Honeybadger
6
6
  module Util
@@ -8,17 +8,17 @@ module Honeybadger
8
8
  # are based on Rails' HTTP parameter filter.
9
9
  class Sanitizer
10
10
  COOKIE_PAIRS = /[;,]\s?/
11
- COOKIE_SEP = '='.freeze
12
- COOKIE_PAIR_SEP = '; '.freeze
11
+ COOKIE_SEP = "=".freeze
12
+ COOKIE_PAIR_SEP = "; ".freeze
13
13
 
14
- ENCODE_OPTS = { invalid: :replace, undef: :replace, replace: '?'.freeze }.freeze
14
+ ENCODE_OPTS = {invalid: :replace, undef: :replace, replace: "?".freeze}.freeze
15
15
 
16
- BASIC_OBJECT = '#<BasicObject>'.freeze
17
- DEPTH = '[DEPTH]'.freeze
18
- FILTERED = '[FILTERED]'.freeze
19
- RAISED = '[RAISED]'.freeze
20
- RECURSION = '[RECURSION]'.freeze
21
- TRUNCATED = '[TRUNCATED]'.freeze
16
+ BASIC_OBJECT = "#<BasicObject>".freeze
17
+ DEPTH = "[DEPTH]".freeze
18
+ FILTERED = "[FILTERED]".freeze
19
+ RAISED = "[RAISED]".freeze
20
+ RECURSION = "[RECURSION]".freeze
21
+ TRUNCATED = "[TRUNCATED]".freeze
22
22
 
23
23
  IMMUTABLE = [NilClass, FalseClass, TrueClass, Symbol, Numeric, Method].freeze
24
24
 
@@ -51,15 +51,15 @@ module Honeybadger
51
51
  @deep_regexps, @regexps = @regexps.partition { |r| r.to_s.include?('\\.'.freeze) }
52
52
  deep_strings, @strings = strings.partition { |s| s.include?('\\.'.freeze) }
53
53
 
54
- @regexps << Regexp.new(strings.join('|'.freeze), true) unless strings.empty?
55
- @deep_regexps << Regexp.new(deep_strings.join('|'.freeze), true) unless deep_strings.empty?
54
+ @regexps << Regexp.new(strings.join("|".freeze), true) unless strings.empty?
55
+ @deep_regexps << Regexp.new(deep_strings.join("|".freeze), true) unless deep_strings.empty?
56
56
  end
57
57
 
58
58
  def sanitize(data, depth = 0, stack = nil, parents = [])
59
59
  return BASIC_OBJECT if basic_object?(data)
60
60
 
61
61
  if recursive?(data)
62
- return RECURSION if stack && stack.include?(data.object_id)
62
+ return RECURSION if stack&.include?(data.object_id)
63
63
 
64
64
  stack = stack ? stack.dup : Set.new
65
65
  stack << data.object_id
@@ -74,12 +74,12 @@ module Honeybadger
74
74
 
75
75
  hash.each_pair do |key, value|
76
76
  parents.push(key) if deep_regexps
77
- key = key.kind_of?(Symbol) ? key : sanitize(key, depth+1, stack, parents)
77
+ key = key.is_a?(Symbol) ? key : sanitize(key, depth + 1, stack, parents)
78
78
 
79
79
  if filter_key?(key, parents)
80
80
  new_hash[key] = FILTERED
81
81
  else
82
- value = sanitize(value, depth+1, stack, parents)
82
+ value = sanitize(value, depth + 1, stack, parents)
83
83
 
84
84
  if blocks.any? && !recursive?(value)
85
85
  key = key.dup if can_dup?(key)
@@ -98,13 +98,13 @@ module Honeybadger
98
98
  return DEPTH if depth >= max_depth
99
99
 
100
100
  data.to_a.map do |value|
101
- sanitize(value, depth+1, stack, parents)
101
+ sanitize(value, depth + 1, stack, parents)
102
102
  end
103
103
  when Numeric, TrueClass, FalseClass, NilClass
104
104
  data
105
105
  when String
106
106
  sanitize_string(data)
107
- when -> (d) { d.respond_to?(:to_honeybadger) }
107
+ when ->(d) { d.respond_to?(:to_honeybadger) }
108
108
  return DEPTH if depth >= max_depth
109
109
 
110
110
  begin
@@ -113,7 +113,7 @@ module Honeybadger
113
113
  return RAISED
114
114
  end
115
115
 
116
- sanitize(data, depth+1, stack, parents)
116
+ sanitize(data, depth + 1, stack, parents)
117
117
  else # all other objects
118
118
  klass = data.class
119
119
 
@@ -156,7 +156,7 @@ module Honeybadger
156
156
  filtered_url
157
157
  end
158
158
 
159
- private
159
+ private
160
160
 
161
161
  attr_reader :max_depth, :regexps, :deep_regexps, :blocks
162
162
 
@@ -180,7 +180,7 @@ module Honeybadger
180
180
  def valid_encoding?(string)
181
181
  string.valid_encoding? && (
182
182
  VALID_ENCODINGS.include?(string.encoding) ||
183
- VALID_ENCODINGS.include?(Encoding.compatible?(''.freeze, string))
183
+ VALID_ENCODINGS.include?(Encoding.compatible?("".freeze, string))
184
184
  )
185
185
  end
186
186
 
@@ -202,7 +202,7 @@ module Honeybadger
202
202
  end
203
203
 
204
204
  def can_dup?(obj)
205
- !IMMUTABLE.any? {|k| obj.kind_of?(k) }
205
+ !IMMUTABLE.any? { |k| obj.is_a?(k) }
206
206
  end
207
207
 
208
208
  def inspected?(string)
@@ -6,14 +6,17 @@ module Honeybadger
6
6
 
7
7
  class << self
8
8
  def all
9
- { :mem => memory, :load => load }
9
+ {mem: memory, load: load}
10
10
  end
11
11
 
12
12
  # From https://github.com/bloopletech/webstats/blob/master/server/data_providers/mem_info.rb
13
13
  def memory
14
14
  out = {}
15
15
  if HAS_MEM && (meminfo = run_meminfo)
16
- out[:total], out[:free], out[:buffers], out[:cached] = meminfo[0..4].map { |l| l =~ /^.*?\: +(.*?) kB$/; ($1.to_i / 1024.0).to_f }
16
+ out[:total], out[:free], out[:buffers], out[:cached] = meminfo[0..4].map { |l|
17
+ l =~ /^.*?: +(.*?) kB$/
18
+ ($1.to_i / 1024.0).to_f
19
+ }
17
20
  out[:free_total] = out[:free] + out[:buffers] + out[:cached]
18
21
  end
19
22
  out
@@ -23,7 +26,7 @@ module Honeybadger
23
26
  def load
24
27
  out = {}
25
28
  if HAS_LOAD && (loadavg = run_loadavg)
26
- out[:one], out[:five], out[:fifteen] = loadavg.split(' ', 4).map(&:to_f)
29
+ out[:one], out[:five], out[:fifteen] = loadavg.split(" ", 4).map(&:to_f)
27
30
  end
28
31
  out
29
32
  end
@@ -1,4 +1,4 @@
1
1
  module Honeybadger
2
2
  # The current String Honeybadger version.
3
- VERSION = '5.29.0'.freeze
3
+ VERSION = "6.0.0".freeze
4
4
  end
@@ -1,7 +1,7 @@
1
- require 'forwardable'
2
- require 'net/http'
1
+ require "forwardable"
2
+ require "net/http"
3
3
 
4
- require 'honeybadger/logging'
4
+ require "honeybadger/logging"
5
5
 
6
6
  module Honeybadger
7
7
  # A concurrent queue to notify the backend.
@@ -38,7 +38,7 @@ module Honeybadger
38
38
  return false unless start
39
39
 
40
40
  if queue.size >= config.max_queue_size
41
- warn { sprintf('Unable to report error; reached max queue size of %s. id=%s', queue.size, msg.id) }
41
+ warn { sprintf("Unable to report error; reached max queue size of %s. id=%s", queue.size, msg.id) }
42
42
  return false
43
43
  end
44
44
 
@@ -50,7 +50,7 @@ module Honeybadger
50
50
  end
51
51
 
52
52
  def shutdown(force = false)
53
- d { 'shutting down worker' }
53
+ d { "shutting down worker" }
54
54
 
55
55
  mutex.synchronize do
56
56
  @shutdown = true
@@ -60,11 +60,11 @@ module Honeybadger
60
60
  return true unless thread&.alive?
61
61
 
62
62
  if throttled?
63
- warn { sprintf('Unable to report %s error(s) to Honeybadger (currently throttled)', queue.size) } unless queue.empty?
63
+ warn { sprintf("Unable to report %s error(s) to Honeybadger (currently throttled)", queue.size) } unless queue.empty?
64
64
  return true
65
65
  end
66
66
 
67
- info { sprintf('Waiting to report %s error(s) to Honeybadger', queue.size) } unless queue.empty?
67
+ info { sprintf("Waiting to report %s error(s) to Honeybadger", queue.size) } unless queue.empty?
68
68
 
69
69
  queue.push(SHUTDOWN)
70
70
  !!thread.join
@@ -76,7 +76,7 @@ module Honeybadger
76
76
  # Blocks until queue is processed up to this point in time.
77
77
  def flush
78
78
  mutex.synchronize do
79
- if thread && thread.alive?
79
+ if thread&.alive?
80
80
  queue.push(marker)
81
81
  marker.wait(mutex)
82
82
  end
@@ -125,7 +125,7 @@ module Honeybadger
125
125
  end
126
126
 
127
127
  def kill!
128
- d { 'killing worker thread' }
128
+ d { "killing worker thread" }
129
129
 
130
130
  if thread
131
131
  Thread.kill(thread)
@@ -147,7 +147,7 @@ module Honeybadger
147
147
 
148
148
  def run
149
149
  begin
150
- d { 'worker started' }
150
+ d { "worker started" }
151
151
  loop do
152
152
  case msg = queue.pop
153
153
  when SHUTDOWN then break
@@ -156,9 +156,9 @@ module Honeybadger
156
156
  end
157
157
  end
158
158
  ensure
159
- d { 'stopping worker' }
159
+ d { "stopping worker" }
160
160
  end
161
- rescue Exception => e
161
+ rescue => e
162
162
  error {
163
163
  msg = "Error in worker thread (shutting down) class=%s message=%s\n\t%s"
164
164
  sprintf(msg, e.class, e.message.dump, Array(e.backtrace).join("\n\t"))
@@ -171,13 +171,13 @@ module Honeybadger
171
171
  send_now(msg)
172
172
 
173
173
  if shutdown? && throttled?
174
- warn { sprintf('Unable to report %s error(s) to Honeybadger (currently throttled)', queue.size) } if queue.size > 1
174
+ warn { sprintf("Unable to report %s error(s) to Honeybadger (currently throttled)", queue.size) } if queue.size > 1
175
175
  kill!
176
176
  return
177
177
  end
178
178
 
179
179
  sleep(throttle_interval)
180
- rescue StandardError => e
180
+ rescue => e
181
181
  error {
182
182
  msg = "Error in worker thread class=%s message=%s\n\t%s"
183
183
  sprintf(msg, e.class, e.message.dump, Array(e.backtrace).join("\n\t"))
@@ -185,12 +185,12 @@ module Honeybadger
185
185
  end
186
186
 
187
187
  def notify_backend(payload)
188
- d { sprintf('worker notifying backend id=%s', payload.id) }
188
+ d { sprintf("worker notifying backend id=%s", payload.id) }
189
189
  backend.notify(:notices, payload)
190
190
  end
191
191
 
192
192
  def calc_throttle_interval
193
- ((BASE_THROTTLE ** throttle) - 1).round(3)
193
+ ((BASE_THROTTLE**throttle) - 1).round(3)
194
194
  end
195
195
 
196
196
  def inc_throttle
@@ -211,33 +211,33 @@ module Honeybadger
211
211
  end
212
212
 
213
213
  def handle_response(msg, response)
214
- d { sprintf('worker response id=%s code=%s message=%s', msg.id, response.code, response.message.to_s.dump) }
214
+ d { sprintf("worker response id=%s code=%s message=%s", msg.id, response.code, response.message.to_s.dump) }
215
215
 
216
216
  case response.code
217
217
  when 429, 503
218
218
  throttle = inc_throttle
219
- warn { sprintf('Error report failed: project is sending too many errors. id=%s code=%s throttle=%s interval=%s', msg.id, response.code, throttle, throttle_interval) }
219
+ warn { sprintf("Error report failed: project is sending too many errors. id=%s code=%s throttle=%s interval=%s", msg.id, response.code, throttle, throttle_interval) }
220
220
  when 402
221
- warn { sprintf('Error report failed: payment is required. id=%s code=%s', msg.id, response.code) }
221
+ warn { sprintf("Error report failed: payment is required. id=%s code=%s", msg.id, response.code) }
222
222
  suspend(3600)
223
223
  when 403
224
- warn { sprintf('Error report failed: API key is invalid. id=%s code=%s', msg.id, response.code) }
224
+ warn { sprintf("Error report failed: API key is invalid. id=%s code=%s", msg.id, response.code) }
225
225
  suspend(3600)
226
226
  when 413
227
- warn { sprintf('Error report failed: Payload is too large. id=%s code=%s', msg.id, response.code) }
227
+ warn { sprintf("Error report failed: Payload is too large. id=%s code=%s", msg.id, response.code) }
228
228
  when 201
229
- host = config.get(:'connection.ui_host')
230
- if throttle = dec_throttle
231
- info { sprintf('Success ⚡ https://%s/notice/%s id=%s code=%s throttle=%s interval=%s', host, msg.id, msg.id, response.code, throttle, throttle_interval) }
229
+ host = config.get(:"connection.ui_host")
230
+ if (throttle = dec_throttle)
231
+ info { sprintf("Success ⚡ https://%s/notice/%s id=%s code=%s throttle=%s interval=%s", host, msg.id, msg.id, response.code, throttle, throttle_interval) }
232
232
  else
233
- info { sprintf('Success ⚡ https://%s/notice/%s id=%s code=%s', host, msg.id, msg.id, response.code) }
233
+ info { sprintf("Success ⚡ https://%s/notice/%s id=%s code=%s", host, msg.id, msg.id, response.code) }
234
234
  end
235
235
  when :stubbed
236
- info { sprintf('Success ⚡ Development mode is enabled; this error will be reported if it occurs after you deploy your app. id=%s', msg.id) }
236
+ info { sprintf("Success ⚡ Development mode is enabled; this error will be reported if it occurs after you deploy your app. id=%s", msg.id) }
237
237
  when :error
238
- warn { sprintf('Error report failed: an unknown error occurred. code=%s error=%s', response.code, response.message.to_s.dump) }
238
+ warn { sprintf("Error report failed: an unknown error occurred. code=%s error=%s", response.code, response.message.to_s.dump) }
239
239
  else
240
- warn { sprintf('Error report failed: unknown response from server. code=%s', response.code) }
240
+ warn { sprintf("Error report failed: unknown response from server. code=%s", response.code) }
241
241
  end
242
242
  end
243
243
 
@@ -248,8 +248,10 @@ module Honeybadger
248
248
  end
249
249
 
250
250
  def signal_marker(marker)
251
- mutex.synchronize do
251
+ if mutex.owned?
252
252
  marker.signal
253
+ else
254
+ mutex.synchronize { marker.signal }
253
255
  end
254
256
  end
255
257
  end
data/lib/honeybadger.rb CHANGED
@@ -1,13 +1,13 @@
1
1
  if defined?(::Rails::Railtie)
2
- require 'honeybadger/init/rails'
2
+ require "honeybadger/init/rails"
3
3
  elsif defined?(Sinatra::Base)
4
- require 'honeybadger/init/sinatra'
4
+ require "honeybadger/init/sinatra"
5
5
  elsif defined?(::Hanami)
6
- require 'honeybadger/init/hanami'
6
+ require "honeybadger/init/hanami"
7
7
  else
8
- require 'honeybadger/init/ruby'
8
+ require "honeybadger/init/ruby"
9
9
  end
10
10
 
11
11
  if defined?(Rake.application)
12
- require 'honeybadger/init/rake'
12
+ require "honeybadger/init/rake"
13
13
  end
@@ -1,10 +1,10 @@
1
- require 'honeybadger/instrumentation_helper'
1
+ require "honeybadger/instrumentation_helper"
2
2
 
3
3
  module Honeybadger
4
4
  class PumaPlugin
5
5
  include Honeybadger::InstrumentationHelper
6
6
 
7
- STATS_KEYS = %i(pool_capacity max_threads requests_count backlog running).freeze
7
+ STATS_KEYS = %i[pool_capacity max_threads requests_count backlog running].freeze
8
8
 
9
9
  ::Puma::Plugin.create do
10
10
  def start(launcher)
@@ -19,14 +19,18 @@ module Honeybadger
19
19
  end
20
20
 
21
21
  def record
22
- metric_source 'puma'
22
+ metric_source "puma"
23
23
 
24
- stats = ::Puma.stats rescue {}
24
+ stats = begin
25
+ ::Puma.stats
26
+ rescue
27
+ {}
28
+ end
25
29
  stats = stats.is_a?(Hash) ? stats : JSON.parse(stats, symbolize_names: true)
26
30
 
27
31
  if stats[:worker_status].is_a?(Array)
28
32
  stats[:worker_status].each do |worker_data|
29
- context = { worker: worker_data[:index] }
33
+ context = {worker: worker_data[:index]}
30
34
  record_puma_stats(worker_data[:last_status], context)
31
35
  end
32
36
  else
@@ -34,14 +38,14 @@ module Honeybadger
34
38
  end
35
39
  end
36
40
 
37
- def record_puma_stats(stats, context={})
41
+ def record_puma_stats(stats, context = {})
38
42
  if Honeybadger.config.load_plugin_insights_events?(:puma)
39
- Honeybadger.event('stats.puma', context.merge(stats))
43
+ Honeybadger.event("stats.puma", context.merge(stats))
40
44
  end
41
45
 
42
46
  if Honeybadger.config.load_plugin_insights_metrics?(:puma)
43
47
  STATS_KEYS.each do |stat|
44
- gauge stat, context, ->{ stats[stat] } if stats[stat]
48
+ gauge stat, context, -> { stats[stat] } if stats[stat]
45
49
  end
46
50
  end
47
51
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeybadger
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.29.0
4
+ version: 6.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Honeybadger Industries LLC
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-06-30 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: logger
@@ -201,14 +201,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
201
201
  requirements:
202
202
  - - ">="
203
203
  - !ruby/object:Gem::Version
204
- version: 2.3.0
204
+ version: 3.0.0
205
205
  required_rubygems_version: !ruby/object:Gem::Requirement
206
206
  requirements:
207
207
  - - ">="
208
208
  - !ruby/object:Gem::Version
209
209
  version: '0'
210
210
  requirements: []
211
- rubygems_version: 3.7.0.dev
211
+ rubygems_version: 3.8.0.dev
212
212
  specification_version: 4
213
213
  summary: Full-stack error tracking, performance monitoring, logging, and more.
214
214
  test_files: []