class RSpec::Core::SharedExampleGroup::Registry
objects.
us to have helper methods that don’t get added to those
to objects we don’t own (main and Module) so this allows
constants. We want to limit the number of methods we add
Used internally to manage the shared example groups and
@private
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, CallerFilter.first_non_rspec_line) 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); end
def ensure_block_has_source_location(block, caller_line); end
def ensure_block_has_source_location(block, caller_line)
def ensure_block_has_source_location(block, caller_line) 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