123456789_123456789_123456789_123456789_123456789_

Class: SimpleCov::Result

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Forwardable
Inherits: Object
Defined in: lib/simplecov/result.rb

Overview

A simplecov code coverage result, initialized from the Hash Ruby's built-in coverage library generates (Coverage.result).

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(original_result, command_name: nil, created_at: nil, not_loaded_files: Set.new, filters: SimpleCov.filters, groups: SimpleCov.groups) ⇒ Result

Initialize a new Result from given Coverage.result (a Hash of filenames each containing an array of coverage data).

filters defaults to the singleton's configured filter chain (SimpleCov.filters) so existing call sites are unchanged. Pass an empty array to opt out — useful for tests that build synthetic Results and don't want the project's filters applied. #groups behaves the same way against SimpleCov.groups.

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 40

def initialize(original_result, command_name: nil, created_at: nil, not_loaded_files: Set.new,
               filters: SimpleCov.filters, groups: SimpleCov.groups)
  result = original_result
  @original_result = result.freeze
  @command_name = command_name
  @created_at = created_at
  @groups_config = groups
  @files = SimpleCov::FileList.new(
    result.filter_map { |filename, coverage| build_source_file(filename, coverage, not_loaded_files) }
          .sort_by(&:filename)
  )
  apply_filters!(filters)
end

Class Method Details

.from_hash(hash)

Loads a #to_hash dump

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 91

def self.from_hash(hash)
  hash.map do |command_name, data|
    new(data.fetch("coverage"), command_name: command_name, created_at: Time.at(data["timestamp"]))
  end
end

Instance Attribute Details

#command_name (rw)

The command name that launched this result. Delegated to SimpleCov.command_name if not set manually

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 76

def command_name
  @command_name ||= SimpleCov.command_name
end

#command_name=(value) (rw)

Explicitly set the command name that was used for this coverage result. Defaults to SimpleCov.command_name

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 23

attr_writer :command_name

#created_at (rw)

Defines when this result has been created. Defaults to Time.now

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 70

def created_at
  @created_at ||= Time.now
end

#created_at=(value) (rw)

Explicitly set the Time this result has been created

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 21

attr_writer :created_at

#files (readonly) Also known as: #source_files

Returns all files that are applicable to this result (sans filters!) as instances of SourceFile. Aliased as :source_files

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 18

attr_reader :files

#original_result (readonly)

Returns the original Coverage.result used for this instance of Result

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 15

attr_reader :original_result

#source_files (readonly)

Alias for #files.

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 19

alias source_files files

Instance Method Details

#apply_filters!(filters) (private)

Applies the given filter chain to @files, dropping each source file that any filter matches.

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 116

def apply_filters!(filters)
  filters.each do |filter|
    @files = SimpleCov::FileList.new(@files.reject { |source_file| filter.matches?(source_file) })
  end
end

#apply_groups (private)

Build the per-group FileLists from @groups_config, plus the implicit "Ungrouped" bucket for files that no group filter matched.

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 125

def apply_groups
  return {} if @groups_config.empty?

  grouped = @groups_config.transform_values do |filter|
    SimpleCov::FileList.new(files.select { |source_file| filter.matches?(source_file) })
  end

  in_group  = grouped.values.flat_map(&:to_a)
  ungrouped = files.reject { |source_file| in_group.include?(source_file) }
  grouped["Ungrouped"] = SimpleCov::FileList.new(ungrouped) if ungrouped.any?

  grouped
end

#build_source_file(filename, coverage, not_loaded_files) (private)

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 99

def build_source_file(filename, coverage, not_loaded_files)
  return unless File.file?(filename)

  SimpleCov::SourceFile.new(
    filename,
    JSON.parse(JSON.dump(coverage)),
    loaded: !not_loaded_files.include?(filename)
  )
end

#coverage (private)

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 109

def coverage
  keys = original_result.keys & filenames
  keys.zip(original_result.values_at(*keys)).to_h
end

#filenames

Returns all filenames for source files contained in this result

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 55

def filenames
  files.map(&:filename)
end

#format!

Applies the configured SimpleCov.formatter on this result

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 65

def format!
  SimpleCov.formatter.new.format(self)
end

#groups

Returns a Hash of groups for this result. Define groups using SimpleCov.add_group 'Models', 'app/models'

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 60

def groups
  @groups ||= apply_groups
end

#to_hash

Returns a hash representation of this Result that can be used for marshalling it into JSON

[ GitHub ]

  
# File 'lib/simplecov/result.rb', line 81

def to_hash
  {
    command_name => {
      "coverage" => coverage,
      "timestamp" => created_at.to_i
    }
  }
end