resque-unique_by_arity 0.2.1 → 1.0.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 +4 -4
- data/README.md +149 -2
- data/lib/resque/resque_solo/queue.rb +9 -0
- data/lib/resque/unique_by_arity/configuration.rb +7 -7
- data/lib/resque/unique_by_arity/cop.rb +5 -5
- data/lib/resque/unique_by_arity/cop_modulizer.rb +54 -15
- data/lib/resque/unique_by_arity/version.rb +1 -1
- data/lib/resque/unique_by_arity.rb +11 -1
- data/resque-unique_by_arity.gemspec +6 -4
- metadata +29 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80b0037698ecc3c3fb68119077dfadb27c266201
|
4
|
+
data.tar.gz: 810f868a334ae08dc806f335f434d5d52fc09639
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce9d5ff1591847f915a3ee57f2418cb337cb9933f7a7bf8e4f28cf99b5ed52d6a58c6b5e11f410753b8df0797787bb9a3b3ec1dcb9f8e05f19b48bd2ec11f5c4
|
7
|
+
data.tar.gz: f4fd53779a94981d4d8335c322bc6adead29a61394e12e44d167a06258b05e79e2350e68bbff528793c43241e07c4a100b8517934cd9cae21ba0c641577c4527
|
data/README.md
CHANGED
@@ -2,14 +2,16 @@
|
|
2
2
|
|
3
3
|
NOTE:
|
4
4
|
|
5
|
-
Requires
|
5
|
+
Requires `resque_solo` gem, and `resque-unique_at_runtime` gem; the latter is a fork of `resque-lonely_job`.
|
6
|
+
Why? `resque-lonely_job` and `resque_solo` can't be used together, because their `redis_key` methods conflict.
|
6
7
|
|
7
|
-
|
8
|
+
Example:
|
8
9
|
|
9
10
|
```ruby
|
10
11
|
class MyJob
|
11
12
|
include UniqueByArity::Cop.new(
|
12
13
|
arity_for_uniqueness: 1,
|
14
|
+
lock_after_execution_period: 60,
|
13
15
|
unique_at_runtime: true,
|
14
16
|
unique_in_queue: true
|
15
17
|
)
|
@@ -34,6 +36,84 @@ Or install it yourself as:
|
|
34
36
|
|
35
37
|
## Usage
|
36
38
|
|
39
|
+
### Arity For Uniqueness
|
40
|
+
|
41
|
+
Some jobs have parameters that you do not want to consider for determination of uniqueness. Resque jobs should use simple parameters, **not named parameters**, so you can just specify the number of parameters, counting from the left, you want to be considered for uniqueness.
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
class MyJob
|
45
|
+
include UniqueByArity::Cop.new(
|
46
|
+
arity_for_uniqueness: 3,
|
47
|
+
unique_at_runtime: true
|
48
|
+
)
|
49
|
+
def self.perform(my, cat, is, the, best, opts = {})
|
50
|
+
# Only the first 3: [my, cat, is] will be considered for determination of uniqueness
|
51
|
+
end
|
52
|
+
end
|
53
|
+
```
|
54
|
+
|
55
|
+
### Lock After Execution
|
56
|
+
|
57
|
+
Give the job a break after it finishes running, and don't allow another of the same, with matching args @ configured arity, to start within X seconds.
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
class MyJob
|
61
|
+
include UniqueByArity::Cop.new(
|
62
|
+
arity_for_uniqueness: 1,
|
63
|
+
lock_after_execution_period: 60,
|
64
|
+
unique_at_runtime: true
|
65
|
+
)
|
66
|
+
end
|
67
|
+
```
|
68
|
+
|
69
|
+
### Unique At Runtime (across all queues)
|
70
|
+
|
71
|
+
Prevent your app from running a job that is already running.
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
class MyJob
|
75
|
+
include UniqueByArity::Cop.new(
|
76
|
+
arity_for_uniqueness: 1,
|
77
|
+
unique_at_runtime: true
|
78
|
+
)
|
79
|
+
end
|
80
|
+
```
|
81
|
+
|
82
|
+
### Unique At Queue Time
|
83
|
+
|
84
|
+
#### Unique In Job's Specific Queue
|
85
|
+
|
86
|
+
Prevent your app from queueing a job that is already queued in the same queue.
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
class MyJob
|
90
|
+
include UniqueByArity::Cop.new(
|
91
|
+
arity_for_uniqueness: 1,
|
92
|
+
unique_in_queue: true
|
93
|
+
)
|
94
|
+
end
|
95
|
+
```
|
96
|
+
|
97
|
+
#### Unique Across All Queues
|
98
|
+
|
99
|
+
Prevent your app from queueing a job that is already queued in *any* queue.
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
class MyJob
|
103
|
+
include UniqueByArity::Cop.new(
|
104
|
+
arity_for_uniqueness: 1,
|
105
|
+
unique_across_queues: true
|
106
|
+
)
|
107
|
+
end
|
108
|
+
```
|
109
|
+
|
110
|
+
### All Together Now
|
111
|
+
|
112
|
+
#### Unique At Runtime (across all queues) AND Unique In Job's Specific Queue
|
113
|
+
|
114
|
+
Prevent your app from running a job that is already running, **and**
|
115
|
+
prevent your app from queueing a job that is already queued in the same queue.
|
116
|
+
|
37
117
|
```ruby
|
38
118
|
class MyJob
|
39
119
|
include UniqueByArity::Cop.new(
|
@@ -44,6 +124,73 @@ class MyJob
|
|
44
124
|
end
|
45
125
|
```
|
46
126
|
|
127
|
+
#### Unique At Runtime (across all queues) AND Unique Across All Queues
|
128
|
+
|
129
|
+
Prevent your app from running a job that is already running, **and**
|
130
|
+
prevent your app from queueing a job that is already queued in *any* queue.
|
131
|
+
|
132
|
+
```ruby
|
133
|
+
class MyJob
|
134
|
+
include UniqueByArity::Cop.new(
|
135
|
+
arity_for_uniqueness: 1,
|
136
|
+
unique_at_runtime: true,
|
137
|
+
unique_across_queues: true
|
138
|
+
)
|
139
|
+
end
|
140
|
+
```
|
141
|
+
|
142
|
+
### Debugging
|
143
|
+
|
144
|
+
Run your worker with `RESQUE_DEBUG=true` to see payloads printed before they are used to determine uniqueness.
|
145
|
+
|
146
|
+
### Customize Unique Keys Per Job
|
147
|
+
|
148
|
+
Redefine methods to customize all the things. Warning: This might be crazy-making.
|
149
|
+
|
150
|
+
```ruby
|
151
|
+
class MyJob
|
152
|
+
include UniqueByArity::Cop.new(
|
153
|
+
#...
|
154
|
+
)
|
155
|
+
|
156
|
+
# Core hashing algorithm for a job used for *all 3 types* of uniqueness
|
157
|
+
# @return [Array<String, arguments>], where the string is the unique digest, and arguments are the specific args that were used to calculate the digest
|
158
|
+
def self.redis_unique_hash(payload)
|
159
|
+
# ... See source @ lib/resque/unique_by_arity/cop_modulizer.rb
|
160
|
+
# for how the built-in version works
|
161
|
+
# uniqueness_args = payload["args"] # over simplified - this ignores the arity
|
162
|
+
# args = { class: job, args: uniqueness_args }
|
163
|
+
# return [Digest::MD5.hexdigest(Resque.encode(args)), uniqueness_args]
|
164
|
+
end
|
165
|
+
|
166
|
+
# Prefix to the unique key for a job for resque_solo, queue time uniqueness
|
167
|
+
def self.solo_redis_key_prefix
|
168
|
+
# "unique_job:#{self}" # <= default value
|
169
|
+
end
|
170
|
+
|
171
|
+
# Prefix to the unique redis key for a job for resque_solo, queue time uniqueness
|
172
|
+
def self.solo_key_namespace(queue = nil)
|
173
|
+
# definition depends on which type of uniqueness is chosen, be careful if you customize
|
174
|
+
# "solo:queue:#{queue}:job" # <= is for unique within queue at queue time
|
175
|
+
# "solo:across_queues:job" # <= is for unique across all queues at queue time
|
176
|
+
end
|
177
|
+
|
178
|
+
def self.unique_at_queue_time_redis_key(queue, payload)
|
179
|
+
# unique_hash, _args_for_uniqueness = redis_unique_hash(payload)
|
180
|
+
# "#{solo_key_namespace(queue)}:#{solo_redis_key_prefix}:#{unique_hash}"
|
181
|
+
end
|
182
|
+
|
183
|
+
def self.runtime_key_namespace
|
184
|
+
# "unique_at_runtime:#{self}"
|
185
|
+
end
|
186
|
+
|
187
|
+
def self.unique_at_runtime_redis_key(*args)
|
188
|
+
# unique_hash, _args_for_uniqueness = redis_unique_hash({"class" => self.to_s, "args" => args})
|
189
|
+
# key = "#{runtime_key_namespace}:#{unique_hash}" # <= simplified default
|
190
|
+
end
|
191
|
+
end
|
192
|
+
```
|
193
|
+
|
47
194
|
## Development
|
48
195
|
|
49
196
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module ResqueSoloUniqueHack
|
2
|
+
def unique_key(queue, item)
|
3
|
+
# "solo:queue:#{queue}:job:#{const_for(item).redis_key(item)}"
|
4
|
+
const_for(item).unique_at_queue_time_redis_key(queue, item)
|
5
|
+
# NOTE: DOES NOT CALL SUPER
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
ResqueSolo::Queue.singleton_class.prepend ResqueSoloUniqueHack
|
@@ -8,12 +8,7 @@ module Resque
|
|
8
8
|
attr_accessor :lock_after_execution_period
|
9
9
|
attr_accessor :unique_at_runtime
|
10
10
|
attr_accessor :unique_in_queue
|
11
|
-
|
12
|
-
alias :debug_log_level :log_level
|
13
|
-
alias :debug_arity_for_uniqueness :arity_for_uniqueness
|
14
|
-
alias :debug_lock_after_execution_period :lock_after_execution_period
|
15
|
-
alias :debug_unique_at_runtime :unique_at_runtime
|
16
|
-
alias :debug_unique_in_queue :unique_in_queue
|
11
|
+
attr_accessor :unique_across_queues
|
17
12
|
def initialize(**options)
|
18
13
|
@logger = options.key?(:logger) ? options[:logger] : Logger.new(STDOUT)
|
19
14
|
@log_level = options.key?(:log_level) ? options[:log_level] : :debug
|
@@ -21,6 +16,10 @@ module Resque
|
|
21
16
|
@lock_after_execution_period = options.key?(:lock_after_execution_period) ? options[:lock_after_execution_period] : nil
|
22
17
|
@unique_at_runtime = options.key?(:unique_at_runtime) ? options[:unique_at_runtime] : false
|
23
18
|
@unique_in_queue = options.key?(:unique_in_queue) ? options[:unique_in_queue] : false
|
19
|
+
@unique_across_queues = options.key?(:unique_across_queues) ? options[:unique_across_queues] : false
|
20
|
+
warn ":arity_for_uniqueness is set to #{@arity_for_uniqueness}, but no uniqueness enforcement was turned on [:unique_at_runtime, :unique_in_queue, :unique_across_queues]" unless @unique_at_runtime || @unique_in_queue || @unique_across_queues
|
21
|
+
warn ":lock_after_execution_period is set to #{@lock_after_execution_period}, but :unique_at_runtime is not set" if @lock_after_execution_period && !@unique_at_runtime
|
22
|
+
warn ":unique_in_queue and :unique_across_queues should not be set at the same time, as :unique_across_queues will always supercede :unique_in_queue" if @unique_in_queue && @unique_across_queues
|
24
23
|
end
|
25
24
|
def to_hash
|
26
25
|
{
|
@@ -29,7 +28,8 @@ module Resque
|
|
29
28
|
arity_for_uniqueness: arity_for_uniqueness,
|
30
29
|
lock_after_execution_period: lock_after_execution_period,
|
31
30
|
unique_at_runtime: unique_at_runtime,
|
32
|
-
unique_in_queue: unique_in_queue
|
31
|
+
unique_in_queue: unique_in_queue,
|
32
|
+
unique_across_queues: unique_across_queues
|
33
33
|
}
|
34
34
|
end
|
35
35
|
end
|
@@ -11,12 +11,12 @@ module Resque
|
|
11
11
|
|
12
12
|
# gem is resque_solo, which is a rewrite of resque-loner
|
13
13
|
# see: https://github.com/neighborland/resque_solo
|
14
|
-
# defines a redis_key method, which
|
15
|
-
base.send(:include, Resque::Plugins::UniqueJob) if @configuration.unique_in_queue
|
14
|
+
# defines a redis_key method, which we have to override.
|
15
|
+
base.send(:include, Resque::Plugins::UniqueJob) if @configuration.unique_in_queue || @configuration.unique_across_queues
|
16
16
|
|
17
|
-
# gem is resque-
|
18
|
-
# see: https://github.com/
|
19
|
-
base.send(:extend, Resque::Plugins::
|
17
|
+
# gem is resque-unique_at_runtime
|
18
|
+
# see: https://github.com/pboling/resque-unique_at_runtime
|
19
|
+
base.send(:extend, Resque::Plugins::UniqueAtRuntime) if @configuration.unique_at_runtime
|
20
20
|
|
21
21
|
uniqueness_cop_module = Resque::UniqueByArity::CopModulizer.to_mod(@configuration)
|
22
22
|
# This will override methods from both plugins above, if configured for both
|
@@ -3,10 +3,11 @@ module Resque
|
|
3
3
|
module CopModulizer
|
4
4
|
def self.to_mod(configuration)
|
5
5
|
Module.new do
|
6
|
-
if configuration.unique_in_queue || configuration.unique_at_runtime
|
6
|
+
if configuration.unique_in_queue || configuration.unique_at_runtime || configuration.unique_across_queues
|
7
7
|
# @return [Array<String, arguments>] the key base hash used to enforce uniqueness, and the arguments from the payload used to calculate it
|
8
8
|
define_method(:redis_unique_hash) do |payload|
|
9
9
|
payload = Resque.decode(Resque.encode(payload))
|
10
|
+
puts "payload is #{payload.inspect}" if ENV['RESQUE_DEBUG'] == 'true'
|
10
11
|
job = payload["class"]
|
11
12
|
# It seems possible that some jobs may not have an "args" key in the payload.
|
12
13
|
args = payload["args"] || []
|
@@ -20,28 +21,64 @@ module Resque
|
|
20
21
|
return [Digest::MD5.hexdigest(Resque.encode(args)), uniqueness_args]
|
21
22
|
end
|
22
23
|
end
|
23
|
-
|
24
|
-
|
24
|
+
|
25
|
+
if configuration.lock_after_execution_period
|
26
|
+
self.instance_variable_set(:@lock_after_execution_period, configuration.lock_after_execution_period)
|
27
|
+
end
|
28
|
+
|
29
|
+
if configuration.unique_in_queue || configuration.unique_across_queues
|
30
|
+
### Gem: resque_solo
|
31
|
+
### Plugin Name: Resque::Plugins::UniqueJob
|
32
|
+
### Provides: Queue-time uniqueness for a single queue, or across queues
|
33
|
+
#
|
34
|
+
# Returns a string, used by Resque::Plugins::UniqueJob, that will be used as the prefix to the redis key
|
35
|
+
define_method(:solo_redis_key_prefix) do
|
36
|
+
"unique_job:#{self}"
|
37
|
+
end
|
38
|
+
#
|
39
|
+
# Returns a string, used by Resque::Plugins::UniqueJob, that will be used as the redis key
|
25
40
|
# The example in the readme is bad. The args passed to this method are like:
|
26
41
|
# [{:class=>"MakeCompanyReport", :args=>[1]}]
|
27
|
-
# This is identical to the version from Resque::Plugins::UniqueJob
|
28
|
-
# and we do not want the version from Resque::Plugins::LonelyJob to be used.
|
29
42
|
# Payload is what Resque stored for this job along with the job's class name:
|
30
43
|
# a hash containing :class and :args
|
31
44
|
# @return [String] the key used to enforce uniqueness (at queue-time)
|
32
|
-
define_method(:
|
45
|
+
define_method(:unique_at_queue_time_redis_key) do |queue, payload|
|
33
46
|
unique_hash, args_for_uniqueness = redis_unique_hash(payload)
|
34
|
-
key = "
|
35
|
-
puts "#{self}.
|
47
|
+
key = "#{solo_key_namespace(queue)}:#{solo_redis_key_prefix}:#{unique_hash}"
|
48
|
+
puts "#{ColorizedString['[Queue-Time]'].green} #{self}.unique_at_queue_time_redis_key for #{args_for_uniqueness} is: #{ColorizedString[key].green}" if ENV['RESQUE_DEBUG'] == 'true'
|
36
49
|
key
|
37
50
|
end
|
51
|
+
#
|
38
52
|
# @return [Fixnum] number of keys that were deleted
|
39
|
-
define_method(:
|
40
|
-
|
53
|
+
define_method(:purge_unique_queued_redis_keys) do
|
54
|
+
# solo_key_namespace may or may not ignore the queue passed in, depending on config.
|
55
|
+
key_match = "#{solo_key_namespace(self.instance_variable_get(:@queue))}:#{solo_redis_key_prefix}:*"
|
56
|
+
keys = Resque.redis.keys(key_match)
|
57
|
+
puts "Purging #{keys.length} keys from #{ColorizedString[key_match].red}"
|
41
58
|
Resque.redis.del keys if keys.length > 0
|
42
59
|
end
|
60
|
+
if configuration.unique_in_queue
|
61
|
+
# @return [String] the Redis namespace of the key used to enforce uniqueness (at queue-time)
|
62
|
+
define_method(:solo_key_namespace) do |queue = nil|
|
63
|
+
"solo:queue:#{queue}:job"
|
64
|
+
end
|
65
|
+
elsif configuration.unique_across_queues
|
66
|
+
# @return [String] the Redis namespace of the key used to enforce uniqueness (at queue-time)
|
67
|
+
define_method(:solo_key_namespace) do |_queue = nil|
|
68
|
+
"solo:across_queues:job"
|
69
|
+
end
|
70
|
+
end
|
43
71
|
end
|
72
|
+
|
73
|
+
### Gem: resque-unique_at_runtime
|
74
|
+
### Plugin Name: Resque::Plugins::UniqueAtRuntime
|
75
|
+
### Provides: Runtime uniqueness across queues
|
44
76
|
if configuration.unique_at_runtime
|
77
|
+
# @return [String] the Redis namespace of the key used to enforce uniqueness (at runtime)
|
78
|
+
define_method(:runtime_key_namespace) do
|
79
|
+
"unique_at_runtime:#{self}"
|
80
|
+
end
|
81
|
+
# Returns a string, used by Resque::Plugins::UniqueAtRuntime, that will be used as the redis key
|
45
82
|
# The versions of redis_key from resque_solo and resque-lonely_job are incompatible.
|
46
83
|
# So we forked resque-lonely_job, change the name of the method so it would not conflict,
|
47
84
|
# and now we can override it, and fix the params to be compatible with the redis_key
|
@@ -49,15 +86,17 @@ module Resque
|
|
49
86
|
# Does not need any customization for arity, because it funnels down to redis_key,
|
50
87
|
# and we handle the arity option there
|
51
88
|
# @return [String] the key used to enforce loneliness (uniqueness at runtime)
|
52
|
-
define_method(:
|
89
|
+
define_method(:unique_at_runtime_redis_key) do |*args|
|
53
90
|
unique_hash, args_for_uniqueness = redis_unique_hash({"class" => self.to_s, "args" => args})
|
54
|
-
key = "
|
55
|
-
puts "#{self}.
|
91
|
+
key = "#{runtime_key_namespace}:#{unique_hash}"
|
92
|
+
puts "#{ColorizedString['[Run-Time]'].yellow} #{self}.unique_at_runtime_redis_key for #{args_for_uniqueness} is: #{ColorizedString[key].yellow}" if ENV['RESQUE_DEBUG'] == 'true'
|
56
93
|
key
|
57
94
|
end
|
58
95
|
# @return [Fixnum] number of keys that were deleted
|
59
|
-
define_method(:
|
60
|
-
|
96
|
+
define_method(:purge_unique_at_runtime_redis_keys) do
|
97
|
+
key_match = "#{runtime_key_namespace}:*"
|
98
|
+
keys = Resque.redis.keys(key_match)
|
99
|
+
puts "Purging #{keys.length} keys from #{ColorizedString[key_match].red}"
|
61
100
|
Resque.redis.del keys if keys.length > 0
|
62
101
|
end
|
63
102
|
end
|
@@ -1,5 +1,9 @@
|
|
1
|
-
require "
|
1
|
+
require "colorized_string"
|
2
|
+
|
3
|
+
require "resque-unique_at_runtime"
|
2
4
|
require "resque_solo"
|
5
|
+
# Little hack of the resque_solo gem
|
6
|
+
require "resque/resque_solo/queue"
|
3
7
|
|
4
8
|
require "resque/unique_by_arity/version"
|
5
9
|
require "resque/unique_by_arity/configuration"
|
@@ -72,6 +76,12 @@ module Resque
|
|
72
76
|
def uniqueness_unique_in_queue=(unique_in_queue)
|
73
77
|
@uniqueness_configuration.unique_in_queue = unique_in_queue
|
74
78
|
end
|
79
|
+
def uniqueness_unique_across_queues
|
80
|
+
@uniqueness_configuration.unique_across_queues
|
81
|
+
end
|
82
|
+
def uniqueness_unique_across_queues=(unique_across_queues)
|
83
|
+
@uniqueness_configuration.unique_across_queues = unique_across_queues
|
84
|
+
end
|
75
85
|
self.uniqueness_configuration = Configuration.new # setup defaults
|
76
86
|
end
|
77
87
|
end
|
@@ -9,9 +9,10 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Peter Boling"]
|
10
10
|
spec.email = ["peter.boling@gmail.com"]
|
11
11
|
|
12
|
-
spec.summary = %q{Magic hacks which allow integration of resque_solo
|
13
|
-
spec.description = %q{resque_solo
|
12
|
+
spec.summary = %q{Magic hacks which allow integration of resque_solo and resque-unique_at_runtime_simultaneously into Resque jobs}
|
13
|
+
spec.description = %q{fixes incompatibilities between resque_solo and resque-unique_at_runtime}
|
14
14
|
spec.homepage = "https://github.com/pboling/resque-unique_by_arity"
|
15
|
+
spec.required_ruby_version = ">= 2.0.0"
|
15
16
|
|
16
17
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
18
|
f.match(%r{^(test|spec|features)/})
|
@@ -20,8 +21,9 @@ Gem::Specification.new do |spec|
|
|
20
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
22
|
spec.require_paths = ["lib"]
|
22
23
|
|
23
|
-
spec.add_runtime_dependency "resque-
|
24
|
-
spec.add_runtime_dependency "resque_solo"
|
24
|
+
spec.add_runtime_dependency "resque-unique_at_runtime", "~> 2.0"
|
25
|
+
spec.add_runtime_dependency "resque_solo", "~> 0.3"
|
26
|
+
spec.add_runtime_dependency "colorize", "~> 0.8"
|
25
27
|
spec.add_development_dependency "bundler", "~> 1.14"
|
26
28
|
spec.add_development_dependency "rake", "~> 10.0"
|
27
29
|
spec.add_development_dependency "rspec", "~> 3.0"
|
metadata
CHANGED
@@ -1,43 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resque-unique_by_arity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Boling
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: resque-
|
14
|
+
name: resque-unique_at_runtime
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '2.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '2.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: resque_solo
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.3'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: colorize
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
47
|
+
version: '0.8'
|
34
48
|
type: :runtime
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- - "
|
52
|
+
- - "~>"
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
54
|
+
version: '0.8'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,7 +94,7 @@ dependencies:
|
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '3.0'
|
83
|
-
description: resque_solo
|
97
|
+
description: fixes incompatibilities between resque_solo and resque-unique_at_runtime
|
84
98
|
email:
|
85
99
|
- peter.boling@gmail.com
|
86
100
|
executables: []
|
@@ -95,6 +109,7 @@ files:
|
|
95
109
|
- Rakefile
|
96
110
|
- bin/console
|
97
111
|
- bin/setup
|
112
|
+
- lib/resque/resque_solo/queue.rb
|
98
113
|
- lib/resque/unique_by_arity.rb
|
99
114
|
- lib/resque/unique_by_arity/configuration.rb
|
100
115
|
- lib/resque/unique_by_arity/cop.rb
|
@@ -112,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
112
127
|
requirements:
|
113
128
|
- - ">="
|
114
129
|
- !ruby/object:Gem::Version
|
115
|
-
version:
|
130
|
+
version: 2.0.0
|
116
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
132
|
requirements:
|
118
133
|
- - ">="
|
@@ -123,6 +138,6 @@ rubyforge_project:
|
|
123
138
|
rubygems_version: 2.6.12
|
124
139
|
signing_key:
|
125
140
|
specification_version: 4
|
126
|
-
summary: Magic hacks which allow integration of resque_solo
|
141
|
+
summary: Magic hacks which allow integration of resque_solo and resque-unique_at_runtime_simultaneously
|
127
142
|
into Resque jobs
|
128
143
|
test_files: []
|