[ruby-core:110000] [Ruby master Feature#19008] Introduce coverage support for `eval`.
From:
"mame (Yusuke Endoh)" <noreply@...>
Date:
2022-09-22 20:46:37 UTC
List:
ruby-core #110000
Issue #19008 has been updated by mame (Yusuke Endoh).
We discussed this proposal at the dev meeting, and @matz decided to give it a try.
@ioquatix has been merged the PR, but I noticed two additional problems:
## 1. eval may discard existing file coverage data
```ruby
require "coverage"
Coverage.start
load "tt.rb"
# the content of tt.rb
#
# 1: 100.times do
# 2: 1
# 3: end
# The coverage of tt.rb is gathered correctly
p Coverage.result(reset: false) #=> {"tt.rb"=>[1, 100, nil]}
# Call eval with a file "tt.rb"
eval(<<SRC, nil, "tt.rb", 1)
p 1
p 2
p 3
SRC
# The gathered coverage is discarded, and overwritten with a new coverage data for eval
p Coverage.result #=> {"tt.rb"=>[1, 1, 1]}
```
I am unsure what behavior is desirable here, but at least I think it should not discard the old coverage for a file. I think a file coverage is more important than an eval coverage.
I propose three possible solutions:
* 1. Do not record an eval coverage when a file coverage already exists. (And if a file is required after eval, overwrite an eval coverage with a file coverage)
* 2. Accumulate the two data (It is inaccurate, but it is maybe better than current)
* 3. Record the data for eval as another key (This will break some coverage tools because it changes the type of keys)
```
# Solution 1
p Coverage.result #=> {"tt.rb"=>[1, 100, nil]}
# Solution 2
p Coverage.result #=> {"tt.rb"=>[2, 101, 1]}
# Solution 3
p Coverage.result #=> {"tt.rb"=>[1, 100, nil], [:eval, "tt.rb"]=>[1, 1, 1]}
```
Personally, I like Solution 1.
## 2. branch coverage with ERB does not work well
Branch coverage includes column information, but this will not work well with ERB, because ERB generate code to keep row numbers, but it does not keep column numbers (it is almost impossible).
I think this would be difficult to resolve. So I guess the only thing we can do is to document it.
@ioquatix What do you think? Can you create an additional patch?
----------------------------------------
Feature #19008: Introduce coverage support for `eval`.
https://bugs.ruby-lang.org/issues/19008#change-99252
* Author: ioquatix (Samuel Williams)
* Status: Open
* Priority: Normal
----------------------------------------
I'd like to introduce coverage support for `eval`. I mostly only care about the case where an explicit path is given, and I'd even be okay to only handle the case where the line number is the default (0).
https://github.com/ruby/ruby/pull/6396
This is an incredibly useful feature for computing coverage of ERB templates and other similar things.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>