Class: LoadTracer

Inherits:
Object
  • Object
show all
Defined in:
lib/load_tracer.rb,
lib/load_tracer/version.rb,
lib/load_tracer/formatter/dot.rb,
lib/load_tracer/formatter/json.rb,
lib/load_tracer/formatter/default.rb

Defined Under Namespace

Classes: DefaultFormatter, DotFormatter, FileSpec, JsonFormatter

Constant Summary collapse

LOAD_METHODS =
i(require require_relative load autoload)
VERSION =
'0.3.0'

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(exclude_files: []) ⇒ LoadTracer

Returns a new instance of LoadTracer.



52
53
54
55
56
57
# File 'lib/load_tracer.rb', line 52

def initialize(exclude_files: [])
  @dependencies = Hash.new { |hash, key| hash[key] = [] }
  @reverse_dependencies = Hash.new { |hash, key| hash[key] = [] }
  @exclude_files = exclude_files
  @not_found_features = []
end

Class Method Details

.trace(format: nil, exclude_files: []) ⇒ Object



46
47
48
49
50
# File 'lib/load_tracer.rb', line 46

def self.trace(format: nil, exclude_files: [])
  instance = new(exclude_files: exclude_files)
  instance.tracer.enable { yield }
  instance.report(format: format)
end

Instance Method Details

#report(format:) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/load_tracer.rb', line 86

def report(format:)
  case format
  when :dot
    DotFormatter.export(
      dependencies: @dependencies
    )
  when :json
    JsonFormatter.export(
      dependencies: @dependencies,
      reverse_dependencies: @reverse_dependencies
    )
  else
    DefaultFormatter.export(
      dependencies: @dependencies,
      reverse_dependencies: @reverse_dependencies
    )
  end
end

#tracerObject



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/load_tracer.rb', line 59

def tracer
  TracePoint.new(:call) do |tp|
    next unless LOAD_METHODS.include?(tp.method_id)
    next if tp.defined_class != ::Kernel
    next if tp.path != __FILE__

    bl = caller_locations[1]
    feature = get_feature(tp)

    if bl.absolute_path.nil?
      bl = find_caller_of_internal_library(feature)
    end

    next if @exclude_files.include?(File.basename(bl.absolute_path))

    path = find_path(feature) || find_path(File.expand_path(feature, File.dirname(bl.path)))

    if path.nil?
      @not_found_features << feature
      next
    end

    @dependencies[bl.absolute_path] << path
    @reverse_dependencies[path] << bl.absolute_path
  end
end