module RSpec::Core::MetadataFilter

Contains metadata filtering logic. This has been extracted from the metadata classes because it operates ON a metadata hash but does not manage any of the state in the hash. We're moving towards having metadata be a raw hash (not a custom subclass), so externalizing this filtering logic helps us move in that direction.

Public Instance Methods

all_apply?(filters, metadata) click to toggle source

@private

# File lib/rspec/core/metadata_filter.rb, line 17
def all_apply?(filters, metadata)
  filters.all? { |k, v| filter_applies?(k, v, metadata) }
end
any_apply?(filters, metadata) click to toggle source

@private

# File lib/rspec/core/metadata_filter.rb, line 12
def any_apply?(filters, metadata)
  filters.any? { |k, v| filter_applies?(k, v, metadata) }
end
filter_applies?(key, value, metadata) click to toggle source

@private

# File lib/rspec/core/metadata_filter.rb, line 22
def filter_applies?(key, value, metadata)
  return filter_applies_to_any_value?(key, value, metadata) if Array === metadata[key] && !(Proc === value)
  return location_filter_applies?(value, metadata)          if key == :locations
  return filters_apply?(key, value, metadata)               if Hash === value

  return false unless metadata.has_key?(key)

  case value
  when Regexp
    metadata[key] =~ value
  when Proc
    case value.arity
    when 0 then value.call
    when 2 then value.call(metadata[key], metadata)
    else value.call(metadata[key])
    end
  else
    metadata[key].to_s == value.to_s
  end
end

Private Instance Methods

example_group_declaration_line(locations, metadata) click to toggle source
# File lib/rspec/core/metadata_filter.rb, line 65
def example_group_declaration_line(locations, metadata)
  parent = parent_of(metadata)
  return nil unless parent
  locations[File.expand_path(parent[:file_path])]
end
filter_applies_to_any_value?(key, value, metadata) click to toggle source
# File lib/rspec/core/metadata_filter.rb, line 45
def filter_applies_to_any_value?(key, value, metadata)
  metadata[key].any? {|v| filter_applies?(key, v, {key => value})}
end
filters_apply?(key, value, metadata) click to toggle source
# File lib/rspec/core/metadata_filter.rb, line 71
def filters_apply?(key, value, metadata)
  subhash = metadata[key]
  return false unless Hash === subhash || HashImitatable === subhash
  value.all? { |k, v| filter_applies?(k, v, subhash) }
end
line_number_filter_applies?(line_numbers, metadata) click to toggle source
# File lib/rspec/core/metadata_filter.rb, line 55
def line_number_filter_applies?(line_numbers, metadata)
  preceding_declaration_lines = line_numbers.map {|n| RSpec.world.preceding_declaration_line(n)}
  !(relevant_line_numbers(metadata) & preceding_declaration_lines).empty?
end
location_filter_applies?(locations, metadata) click to toggle source
# File lib/rspec/core/metadata_filter.rb, line 49
def location_filter_applies?(locations, metadata)
  # it ignores location filters for other files
  line_number = example_group_declaration_line(locations, metadata)
  line_number ? line_number_filter_applies?(line_number, metadata) : true
end
parent_of(metadata) click to toggle source
# File lib/rspec/core/metadata_filter.rb, line 77
def parent_of(metadata)
  if metadata.key?(:example_group)
    metadata[:example_group]
  else
    metadata[:parent_example_group]
  end
end
relevant_line_numbers(metadata) click to toggle source
# File lib/rspec/core/metadata_filter.rb, line 60
def relevant_line_numbers(metadata)
  return [] unless metadata
  [metadata[:line_number]].compact + (relevant_line_numbers(parent_of metadata))
end