sidekiq-throttled 0.1.0 → 0.2.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
  SHA1:
3
- metadata.gz: 76a708f284e2c4b3c3a65477f8893420854aeca4
4
- data.tar.gz: 8c5c83a1d64063af01170067819bf167fe710bfe
3
+ metadata.gz: 8d035a47cfda4397f044828ef34ce2adfba25f4a
4
+ data.tar.gz: d41409aa677dd84626738d1f3860d39acd951d72
5
5
  SHA512:
6
- metadata.gz: 6e703df521b67bccb01d0e022dd83376ac6d9cd68d57e7603f36212b7e8969a0128e5119df0e6224c9da813308a743e8ffb1302f44142adfc82b43b163c82978
7
- data.tar.gz: b0b142ad1f692d962c7ffa63027c309350d5c0258a05d5b9cb1adcc2eb1a491244d0d9dd1191ef1348ed2930f020a1f6a66bc902ff6ab4bd2814c0b98a30233e
6
+ metadata.gz: f313f44d9f897fffc7bb1c3e503fdac7f6884bd3733eab89ede741a208b071207d7c7e09854fa631a00a0fde7308a6ba1753f8953211c66a55b3d53bfdac6342
7
+ data.tar.gz: 01f919a66399826c5e67f05b44e86d5440e5e63b6565b5cada2980a12d24f27e296d8d10f76ec4cd1d575e927d84666afa22066eb69d7c49d76374b3cd59cae8
data/.rubocop.yml CHANGED
@@ -18,6 +18,9 @@ Style/EmptyLineBetweenDefs:
18
18
  Style/Encoding:
19
19
  EnforcedStyle: when_needed
20
20
 
21
+ Style/FrozenStringLiteralComment:
22
+ EnforcedStyle: always
23
+
21
24
  Style/HashSyntax:
22
25
  EnforcedStyle: hash_rockets
23
26
 
@@ -34,8 +37,7 @@ Style/MultilineOperationIndentation:
34
37
  # IMHO `%r{foo/bar}` looks way more cleaner than `/foo\/bar/`.
35
38
  # Enabling this cop also makes Guardfile (which is full of pathname regexps)
36
39
  # look absolutley (style) inconsistent and terrible. Thus it should be on
37
- # developer's choice whenever to user `%r` or not. Just like we don't enforce
38
- # to use `["foo"]` over `%w(foo)` and so on.
40
+ # developer's choice whenever to user `%r` or not.
39
41
  Style/RegexpLiteral:
40
42
  Enabled: false
41
43
 
@@ -45,7 +47,7 @@ Style/RegexpLiteral:
45
47
  # conn.hset :k1, now
46
48
  # conn.hincrby :k2, 123
47
49
  # end
48
- Style/SingleSpaceBeforeFirstArg:
50
+ Style/SpaceBeforeFirstArg:
49
51
  Enabled: false
50
52
 
51
53
  Style/StringLiterals:
data/.travis.yml CHANGED
@@ -1,4 +1,25 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.6
4
- before_install: gem install bundler -v 1.10.6
3
+ - 2.0
4
+ - 2.1
5
+ - 2.2
6
+ - 2.3.0
7
+ - ruby-head
8
+ - jruby-9.0.0.0
9
+ - jruby-9.0.1.0
10
+ - jruby-head
11
+ - ruby-head
12
+ - rbx-2
13
+ matrix:
14
+ allow_failures:
15
+ - rvm: jruby-9.0.0.0
16
+ - rvm: jruby-9.0.1.0
17
+ - rvm: jruby-head
18
+ - rvm: ruby-head
19
+ - rvm: rbx-2
20
+ fast_finish: true
21
+ before_install:
22
+ - gem install bundler -v 1.10.6
23
+ services:
24
+ - redis-server
25
+ sudo: false
data/CHANGES.md ADDED
@@ -0,0 +1,14 @@
1
+ ## 0.2.0 (2016-02-29)
2
+
3
+ * [#6](https://github.com/sensortower/sidekiq-throttled/pull/6):
4
+ Add dynamic key suffix functionality.
5
+ ([@fhwang])
6
+
7
+
8
+ ## 0.1.0 (2015-11-03)
9
+
10
+ * Initial release.
11
+
12
+
13
+ [@ixti]: https://github.com/ixti
14
+ [@fhwang]: https://github.com/fhwang
data/Gemfile CHANGED
@@ -1,4 +1,15 @@
1
+ # frozen_string_literal: true
1
2
  source "https://rubygems.org"
2
3
 
4
+ group :test do
5
+ gem "coveralls"
6
+ gem "rack-test"
7
+ gem "rspec"
8
+ gem "rubocop"
9
+ gem "simplecov", ">= 0.9"
10
+ gem "sinatra", "~> 1.4", ">= 1.4.6"
11
+ gem "timecop"
12
+ end
13
+
3
14
  # Specify your gem's dependencies in sidekiq-throttled.gemspec
4
15
  gemspec
data/README.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Sidekiq::Throttled
2
2
 
3
- Concurrency and threshold throttling for Sidekiq.
3
+ [![Gem Version](https://badge.fury.io/rb/sidekiq-throttled.svg)](http://rubygems.org/gems/sidekiq-throttled)
4
+ [![Build Status](https://travis-ci.org/sensortower/sidekiq-throttled.svg?branch=master)](https://travis-ci.org/sensortower/sidekiq-throttled)
5
+ [![Code Climate](https://codeclimate.com/github/sensortower/sidekiq-throttled.svg?branch=master)](https://codeclimate.com/github/sensortower/sidekiq-throttled)
6
+ [![Coverage Status](https://coveralls.io/repos/sensortower/sidekiq-throttled/badge.svg?branch=master&service=github)](https://coveralls.io/github/sensortower/sidekiq-throttled?branch=master)
7
+
8
+ Concurrency and threshold throttling for [Sidekiq](https://github.com/mperham/sidekiq/).
4
9
 
5
10
 
6
11
  ## Installation
@@ -58,6 +63,42 @@ end
58
63
  ```
59
64
 
60
65
 
66
+ ### Dynamic throttling
67
+
68
+ You can throttle jobs dynamically with `:key_suffix` option:
69
+
70
+ ``` ruby
71
+ class MyWorker
72
+ include Sidekiq::Worker
73
+ include Sidekiq::Throttled::Worker
74
+
75
+ sidekiq_options :queue => :my_queue
76
+
77
+ sidekiq_throttle({
78
+ # Allow maximum 10 concurrent jobs per user at a time.
79
+ :concurrency => { :limit => 10, :key_suffix => -> (user_id) { user_id } }
80
+ })
81
+
82
+ def perform(user_id)
83
+ # ...
84
+ end
85
+ end
86
+ ```
87
+
88
+
89
+ ## Supported Ruby Versions
90
+
91
+ This library aims to support and is [tested against][travis] the following Ruby
92
+ versions:
93
+
94
+ * Ruby 2.0.0
95
+ * Ruby 2.1.x
96
+ * Ruby 2.2.x
97
+ * Ruby 2.3.0
98
+
99
+ [travis]: http://travis-ci.org/sensortower/sidekiq-throttled
100
+
101
+
61
102
  ## Contributing
62
103
 
63
104
  * Fork sidekiq-throttled on GitHub
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "bundler/gem_tasks"
2
3
 
3
4
  require "rspec/core/rake_task"
data/bin/setup CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/bin/bash
2
+
2
3
  set -euo pipefail
3
4
  IFS=$'\n\t'
4
5
 
5
6
  bundle install
6
-
7
- # Do any other automated setup that you need to do here
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # 3rd party
2
3
  require "sidekiq"
3
4
 
@@ -60,7 +61,7 @@ module Sidekiq
60
61
  jid = message.fetch("jid".freeze) { return false }
61
62
 
62
63
  Registry.get job do |strategy|
63
- return strategy.throttled? jid
64
+ return strategy.throttled?(jid, *message["args"])
64
65
  end
65
66
 
66
67
  false
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # stdlib
2
3
  require "thread"
3
4
 
@@ -39,11 +40,11 @@ module Sidekiq
39
40
  # Tries to pop pair of `queue` and job `message` out of sidekiq queue.
40
41
  # @return [Array<String, String>, nil]
41
42
  def brpop
42
- if @strictly_ordered_queues
43
- queues = @unique_queues.dup
44
- else
45
- queues = @queues.shuffle.uniq
46
- end
43
+ queues = if @strictly_ordered_queues
44
+ @unique_queues.dup
45
+ else
46
+ @queues.shuffle.uniq
47
+ end
47
48
 
48
49
  @mutex.synchronize do
49
50
  next if @suspended.empty?
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Sidekiq
2
3
  module Throttled
3
4
  # Generic class for Sidekiq::Throttled errors
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # internal
2
3
  require "sidekiq/throttled/registry"
3
4
 
@@ -11,7 +12,7 @@ module Sidekiq
11
12
  yield
12
13
  ensure
13
14
  Registry.get msg["class".freeze] do |strategy|
14
- strategy.finalize! msg["jid".freeze]
15
+ strategy.finalize!(msg["jid".freeze], *msg["args"])
15
16
  end
16
17
  end
17
18
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # internal
2
3
  require "sidekiq/throttled/strategy"
3
4
 
@@ -34,7 +35,7 @@ module Sidekiq
34
35
  old_name = old_name.to_s
35
36
 
36
37
  warn "Duplicate strategy name: #{new_name}" if @strategies[new_name]
37
- fail "Strategy not found: #{old_name}" unless @strategies[old_name]
38
+ raise "Strategy not found: #{old_name}" unless @strategies[old_name]
38
39
 
39
40
  @aliases[new_name] = @strategies[old_name]
40
41
  end
@@ -67,6 +68,21 @@ module Sidekiq
67
68
  @strategies.each { |*args| yield(*args) }
68
69
  self
69
70
  end
71
+
72
+ # @overload each_with_static_keys()
73
+ # @return [Enumerator]
74
+ #
75
+ # @overload each_with_static_keys(&block)
76
+ # @yieldparam [String] name
77
+ # @yieldparam [Strategy] strategy
78
+ # @yield [strategy] Gives strategy to the block
79
+ # @return [Registry]
80
+ def each_with_static_keys
81
+ return to_enum(__method__) unless block_given?
82
+ @strategies.each do |name, strategy|
83
+ yield(name, strategy) unless strategy.dynamic_keys?
84
+ end
85
+ end
70
86
  end
71
87
  end
72
88
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # internal
2
3
  require "sidekiq/throttled/errors"
3
4
  require "sidekiq/throttled/strategy/concurrency"
@@ -15,28 +16,42 @@ module Sidekiq
15
16
  # @return [Strategy::Threshold, nil]
16
17
  attr_reader :threshold
17
18
 
18
- # @param [#to_s] key
19
+ # @param [#to_s] name
19
20
  # @param [Hash] concurrency Concurrency options.
20
21
  # See {Strategy::Concurrency#initialize} for details.
21
22
  # @param [Hash] threshold Threshold options.
22
23
  # See {Strategy::Threshold#initialize} for details.
23
- def initialize(key, concurrency: nil, threshold: nil)
24
- base_key = "throttled:#{key}"
24
+ # @param [Hash] key_suffix Proc for dynamic keys.
25
+ def initialize(name, concurrency: nil, threshold: nil, key_suffix: nil)
26
+ key = "throttled:#{name}"
25
27
 
26
- @concurrency = concurrency && Concurrency.new(base_key, concurrency)
27
- @threshold = threshold && Threshold.new(base_key, threshold)
28
+ if concurrency
29
+ @concurrency = Concurrency.new(
30
+ key, concurrency.merge(:key_suffix => key_suffix)
31
+ )
32
+ end
33
+ if threshold
34
+ @threshold = Threshold.new(
35
+ key, threshold.merge(:key_suffix => key_suffix)
36
+ )
37
+ end
28
38
 
29
39
  return if @concurrency || @threshold
30
40
 
31
- fail ArgumentError, "Neither :concurrency nor :threshold given"
41
+ raise ArgumentError, "Neither :concurrency nor :threshold given"
42
+ end
43
+
44
+ def dynamic_keys?
45
+ (@concurrency && @concurrency.dynamic_keys?) ||
46
+ (@threshold && @threshold.dynamic_keys?)
32
47
  end
33
48
 
34
49
  # @return [Boolean] whenever job is throttled or not.
35
- def throttled?(jid)
36
- return true if @concurrency && @concurrency.throttled?(jid)
50
+ def throttled?(jid, *job_args)
51
+ return true if @concurrency && @concurrency.throttled?(jid, *job_args)
37
52
 
38
- if @threshold && @threshold.throttled?
39
- finalize! jid
53
+ if @threshold && @threshold.throttled?(*job_args)
54
+ finalize!(jid, *job_args)
40
55
  return true
41
56
  end
42
57
 
@@ -45,8 +60,8 @@ module Sidekiq
45
60
 
46
61
  # Marks job as being processed.
47
62
  # @return [void]
48
- def finalize!(jid)
49
- @concurrency && @concurrency.finalize!(jid)
63
+ def finalize!(jid, *job_args)
64
+ @concurrency && @concurrency.finalize!(jid, *job_args)
50
65
  end
51
66
 
52
67
  # Resets count of jobs of all avaliable strategies
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # internal
2
3
  require "sidekiq/throttled/strategy/script"
3
4
 
@@ -20,38 +21,52 @@ module Sidekiq
20
21
  # @return [Integer] Amount of allwoed concurrent job processors
21
22
  attr_reader :limit
22
23
 
23
- # @param [#to_s] base_key
24
+ # @param [#to_s] strategy_key
24
25
  # @param [Hash] opts
25
26
  # @option opts [#to_i] :limit Amount of allwoed concurrent jobs
26
27
  # processors running for given key
27
- # @option opts [#to_i] :ttl (15.minutes) Concurrency lock TTL
28
- def initialize(base_key, opts)
29
- @key = "#{base_key}:concurrency".freeze
30
- @keys = [@key]
28
+ # @option opts [#to_i] :ttl (15 minutes) Concurrency lock TTL
29
+ # in seconds
30
+ # @option opts :key_suffix Proc for dynamic key suffix.
31
+ def initialize(strategy_key, opts)
32
+ @base_key = "#{strategy_key}:concurrency".freeze
31
33
  @limit = opts.fetch(:limit).to_i
32
- @ttl = opts.fetch(:ttl, 900).to_i
34
+ @ttl = opts.fetch(:ttl, 900).to_i
35
+ @key_suffix = opts[:key_suffix]
36
+ end
37
+
38
+ def dynamic_keys?
39
+ @key_suffix
33
40
  end
34
41
 
35
42
  # @return [Boolean] whenever job is throttled or not
36
- def throttled?(jid)
37
- 1 == SCRIPT.eval(@keys, [@limit, @ttl, jid.to_s])
43
+ def throttled?(jid, *job_args)
44
+ 1 == SCRIPT.eval([key(job_args)], [@limit, @ttl, jid.to_s])
38
45
  end
39
46
 
40
47
  # @return [Integer] Current count of jobs
41
- def count
42
- Sidekiq.redis { |conn| conn.scard(@key) }.to_i
48
+ def count(*job_args)
49
+ Sidekiq.redis { |conn| conn.scard(key(job_args)) }.to_i
43
50
  end
44
51
 
45
52
  # Resets count of jobs
46
53
  # @return [void]
47
- def reset!
48
- Sidekiq.redis { |conn| conn.del(@key) }.to_i
54
+ def reset!(*job_args)
55
+ Sidekiq.redis { |conn| conn.del(key(job_args)) }.to_i
49
56
  end
50
57
 
51
58
  # Remove jid from the pool of jobs in progress
52
59
  # @return [void]
53
- def finalize!(jid)
54
- Sidekiq.redis { |conn| conn.srem(@key, jid.to_s) }
60
+ def finalize!(jid, *job_args)
61
+ Sidekiq.redis { |conn| conn.srem(key(job_args), jid.to_s) }
62
+ end
63
+
64
+ private
65
+
66
+ def key(job_args)
67
+ key = @base_key.dup
68
+ key << ":#{@key_suffix.call(*job_args)}" if @key_suffix
69
+ key
55
70
  end
56
71
  end
57
72
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Sidekiq
2
3
  module Throttled
3
4
  class Strategy
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # internal
2
3
  require "sidekiq/throttled/strategy/script"
3
4
 
@@ -36,31 +37,43 @@ module Sidekiq
36
37
  # @return [Float] Period in seconds
37
38
  attr_reader :period
38
39
 
39
- # @param [#to_s] base_key
40
+ # @param [#to_s] strategy_key
40
41
  # @param [Hash] opts
41
42
  # @option opts [#to_i] :limit Amount of jobs allowed per period
42
43
  # @option opts [#to_f] :period Period in seconds
43
- def initialize(base_key, opts)
44
- @key = "#{base_key}:threshold".freeze
45
- @keys = [@key]
44
+ def initialize(strategy_key, opts)
45
+ @base_key = "#{strategy_key}:threshold".freeze
46
46
  @limit = opts.fetch(:limit).to_i
47
47
  @period = opts.fetch(:period).to_f
48
+ @key_suffix = opts[:key_suffix]
49
+ end
50
+
51
+ def dynamic_keys?
52
+ @key_suffix
48
53
  end
49
54
 
50
55
  # @return [Boolean] whenever job is throttled or not
51
- def throttled?
52
- 1 == SCRIPT.eval(@keys, [@limit, @period, Time.now.to_f])
56
+ def throttled?(*job_args)
57
+ 1 == SCRIPT.eval([key(job_args)], [@limit, @period, Time.now.to_f])
53
58
  end
54
59
 
55
60
  # @return [Integer] Current count of jobs
56
- def count
57
- Sidekiq.redis { |conn| conn.llen(@key) }.to_i
61
+ def count(*job_args)
62
+ Sidekiq.redis { |conn| conn.llen(key(job_args)) }.to_i
58
63
  end
59
64
 
60
65
  # Resets count of jobs
61
66
  # @return [void]
62
- def reset!
63
- Sidekiq.redis { |conn| conn.del(@key) }
67
+ def reset!(*job_args)
68
+ Sidekiq.redis { |conn| conn.del(key(job_args)) }
69
+ end
70
+
71
+ private
72
+
73
+ def key(job_args)
74
+ key = @base_key.dup
75
+ key << ":#{@key_suffix.call(*job_args)}" if @key_suffix
76
+ key
64
77
  end
65
78
  end
66
79
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "sidekiq/throttled/registry"
2
3
 
3
4
  RSpec.configure do |config|
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  module Sidekiq
2
3
  module Throttled
3
4
  # Gem version
4
- VERSION = "0.1.0".freeze
5
+ VERSION = "0.2.0".freeze
5
6
  end
6
7
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # stdlib
2
3
  require "pathname"
3
4
 
@@ -16,7 +16,7 @@
16
16
  </tr>
17
17
  </thead>
18
18
  <tbody>
19
- <% Sidekiq::Throttled::Registry.each do |name, strategy| %>
19
+ <% Sidekiq::Throttled::Registry.each_with_static_keys do |name, strategy| %>
20
20
  <tr>
21
21
  <td style="vertical-align:middle;"><%= name %></td>
22
22
  <td style="vertical-align:middle;text-align:center;">
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Sidekiq
2
3
  module Throttled
3
4
  module Web
@@ -13,6 +14,9 @@ module Sidekiq
13
14
 
14
15
  # @param [Strategy::Concurrency, Strategy::Threshold] strategy
15
16
  def initialize(strategy)
17
+ if strategy && strategy.dynamic_keys?
18
+ raise ArgumentError, "Can't handle strategies with dynamic keys"
19
+ end
16
20
  @strategy = strategy
17
21
  end
18
22
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # internal
2
3
  require "sidekiq/throttled/registry"
3
4
 
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  lib = File.expand_path("../lib", __FILE__)
4
5
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
@@ -16,8 +17,9 @@ Gem::Specification.new do |spec|
16
17
  spec.homepage = "https://github.com/sensortower/sidekiq-throttled"
17
18
  spec.license = "MIT"
18
19
 
19
- spec.files = `git ls-files -z`.split("\x0")
20
- .reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
21
+ f.match %r{^(test|spec|features)/}
22
+ end
21
23
 
22
24
  spec.bindir = "exe"
23
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
@@ -27,9 +29,4 @@ Gem::Specification.new do |spec|
27
29
 
28
30
  spec.add_development_dependency "bundler", "~> 1.10"
29
31
  spec.add_development_dependency "rake", "~> 10.0"
30
- spec.add_development_dependency "rspec"
31
- spec.add_development_dependency "timecop"
32
- spec.add_development_dependency "rubocop"
33
- spec.add_development_dependency "rack-test"
34
- spec.add_development_dependency "sinatra", "~> 1.4", ">= 1.4.6"
35
32
  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.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey V Zapparov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-11-03 00:00:00.000000000 Z
11
+ date: 2016-02-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -52,82 +52,6 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10.0'
55
- - !ruby/object:Gem::Dependency
56
- name: rspec
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: timecop
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop
85
- requirement: !ruby/object:Gem::Requirement
86
- 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: rack-test
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: sinatra
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '1.4'
118
- - - ">="
119
- - !ruby/object:Gem::Version
120
- version: 1.4.6
121
- type: :development
122
- prerelease: false
123
- version_requirements: !ruby/object:Gem::Requirement
124
- requirements:
125
- - - "~>"
126
- - !ruby/object:Gem::Version
127
- version: '1.4'
128
- - - ">="
129
- - !ruby/object:Gem::Version
130
- version: 1.4.6
131
55
  description: Concurrency and threshold throttling for Sidekiq.
132
56
  email:
133
57
  - ixti@member.fsf.org
@@ -140,11 +64,11 @@ files:
140
64
  - ".rubocop.yml"
141
65
  - ".travis.yml"
142
66
  - ".yardopts"
67
+ - CHANGES.md
143
68
  - Gemfile
144
69
  - LICENSE.md
145
70
  - README.md
146
71
  - Rakefile
147
- - bin/console
148
72
  - bin/setup
149
73
  - lib/sidekiq/throttled.rb
150
74
  - lib/sidekiq/throttled/basic_fetch.rb
@@ -184,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
108
  version: '0'
185
109
  requirements: []
186
110
  rubyforge_project:
187
- rubygems_version: 2.2.3
111
+ rubygems_version: 2.5.1
188
112
  signing_key:
189
113
  specification_version: 4
190
114
  summary: Concurrency and threshold throttling for Sidekiq.
data/bin/console DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "sidekiq/throttled"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start