From 3785a5729959a838bb13f2d298a59e12e1844f74 Mon Sep 17 00:00:00 2001 From: Evgenii Pecherkin Date: Mon, 23 Oct 2017 17:29:28 +0400 Subject: [PATCH] Remove non-default serializers --- activejob/README.md | 4 -- activejob/lib/active_job/serializers.rb | 21 ++---- .../serializers/class_serializer.rb | 24 ------- .../serializers/duration_serializer.rb | 42 ------------ .../serializers/struct_serializer.rb | 38 ----------- .../serializers/symbol_serializer.rb | 28 -------- .../lib/rails/generators/job/job_generator.rb | 2 +- .../test/cases/argument_serialization_test.rb | 8 +-- activejob/test/cases/serializers_test.rb | 64 +++++++++++++++++++ guides/source/active_job_basics.md | 4 -- 10 files changed, 72 insertions(+), 163 deletions(-) delete mode 100644 activejob/lib/active_job/serializers/class_serializer.rb delete mode 100644 activejob/lib/active_job/serializers/duration_serializer.rb delete mode 100644 activejob/lib/active_job/serializers/struct_serializer.rb delete mode 100644 activejob/lib/active_job/serializers/symbol_serializer.rb create mode 100644 activejob/test/cases/serializers_test.rb diff --git a/activejob/README.md b/activejob/README.md index 152f924525..56562d870b 100644 --- a/activejob/README.md +++ b/activejob/README.md @@ -57,10 +57,6 @@ That's it! ActiveJob supports the following types of arguments by default: - Standard types (`NilClass`, `String`, `Integer`, `Fixnum`, `Bignum`, `Float`, `BigDecimal`, `TrueClass`, `FalseClass`) - - `Symbol` (`:foo`, `:bar`, ...) - - `ActiveSupport::Duration` (`1.day`, `2.weeks`, ...) - - Classes constants (`ActiveRecord::Base`, `MySpecialService`, ...) - - Struct instances (`Struct.new('Rectangle', :width, :height).new(12, 20)`, ...) - `Hash`. Keys should be of `String` or `Symbol` type - `ActiveSupport::HashWithIndifferentAccess` - `Array` diff --git a/activejob/lib/active_job/serializers.rb b/activejob/lib/active_job/serializers.rb index ec86065149..68ed94896e 100644 --- a/activejob/lib/active_job/serializers.rb +++ b/activejob/lib/active_job/serializers.rb @@ -27,15 +27,11 @@ module ActiveJob autoload :ArraySerializer autoload :BaseSerializer - autoload :ClassSerializer - autoload :DurationSerializer autoload :GlobalIDSerializer autoload :HashWithIndifferentAccessSerializer autoload :HashSerializer autoload :ObjectSerializer autoload :StandardTypeSerializer - autoload :StructSerializer - autoload :SymbolSerializer included do class_attribute :_additional_serializers, instance_accessor: false, instance_predicate: false @@ -46,14 +42,14 @@ module ActiveJob module ClassMethods # Returns list of known serializers def serializers - self._additional_serializers + SERIALIZERS + self._additional_serializers + ActiveJob::Serializers::SERIALIZERS end # Adds a new serializer to a list of known serializers - def add_serializers(*serializers) - check_duplicate_serializer_keys!(serializers) + def add_serializers(*new_serializers) + check_duplicate_serializer_keys!(new_serializers) - @_additional_serializers = serializers + @_additional_serializers + self._additional_serializers = new_serializers + self._additional_serializers end # Returns a list of reserved keys, which cannot be used as keys for a hash @@ -66,7 +62,7 @@ module ActiveJob def check_duplicate_serializer_keys!(serializers) keys_to_add = serializers.select { |s| s.respond_to?(:key) }.map(&:key) - duplicate_keys = reserved_keys & keys_to_add + duplicate_keys = reserved_serializers_keys & keys_to_add raise ArgumentError.new("Can't add serializers because of keys duplication: #{duplicate_keys}") if duplicate_keys.any? end @@ -75,21 +71,16 @@ module ActiveJob # :nodoc: SERIALIZERS = [ ::ActiveJob::Serializers::GlobalIDSerializer, - ::ActiveJob::Serializers::DurationSerializer, - ::ActiveJob::Serializers::StructSerializer, - ::ActiveJob::Serializers::SymbolSerializer, - ::ActiveJob::Serializers::ClassSerializer, ::ActiveJob::Serializers::StandardTypeSerializer, ::ActiveJob::Serializers::HashWithIndifferentAccessSerializer, ::ActiveJob::Serializers::HashSerializer, ::ActiveJob::Serializers::ArraySerializer ].freeze - private_constant :SERIALIZERS class << self # Returns serialized representative of the passed object. # Will look up through all known serializers. - # Raises `SerializationError` if it can't find a proper serializer. + # Raises `ActiveJob::SerializationError` if it can't find a proper serializer. def serialize(argument) serializer = ::ActiveJob::Base.serializers.detect { |s| s.serialize?(argument) } raise SerializationError.new("Unsupported argument type: #{argument.class.name}") unless serializer diff --git a/activejob/lib/active_job/serializers/class_serializer.rb b/activejob/lib/active_job/serializers/class_serializer.rb deleted file mode 100644 index d36e8c0ebc..0000000000 --- a/activejob/lib/active_job/serializers/class_serializer.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -module ActiveJob - module Serializers - # Provides methods to serialize and deserialize `Class` (`ActiveRecord::Base`, `MySpecialService`, ...) - class ClassSerializer < ObjectSerializer - class << self - def serialize(argument_klass) - { key => "::#{argument_klass.name}" } - end - - def key - "_aj_class" - end - - private - - def klass - ::Class - 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 deleted file mode 100644 index 72b7b9528a..0000000000 --- a/activejob/lib/active_job/serializers/duration_serializer.rb +++ /dev/null @@ -1,42 +0,0 @@ -# frozen_string_literal: true - -module ActiveJob - module Serializers - # Provides methods to serialize and deserialize `ActiveSupport::Duration` (`1.day`, `2.weeks`, ...) - class DurationSerializer < ObjectSerializer - class << self - def serialize(duration) - { - key => duration.value, - parts_key => ::ActiveJob::Serializers.serialize(duration.parts) - } - end - - def deserialize(hash) - value = hash[key] - parts = ::ActiveJob::Serializers.deserialize(hash[parts_key]) - - klass.new(value, parts) - end - - def key - "_aj_activesupport_duration" - end - - private - - def klass - ::ActiveSupport::Duration - end - - def keys - super.push parts_key - end - - def parts_key - "parts" - end - end - end - end -end diff --git a/activejob/lib/active_job/serializers/struct_serializer.rb b/activejob/lib/active_job/serializers/struct_serializer.rb deleted file mode 100644 index f6791611ed..0000000000 --- a/activejob/lib/active_job/serializers/struct_serializer.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -module ActiveJob - module Serializers - # Provides methods to serialize and deserialize struct instances - # (`Struct.new('Rectangle', :width, :height).new(12, 20)`) - class StructSerializer < ObjectSerializer - class << self - def serialize(object) - super.merge values_key => ::ActiveJob::Serializers.serialize(object.values) - end - - def deserialize(hash) - values = ::ActiveJob::Serializers.deserialize(hash[values_key]) - super.new(*values) - end - - def key - "_aj_struct" - end - - private - - def klass - ::Struct - end - - def keys - super.push values_key - end - - def values_key - "values" - end - end - end - end -end diff --git a/activejob/lib/active_job/serializers/symbol_serializer.rb b/activejob/lib/active_job/serializers/symbol_serializer.rb deleted file mode 100644 index f128ae8284..0000000000 --- a/activejob/lib/active_job/serializers/symbol_serializer.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true - -module ActiveJob - module Serializers - # Provides methods to serialize and deserialize `Symbol` (`:foo`, `:bar`, ...) - class SymbolSerializer < ObjectSerializer - class << self - def serialize(symbol) - { key => symbol.to_s } - end - - def deserialize(hash) - hash[key].to_sym - end - - def key - "_aj_symbol" - end - - private - - def klass - ::Symbol - end - end - end - end -end diff --git a/activejob/lib/rails/generators/job/job_generator.rb b/activejob/lib/rails/generators/job/job_generator.rb index c940cd154c..69b4fe7d26 100644 --- a/activejob/lib/rails/generators/job/job_generator.rb +++ b/activejob/lib/rails/generators/job/job_generator.rb @@ -30,7 +30,7 @@ module Rails # :nodoc: private def application_job_file_name @application_job_file_name ||= if mountable_engine? - "app/jobs/#{namespaced_path}/application_job.rb" + "app/jobs/#{namespaced_path}/application_job.rb" else "app/jobs/application_job.rb" end diff --git a/activejob/test/cases/argument_serialization_test.rb b/activejob/test/cases/argument_serialization_test.rb index 20296038a0..13e6fcb727 100644 --- a/activejob/test/cases/argument_serialization_test.rb +++ b/activejob/test/cases/argument_serialization_test.rb @@ -4,7 +4,6 @@ require "helper" require "active_job/arguments" require "models/person" require "active_support/core_ext/hash/indifferent_access" -require "active_support/duration" require "jobs/kwargs_job" class ArgumentSerializationTest < ActiveSupport::TestCase @@ -14,7 +13,6 @@ class ArgumentSerializationTest < ActiveSupport::TestCase [ nil, 1, 1.0, 1_000_000_000_000_000_000_000, "a", true, false, BigDecimal.new(5), - :a, self, 1.day, [ 1, "a" ], { "a" => 1 } ].each do |arg| @@ -23,7 +21,7 @@ class ArgumentSerializationTest < ActiveSupport::TestCase end end - [ Object.new, Person.find("5").to_gid ].each do |arg| + [ :a, Object.new, self, Person.find("5").to_gid ].each do |arg| test "does not serialize #{arg.class}" do assert_raises ActiveJob::SerializationError do ActiveJob::Arguments.serialize [ arg ] @@ -35,10 +33,6 @@ class ArgumentSerializationTest < ActiveSupport::TestCase end end - test "serializes Struct" do - assert_arguments_unchanged Struct.new("Rectangle", :width, :height).new(10, 15) - end - test "should convert records to Global IDs" do assert_arguments_roundtrip [@person] end diff --git a/activejob/test/cases/serializers_test.rb b/activejob/test/cases/serializers_test.rb new file mode 100644 index 0000000000..90d4155b3b --- /dev/null +++ b/activejob/test/cases/serializers_test.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +require "helper" +require "active_job/serializers" + +class SerializersTest < ActiveSupport::TestCase + class DummyValueObject + attr_accessor :value + + def initialize(value) + @value = value + end + end + + class DummySerializer < ActiveJob::Serializers::ObjectSerializer + class << self + def serialize(object) + { key => object.value } + end + + def deserialize(hash) + DummyValueObject.new(hash[key]) + end + + def key + "_dummy_serializer" + end + + private + + def klass + DummyValueObject + end + end + end + + setup do + @value_object = DummyValueObject.new 123 + ActiveJob::Base._additional_serializers = [] + end + + test "can't serialize unknown object" do + assert_raises ActiveJob::SerializationError do + ActiveJob::Serializers.serialize @value_object + end + end + + test "won't deserialize unknown hash" do + hash = { "_dummy_serializer" => 123, "_aj_symbol_keys" => [] } + assert ActiveJob::Serializers.deserialize(hash), hash.except("_aj_symbol_keys") + end + + test "adds new serializer" do + ActiveJob::Base.add_serializers DummySerializer + assert ActiveJob::Base.serializers.include?(DummySerializer) + end + + test "can't add serializer with the same key twice" do + ActiveJob::Base.add_serializers DummySerializer + assert_raises ArgumentError do + ActiveJob::Base.add_serializers DummySerializer + end + end +end diff --git a/guides/source/active_job_basics.md b/guides/source/active_job_basics.md index a7067cb97d..eea64f9367 100644 --- a/guides/source/active_job_basics.md +++ b/guides/source/active_job_basics.md @@ -345,10 +345,6 @@ Supported types for arguments ActiveJob supports the following types of arguments by default: - Basic types (`NilClass`, `String`, `Integer`, `Fixnum`, `Bignum`, `Float`, `BigDecimal`, `TrueClass`, `FalseClass`) - - `Symbol` (`:foo`, `:bar`, ...) - - `ActiveSupport::Duration` (`1.day`, `2.weeks`, ...) - - Classes constants (`ActiveRecord::Base`, `MySpecialService`, ...) - - Struct instances (`Struct.new('Rectangle', :width, :height).new(12, 20)`, ...) - `Hash`. Keys should be of `String` or `Symbol` type - `ActiveSupport::HashWithIndifferentAccess` - `Array`