docket 0.1.2 → 0.2.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/CHANGELOG +7 -0
- data/docket.gemspec +3 -0
- data/lib/docket/configuration.rb +23 -0
- data/lib/docket/repeater.rb +1 -1
- data/lib/docket/round_robin.rb +6 -1
- data/lib/docket/storage/base.rb +48 -0
- data/lib/docket/storage/daybreak.rb +58 -0
- data/lib/docket/storage/redis.rb +71 -0
- data/lib/docket/storage.rb +3 -54
- data/lib/docket/version.rb +1 -1
- data/lib/docket.rb +1 -0
- data/spec/round_robin_spec.rb +18 -11
- data/spec/spec_helper.rb +4 -4
- data/spec/{storage_spec.rb → storage/daybreak_spec.rb} +1 -1
- data/spec/storage/redis_spec.rb +51 -0
- metadata +58 -10
data/CHANGELOG
CHANGED
data/docket.gemspec
CHANGED
@@ -21,8 +21,11 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.5"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
spec.add_development_dependency "rspec"
|
24
|
+
spec.add_development_dependency "fakeredis"
|
24
25
|
spec.add_development_dependency "pry"
|
25
26
|
|
26
27
|
spec.add_dependency 'daybreak'
|
28
|
+
spec.add_dependency 'redis'
|
29
|
+
spec.add_runtime_dependency 'msgpack'
|
27
30
|
spec.add_dependency 'rufus-scheduler'
|
28
31
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Docket
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :storage, :storage_namespace
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@storage_namespace = 'docket'
|
7
|
+
@storage = nil
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_accessor :configuration
|
12
|
+
|
13
|
+
extend self
|
14
|
+
|
15
|
+
def configuration
|
16
|
+
@configuration ||= Configuration.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def configure
|
20
|
+
yield(configuration)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/lib/docket/repeater.rb
CHANGED
@@ -14,7 +14,7 @@ module Docket
|
|
14
14
|
@scheduler = args[:scheduler] || Rufus::Scheduler.new
|
15
15
|
@scheduler_action = args[:scheduler_action]
|
16
16
|
@scheduler_set_callback = args[:scheduler_set_callback] || lambda {|scheduler|}
|
17
|
-
@storage = args[:storage] || Docket::Storage.new('/tmp/docket.rb')
|
17
|
+
@storage = args[:storage] || Docket.configuration.storage || Docket::Storage::Daybreak.new('/tmp/docket.rb')
|
18
18
|
@repeat = args[:repeat]
|
19
19
|
end
|
20
20
|
|
data/lib/docket/round_robin.rb
CHANGED
@@ -4,7 +4,7 @@ module Docket
|
|
4
4
|
attr_accessor :storage
|
5
5
|
|
6
6
|
def initialize args={}
|
7
|
-
@storage = args[:storage] || Docket::Storage.new('/tmp/docket.rb')
|
7
|
+
@storage = args[:storage] || Docket.configuration.storage || Docket::Storage::Daybreak.new('/tmp/docket.rb')
|
8
8
|
end
|
9
9
|
|
10
10
|
def set identifier, robins, options={}
|
@@ -14,12 +14,17 @@ module Docket
|
|
14
14
|
def perform identifier, action
|
15
15
|
robin = next_robin identifier
|
16
16
|
action.call(robin)
|
17
|
+
robin
|
17
18
|
end
|
18
19
|
|
19
20
|
def unset identifier
|
20
21
|
unset_key identifier
|
21
22
|
unset_from_groups identifier
|
22
23
|
end
|
24
|
+
|
25
|
+
def reset!
|
26
|
+
storage.clear!
|
27
|
+
end
|
23
28
|
|
24
29
|
protected
|
25
30
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Docket
|
2
|
+
module Storage
|
3
|
+
class Base
|
4
|
+
attr_accessor :db, :namespace
|
5
|
+
|
6
|
+
def initialize args={}
|
7
|
+
self.namespace = args[:namespace] || Docket.configuration.storage_namespace
|
8
|
+
end
|
9
|
+
|
10
|
+
def save key, value, options={}
|
11
|
+
end
|
12
|
+
|
13
|
+
def append key, value
|
14
|
+
end
|
15
|
+
|
16
|
+
def remove key
|
17
|
+
end
|
18
|
+
|
19
|
+
def read key
|
20
|
+
end
|
21
|
+
|
22
|
+
def load
|
23
|
+
end
|
24
|
+
|
25
|
+
def close
|
26
|
+
end
|
27
|
+
|
28
|
+
def closed?
|
29
|
+
end
|
30
|
+
|
31
|
+
def clear!
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def namespaced key
|
37
|
+
[self.namespace, key].compact.join(":")
|
38
|
+
end
|
39
|
+
|
40
|
+
def clean key
|
41
|
+
key.gsub("#{self.namespace}:", "")
|
42
|
+
end
|
43
|
+
|
44
|
+
def touch &block
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'daybreak'
|
2
|
+
|
3
|
+
module Docket
|
4
|
+
module Storage
|
5
|
+
class Daybreak < Base
|
6
|
+
|
7
|
+
def initialize filename
|
8
|
+
self.db = ::Daybreak::DB.new filename
|
9
|
+
end
|
10
|
+
|
11
|
+
def save key, value, options={}
|
12
|
+
touch do
|
13
|
+
db.set! key, value
|
14
|
+
db.compact
|
15
|
+
db.flush
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def append key, value
|
20
|
+
touch do
|
21
|
+
new_value = Array(read(key)) << value
|
22
|
+
save(key, new_value.uniq)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def remove key
|
27
|
+
touch { db.delete! key }
|
28
|
+
end
|
29
|
+
|
30
|
+
def read key
|
31
|
+
touch { db.get key }
|
32
|
+
end
|
33
|
+
|
34
|
+
def load
|
35
|
+
db.load
|
36
|
+
end
|
37
|
+
|
38
|
+
def close
|
39
|
+
db.close
|
40
|
+
end
|
41
|
+
|
42
|
+
def closed?
|
43
|
+
db.closed?
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def clear!
|
49
|
+
db.clear
|
50
|
+
end
|
51
|
+
|
52
|
+
def touch &block
|
53
|
+
db.load
|
54
|
+
yield if block_given?
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'redis'
|
2
|
+
require 'msgpack'
|
3
|
+
|
4
|
+
module Docket
|
5
|
+
module Storage
|
6
|
+
class Redis < Base
|
7
|
+
|
8
|
+
def initialize options={}
|
9
|
+
super
|
10
|
+
self.db = options[:redis] || ::Redis.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def save key, value, options={}
|
14
|
+
save_packed key, value
|
15
|
+
end
|
16
|
+
|
17
|
+
def append key, value
|
18
|
+
if read(key).nil?
|
19
|
+
save(key, Array(value))
|
20
|
+
else
|
21
|
+
current = read(key)
|
22
|
+
new_value = Array(current) << value
|
23
|
+
save(key, new_value.uniq)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def remove key
|
28
|
+
redis.del(namespaced(key))
|
29
|
+
end
|
30
|
+
|
31
|
+
def read key
|
32
|
+
read_packed key
|
33
|
+
end
|
34
|
+
|
35
|
+
def clear!
|
36
|
+
keys = keys_context
|
37
|
+
redis.del(*keys) unless keys.empty?
|
38
|
+
end
|
39
|
+
|
40
|
+
def describe
|
41
|
+
keys_context.map do |key|
|
42
|
+
[key, read(clean(key))]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def keys_context
|
49
|
+
redis.keys "#{namespace}:*"
|
50
|
+
end
|
51
|
+
|
52
|
+
def save_packed key, value
|
53
|
+
redis.set(namespaced(key), MessagePack.pack(value))
|
54
|
+
end
|
55
|
+
|
56
|
+
def read_packed key
|
57
|
+
value = redis.get(namespaced(key))
|
58
|
+
if value
|
59
|
+
MessagePack.unpack(value)
|
60
|
+
else
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def redis
|
66
|
+
self.db
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/docket/storage.rb
CHANGED
@@ -1,54 +1,3 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
|
4
|
-
class Storage
|
5
|
-
|
6
|
-
attr_accessor :db
|
7
|
-
|
8
|
-
def initialize filename
|
9
|
-
@db = Daybreak::DB.new filename
|
10
|
-
end
|
11
|
-
|
12
|
-
def save key, value, options={}
|
13
|
-
touch do
|
14
|
-
db.set! key, value
|
15
|
-
db.compact
|
16
|
-
db.flush
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def append key, value
|
21
|
-
touch do
|
22
|
-
new_value = Array(read(key)) << value
|
23
|
-
save(key, new_value.uniq)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def remove key
|
28
|
-
touch { db.delete! key }
|
29
|
-
end
|
30
|
-
|
31
|
-
def read key
|
32
|
-
touch { db.get key }
|
33
|
-
end
|
34
|
-
|
35
|
-
def load
|
36
|
-
db.load
|
37
|
-
end
|
38
|
-
|
39
|
-
def close
|
40
|
-
db.close
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
def clear!
|
46
|
-
db.clear
|
47
|
-
end
|
48
|
-
|
49
|
-
def touch &block
|
50
|
-
db.load
|
51
|
-
yield if block_given?
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
1
|
+
require 'docket/storage/base'
|
2
|
+
require 'docket/storage/daybreak'
|
3
|
+
require 'docket/storage/redis'
|
data/lib/docket/version.rb
CHANGED
data/lib/docket.rb
CHANGED
data/spec/round_robin_spec.rb
CHANGED
@@ -2,17 +2,24 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Docket::RoundRobin do
|
4
4
|
|
5
|
-
|
5
|
+
before(:all) do
|
6
|
+
@storage = Docket::Storage::Redis.new
|
7
|
+
Docket.configure do |config|
|
8
|
+
config.storage = @storage
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:round_robin) { Docket::RoundRobin.new }
|
6
13
|
|
7
14
|
describe '#set' do
|
8
15
|
|
9
16
|
before :all do
|
10
|
-
|
17
|
+
@storage.clear!
|
11
18
|
end
|
12
19
|
|
13
20
|
it 'sets a list of robins for some identifier key' do
|
14
21
|
round_robin.set("trainer_15", ['dog', 'lion', 'tiger'])
|
15
|
-
expect(
|
22
|
+
expect(@storage.read('trainer_15')).to be_kind_of(Array)
|
16
23
|
end
|
17
24
|
|
18
25
|
context "using group" do
|
@@ -22,11 +29,11 @@ describe Docket::RoundRobin do
|
|
22
29
|
end
|
23
30
|
|
24
31
|
it "writes to the group list" do
|
25
|
-
expect(
|
32
|
+
expect(@storage.read("group1")).to eql(['trainer_15'])
|
26
33
|
end
|
27
34
|
|
28
35
|
it "creates its own index of groups" do
|
29
|
-
expect(
|
36
|
+
expect(@storage.read("trainer_15_groups")).to eql(['group1'])
|
30
37
|
end
|
31
38
|
end
|
32
39
|
end
|
@@ -34,23 +41,23 @@ describe Docket::RoundRobin do
|
|
34
41
|
describe '#unset' do
|
35
42
|
|
36
43
|
before :each do
|
37
|
-
|
44
|
+
@storage.clear!
|
38
45
|
round_robin.set("trainer_15", ['dog', 'lion', 'tiger'], :group => "daily")
|
39
46
|
round_robin.set("trainer_16", ['cat', 'mouse', 'cheese'], :group => "daily")
|
40
47
|
round_robin.unset("trainer_15")
|
41
48
|
end
|
42
49
|
|
43
50
|
it "removes the list of groups associated" do
|
44
|
-
expect(
|
45
|
-
expect(
|
51
|
+
expect(@storage.read('daily')).to_not include("trainer_15")
|
52
|
+
expect(@storage.read('daily')).to include("trainer_16")
|
46
53
|
end
|
47
54
|
|
48
55
|
it "removes index of groups" do
|
49
|
-
expect(
|
56
|
+
expect(@storage.read("trainer_15_groups")).to be_nil
|
50
57
|
end
|
51
58
|
|
52
59
|
it "removes the identifier" do
|
53
|
-
expect(
|
60
|
+
expect(@storage.read("trainer_15")).to be_nil
|
54
61
|
end
|
55
62
|
|
56
63
|
context 'when key not set' do
|
@@ -86,7 +93,7 @@ describe Docket::RoundRobin do
|
|
86
93
|
|
87
94
|
reload_storage_connection
|
88
95
|
|
89
|
-
round_robin = Docket::RoundRobin.new(:storage =>
|
96
|
+
round_robin = Docket::RoundRobin.new(:storage => @storage)
|
90
97
|
|
91
98
|
round_robin.perform("trainer_15", action)
|
92
99
|
expect(@animal_to_train).to eql('tiger')
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'docket'
|
2
2
|
require 'pry'
|
3
|
+
require 'fakeredis'
|
3
4
|
|
4
|
-
$storage = Docket::Storage.new('/tmp/docket_spec.rb')
|
5
|
-
|
5
|
+
$storage = Docket::Storage::Daybreak.new('/tmp/docket_spec.rb')
|
6
6
|
RSpec.configure do |config|
|
7
7
|
config.color_enabled = true
|
8
8
|
config.formatter = 'documentation'
|
@@ -19,8 +19,8 @@ RSpec.configure do |config|
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def reload_storage_connection
|
22
|
-
if $storage && !$storage.
|
22
|
+
if $storage && !$storage.closed?
|
23
23
|
$storage.close
|
24
|
-
$storage = Docket::Storage.new('/tmp/docket_spec.rb')
|
24
|
+
$storage = Docket::Storage::Daybreak.new('/tmp/docket_spec.rb')
|
25
25
|
end
|
26
26
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require "fakeredis"
|
3
|
+
|
4
|
+
describe Docket::Storage::Redis do
|
5
|
+
|
6
|
+
let(:redis_storage) { Docket::Storage::Redis.new(:redis => Redis.new) }
|
7
|
+
|
8
|
+
describe '#new' do
|
9
|
+
it 'creates the storage backend' do
|
10
|
+
expect(redis_storage.db).to_not be_nil
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#save' do
|
15
|
+
it 'saves the key to the db' do
|
16
|
+
redis_storage.save 'key1', 'value1'
|
17
|
+
|
18
|
+
expect(redis_storage.read('key1')).to eql('value1')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#read' do
|
23
|
+
it 'returns value set for key in db' do
|
24
|
+
redis_storage.save 'key1', 'value1'
|
25
|
+
expect(redis_storage.read('key1')).to eql('value1')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#append' do
|
30
|
+
context 'key does not exist' do
|
31
|
+
it 'creates key and appends' do
|
32
|
+
redis_storage.clear!
|
33
|
+
redis_storage.append 'append_key', 2
|
34
|
+
expect(redis_storage.read('append_key')).to eql([2])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'key exists' do
|
39
|
+
|
40
|
+
it "appends value to the end of a list value for key" do
|
41
|
+
redis_storage.clear!
|
42
|
+
redis_storage.append 'key1', 1
|
43
|
+
redis_storage.append 'key1', 2
|
44
|
+
|
45
|
+
expect(redis_storage.read('key1')).to eql([1,2])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docket
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 1
|
9
8
|
- 2
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Hubert Liu
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2014-
|
18
|
+
date: 2014-07-14 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :development
|
@@ -62,7 +62,7 @@ dependencies:
|
|
62
62
|
requirement: *id003
|
63
63
|
- !ruby/object:Gem::Dependency
|
64
64
|
type: :development
|
65
|
-
name:
|
65
|
+
name: fakeredis
|
66
66
|
version_requirements: &id004 !ruby/object:Gem::Requirement
|
67
67
|
none: false
|
68
68
|
requirements:
|
@@ -75,8 +75,8 @@ dependencies:
|
|
75
75
|
prerelease: false
|
76
76
|
requirement: *id004
|
77
77
|
- !ruby/object:Gem::Dependency
|
78
|
-
type: :
|
79
|
-
name:
|
78
|
+
type: :development
|
79
|
+
name: pry
|
80
80
|
version_requirements: &id005 !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
@@ -90,7 +90,7 @@ dependencies:
|
|
90
90
|
requirement: *id005
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
type: :runtime
|
93
|
-
name:
|
93
|
+
name: daybreak
|
94
94
|
version_requirements: &id006 !ruby/object:Gem::Requirement
|
95
95
|
none: false
|
96
96
|
requirements:
|
@@ -102,6 +102,48 @@ dependencies:
|
|
102
102
|
version: "0"
|
103
103
|
prerelease: false
|
104
104
|
requirement: *id006
|
105
|
+
- !ruby/object:Gem::Dependency
|
106
|
+
type: :runtime
|
107
|
+
name: redis
|
108
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
hash: 3
|
114
|
+
segments:
|
115
|
+
- 0
|
116
|
+
version: "0"
|
117
|
+
prerelease: false
|
118
|
+
requirement: *id007
|
119
|
+
- !ruby/object:Gem::Dependency
|
120
|
+
type: :runtime
|
121
|
+
name: msgpack
|
122
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
prerelease: false
|
132
|
+
requirement: *id008
|
133
|
+
- !ruby/object:Gem::Dependency
|
134
|
+
type: :runtime
|
135
|
+
name: rufus-scheduler
|
136
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
hash: 3
|
142
|
+
segments:
|
143
|
+
- 0
|
144
|
+
version: "0"
|
145
|
+
prerelease: false
|
146
|
+
requirement: *id009
|
105
147
|
description: Helps schedule jobs
|
106
148
|
email:
|
107
149
|
- hubert.liu@rigor.com
|
@@ -122,15 +164,20 @@ files:
|
|
122
164
|
- docket.gemspec
|
123
165
|
- example.db
|
124
166
|
- lib/docket.rb
|
167
|
+
- lib/docket/configuration.rb
|
125
168
|
- lib/docket/repeater.rb
|
126
169
|
- lib/docket/robin_list.rb
|
127
170
|
- lib/docket/round_robin.rb
|
128
171
|
- lib/docket/storage.rb
|
172
|
+
- lib/docket/storage/base.rb
|
173
|
+
- lib/docket/storage/daybreak.rb
|
174
|
+
- lib/docket/storage/redis.rb
|
129
175
|
- lib/docket/version.rb
|
130
176
|
- spec/repeater_spec.rb
|
131
177
|
- spec/round_robin_spec.rb
|
132
178
|
- spec/spec_helper.rb
|
133
|
-
- spec/
|
179
|
+
- spec/storage/daybreak_spec.rb
|
180
|
+
- spec/storage/redis_spec.rb
|
134
181
|
homepage: ""
|
135
182
|
licenses:
|
136
183
|
- MIT
|
@@ -168,4 +215,5 @@ test_files:
|
|
168
215
|
- spec/repeater_spec.rb
|
169
216
|
- spec/round_robin_spec.rb
|
170
217
|
- spec/spec_helper.rb
|
171
|
-
- spec/
|
218
|
+
- spec/storage/daybreak_spec.rb
|
219
|
+
- spec/storage/redis_spec.rb
|