From d15cbaca9b98f59e859ab114c13b6a8e92f83937 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Tue, 8 Jul 2025 12:59:15 +0100 Subject: [PATCH] Clean ActiveRecord backtraces as if they are in the source --- test/cases/helper_sqlserver.rb | 1 + test/support/core_ext/backtrace_cleaner.rb | 36 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 test/support/core_ext/backtrace_cleaner.rb diff --git a/test/cases/helper_sqlserver.rb b/test/cases/helper_sqlserver.rb index 4be7683b8..95edca121 100644 --- a/test/cases/helper_sqlserver.rb +++ b/test/cases/helper_sqlserver.rb @@ -5,6 +5,7 @@ Bundler.require :default, :development require "pry" require "support/core_ext/query_cache" +require "support/core_ext/backtrace_cleaner" require "support/minitest_sqlserver" require "support/test_in_memory_oltp" require "support/table_definition_sqlserver" diff --git a/test/support/core_ext/backtrace_cleaner.rb b/test/support/core_ext/backtrace_cleaner.rb new file mode 100644 index 000000000..54e2b3b8e --- /dev/null +++ b/test/support/core_ext/backtrace_cleaner.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +# Need to handle `ActiveRecord` lines like they are in the source rather than in the Rails gem. +module SQLServer + module BacktraceCleaner + extend ActiveSupport::Concern + + private + + def add_gem_filter + gems_paths = (Gem.path | [Gem.default_dir]).map { |p| Regexp.escape(p) } + return if gems_paths.empty? + + gems_regexp = %r{\A(#{gems_paths.join("|")})/(bundler/)?gems/([^/]+)-([\w.]+)/(.*)} + gems_result = '\3 (\4) \5' + + add_filter do |line| + if line.match?(/activerecord/) + line + else + line.sub(gems_regexp, gems_result) + end + end + end + + def add_gem_silencer + add_silencer do |line| + ActiveSupport::BacktraceCleaner::FORMATTED_GEMS_PATTERN.match?(line) && !/activerecord/.match?(line) + end + end + end +end + +ActiveSupport.on_load(:active_record) do + ActiveSupport::BacktraceCleaner.prepend(SQLServer::BacktraceCleaner) +end