class DependencyGrapher::Logger

Attributes

dependencies[R]

Public Class Methods

new() click to toggle source
# File lib/dependency_grapher/logger.rb, line 9
def initialize
  @dependencies = {}
  @keys = Set.new
  @call_stack = []
  @methods = {}
  @trace = get_trace_point
end

Public Instance Methods

disable() click to toggle source
# File lib/dependency_grapher/logger.rb, line 21
def disable
  @trace.disable
end
dump(filename = "dependencies.yml") click to toggle source
# File lib/dependency_grapher/logger.rb, line 25
def dump(filename = "dependencies.yml")
  file = File.open(filename, "w")
  @keys.each do |key|
    file.puts @dependencies[key].serialize
    file.puts
  end
end
enable() click to toggle source
# File lib/dependency_grapher/logger.rb, line 17
def enable
  @trace.enable
end

Private Instance Methods

get_trace_point() click to toggle source
# File lib/dependency_grapher/logger.rb, line 34
def get_trace_point
  # Define a tracepoint for tacking ruby calls and returns
  tp = TracePoint.trace(:call, :return) do |tp|
    case tp.event
    when :call 
      handle_call(tp.defined_class, tp.method_id, tp.path, tp.lineno)
    when :return
      handle_return
    end
  end
  tp.disable # Disable tp by default
  tp
end
handle_call(defined_class, method_id, path, lineno) click to toggle source
# File lib/dependency_grapher/logger.rb, line 48
def handle_call(defined_class, method_id, path, lineno)
  method = Method.new(ParseClass.call(defined_class), method_id.to_s, path, lineno.to_s) 
  @methods[method.id] = method unless  @methods[method.id]
  @call_stack <<  @methods[method.id]
end
handle_return() click to toggle source
# File lib/dependency_grapher/logger.rb, line 54
def handle_return
  kaller = @call_stack[-2] # Second last item on stack is the kaller
  receiver = @call_stack.pop # First item on stack is receiver
  # Ignore case where kaller is nil (ie. main)
  if kaller
    dep = Dependency.new(kaller, receiver)
    key = dep.id
    if @keys.include?(key)
      @dependencies[key].touch
    else
      @dependencies[key] = dep
      @keys << key
    end
  end
end