resque-unique_by_arity 0.1.0 → 0.2.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 +4 -0
- data/lib/resque/unique_by_arity/cop_modulizer.rb +37 -22
- data/lib/resque/unique_by_arity/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac085f3b0b4e1bffe91a7d102a682d1b24c3a1aa
|
4
|
+
data.tar.gz: eacd68195490aee206b3d6c45af092bd00624ac1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9ff0d231d3cc0c06f9bc597783d3948035d8e66f5163c36437809a39dade1326412502b39d2443c437cc66ae33c1f223a751be7a326379ce4d4d88e36a6752d
|
7
|
+
data.tar.gz: fe7a66deceb8ed1fe40dc8b36e94d6e567cd46c896688e44ccb9e3ae4db070430643a35618867f2505d198b4f782090054505e77562211bda1de32f0fdfba6ae
|
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Resque::UniqueByArity
|
2
2
|
|
3
|
+
NOTE:
|
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).
|
6
|
+
|
3
7
|
Usage:
|
4
8
|
|
5
9
|
```ruby
|
@@ -3,6 +3,22 @@ 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
|
7
|
+
# @return [Array<String, arguments>] the key base hash used to enforce uniqueness, and the arguments from the payload used to calculate it
|
8
|
+
define_method(:redis_unique_hash) do |payload|
|
9
|
+
payload = Resque.decode(Resque.encode(payload))
|
10
|
+
job = payload["class"]
|
11
|
+
args = payload["args"]
|
12
|
+
args.map! do |arg|
|
13
|
+
arg.is_a?(Hash) ? arg.sort : arg
|
14
|
+
end
|
15
|
+
# what is the configured arity for uniqueness?
|
16
|
+
# minus one because zero indexed
|
17
|
+
uniqueness_args = args[0..(configuration.arity_for_uniqueness - 1)]
|
18
|
+
args = { class: job, args: uniqueness_args }
|
19
|
+
return [Digest::MD5.hexdigest(Resque.encode(args)), uniqueness_args]
|
20
|
+
end
|
21
|
+
end
|
6
22
|
if configuration.unique_in_queue
|
7
23
|
# Returns a string, used by LonelyJob, that will be used as the redis key
|
8
24
|
# The example in the readme is bad. The args passed to this method are like:
|
@@ -10,27 +26,18 @@ module Resque
|
|
10
26
|
# This is identical to the version from Resque::Plugins::UniqueJob
|
11
27
|
# and we do not want the version from Resque::Plugins::LonelyJob to be used.
|
12
28
|
# Payload is what Resque stored for this job along with the job's class name:
|
13
|
-
#
|
29
|
+
# a hash containing :class and :args
|
30
|
+
# @return [String] the key used to enforce uniqueness (at queue-time)
|
14
31
|
define_method(:redis_key) do |payload|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
# minus one because zero indexed
|
25
|
-
uniqueness_args = args[0..(configuration.arity_for_uniqueness - 1)]
|
26
|
-
args = { class: job, args: uniqueness_args }
|
27
|
-
key = Digest::MD5.hexdigest Resque.encode(args)
|
28
|
-
puts "redis key for uniqueness for #{args} is: #{key.green}"
|
29
|
-
key
|
30
|
-
rescue => e
|
31
|
-
Raven.captureMessage("redis_key error", extra: { signature: payload, error: e.class.to_s, message: e.message })
|
32
|
-
raise e
|
33
|
-
end
|
32
|
+
unique_hash, args_for_uniqueness = redis_unique_hash(payload)
|
33
|
+
key = "unique_job:#{self}:#{unique_hash}"
|
34
|
+
puts "#{self}.redis_key for #{args_for_uniqueness} is: #{key.green}"
|
35
|
+
key
|
36
|
+
end
|
37
|
+
# @return [Fixnum] number of keys that were deleted
|
38
|
+
define_method(:purge_unique_job_redis_keys) do
|
39
|
+
keys = Resque.redis.keys("unique_job:#{self}:*")
|
40
|
+
Resque.redis.del keys if keys.length > 0
|
34
41
|
end
|
35
42
|
end
|
36
43
|
if configuration.unique_at_runtime
|
@@ -40,9 +47,17 @@ module Resque
|
|
40
47
|
# from resque_solo
|
41
48
|
# Does not need any customization for arity, because it funnels down to redis_key,
|
42
49
|
# and we handle the arity option there
|
50
|
+
# @return [String] the key used to enforce loneliness (uniqueness at runtime)
|
43
51
|
define_method(:lonely_job_redis_key) do |*args|
|
44
|
-
|
45
|
-
"lonely_job:#{
|
52
|
+
unique_hash, args_for_uniqueness = redis_unique_hash({"class" => self.to_s, "args" => args})
|
53
|
+
key = "lonely_job:#{self}:#{unique_hash}"
|
54
|
+
puts "#{self}.lonely_job_redis_key for #{args_for_uniqueness} is: #{key.yellow}"
|
55
|
+
key
|
56
|
+
end
|
57
|
+
# @return [Fixnum] number of keys that were deleted
|
58
|
+
define_method(:purge_lonely_job_redis_keys) do
|
59
|
+
keys = Resque.redis.keys("lonely_job:#{self}:*")
|
60
|
+
Resque.redis.del keys if keys.length > 0
|
46
61
|
end
|
47
62
|
end
|
48
63
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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: 0.2.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-05-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: resque-lonely_job
|