class Coverband::Reporters::Base
This is the base clase for report generation it helps with filtering, normalization, etc for final reprort generation
Constants
- DATA_KEY
Public Class Methods
fix_reports(reports)
click to toggle source
Add back files that exist in the project but have no Coverage
This makes it easy to find and delete files with no references
# File lib/coverband/reporters/base.rb, line 30 def fix_reports(reports) # list all files, even if not tracked by Coverband (0% coverage) tracked_glob = Coverband.configuration.tracked_search_paths filtered_report_files = {} reports.each_pair do |report_name, report_data| filtered_report_files[report_name] = {} report_files = Coverband::Utils::Result.add_not_loaded_files(report_data, tracked_glob) # apply coverband filters report_files.each_pair do |file, data| next if Coverband.configuration.ignore.any? { |i| file.match(i) } filtered_report_files[report_name][file] = data end end filtered_report_files end
report(store, _options = {})
click to toggle source
# File lib/coverband/reporters/base.rb, line 13 def report(store, _options = {}) all_roots = Coverband.configuration.all_root_paths scov_style_report = get_current_scov_data_imp(store, all_roots) # These are extremelhy verbose but useful during coverband development, not generally for users # Only avaiable by uncommenting this mode is never released # if Coverband.configuration.verbose # # msg = "report:\n #{scov_style_report.inspect}" # # Coverband.configuration.logger.debug msg # end scov_style_report end
Protected Class Methods
fix_file_names(report_hash, roots)
click to toggle source
# File lib/coverband/reporters/base.rb, line 51 def fix_file_names(report_hash, roots) Coverband.configuration.logger.debug "fixing root: #{roots.join(", ")}" if Coverband.configuration.verbose # normalize names across servers report_hash.each_with_object({}) do |(name, report), fixed_report| fixed_report[name] = {} report.each_pair do |key, vals| filename = Coverband::Utils::AbsoluteFileConverter.convert(key) fixed_report[name][filename] = if fixed_report[name].key?(filename) && fixed_report[name][filename][DATA_KEY] && vals[DATA_KEY] merged_data = merge_arrays(fixed_report[name][filename][DATA_KEY], vals[DATA_KEY]) vals[DATA_KEY] = merged_data vals else vals end end end end
get_current_scov_data_imp(store, roots)
click to toggle source
why do we need to merge covered files data? basically because paths on machines or deployed hosts could be different, so two different keys could point to the same filename or `line_key` TODO: think we are filtering based on ignore while sending to the store and as we also pull it out here
# File lib/coverband/reporters/base.rb, line 92 def get_current_scov_data_imp(store, roots) scov_style_report = {} store.get_coverage_report.each_pair do |name, data| data.each_pair do |key, line_data| next if Coverband.configuration.ignore.any? { |i| key.match(i) } next unless line_data scov_style_report[name] = {} unless scov_style_report.key?(name) scov_style_report[name][key] = line_data end end fix_file_names(scov_style_report, roots) end
merge_arrays(first, second)
click to toggle source
> merge_arrays(,[nil,nil,0,1,0,0]) > [nil,0,0,1,0,1]
# File lib/coverband/reporters/base.rb, line 72 def merge_arrays(first, second) merged = [] longest = first.length > second.length ? first : second longest.each_with_index do |_line, index| merged[index] = if first[index] || second[index] (first[index].to_i + second[index].to_i) end end merged end