em-bucketer 0.1.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.
@@ -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: