module RR::Injections

Public Instance Methods

dispatch_method(subject, subject_class, method_name, arguments, block) click to toggle source
# File lib/rr/injections/double_injection.rb, line 34
def dispatch_method(subject, subject_class, method_name, arguments, block)
  subject_eigenclass = (class << subject; self; end)
  if (
    exists?(subject_class, method_name) &&
    (subject_class == subject_eigenclass) || !subject.is_a?(Class)
  )
    find(subject_class, method_name.to_sym).dispatch_method(subject, arguments, block)
  else
    new(subject_class, method_name.to_sym).dispatch_original_method(subject, arguments, block)
  end
end
exists?(subject_class, method_name) click to toggle source
# File lib/rr/injections/double_injection.rb, line 26
def exists?(subject_class, method_name)
  !!find(subject_class, method_name)
end
exists_by_subject?(subject, method_name) click to toggle source
# File lib/rr/injections/double_injection.rb, line 30
def exists_by_subject?(subject, method_name)
  exists?((class << subject; self; end), method_name)
end
find(subject_class, method_name) click to toggle source
# File lib/rr/injections/double_injection.rb, line 18
def find(subject_class, method_name)
  instances[subject_class] && instances[subject_class][method_name.to_sym]
end
find_by_subject(subject, method_name) click to toggle source
# File lib/rr/injections/double_injection.rb, line 22
def find_by_subject(subject, method_name)
  find(class << subject; self; end, method_name)
end
find_or_create_by_subject(subject, method_name) click to toggle source
# File lib/rr/injections/double_injection.rb, line 14
def find_or_create_by_subject(subject, method_name)
  find_or_create(class << subject; self; end, method_name)
end
instances() click to toggle source
# File lib/rr/injections/double_injection.rb, line 83
def instances
  @instances ||= HashWithObjectIdKey.new do |hash, subject_class|
    hash.set_with_object_id(subject_class, {})
  end
end
reset() click to toggle source
# File lib/rr/injections/double_injection.rb, line 46
def reset
  instances.each do |subject_class, method_double_map|
    SingletonMethodAddedInjection.find(subject_class) && SingletonMethodAddedInjection.find(subject_class).reset
    method_double_map.keys.each do |method_name|
      reset_double(subject_class, method_name)
    end
    Injections::DoubleInjection.instances.delete(subject_class) if Injections::DoubleInjection.instances.has_key?(subject_class)
  end
end
reset_double(subject_class, method_name) click to toggle source

Resets the DoubleInjection for the passed in subject and method_name.

# File lib/rr/injections/double_injection.rb, line 77
def reset_double(subject_class, method_name)
  double_injection = Injections::DoubleInjection.instances[subject_class].delete(method_name)
  double_injection.reset
  Injections::DoubleInjection.instances.delete(subject_class) if Injections::DoubleInjection.instances[subject_class].empty?
end
verify(*subjects) click to toggle source
# File lib/rr/injections/double_injection.rb, line 56
def verify(*subjects)
  subject_classes = subjects.empty? ?
    Injections::DoubleInjection.instances.keys :
    subjects.map {|subject| class << subject; self; end}
  subject_classes.each do |subject_class|
    instances.include?(subject_class) &&
      instances[subject_class].keys.each do |method_name|
        verify_double(subject_class, method_name)
      end &&
      instances.delete(subject_class)
  end
end
verify_double(subject_class, method_name) click to toggle source

Verifies the DoubleInjection for the passed in subject and method_name.

# File lib/rr/injections/double_injection.rb, line 70
def verify_double(subject_class, method_name)
  Injections::DoubleInjection.find(subject_class, method_name).verify
ensure
  reset_double subject_class, method_name
end