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 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