diff --git a/CHANGELOG.md b/CHANGELOG.md index acb151f7..94cece74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ### [0-9-stable](https://github.com/rails-api/active_model_serializers/compare/v0.9.5...0-9-stable) +- [#2080](https://github.com/rails-api/active_model_serializers/pull/2080) remove `{ payload: nil }` from `!serialize.active_model_serializers` ActiveSupport::Notification. `payload` never had a value. Changes, for example `{ serializer: 'ActiveModel::DefaultSerializer', payload: nil }` to be `{ serializer: 'ActiveModel::DefaultSerializer' }` (@yosiat) + ### [v0.9.6 (2017-01-10)](https://github.com/rails-api/active_model_serializers/compare/v0.9.5...v0.9.6) - [#2008](https://github.com/rails-api/active_model_serializers/pull/2008) Fix warning on Thor. (@kirs) diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index 78455537..2c6a4738 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -64,10 +64,5 @@ module ActiveModel end end - private - - def instrumentation_keys - [:object, :scope, :root, :meta_key, :meta, :each_serializer, :resource_name, :key_format, :context] - end end end diff --git a/lib/active_model/default_serializer.rb b/lib/active_model/default_serializer.rb index c2db6b1d..6c809787 100644 --- a/lib/active_model/default_serializer.rb +++ b/lib/active_model/default_serializer.rb @@ -15,18 +15,14 @@ module ActiveModel end def as_json(options={}) - instrument('!serialize') do + instrument do return [] if @object.nil? && @wrap_in_array hash = @object.as_json @wrap_in_array ? [hash] : hash end end + alias serializable_hash as_json alias serializable_object as_json - - private - def instrumentation_keys - [:object, :wrap_in_array] - end end end diff --git a/lib/active_model/serializable.rb b/lib/active_model/serializable.rb index d23aae7d..46584039 100644 --- a/lib/active_model/serializable.rb +++ b/lib/active_model/serializable.rb @@ -2,12 +2,14 @@ require 'active_model/serializable/utils' module ActiveModel module Serializable + INSTRUMENTATION_KEY = '!serialize.active_model_serializers'.freeze + def self.included(base) base.extend Utils end def as_json(options={}) - instrument('!serialize') do + instrument do if root = options.fetch(:root, json_key) hash = { root => serializable_object(options) } hash.merge!(serializable_data) @@ -19,9 +21,7 @@ module ActiveModel end def serializable_object_with_notification(options={}) - instrument('!serialize') do - serializable_object(options) - end + instrument { serializable_object(options) } end def serializable_data @@ -51,16 +51,9 @@ module ActiveModel modules[0..-2].join('::') if modules.size > 1 end - def instrument(action, &block) - payload = instrumentation_keys.inject({ serializer: self.class.name }) do |payload, key| - payload[:payload] = self.instance_variable_get(:"@#{key}") - payload - end - ActiveSupport::Notifications.instrument("#{action}.active_model_serializers", payload, &block) - end - - def instrumentation_keys - [:object, :scope, :root, :meta_key, :meta, :wrap_in_array, :only, :except, :key_format] + def instrument(&block) + payload = { serializer: self.class.name } + ActiveSupport::Notifications.instrument(INSTRUMENTATION_KEY, payload, &block) end end end diff --git a/test/unit/active_model/serilizable_test.rb b/test/unit/active_model/serilizable_test.rb new file mode 100644 index 00000000..99060689 --- /dev/null +++ b/test/unit/active_model/serilizable_test.rb @@ -0,0 +1,50 @@ +require 'test_helper' + +module ActiveModel + class SerializableTest + class InstrumentationTest < Minitest::Test + def setup + @events = [] + + @subscriber = ActiveSupport::Notifications.subscribe('!serialize.active_model_serializers') do |name, start, finish, id, payload| + @events << { name: name, serializer: payload[:serializer] } + end + end + + def teardown + ActiveSupport::Notifications.unsubscribe(@subscriber) if defined?(@subscriber) + end + + def test_instruments_default_serializer + DefaultSerializer.new(1).as_json + + assert_equal [{ name: '!serialize.active_model_serializers', serializer: 'ActiveModel::DefaultSerializer' }], @events + end + + def test_instruments_serializer + profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1') + serializer = ProfileSerializer.new(profile) + + serializer.as_json + + assert_equal [{ name: '!serialize.active_model_serializers', serializer: 'ProfileSerializer' }], @events + end + + def test_instruments_array_serializer + profiles = [ + Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1'), + Profile.new(name: 'Name 2', description: 'Description 2', comments: 'Comments 2') + ] + serializer = ArraySerializer.new(profiles) + + serializer.as_json + + assert_equal [ + { name: '!serialize.active_model_serializers', serializer: 'ProfileSerializer' }, + { name: '!serialize.active_model_serializers', serializer: 'ProfileSerializer' }, + { name: '!serialize.active_model_serializers', serializer: 'ActiveModel::ArraySerializer' } + ], @events + end + end + end +end