module DeepCover::Analyser::Base

Attributes

options[R]
source[R]

Public Class Methods

new(source, **options) click to toggle source
# File lib/deep_cover/analyser/base.rb, line 9
def initialize(source, **options)
  @source = to_source(source, **options)
  @options = options
end

Public Instance Methods

covered_code() click to toggle source
# File lib/deep_cover/analyser/base.rb, line 81
def covered_code
  @source.covered_code
end
each_node(from = covered_code.root) { |from| ... } click to toggle source

Iterates on nodes in the subset. Yields the node and it's children (within the subset)

# File lib/deep_cover/analyser/base.rb, line 67
def each_node(from = covered_code.root, &block)
  return to_enum(:each_node) unless block_given?
  begin
    yield from unless from.is_a?(Node::Root)
  rescue ProblemWithDiagnostic
    raise
  rescue StandardError, SystemStackError => e
    raise ProblemWithDiagnostic.new(covered_code, from.diagnostic_expression, e)
  end
  node_children(from).each do |child|
    each_node(child, &block)
  end
end
node_children(node) click to toggle source

Looking exclusively at our subset of nodes, returns the node's direct descendants

# File lib/deep_cover/analyser/base.rb, line 15
def node_children(node)
  @source.node_children(node)
end
node_covered?(node) click to toggle source
# File lib/deep_cover/analyser/base.rb, line 24
def node_covered?(node)
  covered?(node_runs(node))
end
node_runs(node) click to toggle source

Returns the number of runs of the node (assumed to be in our subset)

# File lib/deep_cover/analyser/base.rb, line 20
def node_runs(node)
  @source.node_runs(node)
end
node_runs_map() click to toggle source
# File lib/deep_cover/analyser/base.rb, line 28
def node_runs_map
  each_node.map do |node|
    [node, node_runs(node)]
  end.to_h
end
node_stat_contributions(nodes) click to toggle source
# File lib/deep_cover/analyser/base.rb, line 51
def node_stat_contributions(nodes)
  if respond_to? :node_stat_contribution
    nodes.sum { |n| node_stat_contribution(n) }
  else
    nodes.size
  end
end
node_stat_type(node) click to toggle source
# File lib/deep_cover/analyser/base.rb, line 39
def node_stat_type(node)
  return :not_executable unless node.executable?
  case node_runs(node)
  when nil
    :ignored
  when 0
    :not_executed
  else
    :executed
  end
end
results() click to toggle source

Analyser-specific output

# File lib/deep_cover/analyser/base.rb, line 35
def results
  node_runs_map
end
stats() click to toggle source
# File lib/deep_cover/analyser/base.rb, line 59
def stats
  st = each_node.group_by { |n| node_stat_type(n) }
                .transform_values { |nodes| node_stat_contributions(nodes) }
  Analyser::Stats.new(**st)
end

Protected Instance Methods

convert(covered_code, **options) click to toggle source
# File lib/deep_cover/analyser/base.rb, line 87
def convert(covered_code, **options)
  Analyser::Node.new(covered_code, **options)
end
to_source(source, **options) click to toggle source
# File lib/deep_cover/analyser/base.rb, line 91
def to_source(source, **options)
  case source
  when Analyser
    source
  when CoveredCode
    convert(source, **options)
  when Node
    convert(source.covered_code, **options)
  else
    raise ArgumentError, "expected Analyser, Node or CoveredCode, got #{source.class}"
  end
end