rollbar 3.1.0 → 3.3.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 (77) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ci.yml +18 -1
  3. data/.rubocop.yml +81 -34
  4. data/Gemfile +17 -10
  5. data/README.md +1 -1
  6. data/data/rollbar.snippet.js +1 -1
  7. data/gemfiles/rails30.gemfile +11 -12
  8. data/gemfiles/rails31.gemfile +12 -13
  9. data/gemfiles/rails32.gemfile +5 -6
  10. data/gemfiles/rails40.gemfile +3 -5
  11. data/gemfiles/rails41.gemfile +3 -6
  12. data/gemfiles/rails42.gemfile +5 -10
  13. data/gemfiles/rails50.gemfile +9 -10
  14. data/gemfiles/rails51.gemfile +8 -9
  15. data/gemfiles/rails52.gemfile +6 -5
  16. data/gemfiles/rails60.gemfile +7 -12
  17. data/gemfiles/rails61.gemfile +54 -0
  18. data/lib/generators/rollbar/rollbar_generator.rb +18 -14
  19. data/lib/generators/rollbar/templates/{initializer.rb → initializer.erb} +0 -0
  20. data/lib/rails/rollbar_runner.rb +12 -5
  21. data/lib/rollbar/capistrano.rb +16 -8
  22. data/lib/rollbar/capistrano3.rb +8 -2
  23. data/lib/rollbar/capistrano_tasks.rb +37 -10
  24. data/lib/rollbar/configuration.rb +114 -90
  25. data/lib/rollbar/delay/shoryuken.rb +4 -3
  26. data/lib/rollbar/delay/sidekiq.rb +3 -1
  27. data/lib/rollbar/delay/sucker_punch.rb +1 -2
  28. data/lib/rollbar/delay/thread.rb +3 -2
  29. data/lib/rollbar/deploy.rb +6 -7
  30. data/lib/rollbar/encoding/encoder.rb +7 -3
  31. data/lib/rollbar/exception_reporter.rb +17 -8
  32. data/lib/rollbar/item/backtrace.rb +10 -8
  33. data/lib/rollbar/item/frame.rb +6 -5
  34. data/lib/rollbar/item/locals.rb +3 -2
  35. data/lib/rollbar/item.rb +48 -39
  36. data/lib/rollbar/json.rb +1 -1
  37. data/lib/rollbar/lazy_store.rb +1 -3
  38. data/lib/rollbar/logger.rb +2 -0
  39. data/lib/rollbar/logger_proxy.rb +3 -1
  40. data/lib/rollbar/middleware/js.rb +58 -36
  41. data/lib/rollbar/middleware/rack/builder.rb +3 -3
  42. data/lib/rollbar/middleware/rack/test_session.rb +3 -3
  43. data/lib/rollbar/middleware/rack.rb +4 -4
  44. data/lib/rollbar/middleware/rails/rollbar.rb +9 -6
  45. data/lib/rollbar/middleware/rails/show_exceptions.rb +8 -4
  46. data/lib/rollbar/notifier/trace_with_bindings.rb +4 -2
  47. data/lib/rollbar/notifier.rb +179 -133
  48. data/lib/rollbar/plugin.rb +8 -8
  49. data/lib/rollbar/plugins/active_job.rb +11 -2
  50. data/lib/rollbar/plugins/delayed_job/plugin.rb +10 -3
  51. data/lib/rollbar/plugins/goalie.rb +27 -16
  52. data/lib/rollbar/plugins/rails/controller_methods.rb +18 -14
  53. data/lib/rollbar/plugins/rails/railtie30.rb +2 -1
  54. data/lib/rollbar/plugins/rails/railtie32.rb +2 -1
  55. data/lib/rollbar/plugins/rails/railtie_mixin.rb +2 -2
  56. data/lib/rollbar/plugins/rails.rb +5 -2
  57. data/lib/rollbar/plugins/rake.rb +2 -1
  58. data/lib/rollbar/plugins/sidekiq/plugin.rb +37 -20
  59. data/lib/rollbar/plugins/sidekiq.rb +1 -1
  60. data/lib/rollbar/plugins/thread.rb +8 -7
  61. data/lib/rollbar/plugins/validations.rb +3 -1
  62. data/lib/rollbar/rake_tasks.rb +0 -1
  63. data/lib/rollbar/request_data_extractor.rb +38 -17
  64. data/lib/rollbar/rollbar_test.rb +3 -1
  65. data/lib/rollbar/scrubbers/params.rb +13 -7
  66. data/lib/rollbar/scrubbers/url.rb +48 -14
  67. data/lib/rollbar/scrubbers.rb +1 -1
  68. data/lib/rollbar/truncation/remove_any_key_strategy.rb +4 -1
  69. data/lib/rollbar/truncation/remove_extra_strategy.rb +3 -1
  70. data/lib/rollbar/util/hash.rb +14 -7
  71. data/lib/rollbar/util/ip_anonymizer.rb +1 -1
  72. data/lib/rollbar/util.rb +19 -13
  73. data/lib/rollbar/version.rb +1 -1
  74. data/lib/rollbar.rb +12 -7
  75. data/lib/tasks/benchmark.rake +2 -1
  76. data/rollbar.gemspec +3 -1
  77. metadata +5 -5
@@ -4,81 +4,82 @@ module Rollbar
4
4
  class Configuration
5
5
  SEND_EXTRA_FRAME_DATA_OPTIONS = [:none, :app, :all].freeze
6
6
 
7
- attr_accessor :access_token
8
- attr_accessor :async_handler
9
- attr_accessor :branch
10
- attr_reader :before_process
11
- attr_accessor :capture_uncaught
12
- attr_accessor :code_version
13
- attr_accessor :custom_data_method
14
- attr_accessor :delayed_job_enabled
15
- attr_accessor :default_logger
16
- attr_reader :logger_level
17
- attr_accessor :disable_monkey_patch
18
- attr_accessor :disable_rack_monkey_patch
19
- attr_accessor :disable_core_monkey_patch
20
- attr_accessor :enable_error_context
21
- attr_accessor :dj_threshold
22
- attr_accessor :async_skip_report_handler
23
- attr_accessor :enabled
24
- attr_accessor :endpoint
25
- attr_accessor :environment
26
- attr_accessor :exception_level_filters
27
- attr_accessor :failover_handlers
28
- attr_accessor :framework
29
- attr_accessor :ignored_person_ids
30
- attr_accessor :host
31
- attr_accessor :locals
32
- attr_writer :logger
33
- attr_accessor :payload_options
34
- attr_accessor :person_method
35
- attr_accessor :person_id_method
36
- attr_accessor :person_username_method
37
- attr_accessor :person_email_method
38
- attr_accessor :populate_empty_backtraces
39
- attr_accessor :report_dj_data
40
- attr_accessor :open_timeout
41
- attr_accessor :request_timeout
42
- attr_accessor :net_retries
43
- attr_accessor :root
44
- attr_accessor :js_options
45
- attr_accessor :js_enabled
46
- attr_accessor :safely
47
- attr_accessor :scrub_fields
48
- attr_accessor :scrub_user
49
- attr_accessor :scrub_password
50
- attr_accessor :scrub_whitelist
51
- attr_accessor :collect_user_ip
52
- attr_accessor :anonymize_user_ip
53
- attr_accessor :user_ip_obfuscator_secret
54
- attr_accessor :randomize_scrub_length
55
- attr_accessor :uncaught_exception_level
56
- attr_accessor :scrub_headers
57
- attr_accessor :sidekiq_threshold
58
- attr_reader :transform
59
- attr_accessor :verify_ssl_peer
60
- attr_accessor :use_async
61
- attr_accessor :async_json_payload
62
- attr_reader :use_eventmachine
63
- attr_accessor :web_base
64
- attr_reader :send_extra_frame_data
65
- attr_accessor :use_exception_level_filters_default
66
- attr_accessor :proxy
67
- attr_accessor :raise_on_error
68
- attr_accessor :transmit
69
- attr_accessor :log_payload
70
- attr_accessor :backtrace_cleaner
71
-
72
- attr_accessor :write_to_file
73
- attr_accessor :filepath
74
- attr_accessor :files_with_pid_name_enabled
75
- attr_accessor :files_processed_enabled
76
- attr_accessor :files_processed_duration # seconds
77
- attr_accessor :files_processed_size # bytes
78
- attr_accessor :use_payload_access_token
79
-
80
- attr_reader :project_gem_paths
81
- attr_accessor :configured_options
7
+ attr_accessor :access_token,
8
+ :anonymize_user_ip,
9
+ :async_handler,
10
+ :async_json_payload,
11
+ :async_skip_report_handler,
12
+ :backtrace_cleaner,
13
+ :branch,
14
+ :capture_uncaught,
15
+ :code_version,
16
+ :collect_user_ip,
17
+ :configured_options,
18
+ :custom_data_method,
19
+ :default_logger,
20
+ :delayed_job_enabled,
21
+ :disable_core_monkey_patch,
22
+ :disable_monkey_patch,
23
+ :disable_rack_monkey_patch,
24
+ :dj_threshold,
25
+ :enable_error_context,
26
+ :enabled,
27
+ :endpoint,
28
+ :environment,
29
+ :exception_level_filters,
30
+ :failover_handlers,
31
+ :filepath,
32
+ :files_processed_duration,
33
+ :files_processed_enabled,
34
+ :files_processed_size,
35
+ :files_with_pid_name_enabled,
36
+ :framework,
37
+ :ignore_internal_errors,
38
+ :ignored_person_ids,
39
+ :js_enabled,
40
+ :js_options,
41
+ :host,
42
+ :locals,
43
+ :log_payload,
44
+ :net_retries,
45
+ :open_timeout,
46
+ :payload_options,
47
+ :person_email_method,
48
+ :person_id_method,
49
+ :person_method,
50
+ :person_username_method,
51
+ :populate_empty_backtraces,
52
+ :proxy,
53
+ :raise_on_error,
54
+ :randomize_scrub_length,
55
+ :report_dj_data,
56
+ :request_timeout,
57
+ :root,
58
+ :safely,
59
+ :scrub_fields,
60
+ :scrub_password,
61
+ :scrub_user,
62
+ :scrub_whitelist,
63
+ :transmit,
64
+ :uncaught_exception_level,
65
+ :user_ip_obfuscator_secret,
66
+ :user_ip_rack_env_key,
67
+ :scrub_headers,
68
+ :sidekiq_threshold,
69
+ :sidekiq_use_scoped_block,
70
+ :use_async,
71
+ :use_exception_level_filters_default,
72
+ :use_payload_access_token,
73
+ :verify_ssl_peer,
74
+ :web_base,
75
+ :write_to_file
76
+ attr_reader :before_process,
77
+ :logger_level,
78
+ :project_gem_paths,
79
+ :send_extra_frame_data,
80
+ :transform,
81
+ :use_eventmachine
82
+ attr_writer :logger # seconds # bytes
82
83
 
83
84
  alias safely? safely
84
85
 
@@ -93,7 +94,7 @@ module Rollbar
93
94
  @capture_uncaught = nil
94
95
  @code_version = nil
95
96
  @custom_data_method = nil
96
- @default_logger = lambda { ::Logger.new(STDERR) }
97
+ @default_logger = lambda { ::Logger.new($stderr) }
97
98
  @logger_level = :info
98
99
  @delayed_job_enabled = true
99
100
  @disable_monkey_patch = false
@@ -112,6 +113,11 @@ module Rollbar
112
113
  }
113
114
  @failover_handlers = []
114
115
  @framework = 'Plain'
116
+ @ignore_internal_errors = [
117
+ 'Net::ReadTimeout',
118
+ 'Net::OpenTimeout',
119
+ 'SocketError'
120
+ ]
115
121
  @ignored_person_ids = []
116
122
  @host = nil
117
123
  @payload_options = {}
@@ -139,6 +145,7 @@ module Rollbar
139
145
  @uncaught_exception_level = 'error'
140
146
  @scrub_headers = ['Authorization']
141
147
  @sidekiq_threshold = 0
148
+ @sidekiq_use_scoped_block = false
142
149
  @safely = false
143
150
  @transform = []
144
151
  @use_async = false
@@ -156,6 +163,7 @@ module Rollbar
156
163
  @collect_user_ip = true
157
164
  @anonymize_user_ip = false
158
165
  @user_ip_obfuscator_secret = nil
166
+ @user_ip_rack_env_key = nil
159
167
  @backtrace_cleaner = nil
160
168
  @hooks = {
161
169
  :on_error_response => nil, # params: response
@@ -212,7 +220,8 @@ module Rollbar
212
220
  def use_active_job(options = {})
213
221
  require 'rollbar/delay/active_job'
214
222
 
215
- Rollbar::Delay::ActiveJob.queue_as(options[:queue] || Rollbar::Delay::ActiveJob.default_queue_name)
223
+ Rollbar::Delay::ActiveJob.queue_as(options[:queue] ||
224
+ Rollbar::Delay::ActiveJob.default_queue_name)
216
225
 
217
226
  @use_async = true
218
227
  @async_handler = Rollbar::Delay::ActiveJob
@@ -252,8 +261,13 @@ module Rollbar
252
261
  end
253
262
 
254
263
  def use_sidekiq=(value)
255
- deprecation_message = '#use_sidekiq=(value) has been deprecated in favor of #use_sidekiq(options = {}). Please update your rollbar configuration.'
256
- defined?(ActiveSupport) ? ActiveSupport::Deprecation.warn(deprecation_message) : puts(deprecation_message)
264
+ deprecation_message = '#use_sidekiq=(value) has been deprecated in favor ' \
265
+ 'of #use_sidekiq(options = {}). Please update your rollbar configuration.'
266
+ if defined?(ActiveSupport)
267
+ ActiveSupport::Deprecation.warn(deprecation_message)
268
+ else
269
+ puts(deprecation_message)
270
+ end
257
271
 
258
272
  value.is_a?(Hash) ? use_sidekiq(value) : use_sidekiq
259
273
  end
@@ -272,8 +286,13 @@ module Rollbar
272
286
  end
273
287
 
274
288
  def use_sucker_punch=(_value)
275
- deprecation_message = '#use_sucker_punch=(value) has been deprecated in favor of #use_sucker_punch. Please update your rollbar configuration.'
276
- defined?(ActiveSupport) ? ActiveSupport::Deprecation.warn(deprecation_message) : puts(deprecation_message)
289
+ deprecation_message = '#use_sucker_punch=(value) has been deprecated in ' \
290
+ 'favor of #use_sucker_punch. Please update your rollbar configuration.'
291
+ if defined?(ActiveSupport)
292
+ ActiveSupport::Deprecation.warn(deprecation_message)
293
+ else
294
+ puts(deprecation_message)
295
+ end
277
296
 
278
297
  use_sucker_punch
279
298
  end
@@ -304,7 +323,9 @@ module Rollbar
304
323
 
305
324
  def send_extra_frame_data=(value)
306
325
  unless SEND_EXTRA_FRAME_DATA_OPTIONS.include?(value)
307
- logger.warning("Wrong 'send_extra_frame_data' value, :none, :app or :full is expected")
326
+ logger.warning(
327
+ "Wrong 'send_extra_frame_data' value, :none, :app or :full is expected"
328
+ )
308
329
 
309
330
  return
310
331
  end
@@ -330,14 +351,14 @@ module Rollbar
330
351
  end
331
352
 
332
353
  def hook(symbol, &block)
333
- if @hooks.key?(symbol)
334
- if block_given?
335
- @hooks[symbol] = block
336
- else
337
- @hooks[symbol]
338
- end
354
+ unless @hooks.key?(symbol)
355
+ raise StandardError, "Hook :#{symbol} is not supported by Rollbar SDK."
356
+ end
357
+
358
+ if block_given?
359
+ @hooks[symbol] = block
339
360
  else
340
- raise StandardError, 'Hook :' + symbol.to_s + ' is not supported by Rollbar SDK.'
361
+ @hooks[symbol]
341
362
  end
342
363
  end
343
364
 
@@ -358,7 +379,10 @@ module Rollbar
358
379
  return super unless configuration.respond_to?(method)
359
380
 
360
381
  method_string = method.to_s
361
- configured[method_string.chomp('=').to_sym] = args.first if method_string.end_with?('=')
382
+ if method_string.end_with?('=')
383
+ configured[method_string.chomp('=').to_sym] =
384
+ args.first
385
+ end
362
386
 
363
387
  configuration.send(method, *args, &block)
364
388
  end
@@ -2,9 +2,10 @@ require 'shoryuken'
2
2
 
3
3
  module Rollbar
4
4
  module Delay
5
- # Following class allows to send rollbars using Sho-ryu-ken as a background jobs processor.
6
- # see the queue_name method which states that your queues needs to be names as "rollbar_ENVIRONMENT".
7
- # retry intervals will be used to retry sending the same message again if failed before.
5
+ # Following class allows to send rollbars using Sho-ryu-ken as a background
6
+ # jobs processor. See the queue_name method which states that your queues
7
+ # needs to be names as "rollbar_ENVIRONMENT". Retry intervals will be used
8
+ # to retry sending the same message again if failed before.
8
9
  class Shoryuken
9
10
  include ::Shoryuken::Worker
10
11
 
@@ -10,7 +10,9 @@ module Rollbar
10
10
  end
11
11
 
12
12
  def call(payload)
13
- raise StandardError, 'Unable to push the job to Sidekiq' if ::Sidekiq::Client.push(@options.merge('args' => [payload])).nil?
13
+ return unless ::Sidekiq::Client.push(@options.merge('args' => [payload])).nil?
14
+
15
+ raise(StandardError, 'Unable to push the job to Sidekiq')
14
16
  end
15
17
 
16
18
  include ::Sidekiq::Worker
@@ -7,8 +7,7 @@ module Rollbar
7
7
  include ::SuckerPunch::Job
8
8
 
9
9
  class << self
10
- attr_accessor :perform_proc
11
- attr_accessor :ready
10
+ attr_accessor :perform_proc, :ready
12
11
  end
13
12
 
14
13
  self.ready = false
@@ -62,11 +62,12 @@ module Rollbar
62
62
  reaper.join
63
63
  end
64
64
  rescue Timeout::Error
65
- raise TimeoutError, "unable to reap all threads within #{EXIT_TIMEOUT} seconds"
65
+ raise TimeoutError,
66
+ "unable to reap all threads within #{EXIT_TIMEOUT} seconds"
66
67
  end
67
68
  end
68
69
  end
69
- end # class << self
70
+ end
70
71
 
71
72
  def priority
72
73
  self.class.options[:priority] || DEFAULT_PRIORITY
@@ -30,9 +30,7 @@ module Rollbar
30
30
  return {} unless access_token && !access_token.empty?
31
31
 
32
32
  uri = ::URI.parse(
33
- ::Rollbar::Deploy::ENDPOINT +
34
- deploy_id.to_s +
35
- '?access_token=' + access_token
33
+ "#{::Rollbar::Deploy::ENDPOINT}#{deploy_id}?access_token=#{access_token}"
36
34
  )
37
35
 
38
36
  request = ::Net::HTTP::Patch.new(uri.request_uri)
@@ -74,17 +72,18 @@ module Rollbar
74
72
 
75
73
  def request_result(uri, request)
76
74
  {
77
- :request_info => uri.inspect + ': ' + request.body,
75
+ :request_info => "#{uri.inspect}: #{request.body}",
78
76
  :request => request
79
77
  }
80
78
  end
81
79
 
82
80
  def response_result(response)
81
+ code = response.code
82
+ message = response.message
83
+ body = response.body.delete("\n")
83
84
  {
84
85
  :response => response,
85
- :response_info => response.code + '; ' +
86
- response.message + '; ' +
87
- response.body.delete("\n")
86
+ :response_info => "#{code}; #{message}; #{body}"
88
87
  }.merge(::JSON.parse(response.body, :symbolize_names => true))
89
88
  end
90
89
  end
@@ -1,8 +1,10 @@
1
1
  module Rollbar
2
2
  module Encoding
3
3
  class Encoder
4
- ALL_ENCODINGS = [::Encoding::UTF_8, ::Encoding::ISO_8859_1, ::Encoding::ASCII_8BIT, ::Encoding::US_ASCII].freeze
5
- ASCII_ENCODINGS = [::Encoding::US_ASCII, ::Encoding::ASCII_8BIT, ::Encoding::ISO_8859_1].freeze
4
+ ALL_ENCODINGS = [::Encoding::UTF_8, ::Encoding::ISO_8859_1, ::Encoding::ASCII_8BIT,
5
+ ::Encoding::US_ASCII].freeze
6
+ ASCII_ENCODINGS = [::Encoding::US_ASCII, ::Encoding::ASCII_8BIT,
7
+ ::Encoding::ISO_8859_1].freeze
6
8
  UTF8 = 'UTF-8'.freeze
7
9
  BINARY = 'binary'.freeze
8
10
 
@@ -40,7 +42,9 @@ module Rollbar
40
42
  def force_encoding(value)
41
43
  return value if value.frozen?
42
44
 
43
- value.force_encoding(detect_encoding(value)) if value.encoding == ::Encoding::UTF_8
45
+ if value.encoding == ::Encoding::UTF_8
46
+ value.force_encoding(detect_encoding(value))
47
+ end
44
48
 
45
49
  value
46
50
  end
@@ -7,16 +7,23 @@ module Rollbar
7
7
 
8
8
  exception_data = exception_data(exception)
9
9
 
10
- if exception_data.is_a?(Hash)
10
+ case exception_data
11
+ when Hash
11
12
  env['rollbar.exception_uuid'] = exception_data[:uuid]
12
- Rollbar.log_debug "[Rollbar] Exception uuid saved in env: #{exception_data[:uuid]}"
13
- elsif exception_data == 'disabled'
14
- Rollbar.log_debug '[Rollbar] Exception not reported because Rollbar is disabled'
15
- elsif exception_data == 'ignored'
13
+ Rollbar.log_debug(
14
+ "[Rollbar] Exception uuid saved in env: #{exception_data[:uuid]}"
15
+ )
16
+ when 'disabled'
17
+ Rollbar.log_debug(
18
+ '[Rollbar] Exception not reported because Rollbar is disabled'
19
+ )
20
+ when 'ignored'
16
21
  Rollbar.log_debug '[Rollbar] Exception not reported because it was ignored'
17
22
  end
18
23
  rescue StandardError => e
19
- Rollbar.log_warning "[Rollbar] Exception while reporting exception to Rollbar: #{e.message}"
24
+ Rollbar.log_warning(
25
+ "[Rollbar] Exception while reporting exception to Rollbar: #{e.message}"
26
+ )
20
27
  end
21
28
 
22
29
  def capture_uncaught?
@@ -24,12 +31,14 @@ module Rollbar
24
31
  end
25
32
 
26
33
  def log_exception_message(exception)
27
- exception_message = exception.respond_to?(:message) ? exception.message : 'No Exception Message'
34
+ exception_message = exception.message if exception.respond_to?(:message)
35
+ exception_message ||= 'No Exception Message'
28
36
  Rollbar.log_debug "[Rollbar] Reporting exception: #{exception_message}"
29
37
  end
30
38
 
31
39
  def exception_data(exception)
32
- Rollbar.log(Rollbar.configuration.uncaught_exception_level, exception, :use_exception_level_filters => true)
40
+ Rollbar.log(Rollbar.configuration.uncaught_exception_level, exception,
41
+ :use_exception_level_filters => true)
33
42
  end
34
43
  end
35
44
  end
@@ -3,11 +3,7 @@ require 'rollbar/item/frame'
3
3
  module Rollbar
4
4
  class Item
5
5
  class Backtrace
6
- attr_reader :exception
7
- attr_reader :message
8
- attr_reader :extra
9
- attr_reader :configuration
10
- attr_reader :files
6
+ attr_reader :exception, :message, :extra, :configuration, :files
11
7
 
12
8
  private :files
13
9
 
@@ -54,7 +50,10 @@ module Rollbar
54
50
 
55
51
  current_exception = exception
56
52
 
57
- while current_exception.respond_to?(:cause) && (cause = current_exception.cause) && cause.is_a?(Exception) && !visited.include?(cause)
53
+ while current_exception.respond_to?(:cause) &&
54
+ (cause = current_exception.cause) &&
55
+ cause.is_a?(Exception) &&
56
+ !visited.include?(cause)
58
57
  traces << trace_data(cause)
59
58
  visited << cause
60
59
  current_exception = cause
@@ -100,7 +99,9 @@ module Rollbar
100
99
  # are those from the user's Rollbar.error line until this method. We want
101
100
  # to remove those lines.
102
101
  def exception_backtrace(current_exception)
103
- return current_exception.backtrace if current_exception.backtrace.respond_to?(:map)
102
+ if current_exception.backtrace.respond_to?(:map)
103
+ return current_exception.backtrace
104
+ end
104
105
  return [] unless configuration.populate_empty_backtraces
105
106
 
106
107
  caller_backtrace = caller
@@ -109,7 +110,8 @@ module Rollbar
109
110
  end
110
111
 
111
112
  def rollbar_lib_gem_dir
112
- Gem::Specification.find_by_name('rollbar').gem_dir + '/lib'
113
+ gem_dir = Gem::Specification.find_by_name('rollbar').gem_dir
114
+ "#{gem_dir}/lib"
113
115
  end
114
116
  end
115
117
  end
@@ -6,9 +6,7 @@ module Rollbar
6
6
  class Item
7
7
  # Representation of the trace data per frame in the payload
8
8
  class Frame
9
- attr_reader :backtrace
10
- attr_reader :frame
11
- attr_reader :configuration
9
+ attr_reader :backtrace, :frame, :configuration
12
10
 
13
11
  MAX_CONTEXT_LENGTH = 4
14
12
 
@@ -104,7 +102,8 @@ module Rollbar
104
102
 
105
103
  def post_data(file_lines, lineno)
106
104
  from_line = lineno
107
- number_of_lines = [from_line + MAX_CONTEXT_LENGTH, file_lines.size].min - from_line
105
+ number_of_lines = [from_line + MAX_CONTEXT_LENGTH,
106
+ file_lines.size].min - from_line
108
107
 
109
108
  file_lines[from_line, number_of_lines]
110
109
  end
@@ -113,7 +112,9 @@ module Rollbar
113
112
  to_line = lineno - 2
114
113
  from_line = [to_line - MAX_CONTEXT_LENGTH + 1, 0].max
115
114
 
116
- file_lines[from_line, (to_line - from_line + 1)].select { |line| line && !line.empty? }
115
+ file_lines[from_line, (to_line - from_line + 1)].select do |line|
116
+ line && !line.empty?
117
+ end
117
118
  end
118
119
  end
119
120
  end
@@ -1,4 +1,3 @@
1
- require 'rollbar/notifier'
2
1
  require 'rollbar/scrubbers/params'
3
2
  require 'rollbar/util'
4
3
 
@@ -59,7 +58,9 @@ module Rollbar
59
58
  # truncation strategy for large payloads.
60
59
  #
61
60
  def prepare_value(value)
62
- return simple_value?(value) ? value : value.inspect unless value.is_a?(Hash) || value.is_a?(Array)
61
+ unless value.is_a?(Hash) || value.is_a?(Array)
62
+ return simple_value?(value) ? value : value.inspect
63
+ end
63
64
 
64
65
  cloned_value = ::Rollbar::Util.deep_copy(value)
65
66
  ::Rollbar::Util.iterate_and_update_with_block(cloned_value) do |v|