Class: SimpleCov::ResultAdapter
| Relationships & Source Files | |
| Inherits: | Object |
| Defined in: | lib/simplecov/result_adapter.rb |
Overview
Responsible for adapting the format of the coverage result whether it's default or with statistics
Constant Summary
-
ADDRESS_PATTERN =
private
# File 'lib/simplecov/result_adapter.rb', line 40
Normalize memory addresses in method coverage keys so that results from different processes can be merged. Anonymous class names like "#Class:0x00007ff19ab24790" get inconsistent addresses across runs. Address widths vary by runtime (32-bit hosts: 8 hex chars; 64-bit CRuby: 16; some JVM/TruffleRuby formats may differ), so match any length of hex digits and collapse to a single placeholder.
/0x\h+/ -
ADDRESS_PLACEHOLDER =
private
# File 'lib/simplecov/result_adapter.rb', line 43"0x0" -
SINGLETON_WRAPPER_PATTERN =
private
# File 'lib/simplecov/result_adapter.rb', line 53
Strip the
#wrapper Ruby's Coverage adds to singleton-class method keys.module_functionand class methods get recorded both as singleton ([#<Class:Foo>, <code>:m</code>, …]) and instance/module ([Foo, <code>:m</code>, …]) entries pointing at the same source location; only one of the two is ever reachable at runtime, so we merge them. Only applies to named constants — anonymous-class addresses like#are left alone (handled by ADDRESS_PATTERN above)./\A#<Class:([A-Z_][\w:]*)>\z/
Class Method Summary
- .call(*args)
- .new(result) ⇒ ResultAdapter constructor
Instance Attribute Summary
- #result readonly
Instance Method Summary
Constructor Details
.new(result) ⇒ ResultAdapter
Class Method Details
.call(*args)
[ GitHub ]Instance Attribute Details
#result (readonly)
[ GitHub ]# File 'lib/simplecov/result_adapter.rb', line 8
attr_reader :result
Instance Method Details
#adapt
[ GitHub ]# File 'lib/simplecov/result_adapter.rb', line 18
def adapt return unless result result.each_with_object({}) do |(file_name, cover_statistic), adapted_result| if cover_statistic.is_a?(Array) adapted_result.merge!(file_name => {"lines" => cover_statistic}) else adapt_oneshot_lines_if_needed(file_name, cover_statistic) normalize_method_keys(cover_statistic) adapted_result.merge!(file_name => cover_statistic) end end end
#adapt_oneshot_lines_if_needed(file_name, cover_statistic) (private)
[ GitHub ]# File 'lib/simplecov/result_adapter.rb', line 71
def adapt_oneshot_lines_if_needed(file_name, cover_statistic) return unless cover_statistic.key?(:oneshot_lines) oneshot_lines = cover_statistic.delete(:oneshot_lines) line_stub = build_line_stub(file_name, oneshot_lines) oneshot_lines.each { |covered_line| line_stub[covered_line - 1] = 1 } cover_statistic[:lines] = line_stub end
#build_line_stub(file_name, oneshot_lines) (private)
[ GitHub ]# File 'lib/simplecov/result_adapter.rb', line 80
def build_line_stub(file_name, oneshot_lines) Coverage.line_stub(file_name) rescue Errno::ENOENT, SyntaxError Array.new(oneshot_lines.max || 0, nil) end
#normalize_method_keys(cover_statistic) (private)
[ GitHub ]# File 'lib/simplecov/result_adapter.rb', line 56
def normalize_method_keys(cover_statistic) methods = cover_statistic[:methods] return unless methods cover_statistic[:methods] = methods.each_with_object({}) do |(key, count), normalized| normalized_key = key.dup normalized_key[0] = key[0].to_s .gsub(ADDRESS_PATTERN, ADDRESS_PLACEHOLDER) .sub(SINGLETON_WRAPPER_PATTERN, '\1') # Keys may collide after normalization (anonymous classes sharing a # method name, or singleton + instance forms of a module_function method). normalized[normalized_key] = normalized.fetch(normalized_key, 0) + count end end