resque-unique_by_arity 0.2.1 → 1.0.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: 5082a9bd4cfded2e55fe7436b007c8f38d5e2604
4
- data.tar.gz: 30758aea39db2962f319e0274bdda29fbf4e7ba7
3
+ metadata.gz: 80b0037698ecc3c3fb68119077dfadb27c266201
4
+ data.tar.gz: 810f868a334ae08dc806f335f434d5d52fc09639
5
5
  SHA512:
6
- metadata.gz: ee2e12f6728c2801048e46d43a0526a5c9292c59ac37906ddff94d1ff75527270709c73f589aad6f97cd0bc177578792c379a993a55f0274136b499957888d08
7
- data.tar.gz: 82fa706dca697a8b9634b418a3b1b55a89f20a735d010fea737f2af7fcfc9f459ebb4de6d6215f673bb90b7a6373523f72d2cd41228b06253ed3c07bb5eb0426
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 the pboling fork of resque-lonely_job at https://github.com/pboling/resque-lonely_job as the standard one is just very incompatible with resque-solo (or vice versa, either direction is true; they step on each other).
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
- Usage:
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
- alias :debug_logger :logger
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 if we are not careful, conflicts with a custom redis_key we set here
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-lonely_job
18
- # see: https://github.com/wallace/resque-lonely_job
19
- base.send(:extend, Resque::Plugins::LonelyJob) if @configuration.unique_at_runtime
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
- if configuration.unique_in_queue
24
- # Returns a string, used by LonelyJob, that will be used as the redis key
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(:redis_key) do |payload|
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 = "unique_job:#{self}:#{unique_hash}"
35
- puts "#{self}.redis_key for #{args_for_uniqueness} is: #{key.green}"
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(:purge_unique_job_redis_keys) do
40
- keys = Resque.redis.keys("unique_job:#{self}:*")
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(:lonely_job_redis_key) do |*args|
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 = "lonely_job:#{self}:#{unique_hash}"
55
- puts "#{self}.lonely_job_redis_key for #{args_for_uniqueness} is: #{key.yellow}"
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(:purge_lonely_job_redis_keys) do
60
- keys = Resque.redis.keys("lonely_job:#{self}:*")
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,5 @@
1
1
  module Resque
2
2
  module UniqueByArity
3
- VERSION = "0.2.1"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
@@ -1,5 +1,9 @@
1
- require "resque-lonely_job"
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 and resque-lonely_simlutaneously into Resque jobs}
13
- spec.description = %q{resque_solo and resque-lonely are incompatible - fixes that}
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-lonely_job"
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.2.1
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-09-30 00:00:00.000000000 Z
11
+ date: 2017-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: resque-lonely_job
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 and resque-lonely are incompatible - fixes that
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: '0'
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 and resque-lonely_simlutaneously
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: []