module RSpec::Core::SharedExampleGroup::Registry
def self.created_from_caller(other_caller)
def self.created_from_caller(other_caller) @caller_line == other_caller.last end
def self.included(kls)
def self.included(kls) kls.describe(&@shared_block) kls.children.first.metadata[:shared_group_name] = name end
def add_const(source, name, &block)
def add_const(source, name, &block) if Object.const_defined?(name) mod = Object.const_get(name) raise_name_error unless mod.created_from_caller(caller) end mod = Module.new do @shared_block = block @caller_line = caller.last def self.created_from_caller(other_caller) @caller_line == other_caller.last end def self.included(kls) kls.describe(&@shared_block) kls.children.first.metadata[:shared_group_name] = name end end shared_const = Object.const_set(name, mod) add_shared_example_group source, shared_const, block end
def add_group(source, *args, &block)
def add_group(source, *args, &block) ensure_block_has_source_location(block, caller[1]) if key? args.first key = args.shift warn_if_key_taken source, key, block add_shared_example_group source, key, block end unless args.empty? mod = Module.new (class << mod; self; end).send :define_method, :extended do |host| host.class_eval(&block) end RSpec.configuration.extend mod, *args end end
def add_shared_example_group(source, key, block)
def add_shared_example_group(source, key, block) shared_example_groups[source][key] = block end
def clear
def clear @shared_example_groups.clear end
def ensure_block_has_source_location(block, caller_line)
def ensure_block_has_source_location(block, caller_line) return if block.respond_to?(:source_location) block.extend Module.new { define_method :source_location do caller_line.split(':') end } end
def example_block_for(source, key)
def example_block_for(source, key) shared_example_groups[source][key] end
def formatted_location(block)
def formatted_location(block) block.source_location.join ":" end
def key?(candidate)
def key?(candidate) [String, Symbol, Module].any? { |cls| cls === candidate } end
def raise_name_error
def raise_name_error raise NameError, "The first argument (#{name}) to share_as must be a legal name for a constant not already in use." end
def shared_example_groups
def shared_example_groups @shared_example_groups ||= Hash.new { |hash,key| hash[key] = Hash.new } end
def shared_example_groups_for(*sources)
def shared_example_groups_for(*sources) Collection.new(sources, shared_example_groups) end
def warn_if_key_taken(source, key, new_block)
def warn_if_key_taken(source, key, new_block) return unless existing_block = example_block_for(source, key) Kernel.warn <<-WARNING.gsub(/^ +\|/, '') |WARNING: Shared example group '#{key}' has been previously defined at: | #{formatted_location existing_block} |...and you are now defining it at: | #{formatted_location new_block} |The new definition will overwrite the original one. WARNING end