kanban 0.3.1 → 0.5.1
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 +4 -4
- data/VERSION +1 -1
- data/kanban.gemspec +3 -3
- data/lib/kanban.rb +23 -1
- data/spec/kanban_spec.rb +63 -9
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5571f4ff8d96226cd84855428ad20f875669991f
|
4
|
+
data.tar.gz: 3ef547ba9f47b0dd43ef43e851052848374e8197
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fbf31b07bfbbcc2a3fd32d4096c0a082c52d880eca58fd7cd041d3deee1f2ebab7448ba1a94eac68c8fb0ac9967ac5d2b42e45fc0102b1b25d1e00364937e2ee
|
7
|
+
data.tar.gz: 08a57add1ad3040481c6ce516ed90ecbbccf2df861038f311f82fec3e3e0557c9e49497c2f69d4d85730e095c3349ee50cbb1e8dfbfd1bbc61488be127a00855
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.1
|
data/kanban.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: kanban 0.
|
5
|
+
# stub: kanban 0.5.1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "kanban"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.5.1"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Chris Olstrom"]
|
14
|
-
s.date = "2015-05-
|
14
|
+
s.date = "2015-05-28"
|
15
15
|
s.description = "Because your code totally needed an Agile Workflow"
|
16
16
|
s.email = "chris@olstrom.com"
|
17
17
|
s.extra_rdoc_files = [
|
data/lib/kanban.rb
CHANGED
@@ -10,7 +10,7 @@ module Kanban
|
|
10
10
|
def initialize(backend:, **options)
|
11
11
|
@namespace = options.fetch :namespace, 'default'
|
12
12
|
@queue = "#{@namespace}:#{options.fetch :queue, 'tasks'}"
|
13
|
-
@item = "#{@namespace}:#{options.fetch :item, '
|
13
|
+
@item = "#{@namespace}:#{options.fetch :item, 'task'}"
|
14
14
|
@backend = backend
|
15
15
|
end
|
16
16
|
|
@@ -38,5 +38,27 @@ module Kanban
|
|
38
38
|
safe = task.with_string_keys
|
39
39
|
add(safe)
|
40
40
|
end
|
41
|
+
|
42
|
+
def claim(duration: 3)
|
43
|
+
id = @backend.brpoplpush("#{@queue}:todo", "#{@queue}:doing")
|
44
|
+
@backend.set "#{@item}:#{id}:claimed", true, ex: duration
|
45
|
+
id.to_i
|
46
|
+
end
|
47
|
+
|
48
|
+
def claimed?(id)
|
49
|
+
@backend.exists "#{@item}:#{id}:claimed"
|
50
|
+
end
|
51
|
+
|
52
|
+
def doing
|
53
|
+
@backend.lrange("#{@queue}:doing", 0, -1).map(&:to_i)
|
54
|
+
end
|
55
|
+
|
56
|
+
def complete(id)
|
57
|
+
@backend.setbit("#{@queue}:completed", id, 1).zero?
|
58
|
+
end
|
59
|
+
|
60
|
+
def completed?(id)
|
61
|
+
@backend.getbit("#{@queue}:completed", id) == 1
|
62
|
+
end
|
41
63
|
end
|
42
64
|
end
|
data/spec/kanban_spec.rb
CHANGED
@@ -1,29 +1,32 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'timeout'
|
2
3
|
|
3
4
|
describe 'Backlog' do
|
4
5
|
before do
|
5
|
-
@backlog = Kanban::Backlog.new backend: Redis.new
|
6
|
+
@backlog = Kanban::Backlog.new backend: Redis.new, namespace: 'kanban:test'
|
6
7
|
end
|
7
8
|
|
8
|
-
|
9
|
-
|
9
|
+
after(:all) do
|
10
|
+
redis = Redis.new
|
11
|
+
redis.keys('kanban:test:*').each do |key|
|
12
|
+
redis.del key
|
13
|
+
end
|
10
14
|
end
|
11
15
|
|
12
|
-
it '
|
13
|
-
expect(@backlog
|
16
|
+
it 'instantiates without error' do
|
17
|
+
expect(@backlog).to be_an_instance_of(Kanban::Backlog)
|
14
18
|
end
|
15
19
|
|
16
20
|
it 'should allow namespace configuration at initialization' do
|
17
|
-
backlog
|
18
|
-
expect(backlog.namespace).to eq 'foo'
|
21
|
+
expect(@backlog.namespace).to eq 'kanban:test'
|
19
22
|
end
|
20
23
|
|
21
24
|
it 'should prefix queue keys with the namespace' do
|
22
|
-
expect(@backlog.queue).to start_with('
|
25
|
+
expect(@backlog.queue).to start_with('kanban:test')
|
23
26
|
end
|
24
27
|
|
25
28
|
it 'should prefix item keys with the namespace' do
|
26
|
-
expect(@backlog.item).to start_with('
|
29
|
+
expect(@backlog.item).to start_with('kanban:test')
|
27
30
|
end
|
28
31
|
|
29
32
|
it 'should require a backend' do
|
@@ -71,4 +74,55 @@ describe 'Backlog' do
|
|
71
74
|
id = @backlog.add(task)
|
72
75
|
expect(@backlog.todo).to include(id)
|
73
76
|
end
|
77
|
+
|
78
|
+
it 'should allow a task to be claimed' do
|
79
|
+
expect(@backlog.claim).to be_a Fixnum
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should track the claim separately from the queue it is in' do
|
83
|
+
id = @backlog.claim
|
84
|
+
redis = Redis.new
|
85
|
+
expect(redis.exists("#{@backlog.item}:#{id}:claimed")).to be true
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should allow claims to expire' do
|
89
|
+
id = @backlog.claim(duration: 1)
|
90
|
+
sleep 1.1
|
91
|
+
redis = Redis.new
|
92
|
+
expect(redis.exists("#{@backlog.item}:#{id}:claimed")).to be false
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should block if there are no pending tasks' do
|
96
|
+
redis = Redis.new
|
97
|
+
redis.del "#{@backlog.queue}:todo"
|
98
|
+
expect do
|
99
|
+
Timeout.timeout(0.1) do
|
100
|
+
@backlog.claim
|
101
|
+
end
|
102
|
+
end.to raise_error(Timeout::Error)
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'should report if a task is claimed' do
|
106
|
+
task = { 'test' => 'data' }
|
107
|
+
5.times { @backlog.add(task) }
|
108
|
+
id = @backlog.claim
|
109
|
+
expect(@backlog.claimed?(id)).to be true
|
110
|
+
expect(@backlog.claimed?(0)).to be false
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should have a list of tasks being worked on' do
|
114
|
+
id = @backlog.claim
|
115
|
+
expect(@backlog.doing).to include(id)
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'should allow indicating completion of a task only once' do
|
119
|
+
expect(@backlog.complete(1)).to be true
|
120
|
+
expect(@backlog.complete(1)).to be false
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should check if a task is completed' do
|
124
|
+
expect(@backlog.completed?(2)).to be false
|
125
|
+
@backlog.complete 2
|
126
|
+
expect(@backlog.completed?(2)).to be true
|
127
|
+
end
|
74
128
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kanban
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Olstrom
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|