boss_queue 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.5.0
data/boss_queue.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "boss_queue"
8
- s.version = "0.4.0"
8
+ s.version = "0.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Daniel Nelson"]
12
- s.date = "2013-10-09"
12
+ s.date = "2013-10-15"
13
13
  s.description = "A fault tolerant job queue built around Amazon SQS & DynamoDB"
14
14
  s.email = "daniel@populr.me"
15
15
  s.extra_rdoc_files = [
@@ -6,6 +6,8 @@ class BossQueue
6
6
  attr_accessor :queue_name
7
7
 
8
8
  boolean_attr :failed
9
+ boolean_attr :target_missing
10
+ boolean_attr :delete_if_target_missing
9
11
 
10
12
  string_attr :model_class_name
11
13
  string_attr :model_id
@@ -73,15 +75,27 @@ class BossQueue
73
75
  self.exception_message = err.message
74
76
  self.stacktrace = err.backtrace[0, 7].join("\n")
75
77
 
76
- if failure_action == 'retry' && retry_delay
78
+ failed_target = target rescue nil
79
+
80
+ if failed_target.nil?
81
+ if delete_if_target_missing?
82
+ destroy
83
+ else
84
+ self.failed = true
85
+ self.target_missing = true
86
+ self.save!
87
+ end
88
+
89
+ elsif failure_action == 'retry' && retry_delay
77
90
  enqueue_with_delay(retry_delay)
78
91
  self.save!
79
92
 
80
93
  elsif failure_action == 'callback' &&
81
94
  failure_callback
82
95
 
83
- callback_called = target.send(failure_callback, err, *arguments) rescue nil
84
- if callback_called
96
+
97
+ delete_me = failed_target.send(failure_callback, err, *arguments)
98
+ if delete_me
85
99
  destroy
86
100
  else
87
101
  self.failed = true
@@ -110,6 +124,10 @@ class BossQueue
110
124
  end
111
125
 
112
126
  def target
127
+ @target ||= _target
128
+ end
129
+
130
+ def _target
113
131
  klass = constantize(model_class_name)
114
132
  if model_id
115
133
  klass.find(model_id)
data/spec/job_spec.rb CHANGED
@@ -11,17 +11,48 @@ describe "BossQueue::Job" do
11
11
  end
12
12
 
13
13
 
14
- it "should respond to failed" do
15
- BossQueue::Job.new.should respond_to(:failed)
14
+
15
+ it "should respond to target_missing?" do
16
+ BossQueue::Job.new.should respond_to(:target_missing?)
17
+ end
18
+
19
+ it "should respond to target_missing=" do
20
+ BossQueue::Job.new.should respond_to(:target_missing=)
21
+ end
22
+
23
+ describe "#target_missing?" do
24
+ it "should default to false" do
25
+ BossQueue::Job.new.target_missing?.should be_false
26
+ end
27
+ end
28
+
29
+
30
+ it "should respond to delete_if_target_missing?" do
31
+ BossQueue::Job.new.should respond_to(:delete_if_target_missing?)
32
+ end
33
+
34
+ it "should respond to delete_if_target_missing=" do
35
+ BossQueue::Job.new.should respond_to(:delete_if_target_missing=)
36
+ end
37
+
38
+ describe "#delete_if_target_missing?" do
39
+ it "should default to false" do
40
+ BossQueue::Job.new.delete_if_target_missing?.should be_false
41
+ end
42
+ end
43
+
44
+
45
+ it "should respond to failed?" do
46
+ BossQueue::Job.new.should respond_to(:failed?)
16
47
  end
17
48
 
18
49
  it "should respond to failed=" do
19
50
  BossQueue::Job.new.should respond_to(:failed=)
20
51
  end
21
52
 
22
- describe "#failed" do
53
+ describe "#failed?" do
23
54
  it "should default to false" do
24
- BossQueue::Job.new.failed.should be_false
55
+ BossQueue::Job.new.failed?.should be_false
25
56
  end
26
57
  end
27
58
 
@@ -284,10 +315,24 @@ describe "BossQueue::Job" do
284
315
 
285
316
  describe "#fail" do
286
317
  before(:each) do
318
+ @instance_to_work_on = double('instance_to_work_on')
319
+ @instance_to_work_on.stub(:test_instance_method)
320
+ @instance_to_work_on.stub(:failure).and_return(false)
321
+ TestClass.stub(:find).and_return(@instance_to_work_on)
322
+
287
323
  @job = BossQueue::Job.new
288
324
  @job.stub(:retry_delay).and_return(nil)
289
325
  @job.stub(:save!)
290
326
  @job.stub(:enqueue_with_delay)
327
+
328
+ @job.stub(:destroy)
329
+ @job.model_class_name = 'TestClass'
330
+ @job.model_id = 'xyz'
331
+ @job.callback = 'test_instance_method'
332
+ @arguments = ['a', 'b', { 'c' => 2, 'd' => 1 }]
333
+ @argument_json = JSON.generate(@arguments)
334
+ @job.args = @argument_json
335
+
291
336
  @err
292
337
  begin
293
338
  raise StandardError.new('hello world')
@@ -316,22 +361,50 @@ describe "BossQueue::Job" do
316
361
  @job.fail(@err)
317
362
  end
318
363
 
319
- context "when failure_action is 'callback'" do
364
+
365
+
366
+
367
+
368
+ context "when delete_if_target_missing is true and the target cannot be found" do
369
+ it "should destroy the record" do
370
+ @job.failure_action = 'callback'
371
+ @job.failure_callback = 'failure'
372
+ @job.delete_if_target_missing = true
373
+ TestClass.stub(:find).and_raise('not found')
374
+
375
+ @job.should_receive(:destroy)
376
+ @job.fail(@err)
377
+ end
378
+ end
379
+
380
+
381
+
382
+
383
+ context "when delete_if_target_missing is false and the target cannot be found" do
320
384
  before(:each) do
321
385
  @job.failure_action = 'callback'
322
386
  @job.failure_callback = 'failure'
387
+ TestClass.stub(:find).and_raise('not found')
388
+ end
323
389
 
324
- @job.stub(:destroy)
325
- @job.model_class_name = 'TestClass'
326
- @job.model_id = 'xyz'
327
- @job.callback = 'test_instance_method'
328
- @arguments = ['a', 'b', { 'c' => 2, 'd' => 1 }]
329
- @argument_json = JSON.generate(@arguments)
330
- @job.args = @argument_json
331
- @instance_to_work_on = double('instance_to_work_on')
332
- @instance_to_work_on.stub(:test_instance_method)
333
- @instance_to_work_on.stub(:failure).and_return(false)
334
- TestClass.stub(:find).and_return(@instance_to_work_on)
390
+ it "should set target_missing on the job" do
391
+ @job.fail(@err)
392
+ @job.target_missing.should be_true
393
+ end
394
+
395
+ it "should not destroy the record" do
396
+ @job.should_not_receive(:destroy)
397
+ @job.fail(@err)
398
+ end
399
+ end
400
+
401
+
402
+
403
+
404
+ context "when failure_action is 'callback'" do
405
+ before(:each) do
406
+ @job.failure_action = 'callback'
407
+ @job.failure_callback = 'failure'
335
408
  end
336
409
 
337
410
  it "should call the failure_callback method with the exception and the callback arguments" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: boss_queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.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: 2013-10-09 00:00:00.000000000 Z
12
+ date: 2013-10-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk
@@ -160,7 +160,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
160
  version: '0'
161
161
  segments:
162
162
  - 0
163
- hash: -3950769751484491906
163
+ hash: -3544343806450601850
164
164
  required_rubygems_version: !ruby/object:Gem::Requirement
165
165
  none: false
166
166
  requirements: