Class: Ibex::Impact::CoverageImpact

Inherits:
Object
  • Object
show all
Defined in:
lib/ibex/impact/coverage_impact.rb,
sig/ibex/impact/coverage_impact.rbs

Overview

Selects separated runtime coverage reports for affected productions.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(automaton, production_ids, reports) ⇒ CoverageImpact

Returns a new instance of CoverageImpact.

RBS:

  • (IR::Automaton automaton, Array[Integer], Array[[String, Coverage::Report]]) -> void

Parameters:



13
14
15
16
17
18
19
20
# File 'lib/ibex/impact/coverage_impact.rb', line 13

def initialize(automaton, production_ids, reports)
  @automaton = automaton
  @production_ids = production_ids.sort
  @warnings = []
  @reports = select_reports(reports)
  @status = coverage_status(reports)
  freeze
end

Instance Attribute Details

#reportsArray[Hash[Symbol, Object?]] (readonly)

Signature:

  • Array[Hash[Symbol, Object?]]

Returns:

  • (Array[Hash[Symbol, Object?]])


9
10
11
# File 'lib/ibex/impact/coverage_impact.rb', line 9

def reports
  @reports
end

#statusString (readonly)

Signature:

  • String

Returns:

  • (String)


8
9
10
# File 'lib/ibex/impact/coverage_impact.rb', line 8

def status
  @status
end

#warningsArray[String] (readonly)

Signature:

  • Array[String]

Returns:

  • (Array[String])


10
11
12
# File 'lib/ibex/impact/coverage_impact.rb', line 10

def warnings
  @warnings
end

Instance Method Details

#coverage_status(reports) ⇒ String

RBS:

  • (Array[[String, Coverage::Report]]) -> String

Parameters:

Returns:

  • (String)


46
47
48
49
50
# File 'lib/ibex/impact/coverage_impact.rb', line 46

def coverage_status(reports)
  return "not_requested" if reports.empty?

  @reports.empty? ? "unmatched" : "matched"
end

#select_reports(reports) ⇒ Array[Hash[Symbol, Object?]]

RBS:

  • (Array[[String, Coverage::Report]]) -> Array[Hash[Symbol, Object?]]

Parameters:

Returns:

  • (Array[Hash[Symbol, Object?]])


30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/ibex/impact/coverage_impact.rb', line 30

def select_reports(reports)
  selected = reports.filter_map do |path, report|
    unless report.grammar_digest == @automaton.grammar_digest
      @warnings << "#{path}: coverage grammar digest does not match the analysis input; report ignored"
      next
    end

    hits = report.production_hits.keys & @production_ids
    next if hits.empty?

    { path: path, productions: hits.sort }
  end
  selected.sort_by { |entry| entry.fetch(:path) }
end

#to_hHash[Symbol, Object?]

RBS:

  • () -> Hash[Symbol, Object?]

Returns:

  • (Hash[Symbol, Object?])


23
24
25
# File 'lib/ibex/impact/coverage_impact.rb', line 23

def to_h
  { status: @status, reports: @reports }
end