sidekiq-grouping 1.2.0 → 1.3.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.
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