docket 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ Version 0.2.0:
2
+ General:
3
+ - Added support for configuration
4
+ Storage:
5
+ - Added support for Redis (which uses MessagePack)
6
+ - Organizational changes (Docket::Storage module added)
7
+
1
8
  Version 0.1.2:
2
9
  General:
3
10
  - Start of Changelog
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
@@ -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
 
@@ -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
@@ -1,54 +1,3 @@
1
- require 'daybreak'
2
-
3
- module Docket
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'
@@ -1,3 +1,3 @@
1
1
  module Docket
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/docket.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "docket/version"
2
+ require "docket/configuration"
2
3
  require "docket/storage"
3
4
  require "docket/round_robin"
4
5
  require 'docket/robin_list'
@@ -2,17 +2,24 @@ require 'spec_helper'
2
2
 
3
3
  describe Docket::RoundRobin do
4
4
 
5
- let(:round_robin) { Docket::RoundRobin.new(:storage => $storage) }
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
- $storage.send(:clear!)
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($storage.db.get('trainer_15')).to be_kind_of(Array)
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($storage.read("group1")).to eql(['trainer_15'])
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($storage.read("trainer_15_groups")).to eql(['group1'])
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
- $storage.send(:clear!)
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($storage.read('daily')).to_not include("trainer_15")
45
- expect($storage.read('daily')).to include("trainer_16")
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($storage.read("trainer_15_groups")).to be_nil
56
+ expect(@storage.read("trainer_15_groups")).to be_nil
50
57
  end
51
58
 
52
59
  it "removes the identifier" do
53
- expect($storage.read("trainer_15")).to be_nil
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 => $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.db.closed?
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
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Docket::Storage do
3
+ describe Docket::Storage::Daybreak do
4
4
 
5
5
  describe '#new' do
6
6
  it 'creates the storage backend' do
@@ -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: 31
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
9
8
  - 2
10
- version: 0.1.2
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-04-29 00:00:00 Z
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: pry
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: :runtime
79
- name: daybreak
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: rufus-scheduler
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/storage_spec.rb
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/storage_spec.rb
218
+ - spec/storage/daybreak_spec.rb
219
+ - spec/storage/redis_spec.rb