Skip to content

Commit

Permalink
Merge pull request #24 from telebugs/root-directory-filter
Browse files Browse the repository at this point in the history
Add RootDirectoryFilter middleware
  • Loading branch information
kyrylo committed Jun 18, 2024
2 parents e5dd1e0 + 527042d commit cffddde
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 5 deletions.
1 change: 1 addition & 0 deletions lib/telebugs.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
14 changes: 12 additions & 2 deletions lib/telebugs/config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -36,6 +45,7 @@ def reset

@middleware = MiddlewareStack.new
@middleware.use Middleware::GemRootFilter.new
@middleware.use Middleware::RootDirectoryFilter.new(root_directory)
end
end
end
27 changes: 27 additions & 0 deletions lib/telebugs/middleware/root_directory_filter.rb
Original file line number Diff line number Diff line change
@@ -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
22 changes: 22 additions & 0 deletions test/middleware/test_root_directory_filter.rb
Original file line number Diff line number Diff line change
@@ -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
18 changes: 15 additions & 3 deletions test/test_config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

0 comments on commit cffddde

Please sign in to comment.