module RSpec::Support::RecursiveConstMethods

Provides recursive constant lookup methods useful for constant stubbing.

Public Instance Methods

We only want to consider constants that are defined directly on a particular module, and not include top-level/inherited constants.

Given:

class A; B = 1; end
class C < A; end

Then:

C.const_get("Hash") # => ::Hash
C.const_defined?("Hash") # => true
C.const_get("Hash", false) # => raises NameError
C.const_defined?("Hash", false) # => false
C.constants # => [:B]
C.constants(false) #=> []
# File rspec-support/lib/rspec/support/recursive_const_methods.rb, line 23
def const_defined_on?(mod, const_name)
  mod.const_defined?(const_name, false)
end
# File rspec-support/lib/rspec/support/recursive_const_methods.rb, line 31
def constants_defined_on(mod)
  mod.constants(false)
end
# File rspec-support/lib/rspec/support/recursive_const_methods.rb, line 27
def get_const_defined_on(mod, const_name)
  mod.const_get(const_name, false)
end
# File rspec-support/lib/rspec/support/recursive_const_methods.rb, line 50
def normalize_const_name(const_name)
  const_name.sub(/\A::/, '')
end
# File rspec-support/lib/rspec/support/recursive_const_methods.rb, line 41
def recursive_const_defined?(const_name)
  parts = normalize_const_name(const_name).split('::')
  parts.inject([Object, '']) do |(mod, full_name), name|
    yield(full_name, name) if block_given? && !(Module === mod)
    return false unless const_defined_on?(mod, name)
    [get_const_defined_on(mod, name), [mod.name, name].join('::')]
  end
end
# File rspec-support/lib/rspec/support/recursive_const_methods.rb, line 35
def recursive_const_get(const_name)
  normalize_const_name(const_name).split('::').inject(Object) do |mod, name|
    get_const_defined_on(mod, name)
  end
end