module SearchWarrant

Constants

HOOK_METHODS
VERSION

Public Class Methods

after_method_fails_hook(object, method_name, error) click to toggle source
# File lib/search_warrant.rb, line 33
def self.after_method_fails_hook(object, method_name, error)
  return if bypass_trace?(method_name)
  SearchWarrant.suppress_tracing { object.search_warrant_after_method_fails_hook(method_name, error) }
end
after_method_succeeds_hook(object, method_name, result) click to toggle source
# File lib/search_warrant.rb, line 28
def self.after_method_succeeds_hook(object, method_name, result)
  return if bypass_trace?(method_name)
  SearchWarrant.suppress_tracing { object.search_warrant_after_method_succeeds_hook(method_name, result) }
end
before_method_hook(object, method_name, args) click to toggle source
# File lib/search_warrant.rb, line 23
def self.before_method_hook(object, method_name, args)
  return if bypass_trace?(method_name)
  SearchWarrant.suppress_tracing { object.search_warrant_before_method_hook(method_name, args) }
end
bypass_trace?(method_name) click to toggle source
# File lib/search_warrant.rb, line 18
def self.bypass_trace?(method_name)
  Thread.current[:'suppress tracing'] ||
    SearchWarrant.suppress_tracing { HOOK_METHODS.include?(method_name) }
end
included(klass) click to toggle source
# File lib/search_warrant.rb, line 56
def self.included(klass)
  klass.const_set(:METHOD_HASH, {})

  # For methods defined directly within the class
  def klass.method_added(name)
    return if @_adding_a_method
    SearchWarrant.suppress_tracing do
      @_adding_a_method = true
      SearchWarrant.wrap_method(self, name)
      @_adding_a_method = false
    end
  end

  # For modules mixed in BEFORE SearchWarrant
  # And base classes (excluding Object/BasicObject)
  (klass.instance_methods - Object.instance_methods).each do |method|
    klass.method_added(method)
  end

  # For modules mixed in AFTER SearchWarrant
  def klass.include(module_name)
    super
    (module_name.instance_methods - Object.instance_methods).each do |method|
      method_added(method)
    end
  end
end
suppress_tracing() { || ... } click to toggle source
# File lib/search_warrant.rb, line 10
def self.suppress_tracing
  old_value = Thread.current[:'suppress tracing']
  Thread.current[:'suppress tracing'] = true
  yield
ensure
  Thread.current[:'suppress tracing'] = old_value
end
wrap_method(klass, method_name) click to toggle source
# File lib/search_warrant.rb, line 38
def self.wrap_method(klass, method_name)
  method_hash = klass.const_get(:METHOD_HASH)
  method_hash[method_name] = klass.instance_method(method_name)
  klass.class_eval do
    define_method(method_name) do |*args, &block|
      SearchWarrant.before_method_hook(self, method_name, args)
      begin
        result = method_hash[method_name].bind(self).call(*args, &block)
      rescue => error
        SearchWarrant.after_method_fails_hook(self, method_name, error)
        raise error
      end
      SearchWarrant.after_method_succeeds_hook(self, method_name, result)
      result
    end
  end
end

Public Instance Methods

search_warrant_after_method_fails_hook(method_name, error) click to toggle source
# File lib/search_warrant.rb, line 99
def search_warrant_after_method_fails_hook(method_name, error)
  puts "<== FAILS with error: #{error.message}"
end
search_warrant_after_method_succeeds_hook(method_name, result) click to toggle source
# File lib/search_warrant.rb, line 93
def search_warrant_after_method_succeeds_hook(method_name, result)
  Thread.current[:'method trace depth'] -= 1
  puts "#{'  '*Thread.current[:'method trace depth']}<== " +
    "Returns #{result.inspect}"
end
search_warrant_before_method_hook(method_name, args) click to toggle source
# File lib/search_warrant.rb, line 84
def search_warrant_before_method_hook(method_name, args)
  Thread.current[:'method trace depth'] ||= 0
  print "#{'  '*Thread.current[:'method trace depth']}==> "
  puts "In #{caller[6]}"
  print '  ' * (Thread.current[:'method trace depth'] + 2)
  puts "Calling #{self.inspect}.#{method_name}(#{args.map(&:inspect).join(', ')})"
  Thread.current[:'method trace depth'] += 1
end