Skip to content

Instantly share code, notes, and snippets.

@amkisko
Last active May 14, 2024 16:02
Show Gist options
  • Save amkisko/9aa686ddd8ebff52397a54fe34d9a036 to your computer and use it in GitHub Desktop.
Save amkisko/9aa686ddd8ebff52397a54fe34d9a036 to your computer and use it in GitHub Desktop.
Rails ActiveRecord and ActiveSupport callbacks wrapper for collecting metrics in pair with rspec
if ENV["DEBUG_CALLBACKS"]
Rails.application.eager_load!
ActiveRecord::Callbacks::CALLBACKS.each do |callback_type|
ApplicationRecord.descendants.each do |model|
kind, name = callback_type.to_s.split("_")
chain = model.__callbacks[name.to_sym]&.send(:chain)
filtered = chain&.select { |chain_callback| chain_callback.kind == kind.to_sym }
$callbacks_counter ||= {}
$callbacks_counter[model.name] ||= {}
$callbacks_counter[model.name][callback_type] = filtered&.count || 0
end
ApplicationRecord.define_method(:run_callbacks) do |kind, *args, &block|
$callbacks_stack ||= []
$callbacks_stack << [self.class.name, kind, caller_locations(1, 1).first.label].join("; ")
super(kind, *args, &block)
end
end
p $callbacks_counter
RSpec.configure do |config|
config.after(:each) do
$callbacks_stack.each do |callback|
puts callback
end
$callbacks_stack = []
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment