diff options
author | Rafael França <rafaelmfranca@gmail.com> | 2018-02-14 14:47:46 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-14 14:47:46 -0500 |
commit | fa9e791e014a650f5ea6a14b283fed9621fc83e2 (patch) | |
tree | 42d892b55c66fd57cc62b7c996b01e30746341c5 /activejob/lib/active_job/serializers.rb | |
parent | 57495086f0bb1315ea287f8d6bafad8fd48e18b2 (diff) | |
parent | 25a14bf2bde90224debee343ebfbb882c02b9588 (diff) | |
download | rails-fa9e791e014a650f5ea6a14b283fed9621fc83e2.tar.gz rails-fa9e791e014a650f5ea6a14b283fed9621fc83e2.tar.bz2 rails-fa9e791e014a650f5ea6a14b283fed9621fc83e2.zip |
Merge pull request #30941 from toptal/introduce-custom-serializers-to-activejob-arguments
Introduce custom serializers to ActiveJob arguments
Diffstat (limited to 'activejob/lib/active_job/serializers.rb')
-rw-r--r-- | activejob/lib/active_job/serializers.rb | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/activejob/lib/active_job/serializers.rb b/activejob/lib/active_job/serializers.rb new file mode 100644 index 0000000000..d9a130fa73 --- /dev/null +++ b/activejob/lib/active_job/serializers.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +require "set" + +module ActiveJob + # The <tt>ActiveJob::Serializers</tt> module is used to store a list of known serializers + # and to add new ones. It also has helpers to serialize/deserialize objects + module Serializers + extend ActiveSupport::Autoload + extend ActiveSupport::Concern + + autoload :ObjectSerializer + autoload :SymbolSerializer + autoload :DurationSerializer + autoload :DateSerializer + autoload :TimeSerializer + autoload :DateTimeSerializer + + mattr_accessor :_additional_serializers + self._additional_serializers = Set.new + + class << self + # Returns serialized representative of the passed object. + # Will look up through all known serializers. + # Raises `ActiveJob::SerializationError` if it can't find a proper serializer. + def serialize(argument) + serializer = serializers.detect { |s| s.serialize?(argument) } + raise SerializationError.new("Unsupported argument type: #{argument.class.name}") unless serializer + serializer.serialize(argument) + end + + # Returns deserialized object. + # Will look up through all known serializers. + # If no serializers found will raise `ArgumentError` + def deserialize(argument) + serializer_name = argument[Arguments::OBJECT_SERIALIZER_KEY] + raise ArgumentError, "Serializer name is not present in the argument: #{argument.inspect}" unless serializer_name + + serializer = serializer_name.safe_constantize + raise ArgumentError, "Serializer #{serializer_name} is not know" unless serializer + + serializer.deserialize(argument) + end + + # Returns list of known serializers + def serializers + self._additional_serializers + end + + # Adds a new serializer to a list of known serializers + def add_serializers(*new_serializers) + self._additional_serializers += new_serializers + end + end + + add_serializers SymbolSerializer, + DurationSerializer, + DateTimeSerializer, + DateSerializer, + TimeSerializer + end +end |