Support ordered YAML fixtures. #1896
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2600 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
0773c2f09f
commit
da675e536d
|
@ -1,5 +1,5 @@
|
||||||
*SVN*
|
*SVN*
|
||||||
=======
|
* YAML fixtures support ordered hashes for fixtures with foreign key dependencies in the same table. #1896 [purestorm@ggnore.net]
|
||||||
|
|
||||||
* :dependent now accepts :nullify option. Sets the foreign key of the related objects to NULL instead of deleting them. #2015 [Robby Russell <robby@planetargon.com>]
|
* :dependent now accepts :nullify option. Sets the foreign key of the related objects to NULL instead of deleting them. #2015 [Robby Russell <robby@planetargon.com>]
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,20 @@ end
|
||||||
# indented list of key/value pairs in the "key: value" format. Records are separated by a blank line for your viewing
|
# indented list of key/value pairs in the "key: value" format. Records are separated by a blank line for your viewing
|
||||||
# pleasure.
|
# pleasure.
|
||||||
#
|
#
|
||||||
|
# Note that YAML fixtures are unordered. If you want ordered fixtures, use the omap YAML type. See http://yaml.org/type/omap.html
|
||||||
|
# for the specification. You will need ordered fixtures when you have foreign key constraints on keys in the same table.
|
||||||
|
# This is commonly needed for tree structures. Example:
|
||||||
|
#
|
||||||
|
# --- !omap
|
||||||
|
# - parent:
|
||||||
|
# id: 1
|
||||||
|
# parent_id: NULL
|
||||||
|
# title: Parent
|
||||||
|
# - child:
|
||||||
|
# id: 2
|
||||||
|
# parent_id: 1
|
||||||
|
# title: Child
|
||||||
|
#
|
||||||
# = CSV fixtures
|
# = CSV fixtures
|
||||||
#
|
#
|
||||||
# Fixtures can also be kept in the Comma Separated Value format. Akin to YAML fixtures, CSV fixtures are stored
|
# Fixtures can also be kept in the Comma Separated Value format. Akin to YAML fixtures, CSV fixtures are stored
|
||||||
|
@ -293,8 +307,12 @@ class Fixtures < YAML::Omap
|
||||||
if File.file?(yaml_file_path)
|
if File.file?(yaml_file_path)
|
||||||
# YAML fixtures
|
# YAML fixtures
|
||||||
begin
|
begin
|
||||||
yaml = YAML::load(erb_render(IO.read(yaml_file_path)))
|
if yaml = YAML::load(erb_render(IO.read(yaml_file_path)))
|
||||||
yaml.each { |name, data| self[name] = Fixture.new(data, @class_name) } if yaml
|
yaml = yaml.value if yaml.kind_of?(YAML::Syck::PrivateType)
|
||||||
|
yaml.each do |name, data|
|
||||||
|
self[name] = Fixture.new(data, @class_name)
|
||||||
|
end
|
||||||
|
end
|
||||||
rescue Exception=>boom
|
rescue Exception=>boom
|
||||||
raise Fixture::FormatError, "a YAML error occured parsing #{yaml_file_path}. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Please have a look at http://www.yaml.org/faq.html\nThe exact error was:\n #{boom.class}: #{boom}"
|
raise Fixture::FormatError, "a YAML error occured parsing #{yaml_file_path}. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Please have a look at http://www.yaml.org/faq.html\nThe exact error was:\n #{boom.class}: #{boom}"
|
||||||
end
|
end
|
||||||
|
@ -350,7 +368,15 @@ class Fixture #:nodoc:
|
||||||
end
|
end
|
||||||
|
|
||||||
def initialize(fixture, class_name)
|
def initialize(fixture, class_name)
|
||||||
@fixture = fixture.is_a?(Hash) ? fixture : read_fixture_file(fixture)
|
case fixture
|
||||||
|
when Hash, YAML::Omap
|
||||||
|
@fixture = fixture
|
||||||
|
when String
|
||||||
|
@fixture = read_fixture_file(fixture)
|
||||||
|
else
|
||||||
|
raise ArgumentError, "Bad fixture argument #{fixture.inspect}"
|
||||||
|
end
|
||||||
|
|
||||||
@class_name = class_name
|
@class_name = class_name
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
--- !omap
|
||||||
|
<% 100.times do |i| %>
|
||||||
|
- fixture_no_<%= i %>:
|
||||||
|
id: <%= i %>
|
||||||
|
name: <%= "Category #{i}" %>
|
||||||
|
type: Category
|
||||||
|
<% end %>
|
|
@ -155,6 +155,19 @@ class FixturesTest < Test::Unit::TestCase
|
||||||
def test_empty_csv_fixtures
|
def test_empty_csv_fixtures
|
||||||
assert_not_nil Fixtures.new( Account.connection, "accounts", File.dirname(__FILE__) + "/fixtures/naked/csv/accounts")
|
assert_not_nil Fixtures.new( Account.connection, "accounts", File.dirname(__FILE__) + "/fixtures/naked/csv/accounts")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_omap_fixtures
|
||||||
|
assert_nothing_raised do
|
||||||
|
fixtures = Fixtures.new(Account.connection, 'categories', File.dirname(__FILE__) + '/fixtures/categories_ordered')
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
fixtures.each do |name, fixture|
|
||||||
|
assert_equal "fixture_no_#{i}", name
|
||||||
|
assert_equal "Category #{i}", fixture['name']
|
||||||
|
i += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue