diff options
author | David Heinemeier Hansson <david@basecamp.com> | 2014-06-05 21:42:22 +0200 |
---|---|---|
committer | David Heinemeier Hansson <david@basecamp.com> | 2014-06-05 21:42:22 +0200 |
commit | 694b562080a7b1473d20c743877481e13d51c421 (patch) | |
tree | b264251049d3c9b4d2e9a4f6ce16ed15d7170766 /lib/active_job | |
parent | f4b42e54e4665b7c92539cc544dfe28df34798b8 (diff) | |
parent | a4a7f0279af91307a8b36a8c437c4734721741d6 (diff) | |
download | rails-694b562080a7b1473d20c743877481e13d51c421.tar.gz rails-694b562080a7b1473d20c743877481e13d51c421.tar.bz2 rails-694b562080a7b1473d20c743877481e13d51c421.zip |
Merge pull request #79 from cristianbica/deep-serialization
Deep serialization
Diffstat (limited to 'lib/active_job')
-rw-r--r-- | lib/active_job/arguments.rb | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/lib/active_job/arguments.rb b/lib/active_job/arguments.rb index d1cc6d3177..553ab20f65 100644 --- a/lib/active_job/arguments.rb +++ b/lib/active_job/arguments.rb @@ -3,14 +3,19 @@ require 'active_support/core_ext/object/try' module ActiveJob class Arguments - TYPE_WHITELIST = [ NilClass, Fixnum, Float, String, TrueClass, FalseClass, Hash, Array, Bignum ] + TYPE_WHITELIST = [ NilClass, Fixnum, Float, String, TrueClass, FalseClass, Bignum ] def self.serialize(arguments) arguments.collect do |argument| - if argument.respond_to?(:global_id) + case argument + when ActiveModel::GlobalIdentification argument.global_id - elsif TYPE_WHITELIST.include?(argument.class) + when *TYPE_WHITELIST argument + when Hash + Hash[ argument.map{ |key, value| [ serialize_hash_key(key), serialize([value]).first ] } ] + when Array + serialize(argument) else raise "Unsupported argument type: #{argument.class.name}" end @@ -18,7 +23,26 @@ module ActiveJob end def self.deserialize(arguments) - arguments.collect { |argument| ActiveModel::GlobalLocator.locate(argument) || argument } + arguments.collect do |argument| + case argument + when Array + deserialize(argument) + when Hash + Hash[argument.map{ |key, value| [ key, deserialize([value]).first ] }].with_indifferent_access + else + ActiveModel::GlobalLocator.locate(argument) || argument + end + end end + + private + def self.serialize_hash_key(key) + case key + when String, Symbol + key.to_s + else + raise "Unsupported hash key type: #{key.class.name}" + end + end end end |