diff --git a/lib/vernier/output/file_listing.rb b/lib/vernier/output/file_listing.rb index b21d62d2..8227a6a2 100644 --- a/lib/vernier/output/file_listing.rb +++ b/lib/vernier/output/file_listing.rb @@ -20,8 +20,9 @@ def +(other) end end - def initialize(profile) + def initialize(profile, relevant_files_filter: nil) @profile = profile + @relevant_files_filter ||= -> (filename) { default_relevant_files_filter(filename) } end def samples_by_file @@ -77,11 +78,9 @@ def samples_by_file def output(template: nil) output = +"" - relevant_files = samples_by_file.select do |k, v| - next if k.start_with?("gem:") - next if k.start_with?("rubylib:") - next if k.start_with?("<") - v.values.map(&:total).sum > total * 0.01 + relevant_files = samples_by_file.select do |filename, v| + @relevant_files_filter.call(filename) && + v.values.map(&:total).sum > total * 0.01 end if template == "html" @@ -97,6 +96,12 @@ def output(template: nil) end end + def default_relevant_files_filter(filename) + !filename.start_with?("gem:") && + !filename.start_with?("rubylib:") && + !filename.start_with?("<") + end + def total thread = @profile.main_thread thread[:weights].sum @@ -116,7 +121,7 @@ def format_file(output, filename, all_samples, total:) else output << sprintf(" | | % 4i %s", lineno, line) end - end + end if File.exist?(filename) end def html_output(output, relevant_files) @@ -145,7 +150,7 @@ def format_file_html(output, filename, relevant_files) else output << sprintf(" | | % 4i %s", lineno, CGI::escapeHTML(line)) end - end + end if File.exist?(filename) end end end diff --git a/test/output/test_file_listing.rb b/test/output/test_file_listing.rb index 16a9de41..8367e3a8 100644 --- a/test/output/test_file_listing.rb +++ b/test/output/test_file_listing.rb @@ -30,10 +30,27 @@ def test_complex_profile assert_match(/\d+\.\d% \| *\d+\.\d% \| *\d+ +while Process\.clock_gettime/, output) end - def test_html_output + def test_complex_profile_html_output output = Vernier::Output::FileListing.new(@result).output(template: "html") assert_match(/
.+#{Regexp.escape(File.basename(__FILE__))}<\/summary>/, output) end + + def test_complex_profile_default_exclude_irrelevant_files + file_listing = Vernier::Output::FileListing.new(@result) + output = file_listing.output + assert_includes(file_listing.samples_by_file.keys.join, "gem:") + refute_match(/^gem:/, output) + end + + def test_complex_profile_customize_relevant_files + custom_relevant_files_filter = ->(filename) { filename == "lib/vernier.rb" } + file_listing = Vernier::Output::FileListing.new(@result, relevant_files_filter: custom_relevant_files_filter) + output = file_listing.output + + assert_includes(file_listing.samples_by_file.keys.join, File.basename(__FILE__)) + refute_match(File.basename(__FILE__), output) + assert_match("lib/vernier.rb", output) + end end describe "with a parsed profile" do @@ -51,10 +68,26 @@ def test_parsed_profile TEXT end - def test_html_output + def test_parsed_profile_html_output output = Vernier::Output::FileListing.new(@profile).output(template: "html") assert_includes output, " 24.5%
examples/gvl_sleep.rb\n" end + + def test_parsed_profile_default_exclude_irrelevant_files + file_listing = Vernier::Output::FileListing.new(@profile) + output = file_listing.output + assert_includes(file_listing.samples_by_file.keys.join, "gem:") + refute_match(/^gem:/, output) + end + + def test_parsed_profile_customize_relevant_files + custom_relevant_files_filter = ->(filename) { filename != "examples/gvl_sleep.rb" } + file_listing = Vernier::Output::FileListing.new(@profile, relevant_files_filter: custom_relevant_files_filter) + output = file_listing.output + + assert_includes(file_listing.samples_by_file.keys.join, "examples/gvl_sleep.rb") + refute_match("examples/gvl_sleep.rb", output) + end end end