1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
# frozen_string_literal: true
require "active_support/configuration_file"
module ActiveRecord
class FixtureSet
class File # :nodoc:
include Enumerable
##
# Open a fixture file named +file+. When called with a block, the block
# is called with the filehandle and the filehandle is automatically closed
# when the block finishes.
def self.open(file)
x = new file
block_given? ? yield(x) : x
end
def initialize(file)
@file = file
end
def each(&block)
rows.each(&block)
end
def model_class
config_row["model_class"]
end
def ignored_fixtures
config_row["ignore"]
end
private
def rows
@rows ||= raw_rows.reject { |fixture_name, _| fixture_name == "_fixture" }
end
def config_row
@config_row ||= begin
row = raw_rows.find { |fixture_name, _| fixture_name == "_fixture" }
if row
validate_config_row(row.last)
else
{ 'model_class': nil, 'ignore': nil }
end
end
end
def raw_rows
@raw_rows ||= begin
data = ActiveSupport::ConfigurationFile.parse(@file, context:
ActiveRecord::FixtureSet::RenderContext.create_subclass.new.get_binding)
data ? validate(data).to_a : []
rescue RuntimeError => error
raise Fixture::FormatError, error.message
end
end
def validate_config_row(data)
unless Hash === data
raise Fixture::FormatError, "Invalid `_fixture` section: `_fixture` must be a hash: #{@file}"
end
begin
data.assert_valid_keys("model_class", "ignore")
rescue ArgumentError => error
raise Fixture::FormatError, "Invalid `_fixture` section: #{error.message}: #{@file}"
end
data
end
# Validate our unmarshalled data.
def validate(data)
unless Hash === data || YAML::Omap === data
raise Fixture::FormatError, "fixture is not a hash: #{@file}"
end
invalid = data.reject { |_, row| Hash === row }
if invalid.any?
raise Fixture::FormatError, "fixture key is not a hash: #{@file}, keys: #{invalid.keys.inspect}"
end
data
end
end
end
end
|