hotseat 0.3.0 → 0.4.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.
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: