aboutsummaryrefslogtreecommitdiffstats
path: root/activejob
diff options
context:
space:
mode:
authorRafael Mendonça França <rafaelmfranca@gmail.com>2018-02-09 16:32:35 -0500
committerRafael Mendonça França <rafaelmfranca@gmail.com>2018-02-14 13:10:08 -0500
commitd2d98d69468bf34a39794496beb8f9f7b69088c4 (patch)
tree1712b44eb7082efabc7dedeb8e7058c3de9bc8bf /activejob
parentb098584f63521d214c1107e6eaa24f292b8e4df8 (diff)
downloadrails-d2d98d69468bf34a39794496beb8f9f7b69088c4.tar.gz
rails-d2d98d69468bf34a39794496beb8f9f7b69088c4.tar.bz2
rails-d2d98d69468bf34a39794496beb8f9f7b69088c4.zip
Allow serializers to be used either as classes or objects
Diffstat (limited to 'activejob')
-rw-r--r--activejob/lib/active_job/serializers/array_serializer.rb20
-rw-r--r--activejob/lib/active_job/serializers/base_serializer.rb32
-rw-r--r--activejob/lib/active_job/serializers/duration_serializer.rb22
-rw-r--r--activejob/lib/active_job/serializers/global_id_serializer.rb30
-rw-r--r--activejob/lib/active_job/serializers/hash_serializer.rb34
-rw-r--r--activejob/lib/active_job/serializers/hash_with_indifferent_access_serializer.rb26
-rw-r--r--activejob/lib/active_job/serializers/object_serializer.rb12
-rw-r--r--activejob/lib/active_job/serializers/standard_type_serializer.rb24
-rw-r--r--activejob/lib/active_job/serializers/symbol_serializer.rb18
-rw-r--r--activejob/test/cases/serializers_test.rb16
10 files changed, 110 insertions, 124 deletions
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
diff --git a/activejob/test/cases/serializers_test.rb b/activejob/test/cases/serializers_test.rb
index fb0e6ecae6..207ae55b49 100644
--- a/activejob/test/cases/serializers_test.rb
+++ b/activejob/test/cases/serializers_test.rb
@@ -17,21 +17,19 @@ class SerializersTest < ActiveSupport::TestCase
end
class DummySerializer < ActiveJob::Serializers::ObjectSerializer
- class << self
- def serialize(object)
- super({ "value" => object.value })
- end
+ def serialize(object)
+ super({ "value" => object.value })
+ end
- def deserialize(hash)
- DummyValueObject.new(hash["value"])
- end
+ def deserialize(hash)
+ DummyValueObject.new(hash["value"])
+ end
- private
+ private
def klass
DummyValueObject
end
- end
end
setup do