resque-unique_by_arity 3.0.2 → 3.0.3
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
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +149 -0
- data/LICENSE.md +12 -0
- data/README.md +518 -111
- data/lib/resque/unique_by_arity/configuration/validator.rb +153 -0
- data/lib/resque/unique_by_arity/configuration.rb +32 -28
- data/lib/resque/unique_by_arity/global_configuration.rb +7 -4
- data/lib/resque/unique_by_arity/modulizer.rb +26 -19
- data/lib/resque/unique_by_arity/version.rb +9 -1
- data/lib/resque/unique_by_arity.rb +4 -2
- data/lib/resque-unique_by_arity.rb +12 -12
- data/sig/resque/unique_by_arity.rbs +8 -0
- data.tar.gz.sig +0 -0
- metadata +204 -69
- metadata.gz.sig +0 -0
- data/.gitignore +0 -19
- data/.rspec +0 -2
- data/.rubocop.yml +0 -2
- data/.rubocop_todo.yml +0 -72
- data/.ruby-version +0 -1
- data/.travis.yml +0 -33
- data/Gemfile +0 -20
- data/LICENSE +0 -22
- data/Rakefile +0 -10
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/resque-unique_by_arity.gemspec +0 -37
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "forwardable"
|
|
4
|
+
|
|
5
|
+
module Resque
|
|
6
|
+
module UniqueByArity
|
|
7
|
+
class Configuration
|
|
8
|
+
class Validator
|
|
9
|
+
extend Forwardable
|
|
10
|
+
|
|
11
|
+
ARITY_FOR_UNIQUENESS_MSG = "[%<job_name>s] :arity_for_uniqueness is set to %<arity_for_uniqueness>d, but no uniqueness enforcement was turned on [:unique_at_runtime, :unique_in_queue, :unique_across_queues]"
|
|
12
|
+
ARITY_FOR_UNIQUENESS_AT_RUNTIME_MSG = "[%<job_name>s] :arity_for_uniqueness_at_runtime is set to %<arity_for_uniqueness_at_runtime>d, but :unique_at_runtime was not turned on"
|
|
13
|
+
ARITY_FOR_UNIQUENESS_IN_QUEUE_MSG = "[%<job_name>s] :arity_for_uniqueness_in_queue is set to %<arity_for_uniqueness_in_queue>d, but :unique_in_queue was not turned on"
|
|
14
|
+
ARITY_FOR_UNIQUENESS_ACROSS_QUEUES_MSG = "[%<job_name>s] :arity_for_uniqueness_across_queues is set to %<arity_for_uniqueness_across_queues>d, but :unique_across_queues was not turned on"
|
|
15
|
+
LOCK_AFTER_EXEC_PERIOD_MSG = "[%<job_name>s] :lock_after_execution_period is set to %<lock_after_execution_period>d, but :unique_at_runtime is not set"
|
|
16
|
+
RUNTIME_LOCK_TIMEOUT_MSG = "[%<job_name>s] :runtime_lock_timeout is set to %<runtime_lock_timeout>s, but :unique_at_runtime is not set"
|
|
17
|
+
RUNTIME_REQUEUE_INTERVAL_MSG = "[%<job_name>s] :runtime_requeue_interval is set to %<runtime_requeue_interval>d, but :unique_at_runtime is not set"
|
|
18
|
+
CONCURRENT_CONFIG_MSG = "[%<job_name>] :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"
|
|
19
|
+
|
|
20
|
+
private_constant :ARITY_FOR_UNIQUENESS_MSG,
|
|
21
|
+
:ARITY_FOR_UNIQUENESS_AT_RUNTIME_MSG,
|
|
22
|
+
:ARITY_FOR_UNIQUENESS_IN_QUEUE_MSG,
|
|
23
|
+
:ARITY_FOR_UNIQUENESS_ACROSS_QUEUES_MSG,
|
|
24
|
+
:LOCK_AFTER_EXEC_PERIOD_MSG,
|
|
25
|
+
:RUNTIME_LOCK_TIMEOUT_MSG,
|
|
26
|
+
:RUNTIME_REQUEUE_INTERVAL_MSG,
|
|
27
|
+
:CONCURRENT_CONFIG_MSG
|
|
28
|
+
|
|
29
|
+
def initialize(config)
|
|
30
|
+
@config = config
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def log_warnings
|
|
34
|
+
validate_arity_for_uniqueness
|
|
35
|
+
validate_arity_for_uniqueness_at_runtime
|
|
36
|
+
validate_arity_for_uniqueness_in_queue
|
|
37
|
+
validate_arity_for_uniqueness_across_queues
|
|
38
|
+
validate_after_execution_period
|
|
39
|
+
validate_runtime_lock_timout
|
|
40
|
+
validate_runtime_requeue_interval
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.log_warnings(*args)
|
|
44
|
+
new(*args).log_warnings
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
attr_reader :config
|
|
50
|
+
def_delegators :config,
|
|
51
|
+
:arity_for_uniqueness,
|
|
52
|
+
:arity_for_uniqueness_at_runtime,
|
|
53
|
+
:arity_for_uniqueness_in_queue,
|
|
54
|
+
:arity_for_uniqueness_across_queues,
|
|
55
|
+
:base_klass_name,
|
|
56
|
+
:lock_after_execution_period,
|
|
57
|
+
:runtime_lock_timeout,
|
|
58
|
+
:runtime_requeue_interval,
|
|
59
|
+
:unique_across_queues,
|
|
60
|
+
:unique_at_runtime,
|
|
61
|
+
:unique_in_queue
|
|
62
|
+
|
|
63
|
+
def log(msg)
|
|
64
|
+
Resque::UniqueByArity.log(msg, config)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def default_config_value?(config_attr)
|
|
68
|
+
config.send(config_attr) == default_config(config_attr)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def default_config(attr)
|
|
72
|
+
Resque::UniqueByArity.configuration.send(attr)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def validate_runtime_requeue_interval
|
|
76
|
+
return if default_config_value?(:runtime_requeue_interval) ||
|
|
77
|
+
unique_at_runtime
|
|
78
|
+
|
|
79
|
+
log format(
|
|
80
|
+
RUNTIME_REQUEUE_INTERVAL_MSG,
|
|
81
|
+
job_name: base_klass_name,
|
|
82
|
+
runtime_requeue_interval: runtime_requeue_interval
|
|
83
|
+
)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def validate_runtime_lock_timout
|
|
87
|
+
return if default_config_value?(:runtime_lock_timeout) ||
|
|
88
|
+
unique_at_runtime
|
|
89
|
+
|
|
90
|
+
log format(
|
|
91
|
+
RUNTIME_LOCK_TIMEOUT_MSG,
|
|
92
|
+
job_name: base_klass_name,
|
|
93
|
+
runtime_lock_timeout: runtime_lock_timeout
|
|
94
|
+
)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def validate_after_execution_period
|
|
98
|
+
return if default_config_value?(:lock_after_execution_period) ||
|
|
99
|
+
(unique_in_queue || unique_across_queues)
|
|
100
|
+
|
|
101
|
+
log format(
|
|
102
|
+
LOCK_AFTER_EXEC_PERIOD_MSG,
|
|
103
|
+
job_name: base_klass_name,
|
|
104
|
+
lock_after_execution_period: lock_after_execution_period
|
|
105
|
+
)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def validate_arity_for_uniqueness
|
|
109
|
+
return if arity_for_uniqueness == 1 ||
|
|
110
|
+
(unique_at_runtime ||
|
|
111
|
+
unique_in_queue ||
|
|
112
|
+
unique_across_queues)
|
|
113
|
+
|
|
114
|
+
log format(
|
|
115
|
+
ARITY_FOR_UNIQUENESS_MSG,
|
|
116
|
+
job_name: base_klass_name,
|
|
117
|
+
arity_for_uniqueness: arity_for_uniqueness
|
|
118
|
+
)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def validate_arity_for_uniqueness_at_runtime
|
|
122
|
+
return if arity_for_uniqueness_at_runtime == arity_for_uniqueness || unique_at_runtime
|
|
123
|
+
|
|
124
|
+
log format(
|
|
125
|
+
ARITY_FOR_UNIQUENESS_AT_RUNTIME_MSG,
|
|
126
|
+
job_name: base_klass_name,
|
|
127
|
+
arity_for_uniqueness_at_runtime: arity_for_uniqueness_at_runtime
|
|
128
|
+
)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def validate_arity_for_uniqueness_in_queue
|
|
132
|
+
return if arity_for_uniqueness_in_queue == arity_for_uniqueness || unique_in_queue
|
|
133
|
+
|
|
134
|
+
log format(
|
|
135
|
+
ARITY_FOR_UNIQUENESS_IN_QUEUE_MSG,
|
|
136
|
+
job_name: base_klass_name,
|
|
137
|
+
arity_for_uniqueness_in_queue: arity_for_uniqueness_in_queue
|
|
138
|
+
)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def validate_arity_for_uniqueness_across_queues
|
|
142
|
+
return if arity_for_uniqueness_across_queues == arity_for_uniqueness || unique_across_queues
|
|
143
|
+
|
|
144
|
+
log format(
|
|
145
|
+
ARITY_FOR_UNIQUENESS_ACROSS_QUEUES_MSG,
|
|
146
|
+
job_name: base_klass_name,
|
|
147
|
+
arity_for_uniqueness_across_queues: arity_for_uniqueness_across_queues
|
|
148
|
+
)
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require
|
|
1
|
+
require "logger"
|
|
2
2
|
module Resque
|
|
3
3
|
module UniqueByArity
|
|
4
4
|
# This class is for configurations that are per job class, *not* app-wide.
|
|
@@ -11,6 +11,9 @@ module Resque
|
|
|
11
11
|
attr_accessor :logger
|
|
12
12
|
attr_accessor :log_level
|
|
13
13
|
attr_accessor :arity_for_uniqueness
|
|
14
|
+
attr_accessor :arity_for_uniqueness_at_runtime
|
|
15
|
+
attr_accessor :arity_for_uniqueness_in_queue
|
|
16
|
+
attr_accessor :arity_for_uniqueness_across_queues
|
|
14
17
|
attr_accessor :arity_validation
|
|
15
18
|
attr_accessor :lock_after_execution_period
|
|
16
19
|
attr_accessor :runtime_lock_timeout
|
|
@@ -28,6 +31,9 @@ module Resque
|
|
|
28
31
|
@logger = options.key?(:logger) ? options[:logger] : defcon(:logger) || Logger.new(STDOUT)
|
|
29
32
|
@log_level = options.key?(:log_level) ? options[:log_level] : defcon(:log_level) || :debug
|
|
30
33
|
@arity_for_uniqueness = options.key?(:arity_for_uniqueness) ? options[:arity_for_uniqueness] : defcon(:arity_for_uniqueness) || 1
|
|
34
|
+
@arity_for_uniqueness_at_runtime = options.key?(:arity_for_uniqueness_at_runtime) ? options[:arity_for_uniqueness_at_runtime] : defcon(:arity_for_uniqueness_at_runtime) || @arity_for_uniqueness
|
|
35
|
+
@arity_for_uniqueness_in_queue = options.key?(:arity_for_uniqueness_in_queue) ? options[:arity_for_uniqueness_in_queue] : defcon(:arity_for_uniqueness_in_queue) || @arity_for_uniqueness
|
|
36
|
+
@arity_for_uniqueness_across_queues = options.key?(:arity_for_uniqueness_across_queues) ? options[:arity_for_uniqueness_across_queues] : defcon(:arity_for_uniqueness_across_queues) || @arity_for_uniqueness
|
|
31
37
|
@arity_validation = options.key?(:arity_validation) ? options[:arity_validation] : defcon(:arity_validation) || :warning
|
|
32
38
|
raise ArgumentError, "Resque::Plugins::UniqueByArity.new requires arity_validation values of #{arity_validation.inspect}, or a class inheriting from Exception, but the value is #{@arity_validation} (#{@arity_validation.class})" unless VALID_ARITY_VALIDATION_LEVELS.include?(@arity_validation) || !@arity_validation.respond_to?(:ancestors) || @arity_validation.ancestors.include?(Exception)
|
|
33
39
|
|
|
@@ -52,14 +58,9 @@ module Resque
|
|
|
52
58
|
end
|
|
53
59
|
|
|
54
60
|
def validate
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
log "[#{base_klass_name}] :lock_after_execution_period is set to #{lock_after_execution_period}, but :unique_at_runtime is not set" if lock_after_execution_period && !(unique_in_queue || unique_across_queues)
|
|
59
|
-
log "[#{base_klass_name}] :runtime_lock_timeout is set to #{runtime_lock_timeout}, but :unique_at_runtime is not set" if runtime_lock_timeout && !unique_at_runtime
|
|
60
|
-
log "[#{base_klass_name}] :runtime_requeue_interval is set to #{runtime_requeue_interval}, but :unique_at_runtime is not set" if runtime_requeue_interval && !unique_at_runtime
|
|
61
|
-
log "[#{base_klass_name}] :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
|
|
62
|
-
end
|
|
61
|
+
return unless base_klass_name && logger
|
|
62
|
+
|
|
63
|
+
Validator.log_warnings(self)
|
|
63
64
|
end
|
|
64
65
|
|
|
65
66
|
def log(msg)
|
|
@@ -71,6 +72,9 @@ module Resque
|
|
|
71
72
|
log_level: log_level,
|
|
72
73
|
logger: logger,
|
|
73
74
|
arity_for_uniqueness: arity_for_uniqueness,
|
|
75
|
+
arity_for_uniqueness_at_runtime: arity_for_uniqueness_at_runtime,
|
|
76
|
+
arity_for_uniqueness_in_queue: arity_for_uniqueness_in_queue,
|
|
77
|
+
arity_for_uniqueness_across_queues: arity_for_uniqueness_across_queues,
|
|
74
78
|
arity_validation: arity_validation,
|
|
75
79
|
base_klass_name: base_klass_name,
|
|
76
80
|
debug_mode: debug_mode,
|
|
@@ -99,25 +103,25 @@ module Resque
|
|
|
99
103
|
# for perform(opts = {}), method(:perform).arity # => -1
|
|
100
104
|
# which means that the only valid arity_for_uniqueness is 0
|
|
101
105
|
msg = if perform_method.arity >= 0
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
106
|
+
# takes a fixed number of arguments
|
|
107
|
+
# parform(a, b, c) # => arity == 3, so arity for uniqueness can be 0, 1, 2, or 3
|
|
108
|
+
if perform_method.arity < arity_for_uniqueness
|
|
109
|
+
"#{klass_string}.#{perform_method.name} has arity of #{perform_method.arity} which will not work with arity_for_uniqueness of #{arity_for_uniqueness}"
|
|
110
|
+
end
|
|
111
|
+
else
|
|
112
|
+
if perform_method.arity.abs < arity_for_uniqueness
|
|
113
|
+
# parform(a, b, c, opts = {}) # => arity == -4
|
|
114
|
+
# and in this case arity for uniqueness can be 0, 1, 2, or 3, because 4 of the arguments are required
|
|
115
|
+
"#{klass_string}.#{perform_method.name} has arity of #{perform_method.arity} which will not work with arity_for_uniqueness of #{arity_for_uniqueness}"
|
|
116
|
+
elsif (required_parameter_names = perform_method.parameters.take_while { |a| a[0] == :req }.map { |b| b[1] }).length < arity_for_uniqueness
|
|
117
|
+
"#{klass_string}.#{perform_method.name} has the following required parameters: #{required_parameter_names}, which is not enough to satisfy the configured arity_for_uniqueness of #{arity_for_uniqueness}"
|
|
118
|
+
end
|
|
119
|
+
end
|
|
116
120
|
if msg
|
|
117
121
|
case arity_validation
|
|
118
|
-
when :warning
|
|
119
|
-
log(
|
|
120
|
-
when :error
|
|
122
|
+
when :warning
|
|
123
|
+
log(msg)
|
|
124
|
+
when :error
|
|
121
125
|
raise ArgumentError, msg
|
|
122
126
|
else
|
|
123
127
|
raise arity_validation, msg
|
|
@@ -136,8 +140,8 @@ module Resque
|
|
|
136
140
|
private
|
|
137
141
|
|
|
138
142
|
def debug_mode_from_env
|
|
139
|
-
env_debug = ENV[
|
|
140
|
-
@debug_mode = !!(env_debug ==
|
|
143
|
+
env_debug = ENV["RESQUE_DEBUG"]
|
|
144
|
+
@debug_mode = !!(env_debug == "true" || (env_debug.is_a?(String) && env_debug.match?(/queue/)))
|
|
141
145
|
end
|
|
142
146
|
end
|
|
143
147
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require
|
|
1
|
+
require "logger"
|
|
2
2
|
module Resque
|
|
3
3
|
module UniqueByArity
|
|
4
4
|
# This class is for configurations that are app-wide, *not per job class.
|
|
@@ -10,12 +10,12 @@ module Resque
|
|
|
10
10
|
# For resque-unique_at_runtime
|
|
11
11
|
DEFAULT_LOCK_TIMEOUT = 60 * 60 * 24 * 5
|
|
12
12
|
DEFAULT_REQUEUE_INTERVAL = 1
|
|
13
|
-
DEFAULT_AT_RUNTIME_KEY_BASE =
|
|
13
|
+
DEFAULT_AT_RUNTIME_KEY_BASE = "r-uar".freeze
|
|
14
14
|
|
|
15
15
|
# For resque-unique_in_queue
|
|
16
16
|
DEFAULT_LOCK_AFTER_EXECUTION_PERIOD = 0
|
|
17
17
|
DEFAULT_TTL = -1
|
|
18
|
-
DEFAULT_IN_QUEUE_KEY_BASE =
|
|
18
|
+
DEFAULT_IN_QUEUE_KEY_BASE = "r-uiq".freeze
|
|
19
19
|
|
|
20
20
|
include Singleton
|
|
21
21
|
|
|
@@ -24,7 +24,7 @@ module Resque
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def defcon(sym)
|
|
27
|
-
|
|
27
|
+
send(sym)
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def reset
|
|
@@ -32,6 +32,9 @@ module Resque
|
|
|
32
32
|
@logger = nil
|
|
33
33
|
@log_level = DEFAULT_LOG_LEVEL
|
|
34
34
|
@arity_for_uniqueness = nil
|
|
35
|
+
@arity_for_uniqueness_at_runtime = nil
|
|
36
|
+
@arity_for_uniqueness_in_queue = nil
|
|
37
|
+
@arity_for_uniqueness_across_queues = nil
|
|
35
38
|
@arity_validation = nil
|
|
36
39
|
@lock_after_execution_period = DEFAULT_LOCK_AFTER_EXECUTION_PERIOD
|
|
37
40
|
@runtime_lock_timeout = DEFAULT_LOCK_TIMEOUT
|
|
@@ -5,26 +5,28 @@ module Resque
|
|
|
5
5
|
Module.new do
|
|
6
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
|
-
define_method(:redis_unique_hash) do |payload|
|
|
8
|
+
define_method(:redis_unique_hash) do |payload, arity_for_uniqueness|
|
|
9
|
+
arity_for_uniqueness ||= configuration.arity_for_uniqueness
|
|
9
10
|
payload = Resque.decode(Resque.encode(payload))
|
|
10
11
|
Resque::UniqueByArity.debug("payload is #{payload.inspect}")
|
|
11
|
-
job
|
|
12
|
+
job = payload["class"]
|
|
12
13
|
# It seems possible that some jobs may not have an "args" key in the payload.
|
|
13
|
-
args = payload[
|
|
14
|
+
args = payload["args"] || []
|
|
14
15
|
args.map! do |arg|
|
|
15
16
|
arg.is_a?(Hash) ? arg.sort : arg
|
|
16
17
|
end
|
|
18
|
+
|
|
17
19
|
# what is the configured arity for uniqueness?
|
|
18
|
-
uniqueness_args = if
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
args = {
|
|
27
|
-
|
|
20
|
+
uniqueness_args = if arity_for_uniqueness.zero?
|
|
21
|
+
[]
|
|
22
|
+
else
|
|
23
|
+
# minus one because zero indexed, so
|
|
24
|
+
# when arity_for_uniqueness is 2 we use args
|
|
25
|
+
# at indexes 0 and 1.
|
|
26
|
+
args[0..(arity_for_uniqueness - 1)]
|
|
27
|
+
end
|
|
28
|
+
args = {class: job, args: uniqueness_args}
|
|
29
|
+
[Digest::MD5.hexdigest(Resque.encode(args)), uniqueness_args]
|
|
28
30
|
end
|
|
29
31
|
end
|
|
30
32
|
|
|
@@ -45,9 +47,14 @@ module Resque
|
|
|
45
47
|
# a hash containing :class and :args
|
|
46
48
|
# @return [String] the key used to enforce uniqueness (at queue-time)
|
|
47
49
|
define_method(:unique_in_queue_redis_key) do |queue, payload|
|
|
48
|
-
|
|
50
|
+
arity_for_uniqueness = if configuration.unique_in_queue
|
|
51
|
+
configuration.arity_for_uniqueness_in_queue
|
|
52
|
+
elsif configuration.unique_across_queues
|
|
53
|
+
configuration.arity_for_uniqueness_across_queues
|
|
54
|
+
end
|
|
55
|
+
unique_hash, args_for_uniqueness = redis_unique_hash(payload, arity_for_uniqueness)
|
|
49
56
|
key = "#{unique_in_queue_key_namespace(queue)}:#{unique_in_queue_redis_key_prefix}:#{unique_hash}"
|
|
50
|
-
Resque::UniqueByArity.debug("#{self}.unique_in_queue_redis_key for #{args_for_uniqueness} is: #{
|
|
57
|
+
Resque::UniqueByArity.debug("#{self}.unique_in_queue_redis_key for #{args_for_uniqueness} is: #{key}")
|
|
51
58
|
key
|
|
52
59
|
end
|
|
53
60
|
#
|
|
@@ -56,7 +63,7 @@ module Resque
|
|
|
56
63
|
# unique_in_queue_key_namespace may or may not ignore the queue passed in, depending on config.
|
|
57
64
|
key_match = "#{unique_in_queue_key_namespace(instance_variable_get(:@queue))}:#{unique_in_queue_redis_key_prefix}:*"
|
|
58
65
|
keys = Resque.redis.keys(key_match)
|
|
59
|
-
Resque::UniqueByArity.log("#{Resque::UniqueByArity::PLUGIN_TAG}#{Resque::UniqueInQueue::PLUGIN_TAG}
|
|
66
|
+
Resque::UniqueByArity.log("#{Resque::UniqueByArity::PLUGIN_TAG}#{Resque::UniqueInQueue::PLUGIN_TAG} Purging #{keys.length} keys from #{key_match}")
|
|
60
67
|
Resque.redis.del keys unless keys.empty?
|
|
61
68
|
end
|
|
62
69
|
|
|
@@ -89,16 +96,16 @@ module Resque
|
|
|
89
96
|
# still funnels down to redis_key, and we handle the arity option there
|
|
90
97
|
# @return [String] the key used to enforce loneliness (uniqueness at runtime)
|
|
91
98
|
define_method(:unique_at_runtime_redis_key) do |*args|
|
|
92
|
-
unique_hash, args_for_uniqueness = redis_unique_hash(
|
|
99
|
+
unique_hash, args_for_uniqueness = redis_unique_hash({"class" => to_s, "args" => args}, configuration.arity_for_uniqueness_at_runtime)
|
|
93
100
|
key = "#{runtime_key_namespace}:#{unique_hash}"
|
|
94
|
-
Resque::UniqueByArity.debug("#{Resque::UniqueAtRuntime::PLUGIN_TAG} #{self}.unique_at_runtime_redis_key for #{args_for_uniqueness} is: #{
|
|
101
|
+
Resque::UniqueByArity.debug("#{Resque::UniqueAtRuntime::PLUGIN_TAG} #{self}.unique_at_runtime_redis_key for #{args_for_uniqueness} is: #{key}")
|
|
95
102
|
key
|
|
96
103
|
end
|
|
97
104
|
# @return [Fixnum] number of keys that were deleted
|
|
98
105
|
define_method(:purge_unique_at_runtime_redis_keys) do
|
|
99
106
|
key_match = "#{runtime_key_namespace}:*"
|
|
100
107
|
keys = Resque.redis.keys(key_match)
|
|
101
|
-
Resque::UniqueByArity.log("#{Resque::UniqueByArity::PLUGIN_TAG}#{Resque::UniqueAtRuntime::PLUGIN_TAG}
|
|
108
|
+
Resque::UniqueByArity.log("#{Resque::UniqueByArity::PLUGIN_TAG}#{Resque::UniqueAtRuntime::PLUGIN_TAG} Purging #{keys.length} keys from #{key_match}")
|
|
102
109
|
Resque.redis.del keys unless keys.empty?
|
|
103
110
|
end
|
|
104
111
|
end
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Resque
|
|
2
4
|
module UniqueByArity
|
|
3
|
-
|
|
5
|
+
# Version namespace for this gem.
|
|
6
|
+
module Version
|
|
7
|
+
# Current gem version.
|
|
8
|
+
VERSION = "3.0.3"
|
|
9
|
+
end
|
|
10
|
+
# Current gem version exposed at the traditional constant location.
|
|
11
|
+
VERSION = Version::VERSION # Traditional Constant Location
|
|
4
12
|
end
|
|
5
13
|
end
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# Just in case some code still does require 'resque/unique_by_arity'
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
require "resque-unique_by_arity"
|
|
4
|
+
require_relative "unique_by_arity/version"
|
|
3
5
|
|
|
4
6
|
module Resque
|
|
5
7
|
module UniqueByArity
|
|
6
|
-
PLUGIN_TAG =
|
|
8
|
+
PLUGIN_TAG = "[R-UBA] ".freeze
|
|
7
9
|
|
|
8
10
|
def log(message, config_proxy = nil)
|
|
9
11
|
config_proxy ||= configuration
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
require
|
|
1
|
+
require "resque/unique_by_arity/version"
|
|
2
2
|
|
|
3
3
|
# External Gems
|
|
4
|
-
require
|
|
5
|
-
require 'resque'
|
|
4
|
+
require "resque"
|
|
6
5
|
|
|
7
6
|
# External Resque Plugins
|
|
8
|
-
require
|
|
9
|
-
require
|
|
7
|
+
require "resque-unique_in_queue"
|
|
8
|
+
require "resque-unique_at_runtime"
|
|
10
9
|
|
|
11
|
-
require
|
|
12
|
-
require
|
|
13
|
-
require
|
|
14
|
-
require
|
|
15
|
-
require
|
|
16
|
-
require
|
|
17
|
-
require
|
|
10
|
+
require "resque/unique_by_arity/configuration"
|
|
11
|
+
require "resque/unique_by_arity/configuration/validator"
|
|
12
|
+
require "resque/unique_by_arity/global_configuration"
|
|
13
|
+
require "resque/unique_by_arity"
|
|
14
|
+
require "resque/unique_by_arity/modulizer"
|
|
15
|
+
require "resque/unique_by_arity/unique_job"
|
|
16
|
+
require "resque/unique_by_arity/validation"
|
|
17
|
+
require "resque/plugins/unique_by_arity"
|
data.tar.gz.sig
ADDED
|
Binary file
|