rollbar 2.26.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.github/pull_request_template.md +34 -0
  3. data/.github/workflows/ci.yml +104 -0
  4. data/.rubocop.yml +52 -36
  5. data/Gemfile +25 -29
  6. data/README.md +32 -8
  7. data/data/rollbar.snippet.js +1 -1
  8. data/docs/configuration.md +7 -0
  9. data/gemfiles/rails30.gemfile +17 -35
  10. data/gemfiles/rails31.gemfile +20 -37
  11. data/gemfiles/rails32.gemfile +13 -31
  12. data/gemfiles/rails40.gemfile +12 -32
  13. data/gemfiles/rails41.gemfile +11 -31
  14. data/gemfiles/rails42.gemfile +11 -35
  15. data/gemfiles/rails50.gemfile +14 -32
  16. data/gemfiles/rails51.gemfile +13 -31
  17. data/gemfiles/rails52.gemfile +10 -19
  18. data/gemfiles/rails60.gemfile +10 -25
  19. data/gemfiles/rails61.gemfile +52 -0
  20. data/gemfiles/rails70.gemfile +52 -0
  21. data/lib/generators/rollbar/rollbar_generator.rb +18 -14
  22. data/lib/rails/rollbar_runner.rb +8 -19
  23. data/lib/rollbar/capistrano.rb +17 -9
  24. data/lib/rollbar/capistrano3.rb +8 -2
  25. data/lib/rollbar/capistrano_tasks.rb +44 -8
  26. data/lib/rollbar/configuration.rb +122 -88
  27. data/lib/rollbar/delay/shoryuken.rb +4 -3
  28. data/lib/rollbar/delay/sidekiq.rb +3 -1
  29. data/lib/rollbar/delay/sucker_punch.rb +1 -2
  30. data/lib/rollbar/delay/thread.rb +3 -2
  31. data/lib/rollbar/deploy.rb +6 -7
  32. data/lib/rollbar/encoding/encoder.rb +7 -3
  33. data/lib/rollbar/encoding.rb +2 -7
  34. data/lib/rollbar/exception_reporter.rb +17 -8
  35. data/lib/rollbar/item/backtrace.rb +10 -8
  36. data/lib/rollbar/item/frame.rb +6 -5
  37. data/lib/rollbar/item/locals.rb +5 -2
  38. data/lib/rollbar/item.rb +60 -38
  39. data/lib/rollbar/json.rb +1 -1
  40. data/lib/rollbar/language_support.rb +0 -6
  41. data/lib/rollbar/lazy_store.rb +3 -7
  42. data/lib/rollbar/logger.rb +2 -0
  43. data/lib/rollbar/logger_proxy.rb +3 -1
  44. data/lib/rollbar/middleware/js/json_value.rb +15 -5
  45. data/lib/rollbar/middleware/js.rb +59 -37
  46. data/lib/rollbar/middleware/rack/builder.rb +3 -3
  47. data/lib/rollbar/middleware/rack/test_session.rb +3 -3
  48. data/lib/rollbar/middleware/rack.rb +4 -4
  49. data/lib/rollbar/middleware/rails/rollbar.rb +9 -6
  50. data/lib/rollbar/middleware/rails/show_exceptions.rb +8 -4
  51. data/lib/rollbar/notifier/trace_with_bindings.rb +13 -3
  52. data/lib/rollbar/notifier.rb +180 -136
  53. data/lib/rollbar/plugin.rb +8 -8
  54. data/lib/rollbar/plugins/active_job.rb +15 -2
  55. data/lib/rollbar/plugins/delayed_job/plugin.rb +14 -3
  56. data/lib/rollbar/plugins/goalie.rb +27 -16
  57. data/lib/rollbar/plugins/rails/controller_methods.rb +18 -14
  58. data/lib/rollbar/plugins/rails/railtie30.rb +2 -1
  59. data/lib/rollbar/plugins/rails/railtie32.rb +2 -1
  60. data/lib/rollbar/plugins/rails/railtie_mixin.rb +2 -2
  61. data/lib/rollbar/plugins/rails.rb +5 -2
  62. data/lib/rollbar/plugins/rake.rb +2 -1
  63. data/lib/rollbar/plugins/sidekiq/plugin.rb +39 -21
  64. data/lib/rollbar/plugins/sidekiq.rb +1 -1
  65. data/lib/rollbar/plugins/thread.rb +8 -7
  66. data/lib/rollbar/plugins/validations.rb +3 -1
  67. data/lib/rollbar/rake_tasks.rb +1 -2
  68. data/lib/rollbar/request_data_extractor.rb +48 -19
  69. data/lib/rollbar/rollbar_test.rb +9 -118
  70. data/lib/rollbar/scrubbers/params.rb +13 -7
  71. data/lib/rollbar/scrubbers/url.rb +56 -17
  72. data/lib/rollbar/scrubbers.rb +1 -1
  73. data/lib/rollbar/truncation/remove_any_key_strategy.rb +4 -1
  74. data/lib/rollbar/truncation/remove_extra_strategy.rb +3 -1
  75. data/lib/rollbar/util/hash.rb +14 -7
  76. data/lib/rollbar/util/ip_anonymizer.rb +1 -1
  77. data/lib/rollbar/util.rb +19 -13
  78. data/lib/rollbar/version.rb +1 -1
  79. data/lib/rollbar.rb +12 -7
  80. data/lib/tasks/benchmark.rake +2 -1
  81. data/rollbar.gemspec +5 -3
  82. metadata +17 -12
  83. data/.travis.yml +0 -284
  84. data/lib/rollbar/encoding/legacy_encoder.rb +0 -20
  85. /data/lib/generators/rollbar/templates/{initializer.rb → initializer.erb} +0 -0
@@ -10,7 +10,8 @@ module Rollbar
10
10
  # configuration array even if :scrub_all is true.
11
11
  class Params
12
12
  SKIPPED_CLASSES = [::Tempfile].freeze
13
- ATTACHMENT_CLASSES = %w[ActionDispatch::Http::UploadedFile Rack::Multipart::UploadedFile].freeze
13
+ ATTACHMENT_CLASSES = %w[ActionDispatch::Http::UploadedFile
14
+ Rack::Multipart::UploadedFile].freeze
14
15
  SCRUB_ALL = :scrub_all
15
16
 
16
17
  def self.call(*args)
@@ -21,7 +22,7 @@ module Rollbar
21
22
  params = options[:params]
22
23
  return {} unless params
23
24
 
24
- @scrubbed_object_ids = {}
25
+ @scrubbed_objects = {}.compare_by_identity
25
26
 
26
27
  config = options[:config]
27
28
  extra_fields = options[:extra_fields]
@@ -52,16 +53,20 @@ module Rollbar
52
53
  end
53
54
 
54
55
  def build_whitelist_regex(whitelist)
55
- fields = whitelist.find_all { |f| f.is_a?(String) || f.is_a?(Symbol) || f.is_a?(Regexp) }
56
+ fields = whitelist.find_all do |f|
57
+ f.is_a?(String) || f.is_a?(Symbol) || f.is_a?(Regexp)
58
+ end
56
59
  return unless fields.any?
57
60
 
58
- Regexp.new(fields.map { |val| val.is_a?(Regexp) ? val : /\A#{Regexp.escape(val.to_s)}\z/ }.join('|'))
61
+ Regexp.new(fields.map do |val|
62
+ val.is_a?(Regexp) ? val : /\A#{Regexp.escape(val.to_s)}\z/
63
+ end.join('|'))
59
64
  end
60
65
 
61
66
  def scrub(params, options)
62
- return params if @scrubbed_object_ids[params.object_id]
67
+ return params if @scrubbed_objects[params]
63
68
 
64
- @scrubbed_object_ids[params.object_id] = true
69
+ @scrubbed_objects[params] = true
65
70
 
66
71
  fields_regex = options[:fields_regex]
67
72
  scrub_all = options[:scrub_all]
@@ -71,7 +76,8 @@ module Rollbar
71
76
 
72
77
  params.to_hash.inject({}) do |result, (key, value)|
73
78
  encoded_key = Rollbar::Encoding.encode(key).to_s
74
- result[key] = if (fields_regex === encoded_key) && !(whitelist_regex === encoded_key)
79
+ result[key] = if (fields_regex === encoded_key) &&
80
+ !(whitelist_regex === encoded_key)
75
81
  scrub_value(value)
76
82
  elsif value.is_a?(Hash)
77
83
  scrub(value, options)
@@ -13,7 +13,7 @@ module Rollbar
13
13
  end
14
14
 
15
15
  def call(options = {})
16
- url = options[:url]
16
+ url = ascii_encode(options[:url])
17
17
 
18
18
  filter(url,
19
19
  build_regex(options[:scrub_fields]),
@@ -23,12 +23,29 @@ module Rollbar
23
23
  options[:scrub_fields].include?(SCRUB_ALL),
24
24
  build_whitelist_regex(options[:whitelist] || []))
25
25
  rescue StandardError => e
26
- Rollbar.logger.error("[Rollbar] There was an error scrubbing the url: #{e}, options: #{options.inspect}")
26
+ message = '[Rollbar] There was an error scrubbing the url: ' \
27
+ "#{e}, options: #{options.inspect}"
28
+ Rollbar.logger.error(message)
27
29
  url
28
30
  end
29
31
 
30
32
  private
31
33
 
34
+ def ascii_encode(url)
35
+ # In some cases non-ascii characters won't be properly encoded, so we do it here.
36
+ #
37
+ # The standard encoders (the CGI and URI methods) are not reliable when
38
+ # the query string is already embedded in the full URL, but the inconsistencies
39
+ # are limited to issues with characters in the ascii range. (For example,
40
+ # the '#' if it appears in an unexpected place.) For escaping non-ascii,
41
+ # they are all OK, so we'll take care to skip the ascii chars.
42
+
43
+ return url if url.ascii_only?
44
+
45
+ # Iterate each char and only escape non-ascii characters.
46
+ url.each_char.map { |c| c.ascii_only? ? c : CGI.escape(c) }.join
47
+ end
48
+
32
49
  def build_whitelist_regex(whitelist)
33
50
  fields = whitelist.find_all { |f| f.is_a?(String) || f.is_a?(Symbol) }
34
51
  return unless fields.any?
@@ -36,12 +53,15 @@ module Rollbar
36
53
  Regexp.new(fields.map { |val| /\A#{Regexp.escape(val.to_s)}\z/ }.join('|'))
37
54
  end
38
55
 
39
- def filter(url, regex, scrub_user, scrub_password, randomize_scrub_length, scrub_all, whitelist)
56
+ def filter(url, regex, scrub_user, scrub_password, randomize_scrub_length,
57
+ scrub_all, whitelist)
40
58
  uri = URI.parse(url)
41
59
 
42
60
  uri.user = filter_user(uri.user, scrub_user, randomize_scrub_length)
43
- uri.password = filter_password(uri.password, scrub_password, randomize_scrub_length)
44
- uri.query = filter_query(uri.query, regex, randomize_scrub_length, scrub_all, whitelist)
61
+ uri.password = filter_password(uri.password, scrub_password,
62
+ randomize_scrub_length)
63
+ uri.query = filter_query(uri.query, regex, randomize_scrub_length, scrub_all,
64
+ whitelist)
45
65
 
46
66
  uri.to_s
47
67
  end
@@ -59,7 +79,12 @@ module Rollbar
59
79
  end
60
80
 
61
81
  def filter_password(password, scrub_password, randomize_scrub_length)
62
- scrub_password && password ? filtered_value(password, randomize_scrub_length) : password
82
+ if scrub_password && password
83
+ filtered_value(password,
84
+ randomize_scrub_length)
85
+ else
86
+ password
87
+ end
63
88
  end
64
89
 
65
90
  def filter_query(query, regex, randomize_scrub_length, scrub_all, whitelist)
@@ -67,10 +92,8 @@ module Rollbar
67
92
 
68
93
  params = decode_www_form(query)
69
94
 
70
- encoded_query = encode_www_form(filter_query_params(params, regex, randomize_scrub_length, scrub_all, whitelist))
71
-
72
- # We want this to rebuild array params like foo[]=1&foo[]=2
73
- URI.escape(CGI.unescape(encoded_query))
95
+ encode_www_form(filter_query_params(params, regex, randomize_scrub_length,
96
+ scrub_all, whitelist))
74
97
  end
75
98
 
76
99
  def decode_www_form(query)
@@ -78,12 +101,28 @@ module Rollbar
78
101
  end
79
102
 
80
103
  def encode_www_form(params)
81
- URI.encode_www_form(params)
104
+ restore_square_brackets(URI.encode_www_form(params))
105
+ end
106
+
107
+ def restore_square_brackets(query)
108
+ # We want this to rebuild array params like foo[]=1&foo[]=2
109
+ #
110
+ # URI.encode_www_form follows the spec at
111
+ # https://url.spec.whatwg.org/#concept-urlencoded-serializer
112
+ # and percent encodes square brackets. Here we change them back.
113
+ query.gsub('%5B', '[').gsub('%5D', ']')
82
114
  end
83
115
 
84
- def filter_query_params(params, regex, randomize_scrub_length, scrub_all, whitelist)
116
+ def filter_query_params(params, regex, randomize_scrub_length, scrub_all,
117
+ whitelist)
85
118
  params.map do |key, value|
86
- [key, filter_key?(key, regex, scrub_all, whitelist) ? filtered_value(value, randomize_scrub_length) : value]
119
+ [key,
120
+ if filter_key?(key, regex, scrub_all,
121
+ whitelist)
122
+ filtered_value(value, randomize_scrub_length)
123
+ else
124
+ value
125
+ end]
87
126
  end
88
127
  end
89
128
 
@@ -96,10 +135,10 @@ module Rollbar
96
135
  random_filtered_value
97
136
  else
98
137
  '*' * (begin
99
- value.length
100
- rescue StandardError
101
- 8
102
- end)
138
+ value.length
139
+ rescue StandardError
140
+ 8
141
+ end)
103
142
  end
104
143
  end
105
144
 
@@ -2,7 +2,7 @@ module Rollbar
2
2
  module Scrubbers
3
3
  module_function
4
4
 
5
- def scrub_value(value)
5
+ def scrub_value(_value)
6
6
  if Rollbar.configuration.randomize_scrub_length
7
7
  random_filtered_value
8
8
  else
@@ -91,7 +91,10 @@ module Rollbar
91
91
  def extract_title(body)
92
92
  return body['message']['body'] if body['message'] && body['message']['body']
93
93
  return extract_title_from_trace(body['trace']) if body['trace']
94
- return extract_title_from_trace(body['trace_chain'][0]) if body['trace_chain'] && body['trace_chain'][0]
94
+
95
+ return unless body['trace_chain'] && body['trace_chain'][0]
96
+
97
+ extract_title_from_trace(body['trace_chain'][0])
95
98
  end
96
99
 
97
100
  def extract_title_from_trace(trace)
@@ -24,7 +24,9 @@ module Rollbar
24
24
  end
25
25
 
26
26
  def delete_trace_chain_extra(body)
27
- body['trace_chain'][0].delete('extra') if body['trace_chain'] && body['trace_chain'][0]['extra']
27
+ return unless body['trace_chain'] && body['trace_chain'][0]['extra']
28
+
29
+ body['trace_chain'][0].delete('extra')
28
30
  end
29
31
 
30
32
  def delete_trace_extra(body)
@@ -2,9 +2,10 @@ module Rollbar
2
2
  module Util
3
3
  module Hash # :nodoc:
4
4
  def self.deep_stringify_keys(hash, seen = {})
5
- return if seen[hash.object_id]
5
+ seen.compare_by_identity
6
+ return if seen[hash]
6
7
 
7
- seen[hash.object_id] = true
8
+ seen[hash] = true
8
9
  replace_seen_children(hash, seen)
9
10
 
10
11
  hash.reduce({}) do |h, (key, value)|
@@ -19,10 +20,10 @@ module Rollbar
19
20
  when ::Hash
20
21
  send(meth, thing, seen)
21
22
  when Array
22
- if seen[thing.object_id]
23
+ if seen[thing]
23
24
  thing
24
25
  else
25
- seen[thing.object_id] = true
26
+ seen[thing] = true
26
27
  replace_seen_children(thing, seen)
27
28
  thing.map { |v| map_value(v, meth, seen) }
28
29
  end
@@ -34,12 +35,18 @@ module Rollbar
34
35
  def self.replace_seen_children(thing, seen)
35
36
  case thing
36
37
  when ::Hash
37
- thing.keys.each do |key|
38
- thing[key] = "removed circular reference: #{thing[key]}" if seen[thing[key].object_id]
38
+ thing.keys.each do |key| # rubocop:disable Style/HashEachMethods
39
+ if seen[thing[key]]
40
+ thing[key] =
41
+ "removed circular reference: #{thing[key]}"
42
+ end
39
43
  end
40
44
  when Array
41
45
  thing.each_with_index do |_, i|
42
- thing[i] = "removed circular reference: #{thing[i]}" if seen[thing[i].object_id]
46
+ if seen[thing[i]]
47
+ thing[i] =
48
+ "removed circular reference: #{thing[i]}"
49
+ end
43
50
  end
44
51
  end
45
52
  end
@@ -24,7 +24,7 @@ module Rollbar
24
24
  def self.anonymize_ipv6(ip)
25
25
  ip_parts = ip.to_s.split ':'
26
26
 
27
- ip_string = ip_parts[0..2].join(':') + ':0000:0000:0000:0000:0000'
27
+ ip_string = "#{ip_parts[0..2].join(':')}:0000:0000:0000:0000:0000"
28
28
 
29
29
  IPAddr.new(ip_string).to_s
30
30
  end
data/lib/rollbar/util.rb CHANGED
@@ -7,9 +7,10 @@ module Rollbar
7
7
  end
8
8
 
9
9
  def self.iterate_and_update(obj, block, seen = {})
10
- return if obj.frozen? || seen[obj.object_id]
10
+ seen.compare_by_identity
11
+ return if obj.frozen? || seen[obj]
11
12
 
12
- seen[obj.object_id] = true
13
+ seen[obj] = true
13
14
 
14
15
  if obj.is_a?(Array)
15
16
  iterate_and_update_array(obj, block, seen)
@@ -29,7 +30,7 @@ module Rollbar
29
30
  end
30
31
 
31
32
  def self.iterate_and_update_hash(obj, block, seen)
32
- obj.keys.each do |k|
33
+ obj.keys.each do |k| # rubocop:disable Style/HashEachMethods
33
34
  v = obj[k]
34
35
  new_key = block.call(k)
35
36
 
@@ -47,18 +48,21 @@ module Rollbar
47
48
  end
48
49
 
49
50
  def self.deep_copy(obj, copied = {})
51
+ copied.compare_by_identity
52
+
50
53
  # if we've already made a copy, return it.
51
- return copied[obj.object_id] if copied[obj.object_id]
54
+ return copied[obj] if copied[obj]
52
55
 
53
56
  result = clone_obj(obj)
54
57
 
55
58
  # Memoize the cloned object before recursive calls to #deep_copy below.
56
59
  # This is the point of doing the work in two steps.
57
- copied[obj.object_id] = result
60
+ copied[obj] = result
58
61
 
59
- if obj.is_a?(::Hash)
62
+ case obj
63
+ when ::Hash
60
64
  obj.each { |k, v| result[k] = deep_copy(v, copied) }
61
- elsif obj.is_a?(Array)
65
+ when Array
62
66
  obj.each { |v| result << deep_copy(v, copied) }
63
67
  end
64
68
 
@@ -66,9 +70,10 @@ module Rollbar
66
70
  end
67
71
 
68
72
  def self.clone_obj(obj)
69
- if obj.is_a?(::Hash)
73
+ case obj
74
+ when ::Hash
70
75
  obj.dup
71
- elsif obj.is_a?(Array)
76
+ when Array
72
77
  obj.dup.clear
73
78
  else
74
79
  obj
@@ -78,12 +83,13 @@ module Rollbar
78
83
  def self.deep_merge(hash1, hash2, merged = {})
79
84
  hash1 ||= {}
80
85
  hash2 ||= {}
86
+ merged.compare_by_identity
81
87
 
82
88
  # If we've already merged these two objects, return hash1 now.
83
- return hash1 if merged[hash1.object_id] && merged[hash1.object_id].include?(hash2.object_id)
89
+ return hash1 if merged[hash1] && merged[hash1].include?(hash2.object_id)
84
90
 
85
- merged[hash1.object_id] ||= []
86
- merged[hash1.object_id] << hash2.object_id
91
+ merged[hash1] ||= []
92
+ merged[hash1] << hash2.object_id
87
93
 
88
94
  perform_deep_merge(hash1, hash2, merged)
89
95
 
@@ -121,7 +127,7 @@ module Rollbar
121
127
  end
122
128
 
123
129
  def self.count_method_in_stack(method_symbol, file_path = '')
124
- caller.grep(/#{file_path}.*#{method_symbol.to_s}/).count
130
+ caller.grep(/#{file_path}.*#{method_symbol}/).count
125
131
  end
126
132
 
127
133
  def self.method_in_stack(method_symbol, file_path = '')
@@ -1,3 +1,3 @@
1
1
  module Rollbar
2
- VERSION = '2.26.0'.freeze
2
+ VERSION = '3.4.0'.freeze
3
3
  end
data/lib/rollbar.rb CHANGED
@@ -8,6 +8,7 @@ require 'forwardable'
8
8
  begin
9
9
  require 'securerandom'
10
10
  rescue LoadError
11
+ # Skip loading
11
12
  end
12
13
 
13
14
  require 'rollbar/version'
@@ -31,8 +32,7 @@ module Rollbar
31
32
 
32
33
  def_delegators :notifier, *PUBLIC_NOTIFIER_METHODS
33
34
 
34
- attr_writer :plugins
35
- attr_writer :root_notifier
35
+ attr_writer :plugins, :root_notifier
36
36
 
37
37
  def notifier
38
38
  # Use the global instance @root_notifier so we don't fall
@@ -160,8 +160,10 @@ module Rollbar
160
160
 
161
161
  # Backwards compatibility methods
162
162
 
163
- def report_exception(exception, request_data = nil, person_data = nil, level = 'error')
164
- Kernel.warn('[DEPRECATION] Rollbar.report_exception has been deprecated, please use log() or one of the level functions')
163
+ def report_exception(exception, request_data = nil, person_data = nil,
164
+ level = 'error')
165
+ Kernel.warn('[DEPRECATION] Rollbar.report_exception has been deprecated, ' \
166
+ 'please use log() or one of the level functions')
165
167
 
166
168
  scope = {}
167
169
  scope[:request] = request_data if request_data
@@ -173,13 +175,16 @@ module Rollbar
173
175
  end
174
176
 
175
177
  def report_message(message, level = 'info', extra_data = nil)
176
- Kernel.warn('[DEPRECATION] Rollbar.report_message has been deprecated, please use log() or one of the level functions')
178
+ Kernel.warn('[DEPRECATION] Rollbar.report_message has been deprecated, ' \
179
+ 'please use log() or one of the level functions')
177
180
 
178
181
  Rollbar.notifier.log(level, message, extra_data)
179
182
  end
180
183
 
181
- def report_message_with_request(message, level = 'info', request_data = nil, person_data = nil, extra_data = nil)
182
- Kernel.warn('[DEPRECATION] Rollbar.report_message_with_request has been deprecated, please use log() or one of the level functions')
184
+ def report_message_with_request(message, level = 'info', request_data = nil,
185
+ person_data = nil, extra_data = nil)
186
+ Kernel.warn('[DEPRECATION] Rollbar.report_message_with_request has been ' \
187
+ 'deprecated, please use log() or one of the level functions')
183
188
 
184
189
  scope = {}
185
190
  scope[:request] = request_data if request_data
@@ -77,7 +77,8 @@ class BenchmarkTraceWithBindings # :nodoc:
77
77
  def trace_point # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
78
78
  return unless defined?(TracePoint)
79
79
 
80
- @trace_point ||= TracePoint.new(:call, :return, :b_call, :b_return, :c_call, :c_return, :raise) do |tp|
80
+ @trace_point ||= TracePoint.new(:call, :return, :b_call, :b_return, :c_call,
81
+ :c_return, :raise) do |tp|
81
82
  next if options['hook_only']
82
83
 
83
84
  case tp.event
data/rollbar.gemspec CHANGED
@@ -7,16 +7,18 @@ Gem::Specification.new do |gem|
7
7
 
8
8
  gem.authors = ['Rollbar, Inc.']
9
9
  gem.email = ['support@rollbar.com']
10
- gem.description = 'Easy and powerful exception tracking for Ruby'
10
+ gem.description = "Track and debug errors in your Ruby applications with ease using Rollbar. With this gem, you can easily monitor and report on exceptions and other errors in your code, helping you identify and fix issues more quickly. Rollbar's intuitive interface and advanced error tracking features make it the perfect tool for ensuring the stability and reliability of your Ruby applications."
11
11
  gem.executables = ['rollbar-rails-runner']
12
12
  gem.summary = 'Reports exceptions to Rollbar'
13
13
  gem.homepage = 'https://rollbar.com'
14
14
  gem.license = 'MIT'
15
- gem.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
15
+ gem.files = `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(%r{^(test|spec|features)/})
17
+ end
16
18
  gem.files += ['spec/support/rollbar_api.rb'] # useful helper for app spec/tests.
17
19
  gem.name = 'rollbar'
18
20
  gem.require_paths = ['lib']
19
- gem.required_ruby_version = '>= 1.9.3'
21
+ gem.required_ruby_version = '>= 2.0.0'
20
22
  gem.version = Rollbar::VERSION
21
23
 
22
24
  if gem.respond_to?(:metadata)
metadata CHANGED
@@ -1,16 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rollbar
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.26.0
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rollbar, Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-22 00:00:00.000000000 Z
11
+ date: 2023-01-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: Easy and powerful exception tracking for Ruby
13
+ description: Track and debug errors in your Ruby applications with ease using Rollbar.
14
+ With this gem, you can easily monitor and report on exceptions and other errors
15
+ in your code, helping you identify and fix issues more quickly. Rollbar's intuitive
16
+ interface and advanced error tracking features make it the perfect tool for ensuring
17
+ the stability and reliability of your Ruby applications.
14
18
  email:
15
19
  - support@rollbar.com
16
20
  executables:
@@ -19,10 +23,11 @@ extensions: []
19
23
  extra_rdoc_files: []
20
24
  files:
21
25
  - ".codeclimate.yml"
26
+ - ".github/pull_request_template.md"
27
+ - ".github/workflows/ci.yml"
22
28
  - ".gitignore"
23
29
  - ".gitmodules"
24
30
  - ".rubocop.yml"
25
- - ".travis.yml"
26
31
  - Appraisals
27
32
  - CHANGELOG.md
28
33
  - Gemfile
@@ -46,8 +51,10 @@ files:
46
51
  - gemfiles/rails51.gemfile
47
52
  - gemfiles/rails52.gemfile
48
53
  - gemfiles/rails60.gemfile
54
+ - gemfiles/rails61.gemfile
55
+ - gemfiles/rails70.gemfile
49
56
  - lib/generators/rollbar/rollbar_generator.rb
50
- - lib/generators/rollbar/templates/initializer.rb
57
+ - lib/generators/rollbar/templates/initializer.erb
51
58
  - lib/rails/rollbar_runner.rb
52
59
  - lib/rollbar.rb
53
60
  - lib/rollbar/capistrano.rb
@@ -65,7 +72,6 @@ files:
65
72
  - lib/rollbar/deploy.rb
66
73
  - lib/rollbar/encoding.rb
67
74
  - lib/rollbar/encoding/encoder.rb
68
- - lib/rollbar/encoding/legacy_encoder.rb
69
75
  - lib/rollbar/exception_reporter.rb
70
76
  - lib/rollbar/exceptions.rb
71
77
  - lib/rollbar/item.rb
@@ -144,7 +150,7 @@ metadata:
144
150
  bug_tracker_uri: https://github.com/rollbar/rollbar-gem/issues
145
151
  homepage_uri: https://rollbar.com/
146
152
  documentation_uri: https://docs.rollbar.com/docs/ruby
147
- post_install_message:
153
+ post_install_message:
148
154
  rdoc_options: []
149
155
  require_paths:
150
156
  - lib
@@ -152,16 +158,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
158
  requirements:
153
159
  - - ">="
154
160
  - !ruby/object:Gem::Version
155
- version: 1.9.3
161
+ version: 2.0.0
156
162
  required_rubygems_version: !ruby/object:Gem::Requirement
157
163
  requirements:
158
164
  - - ">="
159
165
  - !ruby/object:Gem::Version
160
166
  version: '0'
161
167
  requirements: []
162
- rubyforge_project:
163
- rubygems_version: 2.7.7
164
- signing_key:
168
+ rubygems_version: 3.1.4
169
+ signing_key:
165
170
  specification_version: 4
166
171
  summary: Reports exceptions to Rollbar
167
172
  test_files: []