sidekiq-grouping 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be68edcca66201c059ee0a9d18c163cf899a00e1d5013a64ca72206dc9b48e9e
4
- data.tar.gz: 55bfb74ecd86ce73a4fedd115e8adfb1a8531ab3460e008a74ce6c4b9c111892
3
+ metadata.gz: 1626ba86eaf1cb747b25ca6770aa5fa982fbc19f4b8f55bdb49983331ffa8761
4
+ data.tar.gz: bdd1ee7ec9d60582fdf2db69edacbb5a3592f1caa77d60ea60e09f259a0dbca4
5
5
  SHA512:
6
- metadata.gz: 709bbcf1bf236c18e330adba5fd5c0c23a5cce73f869fcc152c3b846f306c28189c3942bb6bfde1875f1895e0a799e7367e1e4bddd4abb8c6147f16490101841
7
- data.tar.gz: d46cb5d01ccaaae7c52f7768e8f8159a8be287e58852f6c167d4ebfbf01e37da70640b40b4476c868fa01a4874d717bbb4c0cbe9108418d1180c4a2c9d95c3ce
6
+ metadata.gz: 99cfd0e831a581d1f38764f1803e81fcdd4ae5b2fd7a75fa8b19a936af601abc415031213f8419d16f3108d8ba8a980439b148e55ae2b64ebc89e674d4c2b780
7
+ data.tar.gz: 9b98e1272e011f68fc60766918f16cb80ce867eb351d05b65ac8a760dbfe05fe363b74a276794b80a6971e5b4593d2c423d35ad835ad7bbdb00d6ca911490e94
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ spec/reports
16
16
  test/tmp
17
17
  test/version_tmp
18
18
  tmp
19
+ .lefthook-local.yml
data/Appraisals CHANGED
@@ -21,3 +21,11 @@ end
21
21
  appraise 'sidekiq-6.5' do
22
22
  gem 'sidekiq', '~> 6.5.0'
23
23
  end
24
+
25
+ appraise 'sidekiq-7.0' do
26
+ gem 'sidekiq', '~> 7.0.0'
27
+ end
28
+
29
+ appraise 'sidekiq-master' do
30
+ gem 'sidekiq', github: 'mperham/sidekiq'
31
+ end
data/bin/console ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "sidekiq/grouping"
6
+
7
+ require "pry"
8
+ Pry.start
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "sidekiq", "~> 7.0.0"
6
+
7
+ gemspec path: "../"
data/lefthook.yml CHANGED
@@ -4,12 +4,17 @@
4
4
  # See: github.com/evilmartians/lefthook
5
5
 
6
6
  pre-commit:
7
+ parallel: true
7
8
  commands:
9
+ appraisal:
10
+ glob: "{Appraisals,*.gemfile}"
11
+ run: echo {staged_files} > /dev/null; bundle exec appraisal install && git add gemfiles/*.gemfile
8
12
  rubocop:
9
- glob: "*.rb"
13
+ glob: "{*.rb,*.gemspec,Gemfile,Rakefile}"
10
14
  run: bundle exec rubocop -A {staged_files} && git add {staged_files}
11
15
 
12
16
  pre-push:
13
17
  commands:
14
18
  rspec:
15
- run: bundle exec appraisal rspec
19
+ glob: "*.rb"
20
+ run: echo {push_files} > /dev/null; bundle exec appraisal rspec
@@ -6,10 +6,12 @@ module Sidekiq
6
6
  include ActiveSupport::Configurable
7
7
 
8
8
  def self.options
9
- if Sidekiq.respond_to?(:[])
10
- Sidekiq[:grouping] || Sidekiq["grouping"] || {}
11
- else
9
+ if Sidekiq.respond_to?(:[]) # Sidekiq 6.x
10
+ Sidekiq[:grouping] || {}
11
+ elsif Sidekiq.respond_to?(:options) # Sidekiq <= 5.x
12
12
  Sidekiq.options[:grouping] || Sidekiq.options["grouping"] || {}
13
+ else # Sidekiq 7.x
14
+ Sidekiq.default_configuration[:grouping] || {}
13
15
  end
14
16
  end
15
17
 
@@ -1,8 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "./redis_dispatcher"
4
+
3
5
  module Sidekiq
4
6
  module Grouping
5
7
  class Redis
8
+ include RedisDispatcher
9
+
6
10
  PLUCK_SCRIPT = <<-SCRIPT
7
11
  local pluck_values = redis.call('lpop', KEYS[1], ARGV[1]) or {}
8
12
  if #pluck_values > 0 then
@@ -15,13 +19,12 @@ module Sidekiq
15
19
  redis do |conn|
16
20
  conn.multi do |pipeline|
17
21
  sadd = pipeline.respond_to?(:sadd?) ? :sadd? : :sadd
18
- pipeline.public_send(sadd, ns("batches"), name)
19
- pipeline.rpush(ns(name), msg)
22
+ redis_connection_call(pipeline, sadd, ns("batches"), name)
23
+ redis_connection_call(pipeline, :rpush, ns(name), msg)
24
+
20
25
  if remember_unique
21
- pipeline.public_send(
22
- sadd,
23
- unique_messages_key(name),
24
- msg
26
+ redis_connection_call(
27
+ pipeline, sadd, unique_messages_key(name), msg
25
28
  )
26
29
  end
27
30
  end
@@ -29,47 +32,62 @@ module Sidekiq
29
32
  end
30
33
 
31
34
  def enqueued?(name, msg)
32
- redis do |conn|
33
- conn.sismember(unique_messages_key(name), msg)
34
- end
35
+ member = redis_call(:sismember, unique_messages_key(name), msg)
36
+ return member if member.is_a?(TrueClass) || member.is_a?(FalseClass)
37
+
38
+ member != 0
35
39
  end
36
40
 
37
41
  def batch_size(name)
38
- redis { |conn| conn.llen(ns(name)) }
42
+ redis_call(:llen, ns(name))
39
43
  end
40
44
 
41
45
  def batches
42
- redis { |conn| conn.smembers(ns("batches")) }
46
+ redis_call(:smembers, ns("batches"))
43
47
  end
44
48
 
45
49
  def pluck(name, limit)
46
- keys = [ns(name), unique_messages_key(name)]
47
- args = [limit]
48
- redis { |conn| conn.eval PLUCK_SCRIPT, keys, args }
50
+ if new_redis_client?
51
+ redis_call(
52
+ :eval,
53
+ PLUCK_SCRIPT,
54
+ 2,
55
+ ns(name),
56
+ unique_messages_key(name),
57
+ limit
58
+ )
59
+ else
60
+ keys = [ns(name), unique_messages_key(name)]
61
+ args = [limit]
62
+ redis_call(:eval, PLUCK_SCRIPT, keys, args)
63
+ end
49
64
  end
50
65
 
51
66
  def get_last_execution_time(name)
52
- redis { |conn| conn.get(ns("last_execution_time:#{name}")) }
67
+ redis_call(:get, ns("last_execution_time:#{name}"))
53
68
  end
54
69
 
55
70
  def set_last_execution_time(name, time)
56
- redis do |conn|
57
- conn.set(ns("last_execution_time:#{name}"), time.to_json)
58
- end
71
+ redis_call(
72
+ :set, ns("last_execution_time:#{name}"), time.to_json
73
+ )
59
74
  end
60
75
 
61
76
  def lock(name)
62
- redis do |conn|
63
- id = ns("lock:#{name}")
64
- conn.set(id, true, nx: true, ex: Sidekiq::Grouping::Config.lock_ttl)
65
- end
77
+ redis_call(
78
+ :set,
79
+ ns("lock:#{name}"),
80
+ "true",
81
+ nx: true,
82
+ ex: Sidekiq::Grouping::Config.lock_ttl
83
+ )
66
84
  end
67
85
 
68
86
  def delete(name)
69
87
  redis do |conn|
70
- conn.del(ns("last_execution_time:#{name}"))
71
- conn.del(ns(name))
72
- conn.srem(ns("batches"), name)
88
+ redis_connection_call(conn, :del, ns("last_execution_time:#{name}"))
89
+ redis_connection_call(conn, :del, ns(name))
90
+ redis_connection_call(conn, :srem, ns("batches"), name)
73
91
  end
74
92
  end
75
93
 
@@ -82,10 +100,6 @@ module Sidekiq
82
100
  def ns(key = nil)
83
101
  "batching:#{key}"
84
102
  end
85
-
86
- def redis(&block)
87
- Sidekiq.redis(&block)
88
- end
89
103
  end
90
104
  end
91
105
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sidekiq
4
+ module Grouping
5
+ module RedisDispatcher
6
+ def redis_call(command, *args, **kwargs)
7
+ redis do |connection|
8
+ redis_connection_call(connection, command, *args, **kwargs)
9
+ end
10
+ end
11
+
12
+ def redis_connection_call(connection, command, *args, **kwargs)
13
+ if new_redis_client? # redis-client
14
+ connection.call(command.to_s.upcase, *args, **kwargs)
15
+ else # redis
16
+ connection.public_send(command, *args, **kwargs)
17
+ end
18
+ end
19
+
20
+ def new_redis_client?
21
+ Sidekiq::VERSION[0].to_i >= 7
22
+ end
23
+
24
+ def redis(&block)
25
+ Sidekiq.redis(&block)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sidekiq
4
4
  module Grouping
5
- VERSION = "1.2.0"
5
+ VERSION = "1.3.0"
6
6
  end
7
7
  end
@@ -4,6 +4,7 @@ require "active_support"
4
4
  require "active_support/core_ext/string"
5
5
  require "active_support/configurable"
6
6
  require "active_support/core_ext/numeric/time"
7
+ require "sidekiq"
7
8
  require "sidekiq/grouping/version"
8
9
  require "concurrent"
9
10
 
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_development_dependency "appraisal"
25
25
  spec.add_development_dependency "bundler", "> 1.5"
26
+ spec.add_development_dependency "pry"
26
27
  spec.add_development_dependency "rake"
27
28
  spec.add_development_dependency "rspec"
28
29
  spec.add_development_dependency "rspec-sidekiq"
@@ -33,6 +34,6 @@ Gem::Specification.new do |spec|
33
34
 
34
35
  spec.add_dependency "activesupport"
35
36
  spec.add_dependency "concurrent-ruby"
36
- spec.add_dependency "sidekiq", ">= 3.4.2", "< 7"
37
+ spec.add_dependency "sidekiq", ">= 3.4.2"
37
38
  spec.metadata["rubygems_mfa_required"] = "true"
38
39
  end
@@ -3,6 +3,8 @@
3
3
  require "spec_helper"
4
4
 
5
5
  describe Sidekiq::Grouping::Redis do
6
+ include Sidekiq::Grouping::RedisDispatcher
7
+
6
8
  subject(:redis_service) { described_class.new }
7
9
 
8
10
  let(:queue_name) { "my_queue" }
@@ -12,14 +14,14 @@ describe Sidekiq::Grouping::Redis do
12
14
  describe "#push_msg" do
13
15
  it "adds message to queue", :aggregate_failures do
14
16
  redis_service.push_msg(queue_name, "My message")
15
- expect(redis { |c| c.llen key }).to eq 1
16
- expect(redis { |c| c.lrange key, 0, 1 }).to eq ["My message"]
17
- expect(redis { |c| c.smembers unique_key }).to eq []
17
+ expect(redis_call(:llen, key)).to eq 1
18
+ expect(redis_call(:lrange, key, 0, 1)).to eq ["My message"]
19
+ expect(redis_call(:smembers, unique_key)).to eq []
18
20
  end
19
21
 
20
22
  it "remembers unique message if specified" do
21
23
  redis_service.push_msg(queue_name, "My message", remember_unique: true)
22
- expect(redis { |c| c.smembers unique_key }).to eq ["My message"]
24
+ expect(redis_call(:smembers, unique_key)).to eq ["My message"]
23
25
  end
24
26
  end
25
27
 
@@ -28,21 +30,15 @@ describe Sidekiq::Grouping::Redis do
28
30
  redis_service.push_msg(queue_name, "Message 1")
29
31
  redis_service.push_msg(queue_name, "Message 2")
30
32
  redis_service.pluck(queue_name, 2)
31
- expect(redis { |c| c.llen key }).to eq 0
33
+ expect(redis_call(:llen, key)).to eq 0
32
34
  end
33
35
 
34
36
  it "forgets unique messages", :aggregate_failures do
35
37
  redis_service.push_msg(queue_name, "Message 1", remember_unique: true)
36
38
  redis_service.push_msg(queue_name, "Message 2", remember_unique: true)
37
- expect(redis { |c| c.scard unique_key }).to eq 2
39
+ expect(redis_call(:scard, unique_key)).to eq 2
38
40
  redis_service.pluck(queue_name, 2)
39
- expect(redis { |c| c.smembers unique_key }).to eq []
41
+ expect(redis_call(:smembers, unique_key)).to eq []
40
42
  end
41
43
  end
42
-
43
- private
44
-
45
- def redis(&block)
46
- Sidekiq.redis(&block)
47
- end
48
44
  end
data/spec/spec_helper.rb CHANGED
@@ -9,6 +9,7 @@ require "simplecov"
9
9
  require "sidekiq"
10
10
  require "rspec-sidekiq"
11
11
  require "support/test_workers"
12
+ require "pry"
12
13
 
13
14
  SimpleCov.start do
14
15
  add_filter "spec"
@@ -17,8 +18,10 @@ end
17
18
  require "sidekiq/grouping"
18
19
 
19
20
  Sidekiq::Grouping.logger = nil
20
- Sidekiq.redis = { db: ENV.fetch("db", 1) }
21
- Sidekiq.logger = nil
21
+ Sidekiq.configure_client do |config|
22
+ config.redis = { db: 1 }
23
+ config.logger = nil
24
+ end
22
25
 
23
26
  RSpec::Sidekiq.configure do |config|
24
27
  config.clear_all_enqueued_jobs = true
@@ -32,8 +35,13 @@ RSpec.configure do |config|
32
35
 
33
36
  config.before do
34
37
  Sidekiq.redis do |conn|
35
- keys = conn.keys "*batching*"
36
- keys.each { |key| conn.del key }
38
+ if Sidekiq::VERSION[0].to_i >= 7
39
+ keys = conn.call("KEYS", "*batching*")
40
+ keys.each { |key| conn.call("DEL", key) }
41
+ else
42
+ keys = conn.keys "*batching*"
43
+ keys.each { |key| conn.del key }
44
+ end
37
45
  end
38
46
  end
39
47
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-grouping
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Sokolov
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -171,9 +185,6 @@ dependencies:
171
185
  - - ">="
172
186
  - !ruby/object:Gem::Version
173
187
  version: 3.4.2
174
- - - "<"
175
- - !ruby/object:Gem::Version
176
- version: '7'
177
188
  type: :runtime
178
189
  prerelease: false
179
190
  version_requirements: !ruby/object:Gem::Requirement
@@ -181,13 +192,11 @@ dependencies:
181
192
  - - ">="
182
193
  - !ruby/object:Gem::Version
183
194
  version: 3.4.2
184
- - - "<"
185
- - !ruby/object:Gem::Version
186
- version: '7'
187
195
  description:
188
196
  email:
189
197
  - gzigzigzeo@gmail.com
190
- executables: []
198
+ executables:
199
+ - console
191
200
  extensions: []
192
201
  extra_rdoc_files: []
193
202
  files:
@@ -200,12 +209,14 @@ files:
200
209
  - LICENSE.txt
201
210
  - README.md
202
211
  - Rakefile
212
+ - bin/console
203
213
  - gemfiles/sidekiq_4.0.gemfile
204
214
  - gemfiles/sidekiq_4.1.gemfile
205
215
  - gemfiles/sidekiq_4.2.gemfile
206
216
  - gemfiles/sidekiq_5.0.gemfile
207
217
  - gemfiles/sidekiq_6.0.gemfile
208
218
  - gemfiles/sidekiq_6.5.gemfile
219
+ - gemfiles/sidekiq_7.0.gemfile
209
220
  - gemfiles/sidekiq_master.gemfile
210
221
  - lefthook.yml
211
222
  - lib/sidekiq/grouping.rb
@@ -215,6 +226,7 @@ files:
215
226
  - lib/sidekiq/grouping/flusher_observer.rb
216
227
  - lib/sidekiq/grouping/middleware.rb
217
228
  - lib/sidekiq/grouping/redis.rb
229
+ - lib/sidekiq/grouping/redis_dispatcher.rb
218
230
  - lib/sidekiq/grouping/version.rb
219
231
  - lib/sidekiq/grouping/views/index.erb
220
232
  - lib/sidekiq/grouping/web.rb