sidekiq-merger 0.0.4 → 0.0.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4bed498597132701a71bf77a583f97668ce5264c
4
- data.tar.gz: 66244be154087fca1647ba21d7b12727167d5106
3
+ metadata.gz: 2333d3953e27f0ba0d3f0efc23a8bc48747b2a6d
4
+ data.tar.gz: ed6230c813938f38f4092ee9a27589a774c55029
5
5
  SHA512:
6
- metadata.gz: 01887441761e31726a0c4cb6feff20e55be5202c3fa9c3d00a43ff28b54589c484ddd95f305ac0c589972e27c05c4ae46201ca408af32ee0904aae2b80827e16
7
- data.tar.gz: 762fca326555feada8466a1eeda5acf2189a8f9e1b2b979e2568b90ccddbc5371d840833f106640889f1f69a744ce79bfa29ee932cf1f905370586375a74830b
6
+ metadata.gz: 271adc650104013b83c9fa5b99672c995c10b7e2d3518485daa9b5f2d62a9fc14333cd29014d8024f0e17a7b6bcfea393010d544f1ca899bab876a9a14647f7d
7
+ data.tar.gz: 1e647aa5449188f1649bd57a84fb34629f348996991e28085aa19a83139cd31eaa2ec089aebb82f6e6cfcd4ec57ffc0738eb52118a07498d72c851d8aeefb9a0
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  [![Coverage Status][cov-image]][cov-link]
7
7
  [![Code Climate][gpa-image]][gpa-link]
8
8
 
9
- Merge sidekiq jobs occurring within specific period. This sidekiq middleware is inspired by [sidekiq-grouping](https://github.com/gzigzigzeo/sidekiq-grouping).
9
+ Merge sidekiq jobs occurring before the execution time. Inspired by [sidekiq-grouping](https://github.com/gzigzigzeo/sidekiq-grouping).
10
10
 
11
11
  ## Installation
12
12
 
@@ -34,8 +34,10 @@ class SomeWorker
34
34
 
35
35
  sidekiq_options merger: { key: -> (args) { args[0] } }
36
36
 
37
- def perform(*ids)
38
- # Do something
37
+ def perform(*merged_args)
38
+ merged_args.each do |args|
39
+ # Do something
40
+ end
39
41
  end
40
42
  end
41
43
  ```
@@ -46,9 +48,12 @@ Then, enqueue jobs by `perform_in` or `perform_at`.
46
48
  SomeWorker.perform_in 100, 4
47
49
  SomeWorker.perform_in 100, 3
48
50
  SomeWorker.perform_in 100, 5
51
+ # Passed 100 seconds from the first enqueue.
52
+ SomeWorker.perform_in 100, 6
53
+ SomeWorker.perform_in 100, 1
49
54
  ```
50
55
 
51
- `SomeWorker` will be executed in 100 seconds with args of `[4], [3], [5]`.
56
+ `SomeWorker` will be executed in 100 seconds with args of `[4], [3], [5]`, then with args of `[6], [1]`.
52
57
 
53
58
  `perform_async` works without merging args.
54
59
 
@@ -6,7 +6,7 @@ class Sidekiq::Merger::Merge
6
6
  def all
7
7
  redis = Sidekiq::Merger::Redis.new
8
8
 
9
- redis.all.map { |full_merge_key| initialize_with_full_merge_key(full_merge_key, redis: redis) }
9
+ redis.all_merges.map { |full_merge_key| initialize_with_full_merge_key(full_merge_key, redis: redis) }
10
10
  end
11
11
 
12
12
  def initialize_with_full_merge_key(full_merge_key, options = {})
@@ -47,17 +47,17 @@ class Sidekiq::Merger::Merge
47
47
  end
48
48
 
49
49
  def add(args, execution_time)
50
- if !options[:unique] || !@redis.exists?(full_merge_key, args)
51
- @redis.push(full_merge_key, args, execution_time)
50
+ if !options[:unique] || !@redis.merge_exists?(full_merge_key, args)
51
+ @redis.push_message(full_merge_key, args, execution_time)
52
52
  end
53
53
  end
54
54
 
55
55
  def delete(args)
56
- @redis.delete(full_merge_key, args)
56
+ @redis.delete_message(full_merge_key, args)
57
57
  end
58
58
 
59
59
  def delete_all
60
- @redis.delete_all(full_merge_key)
60
+ @redis.delete_merge(full_merge_key)
61
61
  end
62
62
 
63
63
  def size
@@ -67,8 +67,8 @@ class Sidekiq::Merger::Merge
67
67
  def flush
68
68
  msgs = []
69
69
 
70
- if @redis.lock(full_merge_key, Sidekiq::Merger::Config.lock_ttl)
71
- msgs = @redis.pluck(full_merge_key)
70
+ if @redis.lock_merge(full_merge_key, Sidekiq::Merger::Config.lock_ttl)
71
+ msgs = @redis.pluck_merge(full_merge_key)
72
72
  end
73
73
 
74
74
  unless msgs.empty?
@@ -90,11 +90,11 @@ class Sidekiq::Merger::Merge
90
90
  end
91
91
 
92
92
  def all_args
93
- @redis.get(full_merge_key)
93
+ @redis.get_merge(full_merge_key)
94
94
  end
95
95
 
96
96
  def execution_time
97
- @execution_time ||= @redis.execution_time(full_merge_key)
97
+ @execution_time ||= @redis.merge_execution_time(full_merge_key)
98
98
  end
99
99
 
100
100
  def ==(other)
@@ -42,7 +42,7 @@ class Sidekiq::Merger::Redis
42
42
  end
43
43
  end
44
44
 
45
- def push(key, msg, execution_time)
45
+ def push_message(key, msg, execution_time)
46
46
  msg_json = msg.to_json
47
47
  redis do |conn|
48
48
  conn.multi do
@@ -54,17 +54,17 @@ class Sidekiq::Merger::Redis
54
54
  end
55
55
  end
56
56
 
57
- def delete(key, msg)
57
+ def delete_message(key, msg)
58
58
  msg_json = msg.to_json
59
59
  redis do |conn|
60
60
  conn.multi do
61
61
  conn.srem(unique_msg_key(key), msg_json)
62
- conn.lrem(msg_key(key), msg_json)
62
+ conn.lrem(msg_key(key), 0, msg_json)
63
63
  end
64
64
  end
65
65
  end
66
66
 
67
- def execution_time(key)
67
+ def merge_execution_time(key)
68
68
  redis do |conn|
69
69
  t = conn.get(time_key(key))
70
70
  Time.at(t.to_i) unless t.nil?
@@ -75,26 +75,26 @@ class Sidekiq::Merger::Redis
75
75
  redis { |conn| conn.llen(msg_key(key)) }
76
76
  end
77
77
 
78
- def exists?(key, msg)
78
+ def merge_exists?(key, msg)
79
79
  msg_json = msg.to_json
80
80
  redis { |conn| conn.sismember(unique_msg_key(key), msg_json) }
81
81
  end
82
82
 
83
- def all
83
+ def all_merges
84
84
  redis { |conn| conn.smembers(merges_key) }
85
85
  end
86
86
 
87
- def lock(key, ttl)
87
+ def lock_merge(key, ttl)
88
88
  redis { |conn| conn.set(lock_key(key), true, nx: true, ex: ttl) }
89
89
  end
90
90
 
91
- def get(key)
91
+ def get_merge(key)
92
92
  msgs = []
93
93
  redis { |conn| msgs = conn.lrange(msg_key(key), 0, -1) }
94
94
  msgs.map { |msg| JSON.parse(msg) }
95
95
  end
96
96
 
97
- def pluck(key)
97
+ def pluck_merge(key)
98
98
  msgs = []
99
99
  redis do |conn|
100
100
  conn.multi do
@@ -108,7 +108,7 @@ class Sidekiq::Merger::Redis
108
108
  extract_future_value(msgs).map { |msg| JSON.parse(msg) }
109
109
  end
110
110
 
111
- def delete_all(key)
111
+ def delete_merge(key)
112
112
  redis do |conn|
113
113
  conn.multi do
114
114
  conn.del(unique_msg_key(key))
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module Merger
3
- VERSION = "0.0.4".freeze
3
+ VERSION = "0.0.5".freeze
4
4
  end
5
5
  end
@@ -63,19 +63,19 @@ describe Sidekiq::Merger::Merge do
63
63
 
64
64
  describe "#add" do
65
65
  it "adds the args in lazy merge" do
66
- expect(redis).to receive(:push).with("name:queue:foo", [1, 2, 3], execution_time)
66
+ expect(redis).to receive(:push_message).with("name:queue:foo", [1, 2, 3], execution_time)
67
67
  subject.add([1, 2, 3], execution_time)
68
68
  end
69
69
  context "with unique option" do
70
70
  let(:options) { { key: -> (args) { args.to_json }, unique: true } }
71
71
  it "adds the args in lazy merge" do
72
- expect(redis).to receive(:push).with("name:queue:foo", [1, 2, 3], execution_time)
72
+ expect(redis).to receive(:push_message).with("name:queue:foo", [1, 2, 3], execution_time)
73
73
  subject.add([1, 2, 3], execution_time)
74
74
  end
75
75
  context "the args has alredy been added" do
76
76
  before { subject.add([1, 2, 3], execution_time) }
77
77
  it "adds the args in lazy merge" do
78
- expect(redis).not_to receive(:push)
78
+ expect(redis).not_to receive(:push_message)
79
79
  subject.add([1, 2, 3], execution_time)
80
80
  end
81
81
  end
@@ -84,7 +84,7 @@ describe Sidekiq::Merger::Merge do
84
84
 
85
85
  describe "#delete" do
86
86
  it "adds the args in lazy merge" do
87
- expect(redis).to receive(:delete).with("name:queue:foo", [1, 2, 3])
87
+ expect(redis).to receive(:delete_message).with("name:queue:foo", [1, 2, 3])
88
88
  subject.delete([1, 2, 3])
89
89
  end
90
90
  end
@@ -26,10 +26,10 @@ describe Sidekiq::Merger::Redis do
26
26
  end
27
27
  end
28
28
 
29
- describe "#push" do
30
- shared_examples_for "push spec" do
31
- it "pushes the args" do
32
- subject.push(pushing_key, pushing_msg, pushing_execution_time)
29
+ describe "#push_message" do
30
+ shared_examples_for "push_message spec" do
31
+ it "pushes the msg" do
32
+ subject.push_message(pushing_key, pushing_msg, pushing_execution_time)
33
33
  described_class.redis do |conn|
34
34
  expect(conn.smembers("sidekiq-merger:merges")).to contain_exactly(*merge_keys)
35
35
  expect(conn.keys("sidekiq-merger:time:*")).to contain_exactly(*times.keys)
@@ -44,7 +44,7 @@ describe Sidekiq::Merger::Redis do
44
44
  end
45
45
  end
46
46
  it "sets the execution time" do
47
- subject.push(pushing_key, pushing_msg, pushing_execution_time)
47
+ subject.push_message(pushing_key, pushing_msg, pushing_execution_time)
48
48
  described_class.redis do |conn|
49
49
  merge_keys.each do |key, time|
50
50
  expect(conn.get(key)).to eq time
@@ -57,7 +57,7 @@ describe Sidekiq::Merger::Redis do
57
57
  let(:pushing_msg) { [1, 2, 3] }
58
58
  let(:pushing_execution_time) { execution_time }
59
59
 
60
- include_examples "push spec" do
60
+ include_examples "push_message spec" do
61
61
  let(:merge_keys) { ["foo"] }
62
62
  let(:times) { {
63
63
  "sidekiq-merger:time:foo" => execution_time.to_i.to_s,
@@ -72,8 +72,8 @@ describe Sidekiq::Merger::Redis do
72
72
 
73
73
  context "the merge key already exists" do
74
74
  let(:pushing_msg) { [2, 3, 4] }
75
- before { subject.push("foo", [1, 2, 3], execution_time) }
76
- include_examples "push spec" do
75
+ before { subject.push_message("foo", [1, 2, 3], execution_time) }
76
+ include_examples "push_message spec" do
77
77
  let(:merge_keys) { ["foo"] }
78
78
  let(:times) { {
79
79
  "sidekiq-merger:time:foo" => execution_time.to_i.to_s,
@@ -87,9 +87,9 @@ describe Sidekiq::Merger::Redis do
87
87
  end
88
88
  end
89
89
 
90
- context "the args has already ben pushed" do
91
- before { subject.push("foo", [1, 2, 3], execution_time) }
92
- include_examples "push spec" do
90
+ context "the msg has already ben pushed" do
91
+ before { subject.push_message("foo", [1, 2, 3], execution_time) }
92
+ include_examples "push_message spec" do
93
93
  let(:merge_keys) { ["foo"] }
94
94
  let(:times) { {
95
95
  "sidekiq-merger:time:foo" => execution_time.to_i.to_s,
@@ -107,8 +107,8 @@ describe Sidekiq::Merger::Redis do
107
107
  let(:pushing_key) { "bar" }
108
108
  let(:pushing_msg) { [2, 3, 4] }
109
109
  let(:pushing_execution_time) { execution_time + 1.hour }
110
- before { subject.push("foo", [1, 2, 3], execution_time) }
111
- include_examples "push spec" do
110
+ before { subject.push_message("foo", [1, 2, 3], execution_time) }
111
+ include_examples "push_message spec" do
112
112
  let(:merge_keys) { ["foo", "bar"] }
113
113
  let(:times) { {
114
114
  "sidekiq-merger:time:foo" => execution_time.to_i.to_s,
@@ -126,45 +126,112 @@ describe Sidekiq::Merger::Redis do
126
126
  end
127
127
  end
128
128
 
129
- describe "#delete" do
129
+ describe "#delete_message" do
130
+ before do
131
+ subject.redis do |conn|
132
+ conn.sadd("sidekiq-merger:unique_msg:foo", "[1,2,3]")
133
+ conn.sadd("sidekiq-merger:unique_msg:foo", "[2,3,4]")
134
+ conn.lpush("sidekiq-merger:msg:foo", "[1,2,3]")
135
+ conn.lpush("sidekiq-merger:msg:foo", "[2,3,4]")
136
+ end
137
+ end
138
+ it "deletes the msg" do
139
+ subject.delete_message("foo", [1, 2, 3])
140
+ subject.redis do |conn|
141
+ expect(conn.smembers("sidekiq-merger:unique_msg:foo")).to contain_exactly "[2,3,4]"
142
+ expect(conn.lrange("sidekiq-merger:msg:foo", 0, -1)).to contain_exactly "[2,3,4]"
143
+ end
144
+ end
145
+ context "with duplicate msgs" do
146
+ it "deletes the msg" do
147
+ subject.redis do |conn|
148
+ conn.lpush("sidekiq-merger:msg:foo", "[1,2,3]")
149
+ end
150
+ subject.delete_message("foo", [1, 2, 3])
151
+ subject.redis do |conn|
152
+ expect(conn.smembers("sidekiq-merger:unique_msg:foo")).to contain_exactly "[2,3,4]"
153
+ expect(conn.lrange("sidekiq-merger:msg:foo", 0, -1)).to contain_exactly "[2,3,4]"
154
+ end
155
+ end
156
+ end
130
157
  end
131
158
 
132
159
  describe "#merge_size" do
160
+ before do
161
+ subject.redis do |conn|
162
+ conn.lpush("sidekiq-merger:msg:foo", "[1,2,3]")
163
+ conn.lpush("sidekiq-merger:msg:foo", "[2,3,4]")
164
+ end
165
+ end
166
+ it "returns the size" do
167
+ expect(subject.merge_size("foo")).to eq 2
168
+ end
133
169
  end
134
170
 
135
- describe "#exists?" do
171
+ describe "#merge_exists?" do
136
172
  context "unique key exists" do
137
173
  it "returns true" do
138
174
  described_class.redis { |conn| conn.sadd("sidekiq-merger:unique_msg:foo", "\"test\"") }
139
- expect(subject.exists?("foo", "test")).to eq true
175
+ expect(subject.merge_exists?("foo", "test")).to eq true
140
176
  end
141
177
  end
142
178
  context "unique key does not exists" do
143
179
  it "returns false" do
144
- expect(subject.exists?("foo", "test")).to eq false
180
+ expect(subject.merge_exists?("foo", "test")).to eq false
145
181
  end
146
182
  end
147
183
  end
148
184
 
149
- describe "#all" do
185
+ describe "#all_merges" do
186
+ before do
187
+ subject.push_message("foo", [1, 2, 3], execution_time)
188
+ subject.push_message("bar", [2, 3, 4], execution_time)
189
+ end
190
+ it "gets all the merges" do
191
+ expect(subject.all_merges).to contain_exactly "foo", "bar"
192
+ end
150
193
  end
151
194
 
152
- describe "#lock" do
195
+ describe "#lock_merge" do
196
+ it "locks the key" do
197
+ subject.lock_merge("foo", 3)
198
+ subject.redis do |conn|
199
+ expect(conn.exists("sidekiq-merger:lock:foo")).to eq true
200
+ end
201
+ end
153
202
  end
154
203
 
155
- describe "#get" do
204
+ describe "#get_merge" do
205
+ before do
206
+ subject.push_message("bar", [1, 2, 3], execution_time)
207
+ subject.push_message("bar", [2, 3, 4], execution_time)
208
+ end
209
+ it "gets all the msg" do
210
+ expect(subject.get_merge("bar")).to contain_exactly [1, 2, 3], [2, 3, 4]
211
+ expect(subject.merge_size("bar")).to eq 2
212
+ end
156
213
  end
157
214
 
158
- describe "#pluck" do
215
+ describe "#pluck_merge" do
159
216
  before do
160
- subject.push("bar", [1, 2, 3], execution_time)
161
- subject.push("bar", [2, 3, 4], execution_time)
217
+ subject.push_message("bar", [1, 2, 3], execution_time)
218
+ subject.push_message("bar", [2, 3, 4], execution_time)
162
219
  end
163
- it "plucks all the args" do
164
- expect(subject.pluck("bar")).to contain_exactly [1, 2, 3], [2, 3, 4]
220
+ it "plucks all the msg" do
221
+ expect(subject.pluck_merge("bar")).to contain_exactly [1, 2, 3], [2, 3, 4]
222
+ expect(subject.merge_size("bar")).to eq 0
165
223
  end
166
224
  end
167
225
 
168
- describe "#delete_all" do
226
+ describe "#delete_merge" do
227
+ before do
228
+ subject.push_message("foo", [1, 2, 3], execution_time)
229
+ subject.push_message("foo", [1, 2, 3], execution_time)
230
+ end
231
+ it "deletes the merge" do
232
+ expect {
233
+ subject.delete_merge("foo")
234
+ }.to change { subject.merge_size("foo") }.from(2).to(0)
235
+ end
169
236
  end
170
237
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-merger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - dtaniwaki