sidekiq-unique-jobs 2.3.2 → 2.6.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sidekiq-unique-jobs might be problematic. Click here for more details.

@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 668f0e7f7a11db5e1ebf8e1d85943911b18c044e
4
+ data.tar.gz: 337c9f52503823719953a55a38fcae0f8f17a6d5
5
+ SHA512:
6
+ metadata.gz: c0e0c720b227b5eb4b574aaf6064bf27f97e6e79faa253287df3d012bad2248ed098e341379cf9a34f20ba5f744e4f9bdd1dd3dcac79afd995644ce8be185311
7
+ data.tar.gz: 5a14117bed073f1e222eb44ee86591ce82dcb4660723bca1a138cfc9f45d9e208b47fafc5d454f29ec23d5756933487a83e6471dd6589590b21bb4241d56135f
data/.gitignore CHANGED
@@ -4,3 +4,5 @@
4
4
  .DS_Store
5
5
 
6
6
  Gemfile.lock
7
+
8
+ .ruby-version
@@ -2,14 +2,17 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - jruby-19mode
5
+ - rbx-19mode
6
+ - 2.0.0
5
7
  branches:
6
8
  only:
7
9
  - master
8
- # notifications:
9
- # irc: "irc.freenode.org#sidekiq"
10
- # email:
11
- # recipients:
12
- # - sidekiq@librelist.org
10
+ notifications:
11
+ email:
12
+ recipients:
13
+ - mikael@zoolutions.se
13
14
  matrix:
14
15
  allow_failures:
15
- - rvm: jruby-19mode
16
+ - rvm: jruby-19mode
17
+ - rvm: rbx-19mode
18
+ - rvm: 2.0.0
@@ -1,3 +1,8 @@
1
+ ## v2.6.5
2
+ - via @sax - possibility to set which arguments should be counted as unique - https://github.com/form26/sidekiq-unique-jobs/pull/12
3
+ - via @eduardosasso - possibility to set which arguments should be counted as unique - https://github.com/form26/sidekiq-unique-jobs/pull/11
4
+ - via @KensoDev - configuration of default expiration - https://github.com/form26/sidekiq-unique-jobs/pull/9
5
+
1
6
  ## v2.1.0
2
7
 
3
8
  Extracted the unique jobs portion from sidekiq main repo since @mperham dropped support for it.
data/Gemfile CHANGED
@@ -1,14 +1,2 @@
1
1
  source 'http://rubygems.org'
2
- gemspec
3
-
4
- group :test do
5
- gem 'simplecov', :require => false
6
- end
7
-
8
- group :development do
9
- gem 'activesupport'
10
- gem 'pry'
11
- gem 'pry-doc'
12
- gem 'pry-stack_explorer'
13
- gem 'pry-debugger'
14
- end
2
+ gemspec
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # SidekiqUniqueJobs [![Build Status](https://secure.travis-ci.org/form26/sidekiq-unique-jobs.png)](http://travis-ci.org/form26/sidekiq-unique-jobs)
1
+ # SidekiqUniqueJobs [![Build Status](https://travis-ci.org/form26/sidekiq-unique-jobs.png?branch=master)](https://travis-ci.org/form26/sidekiq-unique-jobs)
2
2
 
3
3
  The missing unique jobs for sidekiq
4
4
 
@@ -32,6 +32,45 @@ sidekiq_options unique: true, unique_job_expiration: 120 * 60 # 2 hours
32
32
 
33
33
  Requiring the gem in your gemfile should be sufficient to enable unique jobs.
34
34
 
35
+ ### Finer Control over Uniqueness
36
+
37
+ Sometimes it is desired to have a finer control over which arguments are used in determining uniqueness of the job, and others may be _transient_. For this use-case, you need to
38
+ set `SidekiqUniqueJobs::Config.unique_args_enabled` to true in an initializer, and then defined either `unique_args` method, or a ruby proc.
39
+
40
+ ```ruby
41
+ SidekiqUniqueJobs::Config.unique_args_enabled = true
42
+ ```
43
+
44
+ The method or the proc can return a modified version of args without the transient arguments included, as shown below:
45
+
46
+ ```ruby
47
+ class UniqueJobWithFilterMethod
48
+ include Sidekiq::Worker
49
+ sidekiq_options unique: true,
50
+ unique_args: :unique_args
51
+
52
+ def self.unique_args(name, id, options)
53
+ [ name, options[:type] ]
54
+ end
55
+
56
+ ...
57
+
58
+ end
59
+
60
+ class UniqueJobWithFilterProc
61
+ include Sidekiq::Worker
62
+ sidekiq_options unique: true,
63
+ unique_args: ->(args) { [ args.first ] }
64
+
65
+ ...
66
+
67
+ end
68
+ ```
69
+
70
+ Note that objects passed into workers are converted to JSON *after* running through client middleware. In server
71
+ middleware, the JSON is passed directly to the worker `#perform` method. So, you may run into issues where the
72
+ arguments are different when enqueuing than they are when performing. Your `unique_args` method may need to
73
+ account for this.
35
74
 
36
75
  ## Contributing
37
76
 
@@ -40,3 +79,9 @@ Requiring the gem in your gemfile should be sufficient to enable unique jobs.
40
79
  3. Commit your changes (`git commit -am 'Add some feature'`)
41
80
  4. Push to the branch (`git push origin my-new-feature`)
42
81
  5. Create new Pull Request
82
+
83
+ ## Contributors
84
+
85
+ - @sax
86
+ - @eduardosasso
87
+ - @KensoDev
@@ -1,2 +1,11 @@
1
+ require 'yaml' if RUBY_VERSION.include?('2.0.0')
1
2
  require 'sidekiq-unique-jobs/middleware'
2
- require "sidekiq-unique-jobs/version"
3
+ require "sidekiq-unique-jobs/version"
4
+ require "sidekiq-unique-jobs/config"
5
+ require "sidekiq-unique-jobs/payload_helper"
6
+
7
+ module SidekiqUniqueJobs
8
+ def self.config
9
+ SidekiqUniqueJobs::Config
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ module SidekiqUniqueJobs
2
+ class Config
3
+ def self.unique_prefix=(prefix)
4
+ @unique_prefix = prefix
5
+ end
6
+
7
+ def self.unique_prefix
8
+ @unique_prefix || "sidekiq_unique"
9
+ end
10
+
11
+ def self.unique_args_enabled=(enabled)
12
+ @unique_args_enabled = enabled
13
+ end
14
+
15
+ def self.unique_args_enabled?
16
+ @unique_args_enabled || false
17
+ end
18
+
19
+ def self.default_expiration=(expiration)
20
+ @expiration = expiration
21
+ end
22
+
23
+ def self.default_expiration
24
+ @expiration || 30 * 60
25
+ end
26
+ end
27
+ end
@@ -5,6 +5,11 @@ Sidekiq.configure_server do |config|
5
5
  require 'sidekiq-unique-jobs/middleware/server/unique_jobs'
6
6
  chain.add SidekiqUniqueJobs::Middleware::Server::UniqueJobs
7
7
  end
8
+ config.client_middleware do |chain|
9
+ require 'sidekiq-unique-jobs/middleware/client/unique_jobs'
10
+ chain.add SidekiqUniqueJobs::Middleware::Client::UniqueJobs
11
+ end
12
+
8
13
  end
9
14
 
10
15
  Sidekiq.configure_client do |config|
@@ -4,17 +4,14 @@ module SidekiqUniqueJobs
4
4
  module Middleware
5
5
  module Client
6
6
  class UniqueJobs
7
- HASH_KEY_EXPIRATION = 30 * 60
8
-
9
7
  def call(worker_class, item, queue)
10
8
 
11
- enabled = worker_class.get_sidekiq_options['unique']
9
+ enabled = worker_class.get_sidekiq_options['unique'] || item['unique']
12
10
  unique_job_expiration = worker_class.get_sidekiq_options['unique_job_expiration']
13
11
 
14
12
  if enabled
15
13
 
16
- md5_arguments = {:class => item['class'], :queue => item['queue'], :args => item['args']}
17
- payload_hash = Digest::MD5.hexdigest(Sidekiq.dump_json(md5_arguments))
14
+ payload_hash = SidekiqUniqueJobs::PayloadHelper.get_payload(item['class'], item['queue'], item['args'])
18
15
 
19
16
  unique = false
20
17
 
@@ -25,7 +22,7 @@ module SidekiqUniqueJobs
25
22
  if conn.get(payload_hash)
26
23
  conn.unwatch
27
24
  else
28
- expires_at = unique_job_expiration || HASH_KEY_EXPIRATION
25
+ expires_at = unique_job_expiration || SidekiqUniqueJobs::Config.default_expiration
29
26
  expires_at = ((Time.at(item['at']) - Time.now.utc) + expires_at).to_i if item['at']
30
27
 
31
28
  unique = conn.multi do
@@ -5,14 +5,12 @@ module SidekiqUniqueJobs
5
5
  module Server
6
6
  class UniqueJobs
7
7
  def call(*args)
8
- logger.info("About to process a job with args #{args.inspect}")
9
8
  yield
10
- logger.info("Done processing a job with args #{args.inspect}")
11
9
  ensure
12
10
  item = args[1]
13
- md5_arguments = {:class => item['class'], :queue => item['queue'], :args => item['args']}
14
- hash = Digest::MD5.hexdigest(Sidekiq.dump_json(md5_arguments))
15
- Sidekiq.redis {|conn| conn.del(hash) }
11
+ payload_hash = SidekiqUniqueJobs::PayloadHelper.get_payload(item['class'], item['queue'], item['args'])
12
+
13
+ Sidekiq.redis {|conn| conn.del(payload_hash) }
16
14
  end
17
15
 
18
16
  protected
@@ -0,0 +1,25 @@
1
+ module SidekiqUniqueJobs
2
+ class PayloadHelper
3
+ def self.get_payload(klass, queue, *args)
4
+ args = yield_unique_args(klass, *args) if SidekiqUniqueJobs::Config.unique_args_enabled?
5
+ md5_arguments = {:class => klass, :queue => queue, :args => args}
6
+ "#{SidekiqUniqueJobs::Config.unique_prefix}:#{Digest::MD5.hexdigest(Sidekiq.dump_json(md5_arguments))}"
7
+ end
8
+
9
+ def self.yield_unique_args(klass, args)
10
+ worker_class = klass.constantize
11
+ unique_args = worker_class.get_sidekiq_options['unique_args']
12
+ filtered_args = if unique_args
13
+ case unique_args
14
+ when Proc
15
+ unique_args.call(args)
16
+ when Symbol
17
+ worker_class.send(unique_args, *args) if worker_class.respond_to?(unique_args)
18
+ end
19
+ end
20
+ filtered_args || args
21
+ rescue NameError # if we can't instantiate the class, we just fallback to not filtering args
22
+ args
23
+ end
24
+ end
25
+ end
@@ -1,3 +1,3 @@
1
1
  module SidekiqUniqueJobs
2
- VERSION = "2.3.2"
2
+ VERSION = "2.6.5"
3
3
  end
@@ -14,11 +14,11 @@ Gem::Specification.new do |gem|
14
14
  gem.name = "sidekiq-unique-jobs"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = SidekiqUniqueJobs::VERSION
17
- gem.add_dependency 'sidekiq', '>= 2.2.0'
17
+ gem.add_dependency 'sidekiq', '~> 2.6'
18
18
  gem.add_development_dependency 'minitest', '~> 3'
19
19
  gem.add_development_dependency 'sinatra'
20
20
  gem.add_development_dependency 'slim'
21
21
  gem.add_development_dependency 'rake'
22
- gem.add_development_dependency 'actionmailer', '~> 3'
23
- gem.add_development_dependency 'activerecord', '~> 3'
22
+ gem.add_development_dependency 'activesupport', '~> 3'
23
+ gem.add_development_dependency 'simplecov'
24
24
  end
@@ -3,7 +3,6 @@ if ENV.has_key?("SIMPLECOV")
3
3
  require 'simplecov'
4
4
  SimpleCov.start
5
5
  end
6
- require 'pry'
7
6
  require 'minitest/unit'
8
7
  require 'minitest/pride'
9
8
  require 'minitest/autorun'
@@ -0,0 +1,28 @@
1
+ require 'helper'
2
+ require 'sidekiq/worker'
3
+ require "sidekiq-unique-jobs"
4
+ require 'sidekiq/scheduled'
5
+ require 'sidekiq-unique-jobs/middleware/server/unique_jobs'
6
+
7
+ class AnotherTestClient < MiniTest::Unit::TestCase
8
+ describe 'with real redis' do
9
+ before do
10
+ Sidekiq.redis = REDIS
11
+ Sidekiq.redis {|c| c.flushdb }
12
+ QueueWorker.sidekiq_options :unique => nil, :unique_job_expiration => nil
13
+ end
14
+
15
+ class QueueWorker
16
+ include Sidekiq::Worker
17
+ sidekiq_options :queue => 'customqueue'
18
+ def perform(x)
19
+ end
20
+ end
21
+
22
+ it 'does not push duplicate messages when configured for unique only' do
23
+ QueueWorker.sidekiq_options :unique => true
24
+ 10.times { Sidekiq::Client.push('class' => TestClient::QueueWorker, 'queue' => 'customqueue', 'args' => [1, 2]) }
25
+ assert_equal 1, Sidekiq.redis {|c| c.llen("queue:customqueue") }
26
+ end
27
+ end
28
+ end
@@ -19,24 +19,9 @@ class TestClient < MiniTest::Unit::TestCase
19
19
  end
20
20
  end
21
21
 
22
- # This spec sometimes fails (unless it's the only spec that runs)
23
- # Not sure why, we tried a wide variety of ways to make sure that
24
- # there aren't side effects between tests and it still happens
25
- it 'is able to enqueue after the server middleware completes' do
26
- QueueWorker.sidekiq_options :unique => true
27
- request_item = {'class' => TestClient::QueueWorker, 'queue' => 'customqueue', 'args' => ["some arg"]}
28
-
29
- Sidekiq::Client.push(request_item.dup)
30
- assert_equal 1, Sidekiq.redis {|c| c.llen("queue:customqueue") }
31
-
32
- # Simulate sidekiq processing the job
33
- Sidekiq.redis {|c| c.lpop("queue:customqueue")}
34
- assert_equal 0, Sidekiq.redis {|c| c.llen("queue:customqueue") }
35
-
36
- SidekiqUniqueJobs::Middleware::Server::UniqueJobs.new.call("dummy arg", request_item.dup) {}
37
-
38
- Sidekiq::Client.push(request_item.dup)
39
- assert_equal 1, Sidekiq.redis {|c| c.llen("queue:customqueue") }
22
+ class PlainClass
23
+ def run(x)
24
+ end
40
25
  end
41
26
 
42
27
  it 'does not push duplicate messages when configured for unique only' do
@@ -45,13 +30,17 @@ class TestClient < MiniTest::Unit::TestCase
45
30
  assert_equal 1, Sidekiq.redis {|c| c.llen("queue:customqueue") }
46
31
  end
47
32
 
33
+ it 'does not queue duplicates when when calling delay' do
34
+ 10.times { PlainClass.delay(unique: true, queue: 'customqueue').run(1) }
35
+ assert_equal 1, Sidekiq.redis {|c| c.llen("queue:customqueue") }
36
+ end
37
+
48
38
  it 'sets an expiration when provided by sidekiq options' do
49
39
  one_hour_expiration = 60 * 60
50
40
  QueueWorker.sidekiq_options :unique => true, :unique_job_expiration => one_hour_expiration
51
41
  Sidekiq::Client.push('class' => TestClient::QueueWorker, 'queue' => 'customqueue', 'args' => [1, 2])
52
42
 
53
- md5_arguments = {:class => "TestClient::QueueWorker", :queue => "customqueue", :args => [1, 2]}
54
- payload_hash = Digest::MD5.hexdigest(Sidekiq.dump_json(md5_arguments))
43
+ payload_hash = SidekiqUniqueJobs::PayloadHelper.get_payload("TestClient::QueueWorker", "customqueue", [1, 2])
55
44
  actual_expires_at = Sidekiq.redis {|c| c.ttl(payload_hash) }
56
45
 
57
46
  assert_in_delta one_hour_expiration, actual_expires_at, 2
@@ -63,6 +52,43 @@ class TestClient < MiniTest::Unit::TestCase
63
52
  assert_equal 10, Sidekiq.redis {|c| c.llen("queue:customqueue") }
64
53
  end
65
54
 
55
+ describe 'when unique_args is defined' do
56
+ before { SidekiqUniqueJobs::Config.unique_args_enabled = true }
57
+ after { SidekiqUniqueJobs::Config.unique_args_enabled = false }
58
+
59
+ class QueueWorkerWithFilterMethod < QueueWorker
60
+ sidekiq_options :unique => true, :unique_args => :args_filter
61
+
62
+ def self.args_filter(*args)
63
+ args.first
64
+ end
65
+ end
66
+
67
+ class QueueWorkerWithFilterProc < QueueWorker
68
+ # slightly contrived example of munging args to the worker and removing a random bit.
69
+ sidekiq_options :unique => true, :unique_args => lambda { |args| a = args.last.dup; a.delete(:random); [ args.first, a ] }
70
+ end
71
+
72
+ it 'does not push duplicate messages based on args filter method' do
73
+ assert TestClient::QueueWorkerWithFilterMethod.respond_to?(:args_filter)
74
+ assert_equal :args_filter, TestClient::QueueWorkerWithFilterMethod.get_sidekiq_options['unique_args']
75
+
76
+ for i in (0..10).to_a
77
+ Sidekiq::Client.push('class' => TestClient::QueueWorkerWithFilterMethod, 'queue' => 'customqueue', 'args' => [1, i])
78
+ end
79
+ assert_equal 1, Sidekiq.redis {|c| c.llen("queue:customqueue") }
80
+ end
81
+
82
+ it 'does not push duplicate messages based on args filter proc' do
83
+ assert_kind_of Proc, TestClient::QueueWorkerWithFilterProc.get_sidekiq_options['unique_args']
84
+
85
+ 10.times do
86
+ Sidekiq::Client.push('class' => TestClient::QueueWorkerWithFilterProc, 'queue' => 'customqueue', 'args' => [ 1, {:random => rand(), :name => "foobar"} ])
87
+ end
88
+ assert_equal 1, Sidekiq.redis {|c| c.llen("queue:customqueue") }
89
+ end
90
+ end
91
+
66
92
  # TODO: If anyone know of a better way to check that the expiration for scheduled
67
93
  # jobs are set around the same time as the scheduled job itself feel free to improve.
68
94
  it 'expires the payload_hash when a scheduled job is scheduled at' do
@@ -70,11 +96,10 @@ class TestClient < MiniTest::Unit::TestCase
70
96
  QueueWorker.sidekiq_options :unique => true
71
97
 
72
98
  at = 15.minutes.from_now
73
- expected_expires_at = (Time.at(at) - Time.now.utc) + SidekiqUniqueJobs::Middleware::Client::UniqueJobs::HASH_KEY_EXPIRATION
99
+ expected_expires_at = (Time.at(at) - Time.now.utc) + SidekiqUniqueJobs::Config.default_expiration
74
100
 
75
101
  QueueWorker.perform_in(at, 'mike')
76
- md5_arguments = {:class => "TestClient::QueueWorker", :queue => "customqueue", :args => ['mike']}
77
- payload_hash = Digest::MD5.hexdigest(Sidekiq.dump_json(md5_arguments))
102
+ payload_hash = SidekiqUniqueJobs::PayloadHelper.get_payload("TestClient::QueueWorker", "customqueue", ['mike'])
78
103
 
79
104
  # deconstruct this into a time format we can use to get a decent delta for
80
105
  actual_expires_at = Sidekiq.redis {|c| c.ttl(payload_hash) }
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-unique-jobs
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.2
5
- prerelease:
4
+ version: 2.6.5
6
5
  platform: ruby
7
6
  authors:
8
7
  - Mikael Henriksson
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-09-27 00:00:00.000000000 Z
11
+ date: 2013-03-09 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: sidekiq
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ~>
20
18
  - !ruby/object:Gem::Version
21
- version: 2.2.0
19
+ version: '2.6'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ~>
28
25
  - !ruby/object:Gem::Version
29
- version: 2.2.0
26
+ version: '2.6'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: minitest
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,55 +41,48 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: sinatra
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: slim
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rake
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
- name: actionmailer
84
+ name: activesupport
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
@@ -102,27 +90,24 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ~>
108
95
  - !ruby/object:Gem::Version
109
96
  version: '3'
110
97
  - !ruby/object:Gem::Dependency
111
- name: activerecord
98
+ name: simplecov
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ~>
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
- version: '3'
103
+ version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ~>
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
- version: '3'
110
+ version: '0'
126
111
  description: The unique jobs that were removed from sidekiq
127
112
  email:
128
113
  - mikael@zoolutions.se
@@ -138,39 +123,42 @@ files:
138
123
  - README.md
139
124
  - Rakefile
140
125
  - lib/sidekiq-unique-jobs.rb
126
+ - lib/sidekiq-unique-jobs/config.rb
141
127
  - lib/sidekiq-unique-jobs/middleware.rb
142
128
  - lib/sidekiq-unique-jobs/middleware/client/unique_jobs.rb
143
129
  - lib/sidekiq-unique-jobs/middleware/server/unique_jobs.rb
130
+ - lib/sidekiq-unique-jobs/payload_helper.rb
144
131
  - lib/sidekiq-unique-jobs/version.rb
145
132
  - sidekiq-unique-jobs.gemspec
146
133
  - test/helper.rb
134
+ - test/lib/sidekiq/another_test_client.rb
147
135
  - test/lib/sidekiq/test_client.rb
148
136
  homepage: http://mperham.github.com/sidekiq
149
137
  licenses:
150
138
  - LGPL-3.0
139
+ metadata: {}
151
140
  post_install_message:
152
141
  rdoc_options: []
153
142
  require_paths:
154
143
  - lib
155
144
  required_ruby_version: !ruby/object:Gem::Requirement
156
- none: false
157
145
  requirements:
158
- - - ! '>='
146
+ - - '>='
159
147
  - !ruby/object:Gem::Version
160
148
  version: '0'
161
149
  required_rubygems_version: !ruby/object:Gem::Requirement
162
- none: false
163
150
  requirements:
164
- - - ! '>='
151
+ - - '>='
165
152
  - !ruby/object:Gem::Version
166
153
  version: '0'
167
154
  requirements: []
168
155
  rubyforge_project:
169
- rubygems_version: 1.8.23
156
+ rubygems_version: 2.0.2
170
157
  signing_key:
171
- specification_version: 3
158
+ specification_version: 4
172
159
  summary: The unique jobs that were removed from sidekiq
173
160
  test_files:
174
161
  - test/helper.rb
162
+ - test/lib/sidekiq/another_test_client.rb
175
163
  - test/lib/sidekiq/test_client.rb
176
164
  has_rdoc: