From d2d98d69468bf34a39794496beb8f9f7b69088c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Mendon=C3=A7a=20Fran=C3=A7a?= Date: Fri, 9 Feb 2018 16:32:35 -0500 Subject: Allow serializers to be used either as classes or objects --- .../lib/active_job/serializers/array_serializer.rb | 20 ++++++------- .../lib/active_job/serializers/base_serializer.rb | 32 +++++++++++--------- .../active_job/serializers/duration_serializer.rb | 22 +++++++------- .../active_job/serializers/global_id_serializer.rb | 30 +++++++++---------- .../lib/active_job/serializers/hash_serializer.rb | 34 ++++++++++------------ .../hash_with_indifferent_access_serializer.rb | 26 ++++++++--------- .../active_job/serializers/object_serializer.rb | 12 ++++---- .../serializers/standard_type_serializer.rb | 24 +++++++-------- .../active_job/serializers/symbol_serializer.rb | 18 +++++------- 9 files changed, 103 insertions(+), 115 deletions(-) (limited to 'activejob/lib/active_job/serializers') diff --git a/activejob/lib/active_job/serializers/array_serializer.rb b/activejob/lib/active_job/serializers/array_serializer.rb index 1b3c3b2ce3..9db4edea99 100644 --- a/activejob/lib/active_job/serializers/array_serializer.rb +++ b/activejob/lib/active_job/serializers/array_serializer.rb @@ -3,24 +3,22 @@ module ActiveJob module Serializers # Provides methods to serialize and deserialize `Array` - class ArraySerializer < BaseSerializer - class << self - alias_method :deserialize?, :serialize? + class ArraySerializer < BaseSerializer # :nodoc: + alias_method :deserialize?, :serialize? - def serialize(array) - array.map { |arg| Serializers.serialize(arg) } - end + def serialize(array) + array.map { |arg| Serializers.serialize(arg) } + end - def deserialize(array) - array.map { |arg| Serializers.deserialize(arg) } - end + def deserialize(array) + array.map { |arg| Serializers.deserialize(arg) } + end - private + private def klass Array end - end end end end diff --git a/activejob/lib/active_job/serializers/base_serializer.rb b/activejob/lib/active_job/serializers/base_serializer.rb index 8b891cca48..2e510781cf 100644 --- a/activejob/lib/active_job/serializers/base_serializer.rb +++ b/activejob/lib/active_job/serializers/base_serializer.rb @@ -3,29 +3,33 @@ module ActiveJob module Serializers class BaseSerializer + include Singleton + class << self - def serialize?(argument) - argument.is_a?(klass) - end + delegate :serialize?, :deserialize?, :serialize, :deserialize, to: :instance + end - def deserialize?(_argument) - raise NotImplementedError - end + def serialize?(argument) + argument.is_a?(klass) + end - def serialize(_argument) - raise NotImplementedError - end + def deserialize?(_argument) + raise NotImplementedError + end - def deserialize(_argument) - raise NotImplementedError - end + def serialize(_argument) + raise NotImplementedError + end - private + def deserialize(_argument) + raise NotImplementedError + end + + protected def klass raise NotImplementedError end - end end end end diff --git a/activejob/lib/active_job/serializers/duration_serializer.rb b/activejob/lib/active_job/serializers/duration_serializer.rb index 46543cc30d..94b0d0407a 100644 --- a/activejob/lib/active_job/serializers/duration_serializer.rb +++ b/activejob/lib/active_job/serializers/duration_serializer.rb @@ -1,24 +1,22 @@ module ActiveJob module Serializers - class DurationSerializer < ObjectSerializer - class << self - def serialize(duration) - super("value" => duration.value, "parts" => Serializers.serialize(duration.parts)) - end + class DurationSerializer < ObjectSerializer # :nodoc: + def serialize(duration) + super("value" => duration.value, "parts" => Serializers.serialize(duration.parts)) + end - def deserialize(hash) - value = hash["value"] - parts = Serializers.deserialize(hash["parts"]) + def deserialize(hash) + value = hash["value"] + parts = Serializers.deserialize(hash["parts"]) - klass.new(value, parts) - end + klass.new(value, parts) + end - private + private def klass ActiveSupport::Duration end - end end end end diff --git a/activejob/lib/active_job/serializers/global_id_serializer.rb b/activejob/lib/active_job/serializers/global_id_serializer.rb index 84ed33ef99..2d8629ef02 100644 --- a/activejob/lib/active_job/serializers/global_id_serializer.rb +++ b/activejob/lib/active_job/serializers/global_id_serializer.rb @@ -4,29 +4,27 @@ module ActiveJob module Serializers # Provides methods to serialize and deserialize objects which mixes `GlobalID::Identification`, # including `ActiveRecord::Base` models - class GlobalIDSerializer < BaseSerializer - class << self - def serialize(object) - { GLOBALID_KEY => object.to_global_id.to_s } - rescue URI::GID::MissingModelIdError - raise SerializationError, "Unable to serialize #{object.class} " \ - "without an id. (Maybe you forgot to call save?)" - end + class GlobalIDSerializer < BaseSerializer # :nodoc: + def serialize(object) + { GLOBALID_KEY => object.to_global_id.to_s } + rescue URI::GID::MissingModelIdError + raise SerializationError, "Unable to serialize #{object.class} " \ + "without an id. (Maybe you forgot to call save?)" + end - def deserialize(hash) - GlobalID::Locator.locate(hash[GLOBALID_KEY]) - end + def deserialize(hash) + GlobalID::Locator.locate(hash[GLOBALID_KEY]) + end - def deserialize?(argument) - argument.is_a?(Hash) && argument[GLOBALID_KEY] - end + def deserialize?(argument) + argument.is_a?(Hash) && argument[GLOBALID_KEY] + end - private + private def klass GlobalID::Identification end - end end end end diff --git a/activejob/lib/active_job/serializers/hash_serializer.rb b/activejob/lib/active_job/serializers/hash_serializer.rb index 2bbb31946d..e569fe7501 100644 --- a/activejob/lib/active_job/serializers/hash_serializer.rb +++ b/activejob/lib/active_job/serializers/hash_serializer.rb @@ -4,26 +4,25 @@ module ActiveJob module Serializers # Provides methods to serialize and deserialize `Hash` (`{key: field, ...}`) # Only `String` or `Symbol` can be used as a key. Values will be serialized by known serializers - class HashSerializer < BaseSerializer - class << self - def serialize(hash) - symbol_keys = hash.each_key.grep(Symbol).map(&:to_s) - result = serialize_hash(hash) - result[key] = symbol_keys - result - end + class HashSerializer < BaseSerializer # :nodoc: + def serialize(hash) + symbol_keys = hash.each_key.grep(Symbol).map(&:to_s) + result = serialize_hash(hash) + result[key] = symbol_keys + result + end - def deserialize?(argument) - argument.is_a?(Hash) && argument[key] - end + def deserialize?(argument) + argument.is_a?(Hash) && argument[key] + end - def deserialize(hash) - result = hash.transform_values { |v| Serializers::deserialize(v) } - symbol_keys = result.delete(key) - transform_symbol_keys(result, symbol_keys) - end + def deserialize(hash) + result = hash.transform_values { |v| Serializers::deserialize(v) } + symbol_keys = result.delete(key) + transform_symbol_keys(result, symbol_keys) + end - private + private def key SYMBOL_KEYS_KEY @@ -56,7 +55,6 @@ module ActiveJob def klass Hash end - end end end end diff --git a/activejob/lib/active_job/serializers/hash_with_indifferent_access_serializer.rb b/activejob/lib/active_job/serializers/hash_with_indifferent_access_serializer.rb index af3576dd57..3b812ba304 100644 --- a/activejob/lib/active_job/serializers/hash_with_indifferent_access_serializer.rb +++ b/activejob/lib/active_job/serializers/hash_with_indifferent_access_serializer.rb @@ -4,21 +4,20 @@ module ActiveJob module Serializers # Provides methods to serialize and deserialize `ActiveSupport::HashWithIndifferentAccess` # Values will be serialized by known serializers - class HashWithIndifferentAccessSerializer < HashSerializer - class << self - def serialize(hash) - result = serialize_hash(hash) - result[key] = Serializers.serialize(true) - result - end + class HashWithIndifferentAccessSerializer < HashSerializer # :nodoc: + def serialize(hash) + result = serialize_hash(hash) + result[key] = Serializers.serialize(true) + result + end - def deserialize(hash) - result = hash.transform_values { |v| Serializers.deserialize(v) } - result.delete(key) - result.with_indifferent_access - end + def deserialize(hash) + result = hash.transform_values { |v| Serializers.deserialize(v) } + result.delete(key) + result.with_indifferent_access + end - private + private def key WITH_INDIFFERENT_ACCESS_KEY @@ -27,7 +26,6 @@ module ActiveJob def klass ActiveSupport::HashWithIndifferentAccess end - end end end end diff --git a/activejob/lib/active_job/serializers/object_serializer.rb b/activejob/lib/active_job/serializers/object_serializer.rb index d5ff8c91f1..318eabebdf 100644 --- a/activejob/lib/active_job/serializers/object_serializer.rb +++ b/activejob/lib/active_job/serializers/object_serializer.rb @@ -3,14 +3,12 @@ module ActiveJob module Serializers class ObjectSerializer < BaseSerializer - class << self - def serialize(hash) - { OBJECT_SERIALIZER_KEY => self.name }.merge!(hash) - end + def serialize(hash) + { OBJECT_SERIALIZER_KEY => self.class.name }.merge!(hash) + end - def deserialize?(argument) - argument.is_a?(Hash) && argument[OBJECT_SERIALIZER_KEY] == self.name - end + def deserialize?(argument) + argument.is_a?(Hash) && argument[OBJECT_SERIALIZER_KEY] == self.class.name end end end diff --git a/activejob/lib/active_job/serializers/standard_type_serializer.rb b/activejob/lib/active_job/serializers/standard_type_serializer.rb index efc02adcf0..1db4f3937d 100644 --- a/activejob/lib/active_job/serializers/standard_type_serializer.rb +++ b/activejob/lib/active_job/serializers/standard_type_serializer.rb @@ -4,22 +4,20 @@ module ActiveJob module Serializers # Provides methods to serialize and deserialize standard types # (`NilClass`, `String`, `Integer`, `Fixnum`, `Bignum`, `Float`, `BigDecimal`, `TrueClass`, `FalseClass`) - class StandardTypeSerializer < BaseSerializer - class << self - def serialize?(argument) - Arguments::TYPE_WHITELIST.include? argument.class - end + class StandardTypeSerializer < BaseSerializer # :nodoc: + def serialize?(argument) + Arguments::TYPE_WHITELIST.include? argument.class + end - def serialize(argument) - argument - end + def serialize(argument) + argument + end - alias_method :deserialize?, :serialize? + alias_method :deserialize?, :serialize? - def deserialize(argument) - object = GlobalID::Locator.locate(argument) if argument.is_a? String - object || argument - end + def deserialize(argument) + object = GlobalID::Locator.locate(argument) if argument.is_a? String + object || argument end end end diff --git a/activejob/lib/active_job/serializers/symbol_serializer.rb b/activejob/lib/active_job/serializers/symbol_serializer.rb index ec27f6828a..c8900de9d6 100644 --- a/activejob/lib/active_job/serializers/symbol_serializer.rb +++ b/activejob/lib/active_job/serializers/symbol_serializer.rb @@ -1,21 +1,19 @@ module ActiveJob module Serializers - class SymbolSerializer < ObjectSerializer - class << self - def serialize(argument) - super("value" => argument.to_s) - end + class SymbolSerializer < ObjectSerializer # :nodoc: + def serialize(argument) + super("value" => argument.to_s) + end - def deserialize(argument) - argument["value"].to_sym - end + def deserialize(argument) + argument["value"].to_sym + end - private + private def klass Symbol end - end end end end -- cgit v1.2.3