Class: Inspector

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

Class Method Summary collapse

Class Method Details

._collect_events_for_method_call(&block) ⇒ Object

:nodoc:



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/inspector.rb', line 4

def self._collect_events_for_method_call(&block)
  events = []
  
  set_trace_func lambda { |event, file, line, id, binding, classname|
    events << { :event => event, :file => file, :line => line, :id => id, :binding => binding, :classname => classname }
  }
  
  begin
    yield
  ensure
    set_trace_func(nil)
  end

  events
end

._trace_the_method_call(&block) ⇒ Object

:nodoc:



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/inspector.rb', line 21

def self._trace_the_method_call(&block)
  events = _collect_events_for_method_call(&block)
  
  valid_event_types = ['call', 'c-call', 'return']
  
  events.each do |event|
    next unless valid_event_types.include?(event[:event])
    
    case event[:classname].to_s
      when 'ActiveRecord::Base'
        return events[-3]
      else
        return event if event[:event].include?('call')
    end
  end

end

.where_is_this_defined(&block) ⇒ Object



39
40
41
42
43
44
45
46
47
48
# File 'lib/inspector.rb', line 39

def self.where_is_this_defined(&block)
  trace = _trace_the_method_call(&block)
  return "Unable to determine where the method was defined" unless trace

  if trace[:event] == 'c-call'
    "#{trace[:classname]} method :#{trace[:id]} defined in STDLIB"
  else
    "#{trace[:classname]} method :#{trace[:id]} defined in #{trace[:file]}:#{trace[:line]}"
  end
end