class Fukuzatsu::Summary

Constants

BRANCHES

Attributes

container[R]
edges[RW]
entity[R]
exits[RW]
nodes[RW]
source_file[R]
summaries[RW]

Public Class Methods

from(content:, source_file:nil) click to toggle source
# File lib/fukuzatsu/summary.rb, line 16
def self.from(content:, source_file:nil)
  parser = Analyst.for_source(content)

  containers = parser.top_level_entities.select{|e| e.respond_to? :all_methods}
  containers << containers.map(&:classes)
  containers.flatten!.reject!{ |container| container.all_methods.empty? }

  containers.map do |container|
    summary = Fukuzatsu::Summary.new(
      container: container,
      source: container.send(:source),
      entity: container,
      source_file: source_file
    )
    summary.summaries = container.all_methods.map do |method|
      Fukuzatsu::Summary.new(
        container: container,
        source: method.send(:source),
        entity: method,
        source_file: source_file
      )
    end
    summary
  end
end
new(source:, entity:, container:, source_file:nil) click to toggle source
# File lib/fukuzatsu/summary.rb, line 42
def initialize(source:, entity:, container:, source_file:nil)
  @source = source
  @entity = entity
  @container = container
  @source_file = source_file
  @summaries = []
  @edges, @nodes, @exits = [0, 1, 1]
end

Public Instance Methods

average_complexity() click to toggle source
# File lib/fukuzatsu/summary.rb, line 71
def average_complexity
  return 0 if self.summaries.empty?
  self.summaries.map(&:complexity).reduce(&:+) / self.summaries.count.to_f
end
complexity() click to toggle source
# File lib/fukuzatsu/summary.rb, line 51
def complexity
  @complexity ||= begin
    traverse(self.entity.ast)
    self.edges - self.nodes + self.exits
  end
end
container_name() click to toggle source
# File lib/fukuzatsu/summary.rb, line 58
def container_name
  self.container.full_name
end
entity_name() click to toggle source
# File lib/fukuzatsu/summary.rb, line 66
def entity_name
  return "*" if is_class_or_module?
  self.entity.full_name.gsub(self.container.full_name, '')
end
is_class_or_module?() click to toggle source
# File lib/fukuzatsu/summary.rb, line 62
def is_class_or_module?
  self.container == self.entity
end
raw_source() click to toggle source
# File lib/fukuzatsu/summary.rb, line 76
def raw_source
  self.source_file && "\n#{File.open(self.source_file, "r").read}" || @source
end

Private Instance Methods

extend_graph() click to toggle source
# File lib/fukuzatsu/summary.rb, line 82
def extend_graph
  self.edges += 2
  self.nodes += 2
  self.exits += 1
end
traverse(node, accumulator=[]) click to toggle source
# File lib/fukuzatsu/summary.rb, line 88
def traverse(node, accumulator=[])
  accumulator << node.type
  extend_graph if BRANCHES.include?(node.type)
  node.children.each do |child|
    if child.respond_to?(:children) || child.respond_to?(:type)
      accumulator << child.type
      traverse(child, accumulator)
    end
  end
  accumulator
end