sidekiq-merger 0.0.1 → 0.0.4

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.
@@ -17,7 +17,7 @@ describe Sidekiq::Merger::Middleware do
17
17
  "name"
18
18
  end
19
19
 
20
- def perform(args)
20
+ def perform(*args)
21
21
  end
22
22
  end
23
23
  end
@@ -26,7 +26,7 @@ describe Sidekiq::Merger::Middleware do
26
26
  end
27
27
 
28
28
  describe "#call" do
29
- it "adds the args to the batch" do
29
+ it "adds the args to the merge" do
30
30
  subject.call(worker_class, { "args" => [1, 2, 3], "at" => now + 10.seconds }, queue) {}
31
31
  subject.call(worker_class, { "args" => [2, 3, 4], "at" => now + 15.seconds }, queue) {}
32
32
  flusher.flush
@@ -36,15 +36,21 @@ describe Sidekiq::Merger::Middleware do
36
36
  expect(worker_class.jobs.size).to eq 1
37
37
  job = worker_class.jobs[0]
38
38
  expect(job["queue"]).to eq queue
39
- expect(job["args"]).to eq [[1, 2, 3], [2, 3, 4]]
39
+ expect(job["args"]).to contain_exactly [1, 2, 3], [2, 3, 4]
40
40
  end
41
41
  context "without at msg" do
42
- it "does not add the args to the batch" do
43
- subject.call(worker_class, { "args" => [1, 2, 3] }, queue) {}
44
- subject.call(worker_class, { "args" => [2, 3, 4] }, queue) {}
42
+ it "peforms now with brackets" do
43
+ expect { |b| subject.call(worker_class, { "args" => [1, 2, 3] }, queue, &b) }.to yield_with_args(worker_class, { "args" => [[1, 2, 3]] }, queue, anything)
45
44
  flusher.flush
46
45
  expect(worker_class.jobs.size).to eq 0
47
46
  end
47
+ context "merged msgs" do
48
+ it "performs now" do
49
+ expect { |b| subject.call(worker_class, { "args" => [[1, 2, 3]], "merged" => true }, queue, &b) }.to yield_with_args(worker_class, { "args" => [[1, 2, 3]] }, queue, anything)
50
+ flusher.flush
51
+ expect(worker_class.jobs.size).to eq 0
52
+ end
53
+ end
48
54
  end
49
55
  end
50
56
  end
@@ -9,7 +9,8 @@ describe Sidekiq::Merger::Redis do
9
9
  describe ".purge" do
10
10
  it "cleans up all the keys" do
11
11
  described_class.redis do |conn|
12
- conn.sadd("sidekiq-merger:batches", "test")
12
+ conn.sadd("sidekiq-merger:merges", "test")
13
+ conn.set("sidekiq-merger:unique_msg:foo", "test")
13
14
  conn.set("sidekiq-merger:msg:foo", "test")
14
15
  conn.set("sidekiq-merger:lock:foo", "test")
15
16
  end
@@ -17,7 +18,8 @@ describe Sidekiq::Merger::Redis do
17
18
  described_class.purge!
18
19
 
19
20
  described_class.redis do |conn|
20
- expect(conn.smembers("sidekiq-merger:batches")).to be_empty
21
+ expect(conn.smembers("sidekiq-merger:merges")).to be_empty
22
+ expect(conn.keys("sidekiq-merger:unique_msg:*")).to be_empty
21
23
  expect(conn.keys("sidekiq-merger:msg:*")).to be_empty
22
24
  expect(conn.keys("sidekiq-merger:lock:*")).to be_empty
23
25
  end
@@ -25,84 +27,101 @@ describe Sidekiq::Merger::Redis do
25
27
  end
26
28
 
27
29
  describe "#push" do
28
- it "pushes the args" do
29
- subject.push("foo", [1, 2, 3], execution_time)
30
- described_class.redis do |conn|
31
- expect(conn.smembers("sidekiq-merger:batches")).to contain_exactly "foo"
32
- expect(conn.keys("sidekiq-merger:time:*")).to contain_exactly "sidekiq-merger:time:foo"
33
- expect(conn.keys("sidekiq-merger:msg:*")).to contain_exactly "sidekiq-merger:msg:foo"
34
- expect(conn.smembers("sidekiq-merger:msg:foo")).to contain_exactly "[1,2,3]"
35
- end
36
- end
37
- it "sets the execution time" do
38
- subject.push("foo", [1, 2, 3], execution_time)
39
- described_class.redis do |conn|
40
- expect(conn.get("sidekiq-merger:time:foo")).to eq execution_time.to_json
41
- end
42
- end
43
-
44
- context "the batch key already exists" do
45
- before do
46
- subject.push("foo", [1, 2, 3], execution_time)
47
- end
30
+ shared_examples_for "push spec" do
48
31
  it "pushes the args" do
49
- subject.push("foo", [2, 3, 4], execution_time + 1.hour)
32
+ subject.push(pushing_key, pushing_msg, pushing_execution_time)
50
33
  described_class.redis do |conn|
51
- expect(conn.smembers("sidekiq-merger:batches")).to contain_exactly "foo"
52
- expect(conn.keys("sidekiq-merger:time:*")).to contain_exactly "sidekiq-merger:time:foo"
53
- expect(conn.keys("sidekiq-merger:msg:*")).to contain_exactly "sidekiq-merger:msg:foo"
54
- expect(conn.smembers("sidekiq-merger:msg:foo")).to contain_exactly "[1,2,3]", "[2,3,4]"
34
+ expect(conn.smembers("sidekiq-merger:merges")).to contain_exactly(*merge_keys)
35
+ expect(conn.keys("sidekiq-merger:time:*")).to contain_exactly(*times.keys)
36
+ expect(conn.keys("sidekiq-merger:unique_msg:*")).to contain_exactly(*unique_msgs_h.keys)
37
+ unique_msgs_h.each do |key, msgs|
38
+ expect(conn.smembers(key)).to contain_exactly(*msgs)
39
+ end
40
+ expect(conn.keys("sidekiq-merger:msg:*")).to contain_exactly(*msgs_h.keys)
41
+ msgs_h.each do |key, msgs|
42
+ expect(conn.lrange(key, 0, -1)).to contain_exactly(*msgs)
43
+ end
55
44
  end
56
45
  end
57
- it "does not update the execution time" do
58
- subject.push("foo", [2, 3, 4], execution_time + 1.hour)
46
+ it "sets the execution time" do
47
+ subject.push(pushing_key, pushing_msg, pushing_execution_time)
59
48
  described_class.redis do |conn|
60
- expect(conn.get("sidekiq-merger:time:foo")).to eq execution_time.to_json
49
+ merge_keys.each do |key, time|
50
+ expect(conn.get(key)).to eq time
51
+ end
61
52
  end
62
53
  end
63
54
  end
64
55
 
65
- context "the args has already been pushed" do
66
- before do
67
- subject.push("foo", [1, 2, 3], execution_time)
68
- end
69
- it "does not push the args" do
70
- subject.push("foo", [1, 2, 3], execution_time + 1.hour)
71
- described_class.redis do |conn|
72
- expect(conn.smembers("sidekiq-merger:batches")).to contain_exactly "foo"
73
- expect(conn.keys("sidekiq-merger:time:*")).to contain_exactly "sidekiq-merger:time:foo"
74
- expect(conn.keys("sidekiq-merger:msg:*")).to contain_exactly "sidekiq-merger:msg:foo"
75
- expect(conn.smembers("sidekiq-merger:msg:foo")).to contain_exactly "[1,2,3]"
76
- end
77
- end
78
- it "does not update the execution time" do
79
- subject.push("foo", [1, 2, 3], execution_time + 1.hour)
80
- described_class.redis do |conn|
81
- expect(conn.get("sidekiq-merger:time:foo")).to eq execution_time.to_json
82
- end
83
- end
56
+ let(:pushing_key) { "foo" }
57
+ let(:pushing_msg) { [1, 2, 3] }
58
+ let(:pushing_execution_time) { execution_time }
59
+
60
+ include_examples "push spec" do
61
+ let(:merge_keys) { ["foo"] }
62
+ let(:times) { {
63
+ "sidekiq-merger:time:foo" => execution_time.to_i.to_s,
64
+ } }
65
+ let(:unique_msgs_h) { {
66
+ "sidekiq-merger:unique_msg:foo" => ["[1,2,3]"]
67
+ } }
68
+ let(:msgs_h) { {
69
+ "sidekiq-merger:msg:foo" => ["[1,2,3]"]
70
+ } }
84
71
  end
85
72
 
86
- context "other batch key already exists" do
87
- before do
88
- subject.push("foo", [1, 2, 3], execution_time)
73
+ context "the merge key already exists" do
74
+ let(:pushing_msg) { [2, 3, 4] }
75
+ before { subject.push("foo", [1, 2, 3], execution_time) }
76
+ include_examples "push spec" do
77
+ let(:merge_keys) { ["foo"] }
78
+ let(:times) { {
79
+ "sidekiq-merger:time:foo" => execution_time.to_i.to_s,
80
+ } }
81
+ let(:unique_msgs_h) { {
82
+ "sidekiq-merger:unique_msg:foo" => ["[1,2,3]", "[2,3,4]"]
83
+ } }
84
+ let(:msgs_h) { {
85
+ "sidekiq-merger:msg:foo" => ["[1,2,3]", "[2,3,4]"]
86
+ } }
89
87
  end
90
- it "does not interfere the other batch" do
91
- subject.push("bar", [2, 3, 4], execution_time + 1.hour)
92
- described_class.redis do |conn|
93
- expect(conn.smembers("sidekiq-merger:batches")).to contain_exactly "foo", "bar"
94
- expect(conn.keys("sidekiq-merger:time:*")).to contain_exactly "sidekiq-merger:time:foo", "sidekiq-merger:time:bar"
95
- expect(conn.keys("sidekiq-merger:msg:*")).to contain_exactly "sidekiq-merger:msg:foo", "sidekiq-merger:msg:bar"
96
- expect(conn.smembers("sidekiq-merger:msg:foo")).to contain_exactly "[1,2,3]"
97
- expect(conn.smembers("sidekiq-merger:msg:bar")).to contain_exactly "[2,3,4]"
98
- end
88
+ end
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
93
+ let(:merge_keys) { ["foo"] }
94
+ let(:times) { {
95
+ "sidekiq-merger:time:foo" => execution_time.to_i.to_s,
96
+ } }
97
+ let(:unique_msgs_h) { {
98
+ "sidekiq-merger:unique_msg:foo" => ["[1,2,3]"]
99
+ } }
100
+ let(:msgs_h) { {
101
+ "sidekiq-merger:msg:foo" => ["[1,2,3]", "[1,2,3]"]
102
+ } }
99
103
  end
100
- it "sets the execution time" do
101
- subject.push("bar", [2, 3, 4], execution_time + 1.hour)
102
- described_class.redis do |conn|
103
- expect(conn.get("sidekiq-merger:time:foo")).to eq execution_time.to_json
104
- expect(conn.get("sidekiq-merger:time:bar")).to eq (execution_time + 1.hour).to_json
105
- end
104
+ end
105
+
106
+ context "other merge key already exists" do
107
+ let(:pushing_key) { "bar" }
108
+ let(:pushing_msg) { [2, 3, 4] }
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
112
+ let(:merge_keys) { ["foo", "bar"] }
113
+ let(:times) { {
114
+ "sidekiq-merger:time:foo" => execution_time.to_i.to_s,
115
+ "sidekiq-merger:time:bar" => (execution_time + 1.hour).to_i.to_s,
116
+ } }
117
+ let(:unique_msgs_h) { {
118
+ "sidekiq-merger:unique_msg:foo" => ["[1,2,3]"],
119
+ "sidekiq-merger:unique_msg:bar" => ["[2,3,4]"],
120
+ } }
121
+ let(:msgs_h) { {
122
+ "sidekiq-merger:msg:foo" => ["[1,2,3]"],
123
+ "sidekiq-merger:msg:bar" => ["[2,3,4]"],
124
+ } }
106
125
  end
107
126
  end
108
127
  end
@@ -110,10 +129,21 @@ describe Sidekiq::Merger::Redis do
110
129
  describe "#delete" do
111
130
  end
112
131
 
113
- describe "#batch_size" do
132
+ describe "#merge_size" do
114
133
  end
115
134
 
116
135
  describe "#exists?" do
136
+ context "unique key exists" do
137
+ it "returns true" do
138
+ described_class.redis { |conn| conn.sadd("sidekiq-merger:unique_msg:foo", "\"test\"") }
139
+ expect(subject.exists?("foo", "test")).to eq true
140
+ end
141
+ end
142
+ context "unique key does not exists" do
143
+ it "returns false" do
144
+ expect(subject.exists?("foo", "test")).to eq false
145
+ end
146
+ end
117
147
  end
118
148
 
119
149
  describe "#all" do
@@ -131,7 +161,7 @@ describe Sidekiq::Merger::Redis do
131
161
  subject.push("bar", [2, 3, 4], execution_time)
132
162
  end
133
163
  it "plucks all the args" do
134
- expect(subject.pluck("bar")).to eq [[1, 2, 3], [2, 3, 4]]
164
+ expect(subject.pluck("bar")).to contain_exactly [1, 2, 3], [2, 3, 4]
135
165
  end
136
166
  end
137
167
 
data/spec/spec_helper.rb CHANGED
@@ -54,13 +54,18 @@ RSpec.configure do |config|
54
54
  Kernel.srand config.seed
55
55
 
56
56
  config.before :suite do
57
- Sidekiq.logger.level = Logger::ERROR
57
+ Sidekiq::Testing.fake!
58
+ Sidekiq::Merger.logger = nil
59
+ Sidekiq.logger = nil
58
60
  end
59
61
 
60
62
  config.before :example do
61
- Timecop.return
62
63
  Sidekiq::Merger::Redis.redis do |conn|
63
64
  conn.flushall
64
65
  end
65
66
  end
67
+
68
+ config.after :example do
69
+ Timecop.return
70
+ end
66
71
  end
metadata CHANGED
@@ -1,200 +1,207 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-merger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - dtaniwaki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-30 00:00:00.000000000 Z
11
+ date: 2017-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.13'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.13'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: rake
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
- - - "~>"
17
+ - - ">="
32
18
  - !ruby/object:Gem::Version
33
19
  version: '10.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '13'
34
23
  type: :development
35
24
  prerelease: false
36
25
  version_requirements: !ruby/object:Gem::Requirement
37
26
  requirements:
38
- - - "~>"
27
+ - - ">="
39
28
  - !ruby/object:Gem::Version
40
29
  version: '10.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '13'
41
33
  - !ruby/object:Gem::Dependency
42
34
  name: rspec
43
35
  requirement: !ruby/object:Gem::Requirement
44
36
  requirements:
45
- - - "~>"
37
+ - - ">="
46
38
  - !ruby/object:Gem::Version
47
39
  version: '3.0'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '4'
48
43
  type: :development
49
44
  prerelease: false
50
45
  version_requirements: !ruby/object:Gem::Requirement
51
46
  requirements:
52
- - - "~>"
47
+ - - ">="
53
48
  - !ruby/object:Gem::Version
54
49
  version: '3.0'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '4'
55
53
  - !ruby/object:Gem::Dependency
56
54
  name: simplecov
57
55
  requirement: !ruby/object:Gem::Requirement
58
56
  requirements:
59
- - - ">="
57
+ - - "~>"
60
58
  - !ruby/object:Gem::Version
61
- version: '0'
59
+ version: '0.12'
62
60
  type: :development
63
61
  prerelease: false
64
62
  version_requirements: !ruby/object:Gem::Requirement
65
63
  requirements:
66
- - - ">="
64
+ - - "~>"
67
65
  - !ruby/object:Gem::Version
68
- version: '0'
66
+ version: '0.12'
69
67
  - !ruby/object:Gem::Dependency
70
68
  name: timecop
71
69
  requirement: !ruby/object:Gem::Requirement
72
70
  requirements:
73
- - - ">="
71
+ - - "~>"
74
72
  - !ruby/object:Gem::Version
75
- version: '0'
73
+ version: '0.8'
76
74
  type: :development
77
75
  prerelease: false
78
76
  version_requirements: !ruby/object:Gem::Requirement
79
77
  requirements:
80
- - - ">="
78
+ - - "~>"
81
79
  - !ruby/object:Gem::Version
82
- version: '0'
80
+ version: '0.8'
83
81
  - !ruby/object:Gem::Dependency
84
82
  name: rubocop
85
83
  requirement: !ruby/object:Gem::Requirement
86
84
  requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: pry
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
85
+ - - "~>"
102
86
  - !ruby/object:Gem::Version
103
- version: '0'
87
+ version: '0.47'
104
88
  type: :development
105
89
  prerelease: false
106
90
  version_requirements: !ruby/object:Gem::Requirement
107
91
  requirements:
108
- - - ">="
92
+ - - "~>"
109
93
  - !ruby/object:Gem::Version
110
- version: '0'
94
+ version: '0.47'
111
95
  - !ruby/object:Gem::Dependency
112
96
  name: coveralls
113
97
  requirement: !ruby/object:Gem::Requirement
114
98
  requirements:
115
- - - ">="
99
+ - - "~>"
116
100
  - !ruby/object:Gem::Version
117
- version: '0'
101
+ version: '0.8'
118
102
  type: :development
119
103
  prerelease: false
120
104
  version_requirements: !ruby/object:Gem::Requirement
121
105
  requirements:
122
- - - ">="
106
+ - - "~>"
123
107
  - !ruby/object:Gem::Version
124
- version: '0'
108
+ version: '0.8'
125
109
  - !ruby/object:Gem::Dependency
126
110
  name: sidekiq
127
111
  requirement: !ruby/object:Gem::Requirement
128
112
  requirements:
129
113
  - - ">="
130
114
  - !ruby/object:Gem::Version
131
- version: 3.4.0
115
+ version: '3.4'
116
+ - - "<"
117
+ - !ruby/object:Gem::Version
118
+ version: '5'
132
119
  type: :runtime
133
120
  prerelease: false
134
121
  version_requirements: !ruby/object:Gem::Requirement
135
122
  requirements:
136
123
  - - ">="
137
124
  - !ruby/object:Gem::Version
138
- version: 3.4.0
125
+ version: '3.4'
126
+ - - "<"
127
+ - !ruby/object:Gem::Version
128
+ version: '5'
139
129
  - !ruby/object:Gem::Dependency
140
130
  name: concurrent-ruby
141
131
  requirement: !ruby/object:Gem::Requirement
142
132
  requirements:
143
- - - ">="
133
+ - - "~>"
144
134
  - !ruby/object:Gem::Version
145
- version: '0'
135
+ version: '1.0'
146
136
  type: :runtime
147
137
  prerelease: false
148
138
  version_requirements: !ruby/object:Gem::Requirement
149
139
  requirements:
150
- - - ">="
140
+ - - "~>"
151
141
  - !ruby/object:Gem::Version
152
- version: '0'
142
+ version: '1.0'
153
143
  - !ruby/object:Gem::Dependency
154
144
  name: activesupport
155
145
  requirement: !ruby/object:Gem::Requirement
156
146
  requirements:
157
147
  - - ">="
158
148
  - !ruby/object:Gem::Version
159
- version: 3.2.0
149
+ version: '3.2'
150
+ - - "<"
151
+ - !ruby/object:Gem::Version
152
+ version: '6'
160
153
  type: :runtime
161
154
  prerelease: false
162
155
  version_requirements: !ruby/object:Gem::Requirement
163
156
  requirements:
164
157
  - - ">="
165
158
  - !ruby/object:Gem::Version
166
- version: 3.2.0
159
+ version: '3.2'
160
+ - - "<"
161
+ - !ruby/object:Gem::Version
162
+ version: '6'
167
163
  description: Merge sidekiq jobs.
168
164
  email:
169
165
  - daisuketaniwaki@gmail.com
170
- executables:
171
- - console
172
- - setup
166
+ executables: []
173
167
  extensions: []
174
168
  extra_rdoc_files: []
175
169
  files:
170
+ - ".dockerignore"
171
+ - ".gemrelease"
176
172
  - ".gitignore"
177
173
  - ".rspec"
178
174
  - ".rubocop.yml"
179
175
  - ".travis.yml"
176
+ - Dockerfile
180
177
  - Gemfile
181
178
  - LICENSE
182
179
  - README.md
183
180
  - Rakefile
184
- - bin/console
185
- - bin/setup
181
+ - app/Gemfile
182
+ - app/app.rb
183
+ - app/config.ru
184
+ - app/sidekiq.rb
185
+ - app/some_worker.rb
186
+ - app/unique_worker.rb
187
+ - app/views/index.erb
188
+ - docker-compose-common.yml
189
+ - docker-compose.yml
186
190
  - lib/sidekiq-merger.rb
187
191
  - lib/sidekiq/merger.rb
188
- - lib/sidekiq/merger/batch.rb
189
192
  - lib/sidekiq/merger/config.rb
190
193
  - lib/sidekiq/merger/flusher.rb
191
194
  - lib/sidekiq/merger/logging_observer.rb
195
+ - lib/sidekiq/merger/merge.rb
192
196
  - lib/sidekiq/merger/middleware.rb
193
197
  - lib/sidekiq/merger/redis.rb
194
198
  - lib/sidekiq/merger/version.rb
199
+ - lib/sidekiq/merger/views/index.erb
200
+ - lib/sidekiq/merger/web.rb
201
+ - misc/web_ui.png
195
202
  - sidekiq-merger.gemspec
196
- - spec/sidekiq/merger/batch_spec.rb
197
203
  - spec/sidekiq/merger/flusher_spec.rb
204
+ - spec/sidekiq/merger/merge_spec.rb
198
205
  - spec/sidekiq/merger/middleware_spec.rb
199
206
  - spec/sidekiq/merger/redis_spec.rb
200
207
  - spec/sidekiq/merger_spec.rb
@@ -228,8 +235,8 @@ signing_key:
228
235
  specification_version: 4
229
236
  summary: Sidekiq merger plugin
230
237
  test_files:
231
- - spec/sidekiq/merger/batch_spec.rb
232
238
  - spec/sidekiq/merger/flusher_spec.rb
239
+ - spec/sidekiq/merger/merge_spec.rb
233
240
  - spec/sidekiq/merger/middleware_spec.rb
234
241
  - spec/sidekiq/merger/redis_spec.rb
235
242
  - spec/sidekiq/merger_spec.rb