From 1a8d3efb18994de8c0007ac3ab722ff257c0d91b Mon Sep 17 00:00:00 2001 From: ywenc Date: Wed, 5 Feb 2025 15:17:27 -0500 Subject: [PATCH 1/4] All relevant files to be customized --- lib/vernier/output/file_listing.rb | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/vernier/output/file_listing.rb b/lib/vernier/output/file_listing.rb index b21d62d2..9170d6fd 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: method(:default_relevant_files_filter)) @profile = profile + @relevant_files_filter = relevant_files_filter 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 From a54ee710821342163405daf2f17f701461d1817a Mon Sep 17 00:00:00 2001 From: ywenc Date: Wed, 5 Feb 2025 15:48:26 -0500 Subject: [PATCH 2/4] Customize relevant file name --- lib/vernier/output/file_listing.rb | 4 ++-- test/output/test_file_listing.rb | 37 ++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/lib/vernier/output/file_listing.rb b/lib/vernier/output/file_listing.rb index 9170d6fd..2cfd927e 100644 --- a/lib/vernier/output/file_listing.rb +++ b/lib/vernier/output/file_listing.rb @@ -121,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) @@ -150,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 From 3d5b8fd47c05c8daada898da5835738fe95fa270 Mon Sep 17 00:00:00 2001 From: ywenc Date: Thu, 6 Feb 2025 09:40:40 -0500 Subject: [PATCH 3/4] Do not let relevant files filter be nil --- lib/vernier/output/file_listing.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/vernier/output/file_listing.rb b/lib/vernier/output/file_listing.rb index 2cfd927e..05149812 100644 --- a/lib/vernier/output/file_listing.rb +++ b/lib/vernier/output/file_listing.rb @@ -20,9 +20,9 @@ def +(other) end end - def initialize(profile, relevant_files_filter: method(:default_relevant_files_filter)) + def initialize(profile, relevant_files_filter: nil) @profile = profile - @relevant_files_filter = relevant_files_filter + @relevant_files_filter ||= -> (*) { default_relevant_files_filter(*) } end def samples_by_file From 3f5ba6700771eca8baac05d16019ba5027ee3d73 Mon Sep 17 00:00:00 2001 From: ywenc Date: Tue, 11 Feb 2025 11:11:22 -0500 Subject: [PATCH 4/4] No anonymous parameter for default files filter --- lib/vernier/output/file_listing.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/vernier/output/file_listing.rb b/lib/vernier/output/file_listing.rb index 05149812..8227a6a2 100644 --- a/lib/vernier/output/file_listing.rb +++ b/lib/vernier/output/file_listing.rb @@ -22,7 +22,7 @@ def +(other) def initialize(profile, relevant_files_filter: nil) @profile = profile - @relevant_files_filter ||= -> (*) { default_relevant_files_filter(*) } + @relevant_files_filter ||= -> (filename) { default_relevant_files_filter(filename) } end def samples_by_file