module ActiveJob::Arguments - activejob-4.2.4 Documentation

# 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