module ActiveJob::Arguments
Constants
- GLOBALID_KEY
- RESERVED_KEYS
- SYMBOL_KEYS_KEY
- TYPE_WHITELIST
- WITH_INDIFFERENT_ACCESS_KEY
Public Instance Methods
deserialize(arguments)
click to toggle source
Deserializes a set of arguments. Whitelisted types are returned as-is. Arrays/Hashes are deserialized element by element. All other types are deserialized using GlobalID.
# File lib/active_job/arguments.rb, line 39 def deserialize(arguments) arguments.map { |argument| deserialize_argument(argument) } rescue => e raise DeserializationError.new(e) end
serialize(arguments)
click to toggle source
Serializes a set of arguments. Whitelisted types are returned as-is. Arrays/Hashes are serialized element by element. All other types are serialized using GlobalID.
# File lib/active_job/arguments.rb, line 32 def serialize(arguments) arguments.map { |argument| serialize_argument(argument) } end
Private Instance Methods
deserialize_argument(argument)
click to toggle source
# File lib/active_job/arguments.rb, line 73 def deserialize_argument(argument) case argument when String GlobalID::Locator.locate(argument) || argument when *TYPE_WHITELIST argument when Array argument.map { |arg| deserialize_argument(arg) } when Hash if serialized_global_id?(argument) deserialize_global_id argument else deserialize_hash(argument) end else raise ArgumentError, "Can only deserialize primitive arguments: #{argument.inspect}" end end
deserialize_global_id(hash)
click to toggle source
# File lib/active_job/arguments.rb, line 96 def deserialize_global_id(hash) GlobalID::Locator.locate hash[GLOBALID_KEY] end
deserialize_hash(serialized_hash)
click to toggle source
# File lib/active_job/arguments.rb, line 106 def deserialize_hash(serialized_hash) result = serialized_hash.transform_values { |v| deserialize_argument(v) } if result.delete(WITH_INDIFFERENT_ACCESS_KEY) result = result.with_indifferent_access elsif symbol_keys = result.delete(SYMBOL_KEYS_KEY) result = transform_symbol_keys(result, symbol_keys) end result end
serialize_argument(argument)
click to toggle source
# File lib/active_job/arguments.rb, line 51 def serialize_argument(argument) case argument when *TYPE_WHITELIST argument when GlobalID::Identification { GLOBALID_KEY => argument.to_global_id.to_s } when Array argument.map { |arg| serialize_argument(arg) } when ActiveSupport::HashWithIndifferentAccess result = serialize_hash(argument) result[WITH_INDIFFERENT_ACCESS_KEY] = serialize_argument(true) result when Hash symbol_keys = argument.each_key.grep(Symbol).map(&:to_s) result = serialize_hash(argument) result[SYMBOL_KEYS_KEY] = symbol_keys result else raise SerializationError.new("Unsupported argument type: #{argument.class.name}") end end
serialize_hash(argument)
click to toggle source
# File lib/active_job/arguments.rb, line 100 def serialize_hash(argument) argument.each_with_object({}) do |(key, value), hash| hash[serialize_hash_key(key)] = serialize_argument(value) end end
serialize_hash_key(key)
click to toggle source
# File lib/active_job/arguments.rb, line 123 def serialize_hash_key(key) case key when *RESERVED_KEYS raise SerializationError.new("Can't serialize a Hash with reserved key #{key.inspect}") when String, Symbol key.to_s else raise SerializationError.new("Only string and symbol hash keys may be serialized as job arguments, but #{key.inspect} is a #{key.class}") end end
serialized_global_id?(hash)
click to toggle source
# File lib/active_job/arguments.rb, line 92 def serialized_global_id?(hash) hash.size == 1 and hash.include?(GLOBALID_KEY) end
transform_symbol_keys(hash, symbol_keys)
click to toggle source
# File lib/active_job/arguments.rb, line 134 def transform_symbol_keys(hash, symbol_keys) hash.transform_keys do |key| if symbol_keys.include?(key) key.to_sym else key end end end