/
file.rb
89 lines (74 loc) · 2.38 KB
/
file.rb
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