log4r-exceptionable 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
3
  - 1.9.2
5
4
  - 1.9.3
6
- - jruby-18mode # JRuby in 1.8 mode
7
5
  - jruby-19mode # JRuby in 1.9 mode
8
- # - rbx-18mode
9
6
  # - rbx-19mode
10
7
  script: bundle exec rspec spec
@@ -9,6 +9,12 @@ begin
9
9
  rescue LoadError
10
10
  end
11
11
 
12
+ # optional if only using sidekiq
13
+ begin
14
+ require "log4r-exceptionable/sidekiq_failure_handler"
15
+ rescue LoadError
16
+ end
17
+
12
18
  # optional if only using rack
13
19
  begin
14
20
  require "log4r-exceptionable/resque_failure_handler"
@@ -6,7 +6,7 @@ module Log4rExceptionable
6
6
 
7
7
  class << self
8
8
  # required - default loggers used if source logger not available
9
- attr_accessor :rack_failure_logger, :resque_failure_logger
9
+ attr_accessor :rack_failure_logger, :resque_failure_logger, :sidekiq_failure_logger
10
10
  # Allows one to force use of default loggers by setting to false
11
11
  attr_accessor :use_source_logger
12
12
  # The level to log exceptions
@@ -15,17 +15,20 @@ module Log4rExceptionable
15
15
  attr_accessor :context_inclusions
16
16
  # blacklist of context keys (e.g. keys in rack env) to exclude in log4r context when logging
17
17
  attr_accessor :context_exclusions
18
+ # Swallow exceptions raised by the call to the logger, printing to stderr, defaults to true
19
+ attr_accessor :failsafe_logging
18
20
  end
19
21
 
20
22
  # default values
21
23
  self.use_source_logger = true
22
24
  self.log_level = :fatal
25
+ self.failsafe_logging = true
23
26
 
24
27
  def self.configure
25
28
  yield self
26
29
 
27
- if ! self.rack_failure_logger && ! self.resque_failure_logger
28
- raise "log4r-exceptionable requires a rack_failure_logger or resque_failure_logger"
30
+ if ! self.rack_failure_logger && ! self.resque_failure_logger && ! self.sidekiq_failure_logger
31
+ raise "log4r-exceptionable requires a rack_failure_logger or resque_failure_logger or sidekiq_failure_logger"
29
32
  end
30
33
 
31
34
  if self.rack_failure_logger
@@ -36,6 +39,10 @@ module Log4rExceptionable
36
39
  self.set_logger(:resque_failure_logger)
37
40
  end
38
41
 
42
+ if self.sidekiq_failure_logger
43
+ self.set_logger(:sidekiq_failure_logger)
44
+ end
45
+
39
46
  self.context_inclusions = Set.new(self.context_inclusions) if self.context_inclusions
40
47
  self.context_exclusions = Set.new(self.context_exclusions) if self.context_exclusions
41
48
 
@@ -20,7 +20,8 @@ module Log4rExceptionable
20
20
  end
21
21
 
22
22
  rescue => e
23
- $stderr.puts "Log4r Exceptionable could not log exception: " + e.message
23
+ raise e unless Log4rExceptionable::Configuration.failsafe_logging
24
+ $stderr.puts "Log4r Exceptionable could not log exception: #{e.class} #{e.message}"
24
25
  end
25
26
  end
26
27
 
@@ -0,0 +1,51 @@
1
+ require 'sidekiq'
2
+
3
+ module Log4rExceptionable
4
+
5
+ # A Resque Failure backend that logs exceptions with log4r
6
+ #
7
+ class SidekiqFailureHandler
8
+ include Log4rExceptionable::Helper
9
+
10
+ def call(worker, msg, queue)
11
+ begin
12
+ yield
13
+ rescue => ex
14
+ log_exception(worker, queue, ex, msg)
15
+ raise
16
+ end
17
+ end
18
+
19
+ def log_exception(worker, queue, ex, msg)
20
+
21
+ log_with_context do |context|
22
+
23
+ add_context(context, "sidekiq_worker", worker.class)
24
+ add_context(context, "sidekiq_queue", queue.to_s)
25
+ add_context(context, "sidekiq_args", msg['args'])
26
+ add_context(context, "sidekiq_jid", worker.jid)
27
+
28
+ # add in any extra payload data
29
+ msg.each do |k, v|
30
+ next if %w[class args].include?(k)
31
+ add_context(context, "sidekiq_msg_#{k}", v)
32
+ end
33
+
34
+ error_logger = nil
35
+ if Log4rExceptionable::Configuration.use_source_logger
36
+ payload_class = worker.logger rescue nil
37
+ if worker.logger.instance_of?(Log4r::Logger)
38
+ error_logger = worker.logger
39
+ end
40
+ end
41
+
42
+ error_logger ||= Log4rExceptionable::Configuration.sidekiq_failure_logger
43
+
44
+ error_logger.send(Log4rExceptionable::Configuration.log_level, ex)
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -1,3 +1,3 @@
1
1
  module Log4rExceptionable
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -25,5 +25,6 @@ Gem::Specification.new do |s|
25
25
 
26
26
  s.add_development_dependency("rack-test")
27
27
  s.add_development_dependency("resque")
28
+ s.add_development_dependency("sidekiq")
28
29
  s.add_dependency("log4r")
29
30
  end
@@ -7,13 +7,14 @@ describe Log4rExceptionable::Configuration do
7
7
  before(:each) do
8
8
  Log4rExceptionable::Configuration.rack_failure_logger = nil
9
9
  Log4rExceptionable::Configuration.resque_failure_logger = nil
10
+ Log4rExceptionable::Configuration.sidekiq_failure_logger = nil
10
11
  end
11
12
 
12
13
  it "should raise if no logger in config" do
13
14
  lambda {
14
15
  Log4rExceptionable::Configuration.configure do |config|
15
16
  end
16
- }.should raise_error("log4r-exceptionable requires a rack_failure_logger or resque_failure_logger")
17
+ }.should raise_error("log4r-exceptionable requires a rack_failure_logger or resque_failure_logger or sidekiq_failure_logger")
17
18
  end
18
19
 
19
20
  it "should not raise if config has a rack logger" do
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+ describe Log4rExceptionable::Helper do
4
+ include Log4rExceptionable::Helper
5
+
6
+ context "helper" do
7
+
8
+ before(:each) do
9
+ end
10
+
11
+ it "should raise if failsafe_logging false" do
12
+ Log4rExceptionable::Configuration.failsafe_logging = false
13
+ $stderr.should_not_receive(:puts)
14
+
15
+ lambda {
16
+ log_with_context do
17
+ raise "I failed"
18
+ end
19
+ }.should raise_error("I failed")
20
+ end
21
+
22
+ it "should not raise if failsafe_logging true" do
23
+ Log4rExceptionable::Configuration.failsafe_logging = true
24
+ $stderr.should_receive(:puts)
25
+
26
+
27
+ lambda {
28
+ log_with_context do
29
+ raise "I failed"
30
+ end
31
+ }.should_not raise_error("I failed")
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Log4rExceptionable::ResqueFailureHandler do
4
- include PerformJob
4
+ include PerformResqueJob
5
5
 
6
6
  context "handling resque failures" do
7
7
 
@@ -65,7 +65,7 @@ describe Log4rExceptionable::ResqueFailureHandler do
65
65
  Log4r::MDC.get('resque_args').should == ["foo"]
66
66
  end
67
67
 
68
- run_resque_job(SomeJob, 'foo', :queue => :somequeue, :inline => true)
68
+ run_job(SomeJob, 'foo', :queue => :somequeue, :inline => true)
69
69
  end
70
70
 
71
71
  it "uses default logger if job logger is nil" do
@@ -76,7 +76,7 @@ describe Log4rExceptionable::ResqueFailureHandler do
76
76
  Log4r::MDC.get('resque_class').should == SomeJobWithNilLogger
77
77
  end
78
78
 
79
- run_resque_job(SomeJobWithNilLogger, 'foo', :queue => :somequeue, :inline => true)
79
+ run_job(SomeJobWithNilLogger, 'foo', :queue => :somequeue, :inline => true)
80
80
  end
81
81
 
82
82
  it "uses default logger if job logger is not log4r" do
@@ -87,7 +87,7 @@ describe Log4rExceptionable::ResqueFailureHandler do
87
87
  Log4r::MDC.get('resque_class').should == SomeJobWithOtherLogger
88
88
  end
89
89
 
90
- run_resque_job(SomeJobWithOtherLogger, 'foo', :queue => :somequeue, :inline => true)
90
+ run_job(SomeJobWithOtherLogger, 'foo', :queue => :somequeue, :inline => true)
91
91
  end
92
92
 
93
93
  it "uses job logger if set" do
@@ -99,7 +99,7 @@ describe Log4rExceptionable::ResqueFailureHandler do
99
99
  Log4r::MDC.get('resque_class').should == SomeJobWithLogger
100
100
  end
101
101
 
102
- run_resque_job(SomeJobWithLogger, 'foo', :queue => :somequeue, :inline => true)
102
+ run_job(SomeJobWithLogger, 'foo', :queue => :somequeue, :inline => true)
103
103
  end
104
104
 
105
105
  it "uses default logger if source logger disabled" do
@@ -113,7 +113,7 @@ describe Log4rExceptionable::ResqueFailureHandler do
113
113
  Log4r::MDC.get('resque_class').should == SomeJobWithLogger
114
114
  end
115
115
 
116
- run_resque_job(SomeJobWithLogger, 'foo', :queue => :somequeue, :inline => true)
116
+ run_job(SomeJobWithLogger, 'foo', :queue => :somequeue, :inline => true)
117
117
  end
118
118
 
119
119
  it "only includes inclusions if set" do
@@ -125,7 +125,7 @@ describe Log4rExceptionable::ResqueFailureHandler do
125
125
  Log4r::MDC.get_context.keys.should == ['resque_queue']
126
126
  end
127
127
 
128
- run_resque_job(SomeJob, 'foo', :queue => :somequeue, :inline => true)
128
+ run_job(SomeJob, 'foo', :queue => :somequeue, :inline => true)
129
129
  end
130
130
 
131
131
  it "excludes exclusions if set" do
@@ -137,7 +137,7 @@ describe Log4rExceptionable::ResqueFailureHandler do
137
137
  Log4r::MDC.get_context.keys.should_not include 'resque_queue'
138
138
  end
139
139
 
140
- run_resque_job(SomeJob, 'foo', :queue => :somequeue, :inline => true)
140
+ run_job(SomeJob, 'foo', :queue => :somequeue, :inline => true)
141
141
  end
142
142
 
143
143
  it "logs with given log_level" do
@@ -148,7 +148,7 @@ describe Log4rExceptionable::ResqueFailureHandler do
148
148
  msg.message.should == "I failed"
149
149
  end
150
150
 
151
- run_resque_job(SomeJob, 'foo', :queue => :somequeue, :inline => true)
151
+ run_job(SomeJob, 'foo', :queue => :somequeue, :inline => true)
152
152
  end
153
153
 
154
154
 
@@ -0,0 +1,178 @@
1
+ require "spec_helper"
2
+
3
+ describe Log4rExceptionable::SidekiqFailureHandler do
4
+ include PerformSidekiqJob
5
+
6
+ context "handling sidekiq failures" do
7
+
8
+ class SomeJob
9
+ include Sidekiq::Worker
10
+ def perform(*args)
11
+ raise "I failed"
12
+ end
13
+ end
14
+
15
+ class SomeJobWithNilLogger
16
+ include Sidekiq::Worker
17
+ def logger
18
+ nil
19
+ end
20
+
21
+ def perform(*args)
22
+ raise "I failed"
23
+ end
24
+ end
25
+
26
+ class SomeJobWithOtherLogger
27
+ include Sidekiq::Worker
28
+ def logger
29
+ self
30
+ end
31
+
32
+ def perform(*args)
33
+ raise "I failed"
34
+ end
35
+ end
36
+
37
+ class SomeJobWithLogger
38
+ include Sidekiq::Worker
39
+ def logger
40
+ Log4r::Logger["SomeJobWithLogger"] || Log4r::Logger.new("SomeJobWithLogger")
41
+ end
42
+
43
+ def perform(*args)
44
+ raise "I failed"
45
+ end
46
+ end
47
+
48
+ before(:each) do
49
+ Sidekiq.server_middleware do |chain|
50
+ chain.insert_before Sidekiq::Middleware::Server::Logging, Log4rExceptionable::SidekiqFailureHandler
51
+ end
52
+
53
+ Log4rExceptionable::Configuration.configure do |config|
54
+ config.sidekiq_failure_logger = 'sidekiqlogger'
55
+ config.use_source_logger = true
56
+ config.context_inclusions = nil
57
+ config.context_exclusions = nil
58
+ config.log_level = :fatal
59
+ end
60
+ end
61
+
62
+ it "triggers failure handler" do
63
+
64
+ Log4r::Logger['sidekiqlogger'].should_receive(:fatal) do |msg|
65
+ msg.should be_instance_of RuntimeError
66
+ msg.message.should == "I failed"
67
+ msg.backtrace.first.should =~ /sidekiq_failure_handler_spec.rb/
68
+ Log4r::MDC.get('sidekiq_worker').should == SomeJob
69
+ Log4r::MDC.get('sidekiq_queue').should == "somequeue"
70
+ Log4r::MDC.get('sidekiq_args').should == ["foo"]
71
+ end
72
+
73
+ lambda {
74
+ run_job(SomeJob, 'foo', :queue => :somequeue)
75
+ }.should raise_error("I failed")
76
+ end
77
+
78
+ it "uses default logger if job logger is nil" do
79
+
80
+ Log4r::Logger['sidekiqlogger'].should_receive(:fatal) do |msg|
81
+ msg.should be_instance_of RuntimeError
82
+ msg.message.should == "I failed"
83
+ Log4r::MDC.get('sidekiq_worker').should == SomeJobWithNilLogger
84
+ end
85
+
86
+ lambda {
87
+ run_job(SomeJobWithNilLogger, 'foo', :queue => :somequeue)
88
+ }.should raise_error("I failed")
89
+ end
90
+
91
+ it "uses default logger if job logger is not log4r" do
92
+
93
+ Log4r::Logger['sidekiqlogger'].should_receive(:fatal) do |msg|
94
+ msg.should be_instance_of RuntimeError
95
+ msg.message.should == "I failed"
96
+ Log4r::MDC.get('sidekiq_worker').should == SomeJobWithOtherLogger
97
+ end
98
+
99
+ lambda {
100
+ run_job(SomeJobWithOtherLogger, 'foo', :queue => :somequeue)
101
+ }.should raise_error("I failed")
102
+ end
103
+
104
+ it "uses job logger if set" do
105
+ Log4r::Logger.new('SomeJobWithLogger')
106
+ Log4r::Logger['sidekiqlogger'].should_not_receive(:fatal)
107
+ Log4r::Logger['SomeJobWithLogger'].should_receive(:fatal) do |msg|
108
+ msg.should be_instance_of RuntimeError
109
+ msg.message.should == "I failed"
110
+ Log4r::MDC.get('sidekiq_worker').should == SomeJobWithLogger
111
+ end
112
+
113
+ lambda {
114
+ run_job(SomeJobWithLogger, 'foo', :queue => :somequeue)
115
+ }.should raise_error("I failed")
116
+ end
117
+
118
+ it "uses default logger if source logger disabled" do
119
+ Log4rExceptionable::Configuration.use_source_logger = false
120
+
121
+ Log4r::Logger.new('SomeJobWithLogger')
122
+ Log4r::Logger['SomeJobWithLogger'].should_not_receive(:fatal)
123
+ Log4r::Logger['sidekiqlogger'].should_receive(:fatal) do |msg|
124
+ msg.should be_instance_of RuntimeError
125
+ msg.message.should == "I failed"
126
+ Log4r::MDC.get('sidekiq_worker').should == SomeJobWithLogger
127
+ end
128
+
129
+ lambda {
130
+ run_job(SomeJobWithLogger, 'foo', :queue => :somequeue)
131
+ }.should raise_error("I failed")
132
+ end
133
+
134
+ it "only includes inclusions if set" do
135
+ Log4rExceptionable::Configuration.context_inclusions = ['sidekiq_queue']
136
+
137
+ Log4r::Logger['sidekiqlogger'].should_receive(:fatal) do |msg|
138
+ msg.should be_instance_of RuntimeError
139
+ msg.message.should == "I failed"
140
+ Log4r::MDC.get_context.keys.should == ['sidekiq_queue']
141
+ end
142
+
143
+ lambda {
144
+ run_job(SomeJob, 'foo', :queue => :somequeue)
145
+ }.should raise_error("I failed")
146
+ end
147
+
148
+ it "excludes exclusions if set" do
149
+ Log4rExceptionable::Configuration.context_exclusions = ['sidekiq_queue']
150
+
151
+ Log4r::Logger['sidekiqlogger'].should_receive(:fatal) do |msg|
152
+ msg.should be_instance_of RuntimeError
153
+ msg.message.should == "I failed"
154
+ Log4r::MDC.get_context.keys.should_not include 'sidekiq_queue'
155
+ end
156
+
157
+ lambda {
158
+ run_job(SomeJob, 'foo', :queue => :somequeue)
159
+ }.should raise_error("I failed")
160
+ end
161
+
162
+ it "logs with given log_level" do
163
+ Log4rExceptionable::Configuration.log_level = :info
164
+
165
+ Log4r::Logger['sidekiqlogger'].should_receive(:info) do |msg|
166
+ msg.should be_instance_of RuntimeError
167
+ msg.message.should == "I failed"
168
+ end
169
+
170
+ lambda {
171
+ run_job(SomeJob, 'foo', :queue => :somequeue)
172
+ }.should raise_error("I failed")
173
+ end
174
+
175
+
176
+ end
177
+
178
+ end
@@ -1,6 +1,9 @@
1
1
  require "rack/test"
2
2
  require 'rspec'
3
3
  require 'resque'
4
+ require 'sidekiq'
5
+ require 'sidekiq/processor'
6
+ require 'sidekiq/fetch'
4
7
  require 'log4r-exceptionable'
5
8
  require 'ap'
6
9
 
@@ -26,24 +29,28 @@ unless ENV['CI']
26
29
  File.delete("#{spec_dir}/dump.rdb") rescue nil
27
30
  end
28
31
  end
29
-
32
+
33
+ end
34
+
35
+ RSpec.configure do |config|
36
+ config.before(:each) { Log4rExceptionable::Configuration.failsafe_logging = false }
30
37
  end
31
38
 
32
39
  ##
33
40
  # Helper to perform job classes
34
41
  #
35
- module PerformJob
42
+ module PerformResqueJob
36
43
 
37
- def run_resque_job(job_class, *job_args)
44
+ def run_job(job_class, *job_args)
38
45
  opts = job_args.last.is_a?(Hash) ? job_args.pop : {}
39
46
  queue = opts[:queue] || Resque.queue_from_class(job_class)
40
47
 
41
48
  Resque::Job.create(queue, job_class, *job_args)
42
49
 
43
- run_resque_queue(queue, opts)
50
+ run_queue(queue, opts)
44
51
  end
45
52
 
46
- def run_resque_queue(queue, opts={})
53
+ def run_queue(queue, opts={})
47
54
  worker = Resque::Worker.new(queue)
48
55
  worker.very_verbose = true if opts[:verbose]
49
56
 
@@ -76,3 +83,37 @@ module PerformJob
76
83
  end
77
84
 
78
85
  end
86
+
87
+ Celluloid.logger = nil
88
+
89
+ module PerformSidekiqJob
90
+
91
+ def run_job(job_class, *job_args)
92
+ opts = job_args.last.is_a?(Hash) ? job_args.pop : {}
93
+ queue = (opts[:queue] || 'testqueue').to_s
94
+
95
+ Sidekiq.logger = mock().as_null_object
96
+ @boss = stub()
97
+ @processor = ::Sidekiq::Processor.new(@boss)
98
+ #Sidekiq.redis = REDIS
99
+
100
+ msg = Sidekiq.dump_json({ 'class' => job_class.to_s, 'args' => job_args })
101
+ @processor.process(::Sidekiq::BasicFetch::UnitOfWork.new(queue, msg))
102
+ @boss.verify
103
+ end
104
+
105
+ def dump_redis
106
+ result = {}
107
+ Sidekiq.redis.keys("*").each do |key|
108
+ type = Sidekiq.redis.type(key)
109
+ result[key] = case type
110
+ when 'string' then Sidekiq.redis.get(key)
111
+ when 'list' then Sidekiq.redis.lrange(key, 0, -1)
112
+ when 'set' then Sidekiq.redis.smembers(key)
113
+ else type
114
+ end
115
+ end
116
+ return result
117
+ end
118
+
119
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: log4r-exceptionable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-21 00:00:00.000000000 Z
12
+ date: 2013-02-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -91,6 +91,22 @@ dependencies:
91
91
  - - ! '>='
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: sidekiq
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
94
110
  - !ruby/object:Gem::Dependency
95
111
  name: log4r
96
112
  requirement: !ruby/object:Gem::Requirement
@@ -123,17 +139,20 @@ files:
123
139
  - LICENSE
124
140
  - README.md
125
141
  - Rakefile
126
- - graylog2-resque.gemspec
127
142
  - lib/log4r-exceptionable.rb
128
143
  - lib/log4r-exceptionable/configuration.rb
129
144
  - lib/log4r-exceptionable/helper.rb
130
145
  - lib/log4r-exceptionable/rack_failure_handler.rb
131
146
  - lib/log4r-exceptionable/resque_failure_handler.rb
147
+ - lib/log4r-exceptionable/sidekiq_failure_handler.rb
132
148
  - lib/log4r-exceptionable/version.rb
149
+ - log4r-exceptionable.gemspec
133
150
  - spec/configuration_spec.rb
151
+ - spec/helper_spec.rb
134
152
  - spec/rack_failure_handler_spec.rb
135
153
  - spec/redis-test.conf
136
154
  - spec/resque_failure_handler_spec.rb
155
+ - spec/sidekiq_failure_handler_spec.rb
137
156
  - spec/spec_helper.rb
138
157
  homepage: ''
139
158
  licenses: []
@@ -147,22 +166,29 @@ required_ruby_version: !ruby/object:Gem::Requirement
147
166
  - - ! '>='
148
167
  - !ruby/object:Gem::Version
149
168
  version: '0'
169
+ segments:
170
+ - 0
171
+ hash: 391045047313925202
150
172
  required_rubygems_version: !ruby/object:Gem::Requirement
151
173
  none: false
152
174
  requirements:
153
175
  - - ! '>='
154
176
  - !ruby/object:Gem::Version
155
177
  version: '0'
178
+ segments:
179
+ - 0
180
+ hash: 391045047313925202
156
181
  requirements: []
157
182
  rubyforge_project: log4r-exceptionable
158
- rubygems_version: 1.8.21
183
+ rubygems_version: 1.8.24
159
184
  signing_key:
160
185
  specification_version: 3
161
186
  summary: Failure handlers for rack and resque that log failures using log4r
162
187
  test_files:
163
188
  - spec/configuration_spec.rb
189
+ - spec/helper_spec.rb
164
190
  - spec/rack_failure_handler_spec.rb
165
191
  - spec/redis-test.conf
166
192
  - spec/resque_failure_handler_spec.rb
193
+ - spec/sidekiq_failure_handler_spec.rb
167
194
  - spec/spec_helper.rb
168
- has_rdoc: