Skip to content

Commit 6bc65b0

Browse files
authored
Merge pull request #1037 from mame/coverage-for-eval
Support coverage for eval
2 parents 0f1c69a + 56ca3f5 commit 6bc65b0

File tree

7 files changed

+71
-0
lines changed

7 files changed

+71
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,5 @@ tmp
2828
.yardoc
2929
spec/fixtures/coverage
3030
spec/fixtures/frameworks/coverage
31+
spec/fixtures/eval_test/coverage
3132
test_projects/**/coverage

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,18 @@ Primary coverage determines what will come in first all output, and the type of
354354
355355
Note that coverage must first be enabled for non-default coverage types.
356356
357+
## Coverage for eval
358+
359+
You can measure coverage for code that is evaluated by `Kernel#eval`. Supported in CRuby versions 3.2+.
360+
361+
```ruby
362+
SimpleCov.start do
363+
enable_coverage_for_eval
364+
end
365+
```
366+
367+
This is typically useful for ERB. Set `ERB#filename=` to make it possible for SimpleCov to trace the original .erb source file.
368+
357369
## Filters
358370
359371
Filters can be used to remove selected files from your coverage data. By default, a filter is applied that removes all

lib/simplecov.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,8 @@ def start_coverage_with_criteria
351351
[lookup_corresponding_ruby_coverage_name(criterion), true]
352352
end.to_h
353353

354+
start_arguments[:eval] = true if coverage_for_eval_enabled?
355+
354356
Coverage.start(start_arguments) unless Coverage.running?
355357
end
356358

lib/simplecov/configuration.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,23 @@ def branch_coverage_supported?
444444
coverage_start_arguments_supported? && RUBY_ENGINE != "jruby"
445445
end
446446

447+
def coverage_for_eval_supported?
448+
require "coverage"
449+
defined?(Coverage.supported?) && Coverage.supported?(:eval)
450+
end
451+
452+
def coverage_for_eval_enabled?
453+
@coverage_for_eval_enabled ||= false
454+
end
455+
456+
def enable_coverage_for_eval
457+
if coverage_for_eval_supported?
458+
@coverage_for_eval_enabled = true
459+
else
460+
warn "Coverage for eval is not available; Use Ruby 3.2.0 or later"
461+
end
462+
end
463+
447464
private
448465

449466
def raise_if_criterion_disabled(criterion)

spec/coverage_for_eval_spec.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# frozen_string_literal: true
2+
3+
require "helper"
4+
5+
RSpec.describe "coverage for eval" do
6+
if SimpleCov.coverage_for_eval_supported?
7+
around do |test|
8+
Dir.chdir(File.join(File.dirname(__FILE__), "fixtures", "eval_test")) do
9+
FileUtils.rm_rf("./coverage")
10+
test.call
11+
end
12+
end
13+
14+
before do
15+
@stdout, @stderr, @status = Open3.capture3(command)
16+
end
17+
18+
context "foo" do
19+
let(:command) { "ruby eval_test.rb" }
20+
21+
it "records coverage for erb" do
22+
expect(@stdout).to include(" 2 / 3 LOC")
23+
end
24+
end
25+
end
26+
end

spec/fixtures/eval_test/eval_test.erb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<% if 1 + 1 == 2 %>
2+
covered
3+
<% else %>
4+
not covered
5+
<% end %>

spec/fixtures/eval_test/eval_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require "simplecov"
2+
SimpleCov.enable_coverage_for_eval
3+
SimpleCov.start "rails"
4+
5+
file = File.join(__dir__, "eval_test.erb")
6+
erb = ERB.new(File.read(file))
7+
erb.filename = file
8+
erb.run

0 commit comments

Comments
 (0)