class RSpec::Core::Metadata
def all_apply?(filters)
def all_apply?(filters) filters.all? {|k,v| filter_applies?(k,v)} end
def any_apply?(filters)
def any_apply?(filters) filters.any? {|k,v| filter_applies?(k,v)} end
def configure_for_example(description, user_metadata)
def configure_for_example(description, user_metadata) store(:description_args, [description]) store(:caller, user_metadata.delete(:caller) || caller) update(user_metadata) end
def ensure_valid_keys(user_metadata)
def ensure_valid_keys(user_metadata) RESERVED_KEYS.each do |key| if user_metadata.keys.include?(key) raise <<-EOM 50} } is not allowed reserves some hash keys for its own internal use, ing :#{key}, which is used on: ller(0)[4]}. re all of RSpec's reserved hash keys: SERVED_KEYS.join("\n ")} 50} raise ":#{key} is not allowed" end end end
def filter_applies?(key, value, metadata=self)
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 # Pass the metadata hash to allow the proc to check if it even has the key. # This is necessary for the implicit :if exclusion filter: # { } # => run the example # { :if => nil } # => exclude the example # The value of metadata[:if] is the same in these two cases but # they need to be treated differently. 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
def for_example(description, user_metadata)
def for_example(description, user_metadata) dup.extend(MetadataHash).configure_for_example(description, user_metadata) end
def initialize(parent_group_metadata=nil)
def initialize(parent_group_metadata=nil) if parent_group_metadata update(parent_group_metadata) store(:example_group, {:example_group => parent_group_metadata[:example_group]}.extend(GroupMetadataHash)) else store(:example_group, {}.extend(GroupMetadataHash)) end yield self if block_given? end
def process(*args)
def process(*args) user_metadata = args.last.is_a?(Hash) ? args.pop : {} ensure_valid_keys(user_metadata) self[:example_group].store(:description_args, args) self[:example_group].store(:caller, user_metadata.delete(:caller) || caller) update(user_metadata) end
def relevant_line_numbers(metadata)
def relevant_line_numbers(metadata) line_numbers = [metadata[:line_number]] if metadata[:example_group] line_numbers + relevant_line_numbers(metadata[:example_group]) else line_numbers end end
def world
def world RSpec.world end