Module: RSpec::Core::Metadata

Defined in:
lib/rspec/core/metadata.rb

Overview

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.

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).

Defined Under Namespace

Classes: ExampleGroupHash, ExampleHash, HashPopulator

Constant Summary

RESERVED_KEYS =
[
  :description,
  :description_args,
  :described_class,
  :example_group,
  :parent_example_group,
  :execution_result,
  :last_run_status,
  :file_path,
  :absolute_file_path,
  :rerun_file_path,
  :full_description,
  :line_number,
  :location,
  :scoped_id,
  :block,
  :shared_group_inclusion_backtrace
]

Class Method Summary collapse

Class Method Details

.ascend(metadata) ⇒ Object

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



71
72
73
# File 'lib/rspec/core/metadata.rb', line 71

def self.ascend()
  enum_for(:ascending, )
end

.ascending(metadata) {|metadata| ... } ⇒ Object

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

Yields:

  • (metadata)


58
59
60
61
62
63
64
65
66
# File 'lib/rspec/core/metadata.rb', line 58

def self.ascending()
  yield 
  return unless ( = .fetch(:example_group) { [:parent_example_group] })

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

.build_hash_from(args, warn_about_example_group_filtering = false) ⇒ Object

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`.



80
81
82
83
84
85
86
87
88
89
90
91
# File '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

.deep_hash_dup(object) ⇒ Object



94
95
96
97
98
99
100
101
102
# File '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

.id_from(metadata) ⇒ Object



105
106
107
# File 'lib/rspec/core/metadata.rb', line 105

def self.id_from()
  "#{[:rerun_file_path]}[#{[:scoped_id]}]"
end

.location_tuple_from(metadata) ⇒ Object



110
111
112
# File 'lib/rspec/core/metadata.rb', line 110

def self.location_tuple_from()
  [[:absolute_file_path], [:line_number]]
end

.relative_path(line) ⇒ String

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns relative path to line

Parameters:

  • line (String)

    current code line

Returns:

  • (String)

    relative path to line



44
45
46
47
48
49
50
51
52
53
# File '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:
  nil
  # :nocov:
end

.relative_path_regexObject

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



36
37
38
# File '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