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.
@@ -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 'logger'
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
- # The default config initialization shouldn't trigger any warnings.
56
- if base_klass_name && logger
57
- log "[#{base_klass_name}] :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
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
- # takes a fixed number of arguments
103
- # parform(a, b, c) # => arity == 3, so arity for uniqueness can be 0, 1, 2, or 3
104
- if perform_method.arity < arity_for_uniqueness
105
- "#{klass_string}.#{perform_method.name} has arity of #{perform_method.arity} which will not work with arity_for_uniqueness of #{arity_for_uniqueness}"
106
- end
107
- else
108
- if perform_method.arity.abs < arity_for_uniqueness
109
- # parform(a, b, c, opts = {}) # => arity == -4
110
- # and in this case arity for uniqueness can be 0, 1, 2, or 3, because 4 of the arguments are required
111
- "#{klass_string}.#{perform_method.name} has arity of #{perform_method.arity} which will not work with arity_for_uniqueness of #{arity_for_uniqueness}"
112
- elsif (required_parameter_names = perform_method.parameters.take_while { |a| a[0] == :req }.map { |b| b[1] }).length < arity_for_uniqueness
113
- "#{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}"
114
- end
115
- end
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 then
119
- log(ColorizedString[msg].red)
120
- when :error then
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['RESQUE_DEBUG']
140
- @debug_mode = !!(env_debug == 'true' || (env_debug.is_a?(String) && env_debug.match?(/queue/)))
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 'logger'
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 = 'r-uar'.freeze
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 = 'r-uiq'.freeze
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
- self.send(sym)
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 = payload['class']
12
+ job = payload["class"]
12
13
  # It seems possible that some jobs may not have an "args" key in the payload.
13
- args = payload['args'] || []
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 configuration.arity_for_uniqueness.zero?
19
- []
20
- else
21
- # minus one because zero indexed, so
22
- # when arity_for_uniqueness is 2 we use args
23
- # at indexes 0 and 1.
24
- args[0..(configuration.arity_for_uniqueness - 1)]
25
- end
26
- args = { class: job, args: uniqueness_args }
27
- return [Digest::MD5.hexdigest(Resque.encode(args)), uniqueness_args]
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
- unique_hash, args_for_uniqueness = redis_unique_hash(payload)
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: #{ColorizedString[key].green}")
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} #{ColorizedString['Purging'].red} #{keys.length} keys from #{ColorizedString[key_match].red}")
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('class' => to_s, 'args' => args)
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: #{ColorizedString[key].yellow}")
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} #{ColorizedString['Purging'].red} #{keys.length} keys from #{ColorizedString[key_match].red}")
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
- VERSION = '3.0.2'.freeze
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
- require 'resque-unique_by_arity'
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 = (ColorizedString['[R-UBA] '].green).freeze
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 'resque/unique_by_arity/version'
1
+ require "resque/unique_by_arity/version"
2
2
 
3
3
  # External Gems
4
- require 'colorized_string'
5
- require 'resque'
4
+ require "resque"
6
5
 
7
6
  # External Resque Plugins
8
- require 'resque-unique_in_queue'
9
- require 'resque-unique_at_runtime'
7
+ require "resque-unique_in_queue"
8
+ require "resque-unique_at_runtime"
10
9
 
11
- require 'resque/unique_by_arity/configuration'
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'
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"
@@ -0,0 +1,8 @@
1
+ module Resque
2
+ module UniqueByArity
3
+ module Version
4
+ VERSION: String
5
+ end
6
+ VERSION: String
7
+ end
8
+ end
data.tar.gz.sig ADDED
Binary file