Separate out callbacks per ActiveJob pattern

This commit is contained in:
Benjamin Fleischer 2015-11-08 21:01:02 -06:00
parent e8efc4eff4
commit b36cc42f03
3 changed files with 86 additions and 30 deletions

View File

@ -9,6 +9,7 @@ module ActiveModelSerializers
extend ActiveSupport::Autoload
autoload :Model
autoload :Callbacks
autoload :Logging
module_function

View File

@ -0,0 +1,55 @@
# Adapted from
# https://github.com/rails/rails/blob/7f18ea14c8/activejob/lib/active_job/callbacks.rb
require 'active_support/callbacks'
module ActiveModelSerializers
# = ActiveModelSerializers Callbacks
#
# ActiveModelSerializers provides hooks during the life cycle of serialization and
# allow you to trigger logic. Available callbacks are:
#
# * <tt>around_render</tt>
#
module Callbacks
extend ActiveSupport::Concern
include ActiveSupport::Callbacks
included do
define_callbacks :render
end
# These methods will be included into any ActiveModelSerializers object, adding
# callbacks for +render+.
module ClassMethods
# Defines a callback that will get called around the render method,
# whether it is as_json, to_json, or serializable_hash
#
# class ActiveModel::SerializableResource
# include ActiveModelSerializers::Callbacks
#
# around_render do |args, block|
# tag_logger do
# notify_render do
# block.call(args)
# end
# end
# end
#
# def as_json
# run_callbacks :render do
# adapter.as_json
# end
# end
# # Note: So that we can re-use the instrumenter for as_json, to_json, and
# # serializable_hash, we aren't using the usual format, which would be:
# # def render(args)
# # adapter.as_json
# # end
# end
#
def around_render(*filters, &blk)
set_callback(:render, :around, *filters, &blk)
end
end
end
end

View File

@ -1,39 +1,19 @@
##
# Adapted from:
# https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb
# ActiveModelSerializers::Logging
#
# https://github.com/rails/rails/blob/280654ef88/activejob/lib/active_job/logging.rb
#
# Provides a single method +notify+ to be used to declare when
# something a method notifies.
#
# class Adapter
# def self.klass_method
# # ...
# end
#
# def instance_method
# # ...
# end
#
# extend ActiveModelSerializers::Logging
# notify :instance_method, :render
#
# class << self
# extend ActiveModelSerializers::Logging
# notify :klass_method, :render
# end
# end
module ActiveModelSerializers::Logging
extend ActiveSupport::Concern
included do
include ActiveSupport::Callbacks
instrument_around_render
include ActiveModelSerializers::Callbacks
extend NotificationMacro
instrument_rendering
end
module ClassMethods
def instrument_around_render
define_callbacks :render
def instrument_rendering
around_render do |args, block|
tag_logger do
notify_render do
@ -42,11 +22,31 @@ module ActiveModelSerializers::Logging
end
end
end
end
def around_render(*filters, &blk)
set_callback(:render, :around, *filters, &blk)
end
# Adapted from:
# https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb
# Provides a single method +notify+ to be used to declare when
# something a method notifies, with the argument +callback_name+ of the notification callback.
#
# class Adapter
# def self.klass_method
# # ...
# end
#
# def instance_method
# # ...
# end
#
# include ActiveModelSerializers::Logging
# notify :instance_method, :render
#
# class << self
# extend ActiveModelSerializers::Logging::NotificationMacro
# notify :klass_method, :render
# end
# end
module NotificationMacro
##
# Simple notify method that wraps up +name+
# in a dummy method. It notifies on with the +callback_name+ notifier on