hotseat 0.3.0 → 0.4.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.3.0
1
+ 0.4.0
data/hotseat.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "hotseat"
8
- s.version = "0.3.0"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Elad Kehat"]
12
- s.date = "2011-09-23"
12
+ s.date = "2012-02-16"
13
13
  s.email = "eladkehat@gmail.com"
14
14
  s.extra_rdoc_files = [
15
15
  "LICENSE.txt",
data/lib/hotseat/queue.rb CHANGED
@@ -106,6 +106,12 @@ module Hotseat
106
106
  doc
107
107
  end
108
108
 
109
+ def done?(doc)
110
+ if obj = doc[config[:object_name]]
111
+ obj.has_key? 'done'
112
+ end
113
+ end
114
+
109
115
  def add(doc_id)
110
116
  @db.update_doc(doc_id) do |doc|
111
117
  patch doc
@@ -189,6 +195,26 @@ module Hotseat
189
195
  }
190
196
  end
191
197
 
198
+ def undo(doc_id)
199
+ @db.update_doc(doc_id) do |doc|
200
+ raise(QueueError, "Document is not done") unless done?(doc)
201
+ obj = doc[config[:object_name]]
202
+ obj.delete 'done'
203
+ end
204
+ end
205
+
206
+ def undo_bulk(doc_ids)
207
+ rows = @db.bulk_load(doc_ids)['rows']
208
+ docs, missing = rows.partition {|row| row['doc'] }
209
+ docs.map! {|row| row['doc'] }
210
+ done, not_done = docs.partition {|doc| done? doc }
211
+ done.each do |doc|
212
+ obj = doc[config[:object_name]]
213
+ obj.delete 'done'
214
+ end
215
+ @db.bulk_save done, use_uuids=false
216
+ end
217
+
192
218
  def num_done
193
219
  @db.view(done_view_name, :limit => 0)['total_rows']
194
220
  end
@@ -114,6 +114,27 @@ module Hotseat
114
114
  end
115
115
  end
116
116
 
117
+ describe "#done?" do
118
+ before(:each) do
119
+ reset_test_queue!
120
+ end
121
+ it "should be true if the document was marked as done" do
122
+ doc = @q.mark_done( @q.patch( sample_doc ) )
123
+ @q.done?(doc).should be_true
124
+ end
125
+ it "should be false for a patched document that was not marked as done" do
126
+ doc = @q.patch( sample_doc )
127
+ @q.done?(doc).should be_false
128
+ end
129
+ it "should be false for a locked document" do
130
+ doc = @q.add_lock( @q.patch( sample_doc ) )
131
+ @q.done?(doc).should be_false
132
+ end
133
+ it "should be false for an un-patched document (not part of the queue)" do
134
+ @q.done?(sample_doc).should be_false
135
+ end
136
+ end
137
+
117
138
  describe "#add" do
118
139
  before(:each) do
119
140
  reset_test_queue!
@@ -418,6 +439,62 @@ module Hotseat
418
439
  end
419
440
  end
420
441
 
442
+ describe "#undo" do
443
+ before(:all) do
444
+ reset_test_queue!
445
+ doc_ids = create_some_docs(3)
446
+ enqueue doc_ids
447
+ @done_ids = [doc_ids[1]]
448
+ @undone_ids = [doc_ids[0], doc_ids[2]]
449
+ @done_ids.each do |done_id|
450
+ done_doc = DB.get done_id
451
+ @q.mark_done done_doc
452
+ done_doc.save
453
+ end
454
+ end
455
+
456
+ it "should mark the done document as pending again" do
457
+ @q.undo @done_ids.first
458
+ done_doc = DB.get @done_ids.first
459
+ patch = done_doc[@q.config[:object_name]]
460
+ patch.should_not have_key('done')
461
+ patch.should_not have_key('lock')
462
+ end
463
+
464
+ it "should raise an error if the document is not done" do
465
+ undone_doc = DB.get @undone_ids.first
466
+ expect {
467
+ @q.undo @undone_ids.first
468
+ }.to raise_error(Hotseat::QueueError)
469
+ end
470
+ end
471
+
472
+ describe "#undo_bulk" do
473
+ before(:each) do
474
+ reset_test_queue!
475
+ doc_ids = create_some_docs(5)
476
+ enqueue doc_ids
477
+ @done_docs = doc_ids[0..2].map{|id| DB.get id }
478
+ @done_docs.each do |doc|
479
+ @q.mark_done doc
480
+ doc.save
481
+ end
482
+ end
483
+
484
+ it "should mark all 'done' documents as pending again" do
485
+ @q.undo_bulk @done_docs.map{|doc| doc['_id']}
486
+ @q.num_done.should == 0
487
+ @q.num_pending.should == 5
488
+ end
489
+
490
+ it "should leave not-done documents intact" do
491
+ @q.lease
492
+ @q.undo_bulk @done_docs.map{|doc| doc['_id']}
493
+ @q.num_locked.should == 1
494
+ @q.num_pending.should == 4
495
+ end
496
+ end
497
+
421
498
  describe "#num_done" do
422
499
  it "should return the number of documents done" do
423
500
  reset_test_queue!
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hotseat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-23 00:00:00.000000000Z
12
+ date: 2012-02-16 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: couchrest
16
- requirement: &87101760 !ruby/object:Gem::Requirement
16
+ requirement: &76368530 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.1.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *87101760
24
+ version_requirements: *76368530
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &87101330 !ruby/object:Gem::Requirement
27
+ requirement: &76368010 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *87101330
35
+ version_requirements: *76368010
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: yard
38
- requirement: &87100940 !ruby/object:Gem::Requirement
38
+ requirement: &76367640 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *87100940
46
+ version_requirements: *76367640
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &87100480 !ruby/object:Gem::Requirement
49
+ requirement: &76367340 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *87100480
57
+ version_requirements: *76367340
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &87100060 !ruby/object:Gem::Requirement
60
+ requirement: &76367000 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *87100060
68
+ version_requirements: *76367000
69
69
  description:
70
70
  email: eladkehat@gmail.com
71
71
  executables: []
@@ -103,7 +103,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
103
103
  version: '0'
104
104
  segments:
105
105
  - 0
106
- hash: 841242607
106
+ hash: -1012521073
107
107
  required_rubygems_version: !ruby/object:Gem::Requirement
108
108
  none: false
109
109
  requirements: