sidekiq-throttled 0.15.0 → 0.17.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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +12 -0
  3. data/.github/workflows/ci.yml +11 -10
  4. data/.rubocop.yml +8 -7
  5. data/.rubocop_todo.yml +39 -3
  6. data/.travis.yml +2 -4
  7. data/Appraisals +4 -24
  8. data/CHANGES.md +44 -0
  9. data/Gemfile +7 -5
  10. data/LICENSE.md +1 -0
  11. data/README.md +36 -36
  12. data/Rakefile +1 -1
  13. data/gemfiles/{sidekiq_5.2.gemfile → sidekiq_6.4.gemfile} +8 -6
  14. data/gemfiles/{sidekiq_5.1.gemfile → sidekiq_6.5.gemfile} +8 -6
  15. data/lib/sidekiq/throttled/communicator/callbacks.rb +1 -1
  16. data/lib/sidekiq/throttled/communicator/exception_handler.rb +25 -0
  17. data/lib/sidekiq/throttled/communicator/listener.rb +1 -1
  18. data/lib/sidekiq/throttled/communicator.rb +1 -1
  19. data/lib/sidekiq/throttled/configuration.rb +4 -4
  20. data/lib/sidekiq/throttled/expirable_list.rb +2 -5
  21. data/lib/sidekiq/throttled/fetch/unit_of_work.rb +7 -2
  22. data/lib/sidekiq/throttled/fetch.rb +15 -24
  23. data/lib/sidekiq/throttled/job.rb +128 -0
  24. data/lib/sidekiq/throttled/strategy/base.rb +6 -2
  25. data/lib/sidekiq/throttled/version.rb +1 -1
  26. data/lib/sidekiq/throttled/web/stats.rb +5 -4
  27. data/lib/sidekiq/throttled/worker.rb +6 -121
  28. data/lib/sidekiq/throttled.rb +12 -14
  29. data/{.rubocop → rubocop}/layout.yml +0 -0
  30. data/{.rubocop → rubocop}/lint.yml +0 -0
  31. data/{.rubocop → rubocop}/metrics.yml +0 -0
  32. data/{.rubocop → rubocop}/performance.yml +0 -0
  33. data/{.rubocop → rubocop}/rspec.yml +1 -1
  34. data/{.rubocop → rubocop}/style.yml +0 -0
  35. data/sidekiq-throttled.gemspec +7 -5
  36. metadata +22 -23
  37. data/gemfiles/sidekiq_5.0.gemfile +0 -31
  38. data/gemfiles/sidekiq_6.0.gemfile +0 -31
  39. data/gemfiles/sidekiq_6.1.gemfile +0 -31
  40. data/gemfiles/sidekiq_6.2.gemfile +0 -31
  41. data/gemfiles/sidekiq_6.3.gemfile +0 -31
@@ -12,29 +12,6 @@ module Sidekiq
12
12
  #
13
13
  # @private
14
14
  class Fetch
15
- module BulkRequeue
16
- # Requeues all given units as a single operation.
17
- #
18
- # @see http://www.rubydoc.info/github/redis/redis-rb/master/Redis#pipelined-instance_method
19
- # @param [Array<Fetch::UnitOfWork>] units
20
- # @return [void]
21
- def bulk_requeue(units, _options)
22
- return if units.empty?
23
-
24
- Sidekiq.logger.debug { "Re-queueing terminated jobs" }
25
- Sidekiq.redis { |conn| conn.pipelined { units.each(&:requeue) } }
26
- Sidekiq.logger.info("Pushed #{units.size} jobs back to Redis")
27
- rescue => e
28
- Sidekiq.logger.warn("Failed to requeue #{units.size} jobs: #{e}")
29
- end
30
- end
31
-
32
- # https://github.com/mperham/sidekiq/commit/fce05c9d4b4c0411c982078a4cf3a63f20f739bc
33
- if Gem::Version.new(Sidekiq::VERSION) < Gem::Version.new("6.1.0")
34
- extend BulkRequeue
35
- else
36
- include BulkRequeue
37
- end
38
15
  # Timeout to sleep between fetch retries in case of no job received,
39
16
  # as well as timeout to wait for redis to give us something to work.
40
17
  TIMEOUT = 2
@@ -73,6 +50,20 @@ module Sidekiq
73
50
  nil
74
51
  end
75
52
 
53
+ def bulk_requeue(units, _options)
54
+ return if units.empty?
55
+
56
+ Sidekiq.logger.debug { "Re-queueing terminated jobs" }
57
+ Sidekiq.redis do |conn|
58
+ conn.pipelined do |pipeline|
59
+ units.each { |unit| unit.requeue(pipeline) }
60
+ end
61
+ end
62
+ Sidekiq.logger.info("Pushed #{units.size} jobs back to Redis")
63
+ rescue => e
64
+ Sidekiq.logger.warn("Failed to requeue #{units.size} jobs: #{e}")
65
+ end
66
+
76
67
  private
77
68
 
78
69
  # Tries to pop pair of `queue` and job `message` out of sidekiq queues.
@@ -87,7 +78,7 @@ module Sidekiq
87
78
  return
88
79
  end
89
80
 
90
- Sidekiq.redis { |conn| conn.brpop(*queues, TIMEOUT) }
81
+ Sidekiq.redis { |conn| conn.brpop(*queues, :timeout => TIMEOUT) }
91
82
  end
92
83
 
93
84
  # Returns list of queues to try to fetch jobs from.
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ # internal
4
+ require "sidekiq/throttled/registry"
5
+
6
+ module Sidekiq
7
+ module Throttled
8
+ # Adds helpers to your worker classes
9
+ #
10
+ # @example Usage
11
+ #
12
+ # class MyJob
13
+ # include Sidekiq::Job
14
+ # include Sidekiq::Throttled::Job
15
+ #
16
+ # sidkiq_options :queue => :my_queue
17
+ # sidekiq_throttle :threshold => { :limit => 123, :period => 1.hour }
18
+ #
19
+ # def perform
20
+ # # ...
21
+ # end
22
+ # end
23
+ #
24
+ # @see ClassMethods
25
+ module Job
26
+ # Extends worker class with {ClassMethods}.
27
+ #
28
+ # @note Using `included` hook with extending worker with {ClassMethods}
29
+ # in order to make API inline with `include Sidekiq::Job`.
30
+ #
31
+ # @private
32
+ def self.included(worker)
33
+ worker.send(:extend, ClassMethods)
34
+ end
35
+
36
+ # Helper methods added to the singleton class of destination
37
+ module ClassMethods
38
+ # Registers some strategy for the worker.
39
+ #
40
+ # @example Allow max 123 MyJob jobs per hour
41
+ #
42
+ # class MyJob
43
+ # include Sidekiq::Job
44
+ # include Sidekiq::Throttled::Job
45
+ #
46
+ # sidekiq_throttle({
47
+ # :threshold => { :limit => 123, :period => 1.hour }
48
+ # })
49
+ # end
50
+ #
51
+ # @example Allow max 10 concurrently running MyJob jobs
52
+ #
53
+ # class MyJob
54
+ # include Sidekiq::Job
55
+ # include Sidekiq::Throttled::Job
56
+ #
57
+ # sidekiq_throttle({
58
+ # :concurrency => { :limit => 10 }
59
+ # })
60
+ # end
61
+ #
62
+ # @example Allow max 10 concurrent MyJob jobs and max 123 per hour
63
+ #
64
+ # class MyJob
65
+ # include Sidekiq::Job
66
+ # include Sidekiq::Throttled::Job
67
+ #
68
+ # sidekiq_throttle({
69
+ # :threshold => { :limit => 123, :period => 1.hour },
70
+ # :concurrency => { :limit => 10 }
71
+ # })
72
+ # end
73
+ #
74
+ # @see Registry.add
75
+ # @return [void]
76
+ def sidekiq_throttle(**kwargs)
77
+ Registry.add(self, **kwargs)
78
+ end
79
+
80
+ # Adds current worker to preconfigured throttling strategy. Allows
81
+ # sharing same pool for multiple workers.
82
+ #
83
+ # First of all we need to create shared throttling strategy:
84
+ #
85
+ # # Create google_api throttling strategy
86
+ # Sidekiq::Throttled::Registry.add(:google_api, {
87
+ # :threshold => { :limit => 123, :period => 1.hour },
88
+ # :concurrency => { :limit => 10 }
89
+ # })
90
+ #
91
+ # Now we can assign it to our workers:
92
+ #
93
+ # class FetchProfileJob
94
+ # include Sidekiq::Job
95
+ # include Sidekiq::Throttled::Job
96
+ #
97
+ # sidekiq_throttle_as :google_api
98
+ # end
99
+ #
100
+ # class FetchCommentsJob
101
+ # include Sidekiq::Job
102
+ # include Sidekiq::Throttled::Job
103
+ #
104
+ # sidekiq_throttle_as :google_api
105
+ # end
106
+ #
107
+ # With the above configuration we ensure that there are maximum 10
108
+ # concurrently running jobs of FetchProfileJob or FetchCommentsJob
109
+ # allowed. And only 123 jobs of those are executed per hour.
110
+ #
111
+ # In other words, it will allow:
112
+ #
113
+ # - only `X` concurrent `FetchProfileJob`s
114
+ # - max `XX` `FetchProfileJob` per hour
115
+ # - only `Y` concurrent `FetchCommentsJob`s
116
+ # - max `YY` `FetchCommentsJob` per hour
117
+ #
118
+ # Where `(X + Y) == 10` and `(XX + YY) == 123`
119
+ #
120
+ # @see Registry.add_alias
121
+ # @return [void]
122
+ def sidekiq_throttle_as(name)
123
+ Registry.add_alias(self, name)
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -12,8 +12,12 @@ module Sidekiq
12
12
 
13
13
  def key(job_args)
14
14
  key = @base_key.dup
15
- key << ":#{@key_suffix.call(*job_args)}" if @key_suffix
16
- key
15
+ return key unless @key_suffix
16
+
17
+ key << ":#{@key_suffix.call(*job_args)}"
18
+ rescue => e
19
+ Sidekiq.logger.error "Failed to get key suffix: #{e}"
20
+ raise e
17
21
  end
18
22
  end
19
23
  end
@@ -3,6 +3,6 @@
3
3
  module Sidekiq
4
4
  module Throttled
5
5
  # Gem version
6
- VERSION = "0.15.0"
6
+ VERSION = "0.17.0"
7
7
  end
8
8
  end
@@ -37,7 +37,8 @@ module Sidekiq
37
37
  percentile = 100.00 * int / max
38
38
  lvl = if 80 <= percentile then "danger"
39
39
  elsif 60 <= percentile then "warning"
40
- else "success"
40
+ else
41
+ "success"
41
42
  end
42
43
 
43
44
  %(<span class="label label-#{lvl}">#{int}</span>)
@@ -61,10 +62,10 @@ module Sidekiq
61
62
 
62
63
  # @return [String]
63
64
  def humanize_integer(int)
64
- digits = int.to_s.split ""
65
- str = digits.shift(digits.count % 3).join("")
65
+ digits = int.to_s.chars
66
+ str = digits.shift(digits.count % 3).join
66
67
 
67
- str << " " << digits.shift(3).join("") while digits.count.positive?
68
+ str << " " << digits.shift(3).join while digits.count.positive?
68
69
 
69
70
  str.strip
70
71
  end
@@ -1,128 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # internal
4
- require "sidekiq/throttled/registry"
3
+ require "sidekiq/throttled/job"
5
4
 
6
5
  module Sidekiq
7
6
  module Throttled
8
- # Adds helpers to your worker classes
9
- #
10
- # @example Usage
11
- #
12
- # class MyWorker
13
- # include Sidekiq::Worker
14
- # include Sidekiq::Throttled::Worker
15
- #
16
- # sidkiq_options :queue => :my_queue
17
- # sidekiq_throttle :threshold => { :limit => 123, :period => 1.hour }
18
- #
19
- # def perform
20
- # # ...
21
- # end
22
- # end
23
- #
24
- # @see ClassMethods
25
- module Worker
26
- # Extends worker class with {ClassMethods}.
27
- #
28
- # @note Using `included` hook with extending worker with {ClassMethods}
29
- # in order to make API inline with `include Sidekiq::Worker`.
30
- #
31
- # @private
32
- def self.included(worker)
33
- worker.send(:extend, ClassMethods)
34
- end
35
-
36
- # Helper methods added to the singleton class of destination
37
- module ClassMethods
38
- # Registers some strategy for the worker.
39
- #
40
- # @example Allow max 123 MyWorker jobs per hour
41
- #
42
- # class MyWorker
43
- # include Sidekiq::Worker
44
- # include Sidekiq::Throttled::Worker
45
- #
46
- # sidekiq_throttle({
47
- # :threshold => { :limit => 123, :period => 1.hour }
48
- # })
49
- # end
50
- #
51
- # @example Allow max 10 concurrently running MyWorker jobs
52
- #
53
- # class MyWorker
54
- # include Sidekiq::Worker
55
- # include Sidekiq::Throttled::Worker
56
- #
57
- # sidekiq_throttle({
58
- # :concurrency => { :limit => 10 }
59
- # })
60
- # end
61
- #
62
- # @example Allow max 10 concurrent MyWorker jobs and max 123 per hour
63
- #
64
- # class MyWorker
65
- # include Sidekiq::Worker
66
- # include Sidekiq::Throttled::Worker
67
- #
68
- # sidekiq_throttle({
69
- # :threshold => { :limit => 123, :period => 1.hour },
70
- # :concurrency => { :limit => 10 }
71
- # })
72
- # end
73
- #
74
- # @see Registry.add
75
- # @return [void]
76
- def sidekiq_throttle(**kwargs)
77
- Registry.add(self, **kwargs)
78
- end
79
-
80
- # Adds current worker to preconfigured throttling strategy. Allows
81
- # sharing same pool for multiple workers.
82
- #
83
- # First of all we need to create shared throttling strategy:
84
- #
85
- # # Create google_api throttling strategy
86
- # Sidekiq::Throttled::Registry.add(:google_api, {
87
- # :threshold => { :limit => 123, :period => 1.hour },
88
- # :concurrency => { :limit => 10 }
89
- # })
90
- #
91
- # Now we can assign it to our workers:
92
- #
93
- # class FetchProfileJob
94
- # include Sidekiq::Worker
95
- # include Sidekiq::Throttled::Worker
96
- #
97
- # sidekiq_throttle_as :google_api
98
- # end
99
- #
100
- # class FetchCommentsJob
101
- # include Sidekiq::Worker
102
- # include Sidekiq::Throttled::Worker
103
- #
104
- # sidekiq_throttle_as :google_api
105
- # end
106
- #
107
- # With the above configuration we ensure that there are maximum 10
108
- # concurrently running jobs of FetchProfileJob or FetchCommentsJob
109
- # allowed. And only 123 jobs of those are executed per hour.
110
- #
111
- # In other words, it will allow:
112
- #
113
- # - only `X` concurrent `FetchProfileJob`s
114
- # - max `XX` `FetchProfileJob` per hour
115
- # - only `Y` concurrent `FetchCommentsJob`s
116
- # - max `YY` `FetchCommentsJob` per hour
117
- #
118
- # Where `(X + Y) == 10` and `(XX + YY) == 123`
119
- #
120
- # @see Registry.add_alias
121
- # @return [void]
122
- def sidekiq_throttle_as(name)
123
- Registry.add_alias(self, name)
124
- end
125
- end
126
- end
7
+ # A new module, Sidekiq::Job, was added in Sidekiq version 6.3.0 as a
8
+ # simple alias for Sidekiq::Worker as the term "worker" was considered
9
+ # too generic and confusing. Many people call a Sidekiq process a "worker"
10
+ # whereas others call the thread that executes jobs a "worker".
11
+ Worker = Job
127
12
  end
128
13
  end
@@ -9,6 +9,7 @@ require "sidekiq/throttled/communicator"
9
9
  require "sidekiq/throttled/configuration"
10
10
  require "sidekiq/throttled/queues_pauser"
11
11
  require "sidekiq/throttled/registry"
12
+ require "sidekiq/throttled/job"
12
13
  require "sidekiq/throttled/worker"
13
14
  require "sidekiq/throttled/utils"
14
15
 
@@ -21,12 +22,12 @@ module Sidekiq
21
22
  # require "sidekiq/throttled"
22
23
  # Sidekiq::Throttled.setup!
23
24
  #
24
- # Once you've done that you can include {Sidekiq::Throttled::Worker} to your
25
+ # Once you've done that you can include {Sidekiq::Throttled::Job} to your
25
26
  # job classes and configure throttling:
26
27
  #
27
- # class MyWorker
28
- # include Sidekiq::Worker
29
- # include Sidekiq::Throttled::Worker
28
+ # class MyJob
29
+ # include Sidekiq::Job
30
+ # include Sidekiq::Throttled::Job
30
31
  #
31
32
  # sidekiq_options :queue => :my_queue
32
33
  #
@@ -61,7 +62,7 @@ module Sidekiq
61
62
  QueuesPauser.instance.setup!
62
63
 
63
64
  Sidekiq.configure_server do |config|
64
- setup_strategy!
65
+ setup_strategy!(config)
65
66
 
66
67
  require "sidekiq/throttled/middleware"
67
68
  config.server_middleware do |chain|
@@ -76,7 +77,7 @@ module Sidekiq
76
77
  # @return [Boolean]
77
78
  def throttled?(message)
78
79
  message = JSON.parse message
79
- job = message.fetch("class") { return false }
80
+ job = message.fetch("wrapped") { message.fetch("class") { return false } }
80
81
  jid = message.fetch("jid") { return false }
81
82
 
82
83
  preload_constant! job
@@ -93,16 +94,13 @@ module Sidekiq
93
94
  private
94
95
 
95
96
  # @return [void]
96
- def setup_strategy!
97
+ def setup_strategy!(sidekiq_config)
97
98
  require "sidekiq/throttled/fetch"
98
99
 
99
- # https://github.com/mperham/sidekiq/commit/fce05c9d4b4c0411c982078a4cf3a63f20f739bc
100
- Sidekiq.options[:fetch] =
101
- if Gem::Version.new(Sidekiq::VERSION) < Gem::Version.new("6.1.0")
102
- Sidekiq::Throttled::Fetch
103
- else
104
- Sidekiq::Throttled::Fetch.new(Sidekiq.options)
105
- end
100
+ # https://github.com/mperham/sidekiq/commit/67daa7a408b214d593100f782271ed108686c147
101
+ sidekiq_config = sidekiq_config.options if Gem::Version.new(Sidekiq::VERSION) < Gem::Version.new("6.5.0")
102
+
103
+ sidekiq_config[:fetch] = Sidekiq::Throttled::Fetch.new(sidekiq_config)
106
104
  end
107
105
 
108
106
  # Tries to preload constant by it's name once.
File without changes
File without changes
File without changes
File without changes
@@ -1,3 +1,3 @@
1
1
  RSpec/ExampleLength:
2
2
  Enabled: true
3
- Max: 10
3
+ Max: 15
File without changes
@@ -8,27 +8,29 @@ require "sidekiq/throttled/version"
8
8
  Gem::Specification.new do |spec|
9
9
  spec.name = "sidekiq-throttled"
10
10
  spec.version = Sidekiq::Throttled::VERSION
11
- spec.authors = ["Alexey V Zapparov"]
12
- spec.email = ["ixti@member.fsf.org"]
11
+ spec.authors = ["Alexey Zapparov"]
12
+ spec.email = ["alexey@zapparov.com"]
13
13
 
14
14
  spec.summary = "Concurrency and threshold throttling for Sidekiq."
15
15
  spec.description = "Concurrency and threshold throttling for Sidekiq."
16
- spec.homepage = "https://github.com/sensortower/sidekiq-throttled"
16
+ spec.homepage = "https://github.com/ixti/sidekiq-throttled"
17
17
  spec.license = "MIT"
18
18
 
19
19
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
20
  f.match %r{^(test|spec|features)/}
21
21
  end
22
22
 
23
+ spec.metadata["rubygems_mfa_required"] = "true"
24
+
23
25
  spec.bindir = "exe"
24
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
27
  spec.require_paths = ["lib"]
26
28
 
27
- spec.required_ruby_version = ">= 2.6"
29
+ spec.required_ruby_version = ">= 2.7"
28
30
 
29
31
  spec.add_runtime_dependency "concurrent-ruby"
30
32
  spec.add_runtime_dependency "redis-prescription"
31
- spec.add_runtime_dependency "sidekiq"
33
+ spec.add_runtime_dependency "sidekiq", ">= 6.4"
32
34
 
33
35
  spec.add_development_dependency "bundler", ">= 2.0"
34
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-throttled
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.17.0
5
5
  platform: ruby
6
6
  authors:
7
- - Alexey V Zapparov
7
+ - Alexey Zapparov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-16 00:00:00.000000000 Z
11
+ date: 2022-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '6.4'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '6.4'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -68,22 +68,17 @@ dependencies:
68
68
  version: '2.0'
69
69
  description: Concurrency and threshold throttling for Sidekiq.
70
70
  email:
71
- - ixti@member.fsf.org
71
+ - alexey@zapparov.com
72
72
  executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
76
  - ".coveralls.yml"
77
+ - ".github/dependabot.yml"
77
78
  - ".github/workflows/ci.yml"
78
79
  - ".gitignore"
79
80
  - ".rspec"
80
81
  - ".rubocop.yml"
81
- - ".rubocop/layout.yml"
82
- - ".rubocop/lint.yml"
83
- - ".rubocop/metrics.yml"
84
- - ".rubocop/performance.yml"
85
- - ".rubocop/rspec.yml"
86
- - ".rubocop/style.yml"
87
82
  - ".rubocop_todo.yml"
88
83
  - ".travis.yml"
89
84
  - ".yardopts"
@@ -94,22 +89,19 @@ files:
94
89
  - LICENSE.md
95
90
  - README.md
96
91
  - Rakefile
97
- - gemfiles/sidekiq_5.0.gemfile
98
- - gemfiles/sidekiq_5.1.gemfile
99
- - gemfiles/sidekiq_5.2.gemfile
100
- - gemfiles/sidekiq_6.0.gemfile
101
- - gemfiles/sidekiq_6.1.gemfile
102
- - gemfiles/sidekiq_6.2.gemfile
103
- - gemfiles/sidekiq_6.3.gemfile
92
+ - gemfiles/sidekiq_6.4.gemfile
93
+ - gemfiles/sidekiq_6.5.gemfile
104
94
  - lib/sidekiq/throttled.rb
105
95
  - lib/sidekiq/throttled/communicator.rb
106
96
  - lib/sidekiq/throttled/communicator/callbacks.rb
97
+ - lib/sidekiq/throttled/communicator/exception_handler.rb
107
98
  - lib/sidekiq/throttled/communicator/listener.rb
108
99
  - lib/sidekiq/throttled/configuration.rb
109
100
  - lib/sidekiq/throttled/errors.rb
110
101
  - lib/sidekiq/throttled/expirable_list.rb
111
102
  - lib/sidekiq/throttled/fetch.rb
112
103
  - lib/sidekiq/throttled/fetch/unit_of_work.rb
104
+ - lib/sidekiq/throttled/job.rb
113
105
  - lib/sidekiq/throttled/middleware.rb
114
106
  - lib/sidekiq/throttled/patches/queue.rb
115
107
  - lib/sidekiq/throttled/queue_name.rb
@@ -132,11 +124,18 @@ files:
132
124
  - lib/sidekiq/throttled/web/summary_fix.rb
133
125
  - lib/sidekiq/throttled/web/throttled.html.erb
134
126
  - lib/sidekiq/throttled/worker.rb
127
+ - rubocop/layout.yml
128
+ - rubocop/lint.yml
129
+ - rubocop/metrics.yml
130
+ - rubocop/performance.yml
131
+ - rubocop/rspec.yml
132
+ - rubocop/style.yml
135
133
  - sidekiq-throttled.gemspec
136
- homepage: https://github.com/sensortower/sidekiq-throttled
134
+ homepage: https://github.com/ixti/sidekiq-throttled
137
135
  licenses:
138
136
  - MIT
139
- metadata: {}
137
+ metadata:
138
+ rubygems_mfa_required: 'true'
140
139
  post_install_message:
141
140
  rdoc_options: []
142
141
  require_paths:
@@ -145,14 +144,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
145
144
  requirements:
146
145
  - - ">="
147
146
  - !ruby/object:Gem::Version
148
- version: '2.6'
147
+ version: '2.7'
149
148
  required_rubygems_version: !ruby/object:Gem::Requirement
150
149
  requirements:
151
150
  - - ">="
152
151
  - !ruby/object:Gem::Version
153
152
  version: '0'
154
153
  requirements: []
155
- rubygems_version: 3.2.22
154
+ rubygems_version: 3.2.33
156
155
  signing_key:
157
156
  specification_version: 4
158
157
  summary: Concurrency and threshold throttling for Sidekiq.
@@ -1,31 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "appraisal"
6
- gem "rake"
7
- gem "rspec"
8
- gem "rubocop", "~> 0.90.0", require: false
9
- gem "rubocop-performance", "~> 1.8.0", require: false
10
- gem "rubocop-rspec", "~> 1.43.2", require: false
11
- gem "sidekiq", "~> 5.0.0"
12
-
13
- group :development do
14
- gem "byebug"
15
- gem "guard", require: false
16
- gem "guard-rspec", require: false
17
- gem "guard-rubocop", require: false
18
- end
19
-
20
- group :test do
21
- gem "apparition"
22
- gem "capybara"
23
- gem "coveralls", require: false
24
- gem "puma"
25
- gem "rack-test"
26
- gem "simplecov"
27
- gem "sinatra"
28
- gem "timecop"
29
- end
30
-
31
- gemspec path: "../"
@@ -1,31 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "appraisal"
6
- gem "rake"
7
- gem "rspec"
8
- gem "rubocop", "~> 0.90.0", require: false
9
- gem "rubocop-performance", "~> 1.8.0", require: false
10
- gem "rubocop-rspec", "~> 1.43.2", require: false
11
- gem "sidekiq", "~> 6.0.0"
12
-
13
- group :development do
14
- gem "byebug"
15
- gem "guard", require: false
16
- gem "guard-rspec", require: false
17
- gem "guard-rubocop", require: false
18
- end
19
-
20
- group :test do
21
- gem "apparition"
22
- gem "capybara"
23
- gem "coveralls", require: false
24
- gem "puma"
25
- gem "rack-test"
26
- gem "simplecov"
27
- gem "sinatra"
28
- gem "timecop"
29
- end
30
-
31
- gemspec path: "../"