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 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: []