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 extend ActiveSupport::Autoload
autoload :Model autoload :Model
autoload :Callbacks
autoload :Logging autoload :Logging
module_function 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: # ActiveModelSerializers::Logging
# https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb #
# https://github.com/rails/rails/blob/280654ef88/activejob/lib/active_job/logging.rb # 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 module ActiveModelSerializers::Logging
extend ActiveSupport::Concern extend ActiveSupport::Concern
included do included do
include ActiveSupport::Callbacks include ActiveModelSerializers::Callbacks
instrument_around_render extend NotificationMacro
instrument_rendering
end end
module ClassMethods module ClassMethods
def instrument_around_render def instrument_rendering
define_callbacks :render
around_render do |args, block| around_render do |args, block|
tag_logger do tag_logger do
notify_render do notify_render do
@ -42,11 +22,31 @@ module ActiveModelSerializers::Logging
end end
end end
end end
end
def around_render(*filters, &blk) # Adapted from:
set_callback(:render, :around, *filters, &blk) # https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb
end # 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+ # Simple notify method that wraps up +name+
# in a dummy method. It notifies on with the +callback_name+ notifier on # in a dummy method. It notifies on with the +callback_name+ notifier on