em-bucketer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ module EventMachine
2
+ module Bucketer
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+ require 'em-bucketer'
3
+
4
+ shared_examples "a bucketer" do
5
+ describe '#add_item' do
6
+ it 'adds a item to the bucket' do
7
+ EM.run do
8
+ EM.add_timer(0.1) { fail "didn't reach EM.stop" }
9
+ bucketer.add_item("1", "2", {:foo => :bar}) do
10
+ bucketer.get_bucket("1") do |bucket|
11
+ expect(bucket).to eq([{:foo => :bar}])
12
+ EM.stop
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ it 'overwrites an existing item with the same id' do
19
+ EM.run do
20
+ EM.add_timer(0.1) { fail "didn't reach EM.stop" }
21
+ bucketer.add_item("1", "2", {:foo => :bar}) do
22
+ bucketer.add_item("1", "2", {:bar => :foo}) do
23
+
24
+ bucketer.get_bucket("1") do |bucket|
25
+ expect(bucket).to eq([{:bar => :foo}])
26
+ EM.stop
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ it 'calls on_bucket_full when a bucket fills up' do
34
+ EM.run do
35
+ EM.add_timer(0.1) { fail "didn't reach EM.stop" }
36
+ bucketer.on_bucket_full do |bucket_id|
37
+ expect(bucket_id).to eq("1")
38
+ EM.stop
39
+ end
40
+
41
+ add_n_items(bucketer, "1", 5) {}
42
+ end
43
+ end
44
+ end
45
+
46
+ describe '#empty_bucket' do
47
+ it 'emptys a bucket' do
48
+ EM.run do
49
+ EM.add_timer(0.1) { fail "didn't reach EM.stop" }
50
+ add_n_items(bucketer, "1", 3) do
51
+ bucketer.empty_bucket("1") do
52
+ bucketer.get_bucket("1") do |bucket|
53
+ expect(bucket).to eq([])
54
+ EM.stop
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ describe '#on_bucket_timeout' do
63
+ it 'calls the block when the timer times out' do
64
+ ran = false
65
+ EM.run do
66
+ EM.add_timer(0.05) { EM.stop }
67
+ # Stub out the timer that the bucketer uses
68
+ allow(EM).to receive(:add_timer).and_yield
69
+ bucketer.on_bucket_timeout do |bucket_id|
70
+ ran = true
71
+ expect(bucket_id).to eq("1")
72
+ end
73
+ bucketer.add_item("1", "2", :foo => :bar)
74
+ end
75
+ fail "didn't call timeout" unless ran
76
+ end
77
+
78
+ it 'doesnt call the block when the timer doesnt time out' do
79
+ EM.run do
80
+ EM.add_timer(0.1) { EM.stop }
81
+ allow(EM).to receive(:add_timer)
82
+ bucketer.on_bucket_timeout do |bucket_id|
83
+ fail "shouldn't have called timeout"
84
+ end
85
+ bucketer.add_item("1", "2", :foo => :bar)
86
+ end
87
+ end
88
+ end
89
+
90
+ describe '#get_and_empty_bucket' do
91
+ it 'gets the bucket then emptys the bucket' do
92
+ EM.run do
93
+ EM.add_timer(0.1) { fail "didn't reach EM.stop" }
94
+ add_n_items(bucketer, "1", 3) do
95
+
96
+ bucketer.get_and_empty_bucket("1") do |bucket|
97
+ expect(bucket).to eq([{:id => 0}, {:id => 1}, {:id => 2}])
98
+
99
+ bucketer.get_bucket("1") do |empty_bucket|
100
+ expect(empty_bucket).to eq([])
101
+ EM.stop
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+ require 'em-bucketer'
3
+
4
+ describe EventMachine::Bucketer::InMemory do
5
+ it_behaves_like "a bucketer" do
6
+ let(:bucketer) { EM::Bucketer::InMemory.new(:bucket_threshold_size => 5) }
7
+ end
8
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require 'em-bucketer'
3
+ require 'redis'
4
+
5
+ describe EventMachine::Bucketer::Redis do
6
+ let(:prefix) { "test_prefix" }
7
+ before(:each) do
8
+ redis = Redis.new
9
+ redis.keys("em_bucketer:#{prefix}:*").each do |k|
10
+ redis.del(k)
11
+ end
12
+ redis.del("em_bucketer_known_buckets:#{prefix}")
13
+ end
14
+
15
+ it_behaves_like "a bucketer" do
16
+ let(:bucketer) { EM::Bucketer::Redis.new(prefix, :bucket_threshold_size => 5) }
17
+ end
18
+
19
+ it 'will set timers for existing buckets on startup' do
20
+ EM.run do
21
+ EM.add_timer(0.1) { EM.stop }
22
+ allow(EM).to receive(:add_timer).with(anything).and_yield
23
+ bucketer = EM::Bucketer::Redis.new(prefix, :bucket_threshold_size => 5)
24
+ bucketer.add_item("1", "2", :foo => :bar).callback do
25
+ bucketer.add_item("3", "4", :foo => :bar).callback do
26
+
27
+ expect(EM).to receive(:add_timer).with(3600).twice
28
+ bucketer = EM::Bucketer::Redis.new(prefix, :bucket_threshold_size => 5)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
2
+
3
+ require 'rspec'
4
+ require 'pry'
5
+ require 'spec_methods'
6
+ require 'em_bucketer_examples'
7
+
8
+ RSpec.configure do |config|
9
+ config.order = :rand
10
+ config.include(SpecMethods)
11
+ end
@@ -0,0 +1,10 @@
1
+ module SpecMethods
2
+ def add_n_items(bucketer, bucket, n, &blk)
3
+ worker = proc do |i, iter|
4
+ bucketer.add_item(bucket, i.to_s, {:id => i}) do
5
+ iter.next
6
+ end
7
+ end
8
+ EM::Iterator.new(0...n).each(worker, blk)
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,183 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: em-bucketer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Richard Heycock
8
+ - Dylan Griffith
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-11-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: eventmachine
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: em-hiredis
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.6'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.6'
56
+ - !ruby/object:Gem::Dependency
57
+ name: redis
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: pry
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: yard
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description:
127
+ email:
128
+ - dyl.griffith@gmail.com
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - ".gitignore"
134
+ - Gemfile
135
+ - LICENSE
136
+ - README.md
137
+ - Rakefile
138
+ - em-bucketer.gemspec
139
+ - lib/em-bucketer.rb
140
+ - lib/em-bucketer/base.rb
141
+ - lib/em-bucketer/database.rb
142
+ - lib/em-bucketer/database/hash.rb
143
+ - lib/em-bucketer/database/redis.rb
144
+ - lib/em-bucketer/in_memory.rb
145
+ - lib/em-bucketer/redis.rb
146
+ - lib/em-bucketer/version.rb
147
+ - spec/em_bucketer_examples.rb
148
+ - spec/in_memory_spec.rb
149
+ - spec/redis_spec.rb
150
+ - spec/spec_helper.rb
151
+ - spec/spec_methods.rb
152
+ homepage: https://github.com/dgvz/em-bucketer
153
+ licenses:
154
+ - GPL
155
+ metadata: {}
156
+ post_install_message:
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ required_rubygems_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ requirements: []
171
+ rubyforge_project:
172
+ rubygems_version: 2.2.2
173
+ signing_key:
174
+ specification_version: 4
175
+ summary: A generic eventmachine library for storing arbitrary objects in buckets with
176
+ callbacks on threshold reached
177
+ test_files:
178
+ - spec/em_bucketer_examples.rb
179
+ - spec/in_memory_spec.rb
180
+ - spec/redis_spec.rb
181
+ - spec/spec_helper.rb
182
+ - spec/spec_methods.rb
183
+ has_rdoc: