diff --git a/lib/telebugs.rb b/lib/telebugs.rb index 6123798..b1114d9 100644 --- a/lib/telebugs.rb +++ b/lib/telebugs.rb @@ -20,6 +20,7 @@ require_relative "telebugs/truncator" require_relative "telebugs/middleware/gem_root_filter" +require_relative "telebugs/middleware/root_directory_filter" module Telebugs # The general error that this library uses when it wants to raise. diff --git a/lib/telebugs/config.rb b/lib/telebugs/config.rb index 7ba6ef5..663cfda 100644 --- a/lib/telebugs/config.rb +++ b/lib/telebugs/config.rb @@ -5,10 +5,10 @@ class Config ERROR_API_URL = "https://api.telebugs.com/2024-03-28/errors" attr_accessor :api_key, - :root_directory, :middleware - attr_reader :api_url + attr_reader :api_url, + :root_directory class << self attr_writer :instance @@ -26,6 +26,15 @@ def api_url=(url) @api_url = URI(url) end + def root_directory=(directory) + @root_directory = File.realpath(directory) + + if @middleware + @middleware.delete(Middleware::RootDirectoryFilter) + @middleware.use Middleware::RootDirectoryFilter.new(@root_directory) + end + end + def reset self.api_key = nil self.api_url = ERROR_API_URL @@ -36,6 +45,7 @@ def reset @middleware = MiddlewareStack.new @middleware.use Middleware::GemRootFilter.new + @middleware.use Middleware::RootDirectoryFilter.new(root_directory) end end end diff --git a/lib/telebugs/middleware/root_directory_filter.rb b/lib/telebugs/middleware/root_directory_filter.rb new file mode 100644 index 0000000..4711a75 --- /dev/null +++ b/lib/telebugs/middleware/root_directory_filter.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module Telebugs + class Middleware + # Filters out the root directory from the backtrace paths. + class RootDirectoryFilter < Telebugs::Middleware + def initialize(root_directory) + @root_directory = root_directory + end + + def call(report) + report.data[:errors].each do |error| + error[:backtrace].each do |frame| + next unless (file = frame[:file]) + next unless file.start_with?(@root_directory) + + file.sub!(/#{@root_directory}\/?/, "") + end + end + end + + def weight + -999 + end + end + end +end diff --git a/test/middleware/test_root_directory_filter.rb b/test/middleware/test_root_directory_filter.rb new file mode 100644 index 0000000..9533032 --- /dev/null +++ b/test/middleware/test_root_directory_filter.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require "test_helper" + +class TestRootDirectoryFilter < Minitest::Test + def test_root_directory_filter + root_directory = "/tmp" + Telebugs.configure do |c| + c.root_directory = root_directory + end + + e = StandardError.new("test error") + e.set_backtrace([ + "#{root_directory}/app/models/user.rb:1:in `save'" + ]) + + report = Telebugs::Report.new(e) + Telebugs::Middleware::RootDirectoryFilter.new(root_directory).call(report) + + assert_equal "app/models/user.rb", report.data[:errors][0][:backtrace][0][:file] + end +end diff --git a/test/test_config.rb b/test/test_config.rb index 62d824c..0577006 100644 --- a/test/test_config.rb +++ b/test/test_config.rb @@ -20,9 +20,20 @@ def test_error_api_url end def test_root_directory - Telebugs.configure { |c| c.root_directory = "/tmp" } + Telebugs.configure { |c| c.root_directory = "/etc" } - assert_equal "/tmp", Telebugs.config.root_directory + assert_equal "/etc", Telebugs.config.root_directory + end + + def test_root_directory_overwrite_root_directory_filter_middleware + Telebugs.configure do |c| + c.middleware.use Telebugs::Middleware::RootDirectoryFilter.new("/tmp") + c.root_directory = "/tmp" + c.root_directory = "/var" + c.root_directory = "/etc" + end + + assert_equal 2, Telebugs.config.middleware.middlewares.size end def test_middleware @@ -32,11 +43,12 @@ def test_middleware c.middleware.use middleware_class.new end - assert_equal 2, Telebugs.config.middleware.middlewares.size + assert_equal 3, Telebugs.config.middleware.middlewares.size end def test_default_middleware_list middleware_list = Telebugs.config.middleware.middlewares.map(&:class) assert_includes middleware_list, Telebugs::Middleware::GemRootFilter + assert_includes middleware_list, Telebugs::Middleware::RootDirectoryFilter end end