aboutsummaryrefslogtreecommitdiffstats
path: root/lib/active_job
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@basecamp.com>2014-06-05 21:42:22 +0200
committerDavid Heinemeier Hansson <david@basecamp.com>2014-06-05 21:42:22 +0200
commit694b562080a7b1473d20c743877481e13d51c421 (patch)
treeb264251049d3c9b4d2e9a4f6ce16ed15d7170766 /lib/active_job
parentf4b42e54e4665b7c92539cc544dfe28df34798b8 (diff)
parenta4a7f0279af91307a8b36a8c437c4734721741d6 (diff)
downloadrails-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.rb32
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