rollbar 2.2.1 → 2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8387b8dd9b53558f27d84908e1f3ac8beb26204
4
- data.tar.gz: d8eec2f09315894700991fbaf1765d30cd0c697d
3
+ metadata.gz: 6e71e17b7e4734a7d1f0ef5b089a35786b962b4e
4
+ data.tar.gz: 6b91570fd7e15397aa2100e0e2e99339d99544b0
5
5
  SHA512:
6
- metadata.gz: 15191d6677c822f80dadeb608d41e1cd35e778e15a4f2e49254bd954e2db4179127406c841f05910cee36a8d2be6adabbb70704f18e53f6b9da0c773bb231585
7
- data.tar.gz: 59e4273d242a88151f509845334448c067eb63b97241785eb4b46db6fbe1afcb4a916760fa2351283df1b10357394c59026aaeb808784f5119295394123b1289
6
+ metadata.gz: 5d768005681a92731a4947f3f8afb7db45cf73f2cc51119495e731dd7cf8fdf3b58c7dc6220e234e47f3dc00acf1c1b50c4870763b7685e6e8ec362f5001cf5d
7
+ data.tar.gz: 0383bbc528d88144cf755ac2d7042fcb4165faa521d69c58f65f2a2ebb7be1db17dddd98cd5c41187e85fbc8264e20f0cc12555a32bd577725f49d3c2ade2b37
@@ -1,5 +1,20 @@
1
1
  # Change Log
2
2
 
3
+ ## 2.3.0
4
+
5
+ Internal changes:
6
+
7
+ - Use Oj instead of JSON gem for payload serializing. See [#300](https://github.com/rollbar/rollbar-gem/pull/300)
8
+ - Send nearest backtrace entry on failsafe messages. See [#290](https://github.com/rollbar/rollbar-gem/pull/290)
9
+ - Remove whitespace from config template. See [#295](https://github.com/rollbar/rollbar-gem/pull/295)
10
+
11
+ Bug fixes:
12
+
13
+ - Send correct hash value for delayed job 'handler' object. See [#301](https://github.com/rollbar/rollbar-gem/pull/301)
14
+ - Fix delayed_job crash reports. See [#293](https://github.com/rollbar/rollbar-gem/pull/293)
15
+ - Send session data instead of session store options. [#289](https://github.com/rollbar/rollbar-gem/pull/289)
16
+
17
+
3
18
  ## 2.2.1
4
19
 
5
20
  Improvement:
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Rollbar notifier for Ruby [![Build Status](https://api.travis-ci.org/rollbar/rollbar-gem.svg?branch=v2.2.1)](https://travis-ci.org/rollbar/rollbar-gem/branches)
1
+ # Rollbar notifier for Ruby [![Build Status](https://api.travis-ci.org/rollbar/rollbar-gem.svg?branch=v2.3.0)](https://travis-ci.org/rollbar/rollbar-gem/branches)
2
2
 
3
3
  <!-- RemoveNext -->
4
4
  [Rollbar](https://rollbar.com) is an error tracking service for Ruby and other languages. The Rollbar service will alert you of problems with your code and help you understand them in a ways never possible before. We love it and we hope you will too.
@@ -12,7 +12,7 @@ This is the Ruby library for Rollbar. It will instrument many kinds of Ruby appl
12
12
  Add this line to your application's Gemfile:
13
13
 
14
14
  ```ruby
15
- gem 'rollbar', '~> 2.2.1'
15
+ gem 'rollbar', '~> 2.3.0'
16
16
  ```
17
17
 
18
18
  And then execute:
@@ -1,16 +1,17 @@
1
1
  # This file was generated by Appraisal
2
2
 
3
- source "https://rubygems.org"
3
+ source 'https://rubygems.org'
4
4
 
5
- gem "sqlite3", :platform => [:ruby, :mswin, :mingw]
6
- gem "jruby-openssl", :platform => :jruby
7
- gem "activerecord-jdbcsqlite3-adapter", :platform => :jruby
8
- gem "appraisal", '= 1.0.2'
9
- gem "rubysl", "~> 2.0", :platform => :rbx
10
- gem "racc", :platform => :rbx
11
- gem "minitest", :platform => :rbx
12
- gem "rubysl-test-unit", :platform => :rbx
13
- gem "rubinius-developer_tools", :platform => :rbx
14
- gem "rails", "3.0.20"
5
+ gem 'sqlite3', :platform => [:ruby, :mswin, :mingw]
6
+ gem 'jruby-openssl', :platform => :jruby
7
+ gem 'activerecord-jdbcsqlite3-adapter', :platform => :jruby
8
+ gem 'appraisal', '= 1.0.2'
9
+ gem 'rubysl', '~> 2.0', :platform => :rbx
10
+ gem 'racc', :platform => :rbx
11
+ gem 'minitest', :platform => :rbx
12
+ gem 'rubysl-test-unit', :platform => :rbx
13
+ gem 'rubinius-developer_tools', :platform => :rbx
14
+ gem 'rails', '3.0.20'
15
+ gem 'hitimes', '< 1.2.2'
15
16
 
16
- gemspec :path => "../"
17
+ gemspec :path => '../'
@@ -2,7 +2,7 @@ require 'rollbar/rails'
2
2
  Rollbar.configure do |config|
3
3
  # Without configuration, Rollbar is enabled in all environments.
4
4
  # To disable in specific environments, set config.enabled=false.
5
-
5
+
6
6
  <%- if (defined? EY::Config) -%>
7
7
  # Here we'll disable in 'test' and 'development':
8
8
  if Rails.env.test? or Rails.env.development?
@@ -573,21 +573,11 @@ module Rollbar
573
573
  end
574
574
 
575
575
  def send_failsafe(message, exception)
576
- body = 'Failsafe from rollbar-gem: '
577
- log_error "[Rollbar] Sending failsafe response due to #{message}."
576
+ exception_reason = failsafe_reason(message, exception)
578
577
 
579
- if exception
580
- begin
581
- body += "#{exception.class.name}: #{message}"
582
- log_error "[Rollbar] #{exception.class.name}: #{exception}"
583
- rescue
584
- end
585
- else
586
- begin
587
- body += message.to_s
588
- rescue
589
- end
590
- end
578
+ log_error "[Rollbar] Sending failsafe response due to #{exception_reason}"
579
+
580
+ body = failsafe_body(exception_reason)
591
581
 
592
582
  failsafe_data = {
593
583
  :level => 'error',
@@ -619,6 +609,34 @@ module Rollbar
619
609
  failsafe_payload
620
610
  end
621
611
 
612
+ def failsafe_reason(message, exception)
613
+ body = ''
614
+
615
+ if exception
616
+ begin
617
+ backtrace = exception.backtrace || []
618
+ nearest_frame = backtrace[0]
619
+
620
+ exception_info = exception.class.name
621
+ exception_info += " in #{nearest_frame}" if nearest_frame
622
+
623
+ body += "#{exception_info}: #{message}"
624
+ rescue
625
+ end
626
+ else
627
+ begin
628
+ body += message.to_s
629
+ rescue
630
+ end
631
+ end
632
+
633
+ body
634
+ end
635
+
636
+ def failsafe_body(reason)
637
+ "Failsafe from rollbar-gem. #{reason}"
638
+ end
639
+
622
640
  def schedule_payload(payload)
623
641
  return if payload.nil?
624
642
 
@@ -778,14 +796,7 @@ module Rollbar
778
796
  end
779
797
 
780
798
  def monkey_patch_socket?
781
- return false unless defined?(ActiveSupport::VERSION::STRING)
782
-
783
- major, minor = ActiveSupport::VERSION::STRING.split('.').map(&:to_i)
784
-
785
- return true if major == 3
786
- return true if major == 4 && minor == 0
787
-
788
- false
799
+ defined?(ActiveSupport::VERSION::STRING)
789
800
  end
790
801
 
791
802
  def wrap_delayed_worker
@@ -1,20 +1,66 @@
1
+ require 'delayed_job'
2
+
1
3
  module Rollbar
2
4
  module Delayed
5
+ class << self
6
+ attr_accessor :wrapped
7
+ end
8
+
9
+ class JobData
10
+ attr_reader :job
11
+
12
+ def initialize(job)
13
+ @job = job
14
+ end
15
+
16
+ def to_hash
17
+ job_data = job.as_json
18
+ # Here job_data['handler'] is a YAML object comming
19
+ # from the storage backend
20
+ job_data['handler'] = job.payload_object.as_json
21
+
22
+ job_data
23
+ end
24
+ end
25
+
26
+ self.wrapped = false
27
+
3
28
  def self.wrap_worker
4
- return if @wrapped
5
- @wrapped = true
29
+ return if wrapped
30
+
31
+ around_invoke_job(&invoke_job_callback)
6
32
 
7
- ::Delayed::Worker.lifecycle.around(:invoke_job) do |job, *args, &block|
33
+ self.wrapped = true
34
+ end
35
+
36
+ def self.around_invoke_job(&block)
37
+ ::Delayed::Worker.lifecycle.around(:invoke_job, &block)
38
+ end
39
+
40
+ def self.invoke_job_callback
41
+ proc do |job, *args, &block|
8
42
  begin
9
43
  block.call(job, *args)
10
- rescue Exception => e
11
- if job.attempts >= ::Rollbar.configuration.dj_threshold
12
- data = ::Rollbar.configuration.report_dj_data ? job : nil
13
- ::Rollbar.scope(:request => data).error(e, :use_exception_level_filters => true)
14
- end
44
+ rescue => e
45
+ report(e, job)
46
+
15
47
  raise e
16
48
  end
17
49
  end
18
50
  end
51
+
52
+ def self.report(e, job)
53
+ return unless job.attempts <= ::Rollbar.configuration.dj_threshold
54
+
55
+ data = build_job_data(job)
56
+
57
+ ::Rollbar.scope(:request => data).error(e, :use_exception_level_filters => true)
58
+ end
59
+
60
+ def self.build_job_data(job)
61
+ return nil unless ::Rollbar.configuration.report_dj_data
62
+
63
+ JobData.new(job).to_hash
64
+ end
19
65
  end
20
66
  end
@@ -6,23 +6,20 @@ module Rollbar
6
6
  attr_accessor :dump_method
7
7
  attr_accessor :load_method
8
8
 
9
- def load_native_json
10
- require 'json' unless defined?(::JSON)
9
+ def load_oj
10
+ require 'oj'
11
11
 
12
- if ::JSON.respond_to?(:dump_default_options)
13
- options = ::JSON.dump_default_options
14
- else
15
- # Default options from json 1.1.9 up to 1.6.1
16
- options = { :allow_nan => true, :max_nesting => false }
17
- end
12
+ options = { :mode=> :compat,
13
+ :use_to_json => false,
14
+ :symbol_keys => false,
15
+ :circular => false
16
+ }
18
17
 
19
- self.dump_method = proc { |obj| ::JSON.generate(obj, options) }
20
- self.load_method = proc { |obj| ::JSON.load(obj) }
21
- self.backend_name = :json
18
+ self.dump_method = proc { |obj| Oj.dump(obj, options) }
19
+ self.load_method = proc { |obj| Oj.load(obj, options) }
20
+ self.backend_name = :oj
22
21
 
23
22
  true
24
- rescue StandardError, ScriptError => err
25
- Rollbar.log_debug('%p while loading JSON library: %s' % [err, err.message])
26
23
  end
27
24
 
28
25
  def dump(object)
@@ -34,7 +31,7 @@ module Rollbar
34
31
  end
35
32
 
36
33
  def setup
37
- load_native_json
34
+ load_oj
38
35
  end
39
36
  end
40
37
  end
@@ -25,7 +25,7 @@ module Rollbar
25
25
  post_params = rollbar_filtered_params(sensitive_params, rollbar_post_params(rack_req))
26
26
  raw_body_params = rollbar_filtered_params(sensitive_params, mergeable_raw_body_params(rack_req))
27
27
  cookies = rollbar_filtered_params(sensitive_params, rollbar_request_cookies(rack_req))
28
- session = rollbar_filtered_params(sensitive_params, env['rack.session.options'])
28
+ session = rollbar_filtered_params(sensitive_params, rollbar_request_session(rack_req))
29
29
  route_params = rollbar_filtered_params(sensitive_params, rollbar_route_params(env))
30
30
 
31
31
  params = request_params.merge(get_params).merge(post_params).merge(raw_body_params)
@@ -150,6 +150,14 @@ module Rollbar
150
150
  end
151
151
  end
152
152
 
153
+ def rollbar_request_session(rack_req)
154
+ session = rack_req.session
155
+
156
+ session.to_hash
157
+ rescue
158
+ {}
159
+ end
160
+
153
161
  def rollbar_request_cookies(rack_req)
154
162
  rack_req.cookies
155
163
  rescue
@@ -1,3 +1,3 @@
1
1
  module Rollbar
2
- VERSION = "2.2.1"
2
+ VERSION = "2.3.0"
3
3
  end
@@ -28,4 +28,5 @@ Gem::Specification.new do |gem|
28
28
  gem.add_development_dependency 'delayed_job'
29
29
  gem.add_development_dependency 'rake', '>= 0.9.0'
30
30
  gem.add_development_dependency 'redis'
31
+ gem.add_runtime_dependency 'oj', '~> 2.12.14'
31
32
  end
@@ -368,7 +368,7 @@ describe HomeController do
368
368
  end
369
369
  end
370
370
 
371
- context 'with multiple uploads' do
371
+ context 'with multiple uploads', :type => :request do
372
372
  it "saves attachment data for all uploads" do
373
373
  expect { post '/file_upload', :upload => [file1, file2] }.to raise_exception
374
374
  sent_params = Rollbar.last_report[:request][:params]['upload']
@@ -379,6 +379,17 @@ describe HomeController do
379
379
  end
380
380
  end
381
381
 
382
+ context 'with session data', :type => :request do
383
+ before { get '/set_session_data' }
384
+ it 'reports the session data' do
385
+ expect { get '/use_session_data' }.to raise_exception
386
+
387
+ session_data = Rollbar.last_report[:request][:session]
388
+
389
+ expect(session_data['some_value']).to be_eql('this-is-a-cool-value')
390
+ end
391
+ end
392
+
382
393
  after(:each) do
383
394
  Rollbar.configure do |config|
384
395
  config.logger = ::Rails.logger
@@ -0,0 +1,133 @@
1
+ require 'ostruct'
2
+ require 'delayed/backend/base'
3
+
4
+ # This code is taken from delayed_job/spec/delayed/backend/test.rb.
5
+ #
6
+ # It just works as a in memory job backend. Job#save is modified to create
7
+ # a new Delayed::Worker and call #work_off(1) so the job is processed inline.
8
+
9
+ module Delayed
10
+ module Backend
11
+ module Test
12
+ def self.run
13
+ worker.work_off(1)
14
+ end
15
+
16
+ def self.worker
17
+ @worker ||= ::Delayed::Worker.new
18
+ end
19
+
20
+ class Job
21
+ attr_accessor :id
22
+ attr_accessor :priority
23
+ attr_accessor :attempts
24
+ attr_accessor :handler
25
+ attr_accessor :last_error
26
+ attr_accessor :run_at
27
+ attr_accessor :locked_at
28
+ attr_accessor :locked_by
29
+ attr_accessor :failed_at
30
+ attr_accessor :queue
31
+
32
+ include Delayed::Backend::Base
33
+
34
+ cattr_accessor :id
35
+ self.id = 0
36
+
37
+ def initialize(hash = {})
38
+ self.attempts = 0
39
+ self.priority = 0
40
+ self.id = (self.class.id += 1)
41
+ hash.each { |k, v| send(:"#{k}=", v) }
42
+ end
43
+
44
+ def self.all
45
+ @jobs ||= []
46
+ end
47
+
48
+ def self.count
49
+ all.size
50
+ end
51
+
52
+ def self.delete_all
53
+ all.clear
54
+ end
55
+
56
+ def self.create(attrs = {})
57
+ new(attrs).tap do |o|
58
+ o.save
59
+ end
60
+ end
61
+
62
+ def self.create!(*args)
63
+ create(*args)
64
+ end
65
+
66
+ def self.clear_locks!(worker_name)
67
+ all.select { |j| j.locked_by == worker_name }.each do |j|
68
+ j.locked_by = nil
69
+ j.locked_at = nil
70
+ end
71
+ end
72
+
73
+ # Find a few candidate jobs to run (in case some immediately get locked by others).
74
+ def self.find_available(worker_name, limit = 5, max_run_time = Worker.max_run_time) # rubocop:disable CyclomaticComplexity, PerceivedComplexity
75
+ jobs = all.select do |j|
76
+ j.run_at <= db_time_now &&
77
+ (j.locked_at.nil? || j.locked_at < db_time_now - max_run_time || j.locked_by == worker_name) &&
78
+ !j.failed?
79
+ end
80
+ jobs.select! { |j| j.priority <= Worker.max_priority } if Worker.max_priority
81
+ jobs.select! { |j| j.priority >= Worker.min_priority } if Worker.min_priority
82
+ jobs.select! { |j| Worker.queues.include?(j.queue) } if Worker.queues.any?
83
+ jobs.sort_by! { |j| [j.priority, j.run_at] }[0..limit - 1]
84
+ end
85
+
86
+ # Lock this job for this worker.
87
+ # Returns true if we have the lock, false otherwise.
88
+ def lock_exclusively!(_max_run_time, worker)
89
+ now = self.class.db_time_now
90
+ if locked_by != worker
91
+ # We don't own this job so we will update the locked_by name and the locked_at
92
+ self.locked_at = now
93
+ self.locked_by = worker
94
+ end
95
+
96
+ true
97
+ end
98
+
99
+ def self.db_time_now
100
+ Time.current
101
+ end
102
+
103
+ def update_attributes(attrs = {})
104
+ attrs.each { |k, v| send(:"#{k}=", v) }
105
+ save
106
+ end
107
+
108
+ def destroy
109
+ self.class.all.delete(self)
110
+ end
111
+
112
+ def save
113
+ self.run_at ||= Time.current
114
+
115
+ self.class.all << self unless self.class.all.include?(self)
116
+
117
+ ::Delayed::Backend::Test.run
118
+
119
+ true
120
+ end
121
+
122
+ def save!
123
+ save
124
+ end
125
+
126
+ def reload
127
+ reset
128
+ self
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
File without changes
@@ -32,6 +32,16 @@ class HomeController < ApplicationController
32
32
  this = will_crash
33
33
  end
34
34
 
35
+ def set_session_data
36
+ session[:some_value] = 'this-is-a-cool-value'
37
+
38
+ render :json => {}
39
+ end
40
+
41
+ def use_session_data
42
+ oh = this_is_crashing!
43
+ end
44
+
35
45
  def current_user
36
46
  @current_user ||= User.find_by_id(cookies[:session_id])
37
47
  end
@@ -1,12 +1,16 @@
1
1
  Dummy::Application.routes.draw do
2
- root :to => "home#index"
2
+ root :to => 'home#index'
3
3
  resources :users do
4
4
  member { post :start_session }
5
5
  end
6
6
 
7
- get "/cause_exception" => "home#cause_exception"
8
- put "/deprecated_report_exception" => "home#deprecated_report_exception"
9
- match "/report_exception" => "home#report_exception", :via => [:get, :post, :put]
10
- get "/current_user" => "home#current_user"
11
- post "/file_upload" => "home#file_upload"
7
+ get '/cause_exception' => 'home#cause_exception'
8
+ put '/deprecated_report_exception' => 'home#deprecated_report_exception'
9
+ match '/report_exception' => 'home#report_exception',
10
+ :via => [:get, :post, :put]
11
+ get '/current_user' => 'home#current_user'
12
+ post '/file_upload' => 'home#file_upload'
13
+
14
+ get '/set_session_data' => 'home#set_session_data'
15
+ get '/use_session_data' => 'home#use_session_data'
12
16
  end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ require 'rollbar/delayed_job'
4
+ require 'delayed/backend/test'
5
+
6
+ describe Rollbar::Delayed::JobData do
7
+ describe '#to_hash' do
8
+ let(:handler) { { 'foo' => 'bar' } }
9
+
10
+ let(:attrs) do
11
+ {
12
+ 'id' => 1,
13
+ 'priority' => 0,
14
+ 'attempts' => 1,
15
+ 'handler' => handler.to_yaml
16
+ }
17
+ end
18
+
19
+ let(:job) do
20
+ ::Delayed::Backend::Test::Job.new(attrs)
21
+ end
22
+
23
+ subject { described_class.new(job) }
24
+
25
+ it 'returns the correct job data' do
26
+ expected_result = attrs.dup
27
+ expected_result.delete('id')
28
+ expected_result['handler'] = handler
29
+
30
+ result = subject.to_hash
31
+
32
+ expect(result).to be_eql(expected_result)
33
+ end
34
+ end
35
+ end
@@ -6,41 +6,54 @@ describe Rollbar::Delayed, :reconfigure_notifier => true do
6
6
  class FailingJob
7
7
  class TestException < Exception; end
8
8
 
9
- def perform
10
- fail(TestException, 'failing')
9
+ def do_job_please!(a, b)
10
+ this = will_crash_again!
11
11
  end
12
12
  end
13
13
 
14
- module DummyBackend
15
- class Job
16
- include Delayed::Backend::Base
14
+ before do
15
+ Rollbar::Delayed.wrap_worker
16
+ Delayed::Worker.backend = :test
17
17
 
18
- attr_accessor :handler, :attempts
18
+ Delayed::Backend::Test::Job.delete_all
19
+ end
19
20
 
20
- def initialize(options = {})
21
- @payload_object = options[:payload_object]
22
- @attempts = 0
23
- end
24
- end
21
+ let(:expected_args) do
22
+ [kind_of(NoMethodError), { :use_exception_level_filters => true }]
25
23
  end
26
24
 
27
- let(:logger) { Rollbar.logger }
25
+ context 'with delayed method without arguments failing' do
26
+ it 'sends the exception' do
27
+ expect(Rollbar).to receive(:scope).with(kind_of(Hash)).and_call_original
28
+ expect_any_instance_of(Rollbar::Notifier).to receive(:error).with(*expected_args)
28
29
 
29
- before do
30
- Rollbar::Delayed.wrap_worker
31
- Delayed::Worker.delay_jobs = false
32
- Delayed::Worker.backend = DummyBackend::Job
30
+ FailingJob.new.delay.do_job_please!(:foo, :bar)
31
+ end
33
32
  end
34
33
 
35
- let(:expected_args) do
36
- [kind_of(FailingJob::TestException), { :use_exception_level_filters => true}]
37
- end
38
34
 
39
- it 'sends the exception' do
40
- expect_any_instance_of(Rollbar::Notifier).to receive(:error).with(*expected_args)
35
+ describe '.build_job_data' do
36
+ let(:job) { double(:payload_object => {}) }
37
+
38
+ context 'if report_dj_data is disabled' do
39
+ before do
40
+ allow(Rollbar.configuration).to receive(:report_dj_data).and_return(false)
41
+ end
42
+
43
+ it 'returns nil' do
44
+ expect(described_class.build_job_data(job)).to be_nil
45
+ end
46
+ end
47
+
48
+ context 'with report_dj_data enabled' do
49
+ before do
50
+ allow(Rollbar.configuration).to receive(:report_dj_data).and_return(true)
51
+ end
41
52
 
42
- expect do
43
- Delayed::Job.enqueue(FailingJob.new)
44
- end.to raise_error(FailingJob::TestException)
53
+ it 'returns a hash' do
54
+ result = described_class.build_job_data(job)
55
+ expect(result).to be_kind_of(Hash)
56
+ end
57
+ end
45
58
  end
46
59
  end
@@ -7,23 +7,37 @@ describe Rollbar::JSON do
7
7
  Rollbar::JSON.setup
8
8
  end
9
9
 
10
+ let(:payload) do
11
+ { :foo => :bar }
12
+ end
13
+
14
+ let(:options) do
15
+ {
16
+ :mode => :compat,
17
+ :use_to_json => false,
18
+ :symbol_keys => false,
19
+ :circular => false
20
+ }
21
+ end
22
+
10
23
  describe '.dump' do
11
24
  it 'has JSON as backend' do
12
- expect(Rollbar::JSON.backend_name).to be_eql(:json)
25
+ expect(Rollbar::JSON.backend_name).to be_eql(:oj)
13
26
  end
14
27
 
28
+
15
29
  it 'calls JSON.generate' do
16
- expect(::JSON).to receive(:generate).once
30
+ expect(::Oj).to receive(:dump).once.with(payload, options)
17
31
 
18
- Rollbar::JSON.dump(:foo => :bar)
32
+ Rollbar::JSON.dump(payload)
19
33
  end
20
34
  end
21
35
 
22
36
  describe '.load' do
23
37
  it 'calls MultiJson.load' do
24
- expect(::JSON).to receive(:load).once
38
+ expect(::Oj).to receive(:load).once.with(payload, options)
25
39
 
26
- Rollbar::JSON.load(:foo => :bar)
40
+ Rollbar::JSON.load(payload)
27
41
  end
28
42
  end
29
43
  end
@@ -1564,14 +1564,14 @@ describe Rollbar do
1564
1564
  context "send_failsafe" do
1565
1565
  let(:exception) { StandardError.new }
1566
1566
 
1567
- it "should not crash when given a message and exception" do
1567
+ it "doesn't crash when given a message and exception" do
1568
1568
  sent_payload = notifier.send(:send_failsafe, "test failsafe", exception)
1569
1569
 
1570
- expected_message = 'Failsafe from rollbar-gem: StandardError: test failsafe'
1570
+ expected_message = 'Failsafe from rollbar-gem. StandardError: test failsafe'
1571
1571
  expect(sent_payload['data'][:body][:message][:body]).to be_eql(expected_message)
1572
1572
  end
1573
1573
 
1574
- it "should not crash when given all nils" do
1574
+ it "doesn't crash when given all nils" do
1575
1575
  notifier.send(:send_failsafe, nil, nil)
1576
1576
  end
1577
1577
 
@@ -1579,10 +1579,29 @@ describe Rollbar do
1579
1579
  it 'just sends the given message' do
1580
1580
  sent_payload = notifier.send(:send_failsafe, "test failsafe", nil)
1581
1581
 
1582
- expected_message = 'Failsafe from rollbar-gem: test failsafe'
1582
+ expected_message = 'Failsafe from rollbar-gem. test failsafe'
1583
1583
  expect(sent_payload['data'][:body][:message][:body]).to be_eql(expected_message)
1584
1584
  end
1585
1585
  end
1586
+
1587
+ context 'if the exception has a backtrace' do
1588
+ let(:backtrace) { ['func3', 'func2', 'func1'] }
1589
+ let(:failsafe_reason) { 'StandardError in func3: test failsafe' }
1590
+ let(:expected_body) { "Failsafe from rollbar-gem. #{failsafe_reason}" }
1591
+ let(:expected_log_message) do
1592
+ "[Rollbar] Sending failsafe response due to #{failsafe_reason}"
1593
+ end
1594
+
1595
+ before { exception.set_backtrace(backtrace) }
1596
+
1597
+ it 'adds the nearest frame to the message' do
1598
+ expect(notifier).to receive(:log_error).with(expected_log_message)
1599
+
1600
+ sent_payload = notifier.send(:send_failsafe, "test failsafe", exception)
1601
+
1602
+ expect(sent_payload['data'][:body][:message][:body]).to be_eql(expected_body)
1603
+ end
1604
+ end
1586
1605
  end
1587
1606
 
1588
1607
  context 'when reporting internal error with nil context' do
@@ -20,6 +20,7 @@ Rake::Task['dummy:db:setup'].invoke
20
20
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
21
21
 
22
22
  RSpec.configure do |config|
23
+ config.extend(Helpers)
23
24
  config.include(NotifierHelpers)
24
25
  config.include(FixtureHelpers)
25
26
  config.include(EncodingHelpers)
@@ -52,7 +53,3 @@ RSpec.configure do |config|
52
53
  end
53
54
  end
54
55
 
55
- def local?
56
- ENV['LOCAL'] == '1'
57
- end
58
-
@@ -0,0 +1,5 @@
1
+ module Helpers
2
+ def local?
3
+ ENV['LOCAL'] == '1'
4
+ end
5
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rollbar
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rollbar, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-01 00:00:00.000000000 Z
11
+ date: 2015-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -178,6 +178,20 @@ dependencies:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: oj
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 2.12.14
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: 2.12.14
181
195
  description: Easy and powerful exception tracking for Ruby
182
196
  email:
183
197
  - support@rollbar.com
@@ -256,6 +270,8 @@ files:
256
270
  - spec/controllers/home_controller_spec.rb
257
271
  - spec/delay/sidekiq_spec.rb
258
272
  - spec/delay/sucker_punch_spec.rb
273
+ - spec/delayed/backend/test.rb
274
+ - spec/delayed/serialization/test.rb
259
275
  - spec/dummyapp/.gitignore
260
276
  - spec/dummyapp/Rakefile
261
277
  - spec/dummyapp/app/assets/javascripts/application.js
@@ -318,6 +334,7 @@ files:
318
334
  - spec/rollbar/delay/girl_friday_spec.rb
319
335
  - spec/rollbar/delay/resque_spec.rb
320
336
  - spec/rollbar/delay/thread_spec.rb
337
+ - spec/rollbar/delayed_job/job_data.rb
321
338
  - spec/rollbar/delayed_job_spec.rb
322
339
  - spec/rollbar/encoding/encoder_spec.rb
323
340
  - spec/rollbar/json_spec.rb
@@ -338,6 +355,7 @@ files:
338
355
  - spec/support/encoding_helpers.rb
339
356
  - spec/support/fixture_helpers.rb
340
357
  - spec/support/get_ip_raising.rb
358
+ - spec/support/helpers.rb
341
359
  - spec/support/notifier_helpers.rb
342
360
  - spec/support/shared_contexts.rb
343
361
  homepage: https://rollbar.com
@@ -368,6 +386,8 @@ test_files:
368
386
  - spec/controllers/home_controller_spec.rb
369
387
  - spec/delay/sidekiq_spec.rb
370
388
  - spec/delay/sucker_punch_spec.rb
389
+ - spec/delayed/backend/test.rb
390
+ - spec/delayed/serialization/test.rb
371
391
  - spec/dummyapp/.gitignore
372
392
  - spec/dummyapp/Rakefile
373
393
  - spec/dummyapp/app/assets/javascripts/application.js
@@ -430,6 +450,7 @@ test_files:
430
450
  - spec/rollbar/delay/girl_friday_spec.rb
431
451
  - spec/rollbar/delay/resque_spec.rb
432
452
  - spec/rollbar/delay/thread_spec.rb
453
+ - spec/rollbar/delayed_job/job_data.rb
433
454
  - spec/rollbar/delayed_job_spec.rb
434
455
  - spec/rollbar/encoding/encoder_spec.rb
435
456
  - spec/rollbar/json_spec.rb
@@ -450,5 +471,6 @@ test_files:
450
471
  - spec/support/encoding_helpers.rb
451
472
  - spec/support/fixture_helpers.rb
452
473
  - spec/support/get_ip_raising.rb
474
+ - spec/support/helpers.rb
453
475
  - spec/support/notifier_helpers.rb
454
476
  - spec/support/shared_contexts.rb