Sha256: 9f15ef3bdd8e524df756dd9ccb7364949e2ad8bc2098d181d95fb98cec5b389a

Contents?: true

Size: 1.7 KB

Versions: 2

Compression:

Stored size: 1.7 KB

Contents

require_relative "method"
require_relative "dependency"
require_relative "parse_class"

require 'pry'
module DependencyGrapher
  class Logger
    attr_reader :dependencies 
    def initialize
      @dependencies = {}
      @keys = Set.new
      @call_stack = []
      @methods = {}
      @trace = get_trace_point
    end

    def enable
      @trace.enable
    end

    def disable
      @trace.disable
    end

    def dump(filename = "dependencies.yml")
      file = File.open(filename, "w")
      @keys.each do |key|
        file.puts @dependencies[key].serialize
        file.puts
      end
    end

    private
    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

    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

    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
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
dependency_grapher-0.1.1 lib/dependency_grapher/logger.rb
dependency_grapher-0.1.0 lib/dependency_grapher/logger.rb