def filter_applies?(key, value, metadata=self)
case value
when Hash
if key == :locations
file_path = (self[:example_group] || {})[:file_path]
expanded_path = file_path && File.expand_path( file_path )
if expanded_path && line_numbers = value[expanded_path]
filter_applies?(:line_numbers, line_numbers)
else
true
end
else
value.all? { |k, v| filter_applies?(k, v, metadata[key]) }
end
when Regexp
metadata[key] =~ value
when Proc
if value.arity == 2
value.call(metadata[key], metadata) rescue false
else
value.call(metadata[key]) rescue false
end
when String
metadata[key].to_s == value.to_s
when Enumerable
if key == :line_numbers
preceding_declaration_lines = value.map{|v| world.preceding_declaration_line(v)}
!(relevant_line_numbers(metadata) & preceding_declaration_lines).empty?
else
metadata[key] == value
end
else
metadata[key].to_s == value.to_s
end
end