class RSpec::Core::SharedExampleGroup::Registry

@private

Public Instance Methods

add(context, name, *metadata_args, &block) click to toggle source
# File lib/rspec/core/shared_example_group.rb, line 155
def add(context, name, *metadata_args, &block)
  if RSpec.configuration.shared_context_metadata_behavior == :trigger_inclusion
    return legacy_add(context, name, *metadata_args, &block)
  end

  unless valid_name?(name)
    raise ArgumentError, "Shared example group names can only be a string, "                                   "symbol or module but got: #{name.inspect}"
  end

  ensure_block_has_source_location(block) { CallerFilter.first_non_rspec_line }
  warn_if_key_taken context, name, block

  metadata = Metadata.build_hash_from(metadata_args)
  shared_module = SharedExampleGroupModule.new(name, block, metadata)
  shared_example_groups[context][name] = shared_module
end
find(lookup_contexts, name) click to toggle source
# File lib/rspec/core/shared_example_group.rb, line 173
def find(lookup_contexts, name)
  lookup_contexts.each do |context|
    found = shared_example_groups[context][name]
    return found if found
  end

  shared_example_groups[:main][name]
end

Private Instance Methods

ensure_block_has_source_location(_block) click to toggle source
# File lib/rspec/core/shared_example_group.rb, line 233
def ensure_block_has_source_location(_block); end
formatted_location(block) click to toggle source
# File lib/rspec/core/shared_example_group.rb, line 228
def formatted_location(block)
  block.source_location.join ":"
end
legacy_add(context, name, *metadata_args, &block) click to toggle source

TODO: remove this in RSpec 4. This exists only to support `config.shared_context_metadata_behavior == :trigger_inclusion`, the legacy behavior of shared context metadata, which we do not want to support in RSpec 4.

# File lib/rspec/core/shared_example_group.rb, line 188
def legacy_add(context, name, *metadata_args, &block)
  ensure_block_has_source_location(block) { CallerFilter.first_non_rspec_line }
  shared_module = SharedExampleGroupModule.new(name, block, {})

  if valid_name?(name)
    warn_if_key_taken context, name, block
    shared_example_groups[context][name] = shared_module
  else
    metadata_args.unshift name
  end

  return if metadata_args.empty?
  RSpec.configuration.include shared_module, *metadata_args
end
shared_example_groups() click to toggle source
# File lib/rspec/core/shared_example_group.rb, line 203
def shared_example_groups
  @shared_example_groups ||= Hash.new { |hash, context| hash[context] = {} }
end
valid_name?(candidate) click to toggle source
# File lib/rspec/core/shared_example_group.rb, line 207
def valid_name?(candidate)
  case candidate
  when String, Symbol, Module then true
  else false
  end
end
warn_if_key_taken(context, key, new_block) click to toggle source
# File lib/rspec/core/shared_example_group.rb, line 214
        def warn_if_key_taken(context, key, new_block)
          existing_module = shared_example_groups[context][key]

          return unless existing_module

          RSpec.warn_with "            |WARNING: Shared example group '#{key}' has been previously defined at:
            |  #{formatted_location existing_module.definition}
            |...and you are now defining it at:
            |  #{formatted_location new_block}
            |The new definition will overwrite the original one.
".gsub(/^ +\|/, ''), :call_site => nil
        end