module RSpec::Core::Metadata

Each ExampleGroup class and Example instance owns an instance of Metadata, which is Hash extended to support lazy evaluation of values associated with keys that may or may not be used by any example or group.

In addition to metadata that is used internally, this also stores user-supplied metadata, e.g.

RSpec.describe Something, :type => :ui do
  it "does something", :slow => true do
    # ...
  end
end

‘:type => :ui` is stored in the Metadata owned by the example group, and `:slow => true` is stored in the Metadata owned by the example. These can then be used to select which examples are run using the `–tag` option on the command line, or several methods on `Configuration` used to filter a run (e.g. `filter_run_including`, `filter_run_excluding`, etc).

@see Example#metadata @see ExampleGroup.metadata @see FilterManager @see Configuration#filter_run_including @see Configuration#filter_run_excluding

Constants

RESERVED_KEYS

@private

Public Class Methods

@private Returns an enumerator that iteratively walks up the given metadata through all example group ancestors, yielding each metadata hash along the way.

# File rspec-core/lib/rspec/core/metadata.rb, line 71
def self.ascend(metadata)
  enum_for(:ascending, metadata)
end

@private Iteratively walks up from the given metadata through all example group ancestors, yielding each metadata hash along the way.

# File rspec-core/lib/rspec/core/metadata.rb, line 58
def self.ascending(metadata)
  yield metadata
  return unless (group_metadata = metadata.fetch(:example_group) { metadata[:parent_example_group] })

  loop do
    yield group_metadata
    break unless (group_metadata = group_metadata[:parent_example_group])
  end
end

@private Used internally to build a hash from an args array. Symbols are converted into hash keys with a value of ‘true`. This is done to support simple tagging using a symbol, rather than needing to do `:symbol => true`.

# File rspec-core/lib/rspec/core/metadata.rb, line 80
def self.build_hash_from(args, warn_about_example_group_filtering=false)
  hash = args.last.is_a?(Hash) ? args.pop : {}

  hash[args.pop] = true while args.last.is_a?(Symbol)

  if warn_about_example_group_filtering && hash.key?(:example_group)
    RSpec.deprecate("Filtering by an `:example_group` subhash",
                    :replacement => "the subhash to filter directly")
  end

  hash
end

@private

# File rspec-core/lib/rspec/core/metadata.rb, line 94
def self.deep_hash_dup(object)
  return object.dup if Array === object
  return object unless Hash  === object

  object.inject(object.dup) do |duplicate, (key, value)|
    duplicate[key] = deep_hash_dup(value)
    duplicate
  end
end

@private

# File rspec-core/lib/rspec/core/metadata.rb, line 105
def self.id_from(metadata)
  "#{metadata[:rerun_file_path]}[#{metadata[:scoped_id]}]"
end

@private

# File rspec-core/lib/rspec/core/metadata.rb, line 110
def self.location_tuple_from(metadata)
  [metadata[:absolute_file_path], metadata[:line_number]]
end

@api private

@param line [String] current code line @return [String] relative path to line

# File rspec-core/lib/rspec/core/metadata.rb, line 44
def self.relative_path(line)
  line = line.sub(relative_path_regex, "\\1.\\2".freeze)
  line = line.sub(/\A([^:]+:\d+)$/, '\\1'.freeze)
  return nil if line == '-e:1'.freeze
  line
rescue SecurityError
  # :nocov: - SecurityError is no longer produced starting in ruby 2.7
  nil
  # :nocov:
end

Matches strings either at the beginning of the input or prefixed with a whitespace, containing the current path, either postfixed with the separator, or at the end of the string. Match groups are the character before and the character after the string if any.

rubular.com/r/fT0gmX6VJX rubular.com/r/duOrD4i3wb rubular.com/r/sbAMHFrOx1

# File rspec-core/lib/rspec/core/metadata.rb, line 36
def self.relative_path_regex
  @relative_path_regex ||= /(\A|\s)#{File.expand_path('.')}(#{File::SEPARATOR}|\s|\Z)/
end