Class: Spork::Diagnoser

Inherits:
Object
  • Object
show all
Defined in:
lib/spork/diagnoser.rb

Overview

The Diagnoser hooks into load and require and keeps track of when files are required / loaded, and who loaded them. It's used when you run spork --diagnose

Example

Spork::Diagnoser.install_hook!('/path/env.rb', '/path')
require '/path/to/env.rb'
Spork::Diagnoser.output_results(STDOUT)

Class Method Summary collapse

Class Method Details

.add_included_file(filename, callstack) ⇒ Object



43
44
45
46
47
# File 'lib/spork/diagnoser.rb', line 43

def add_included_file(filename, callstack)
  filename = expand_filename(filename)
  return unless File.exist?(filename)
  loaded_files[filename] = filter_callstack(caller) if subdirectory?(filename)
end

.install_hook!(entry_file = nil, dir = Dir.pwd) ⇒ Object

Installs the diagnoser hook into Kernel#require and Kernel#load

Parameters

  • entry_file - The file that is used to load the project. Used to filter the backtrace so anything that happens after it is hidden.

  • dir - The project directory. Any file loaded outside of this directory will not be logged.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/spork/diagnoser.rb', line 21

def install_hook!(entry_file = nil, dir = Dir.pwd)
  @dir = File.expand_path(Dir.pwd, dir)
  @entry_file = entry_file
  
  Kernel.class_eval do
    alias :require_without_diagnoser :require
    alias :load_without_diagnoser :load
    
    def require(string)
      ::Spork::Diagnoser.add_included_file(string, caller)
      require_without_diagnoser(string)
    end
    private :require
    
    def load(string)
      ::Spork::Diagnoser.add_included_file(string, caller)
      load_without_diagnoser(string)
    end
    private :load
  end
end

.loaded_filesObject



11
12
13
# File 'lib/spork/diagnoser.rb', line 11

def loaded_files
  @loaded_files ||= {}
end

.output_results(stdout) ⇒ Object

output the results of a diagnostic run.

Parameters

  • stdout - An IO stream to output the results to.



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/spork/diagnoser.rb', line 67

def output_results(stdout)
  project_prefix = Dir.pwd + "/"
  minimify = lambda { |f| f.gsub(project_prefix, '')}
  stdout.puts "- Spork Diagnosis -\n"
  stdout.puts "-- Summary --"
  stdout.puts loaded_files.keys.sort.map(&minimify)
  stdout.puts "\n\n\n"
  stdout.puts "-- Detail --"
  loaded_files.keys.sort.each do |file|
    stdout.puts "\n\n\n--- #{minimify.call(file)} ---\n"
    stdout.puts loaded_files[file].map(&minimify)
  end
end

.remove_hook!Object

Uninstall the hook. Generally useful only for testing the Diagnoser.



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/spork/diagnoser.rb', line 50

def remove_hook!
  return unless Kernel.private_instance_methods.map(&:to_sym).include?(:require_without_diagnoser)
  Kernel.class_eval do
    alias :require :require_without_diagnoser
    alias :load :load_without_diagnoser
    
    undef_method(:require_without_diagnoser)
    undef_method(:load_without_diagnoser)
  end
  true
end