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/static_checker.rb,
lib/load_tracer/formatter/default.rb

Direct Known Subclasses

StaticChecker

Defined Under Namespace

Classes: DefaultFormatter, DotFormatter, FileSpec, JsonFormatter, StaticChecker

Constant Summary collapse

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(format: nil, exclude_files: []) ⇒ LoadTracer

Returns a new instance of LoadTracer.



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

def initialize(format: nil, exclude_files: [])
  @exclude_files = exclude_files
end

Class Method Details

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



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

def self.trace(format: nil, exclude_files: [], &block)
  new(exclude_files: exclude_files).trace(format: format, &block)
end

Instance Method Details

#report(format:, dependencies:, reverse_dependencies:) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/load_tracer.rb', line 107

def report(format:, dependencies:, reverse_dependencies:)
  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

#trace(format: nil) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/load_tracer.rb', line 56

def trace(format: nil)
  @dependencies = Hash.new { |hash, key| hash[key] = [] }
  @reverse_dependencies = Hash.new { |hash, key| hash[key] = [] }
  @load_checked_features = Hash.new
  @not_found_features = []
  bl = caller_locations[1]
  @exclude_files << bl.absolute_path

  tracer.enable { yield }

  report(format: format, dependencies: @dependencies, reverse_dependencies: @reverse_dependencies)
end

#tracerObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/load_tracer.rb', line 69

def tracer
  TracePoint.new(:return) 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?(bl.absolute_path)

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

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

    @load_checked_features[bl.absolute_path] = true

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

    if !tp.return_value && !@load_checked_features[path]
      file_specs = StaticChecker.parse_file(path)

      file_specs.each do |fs|
        @dependencies[fs.path] |= fs.dependencies
        @reverse_dependencies[fs.path] |= fs.reverse_dependencies
      end
    end
  end
end