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 Class Methods

@private

# File rspec-core/lib/rspec/core/metadata_filter.rb, line 11
def apply?(predicate, filters, metadata)
  filters.__send__(predicate) { |k, v| filter_applies?(k, v, metadata) }
end

@private

# File rspec-core/lib/rspec/core/metadata_filter.rb, line 16
def filter_applies?(key, filter_value, metadata)
  silence_metadata_example_group_deprecations do
    return location_filter_applies?(filter_value, metadata) if key == :locations
    return id_filter_applies?(filter_value, metadata)       if key == :ids
    return filters_apply?(key, filter_value, metadata)      if Hash === filter_value

    meta_value = metadata.fetch(key) { return false }

    return true if TrueClass === filter_value && meta_value
    return proc_filter_applies?(key, filter_value, metadata) if Proc === filter_value
    return filter_applies_to_any_value?(key, filter_value, metadata) if Array === meta_value

    filter_value === meta_value || filter_value.to_s == meta_value.to_s
  end
end

@private

# File rspec-core/lib/rspec/core/metadata_filter.rb, line 33
def silence_metadata_example_group_deprecations
  RSpec::Support.thread_local_data[:silence_metadata_example_group_deprecations] = true
  yield
ensure
  RSpec::Support.thread_local_data.delete(:silence_metadata_example_group_deprecations)
end