class RSpec::Core::Metadata

def all_apply?(filters)

def all_apply?(filters)
  filters.all? do |key, value|
    apply_condition(key, value)
  end
end

def apply_condition(key, value, metadata=nil)

def apply_condition(key, value, metadata=nil)
  metadata ||= self
  case value
  when Hash
    value.all? { |k, v| apply_condition(k, v, metadata[key]) }
  when Regexp
    metadata[key] =~ value
  when Proc
    value.call(metadata[key]) rescue false
  when Fixnum
    if key == :line_number
      relevant_line_numbers(metadata).include?(world.preceding_declaration_line(value))
    else
      metadata[key] == value
    end
  else
    metadata[key] == value
  end
end

def candidate_entries_from_caller(metadata)

def candidate_entries_from_caller(metadata)
  metadata[:caller].grep(/\_spec\.rb:/i)
end

def configure_for_example(description, options)

def configure_for_example(description, options)
  store(:description, description.to_s)
  store(:full_description, "#{self[:example_group][:full_description]} #{self[:description]}")
  store(:execution_result, {})
  store(:caller, options.delete(:caller))
  if self[:caller]
    store(:file_path, file_path_from(self))
    store(:line_number, line_number_from(self))
  end
  self[:location] = location_from(self)
  update(options)
end

def described_class_from(args)

def described_class_from(args)
  if args.first.is_a?(String) || args.first.is_a?(Symbol)
    superclass_metadata[:example_group][:describes]
  else
    args.first
  end
end

def description_from(args)

def description_from(args)
  @description_from_args ||= args.map{|a| a.to_s.strip}.join(" ")
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 file_and_line_number(metadata)

def file_and_line_number(metadata)
  entry = candidate_entries_from_caller(metadata).first
  entry && entry.split(":")
end

def file_path_from(metadata, given_file_path=nil)

def file_path_from(metadata, given_file_path=nil)
  return given_file_path if given_file_path
  file = file_and_line_number(metadata)[0] if file_and_line_number(metadata)
  file.strip if file
end

def for_example(description, options)

def for_example(description, options)
  dup.configure_for_example(description,options)
end

def full_description_from(args)

def full_description_from(args)
  if superclass_metadata[:example_group][:full_description]
    "#{superclass_metadata[:example_group][:full_description]} #{description_from(args)}"
  else
    description_from(args)
  end
end

def initialize(superclass_metadata=nil)

def initialize(superclass_metadata=nil)
  @superclass_metadata = superclass_metadata
  if @superclass_metadata
    update(@superclass_metadata)
    example_group = {:example_group => @superclass_metadata[:example_group]}
  end
  store(:example_group, example_group || {})
  store(:behaviour, self[:example_group])
  yield self if block_given?
end

def line_number_from(metadata, given_line_number=nil)

def line_number_from(metadata, given_line_number=nil)
  return given_line_number if given_line_number
  line_number = file_and_line_number(metadata)[1] if file_and_line_number(metadata)
  line_number && line_number.to_i
end

def location_from(metadata)

def location_from(metadata)
  "#{metadata[:file_path]}:#{metadata[:line_number]}"
end

def process(*args)

def process(*args)
  user_metadata = args.last.is_a?(Hash) ? args.pop : {}
  ensure_valid_keys(user_metadata)
  self[:example_group][:describes] = described_class_from(args)
  self[:example_group][:description] = description_from(args)
  self[:example_group][:full_description] = full_description_from(args)
  self[:example_group][:block] = user_metadata.delete(:example_group_block)
  self[:example_group][:caller] = user_metadata.delete(:caller) || caller(1)
  self[:example_group][:file_path] = file_path_from(self[:example_group], user_metadata.delete(:file_path))
  self[:example_group][:line_number] = line_number_from(self[:example_group], user_metadata.delete(:line_number))
  self[:example_group][:location] = location_from(self[:example_group])
  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 superclass_metadata

def superclass_metadata
  @superclass_metadata ||= { :example_group => {} }
end

def world

def world
  RSpec.world
end