module ActiveJob::Arguments

Constants

GLOBALID_KEY
RESERVED_KEYS
TYPE_WHITELIST

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 37
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 30
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 64
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 87
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 91
def deserialize_hash(serialized_hash)
  serialized_hash.each_with_object({}.with_indifferent_access) do |(key, value), hash|
    hash[key] = deserialize_argument(value)
  end
end
serialize_argument(argument) click to toggle source
# File lib/active_job/arguments.rb, line 47
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 Hash
    argument.each_with_object({}) do |(key, value), hash|
      hash[serialize_hash_key(key)] = serialize_argument(value)
    end
  else
    raise SerializationError.new("Unsupported argument type: #{argument.class.name}")
  end
end
serialize_hash_key(key) click to toggle source
# File lib/active_job/arguments.rb, line 100
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 83
def serialized_global_id?(hash)
  hash.size == 1 and hash.include?(GLOBALID_KEY)
end