fixture_builder 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +4 -0
- data/README.markdown +12 -10
- data/fixture_builder.gemspec +6 -5
- data/lib/fixture_builder/builder.rb +18 -2
- data/lib/fixture_builder/namer.rb +10 -3
- data/lib/fixture_builder/version.rb +1 -1
- data/test/fixture_builder_test.rb +15 -0
- data/test/legacy_fixture_mode_fixture_generation_test.rb +16 -9
- data/test/namer_test.rb +18 -0
- data/test/test_helper.rb +11 -5
- metadata +23 -8
data/.travis.yml
ADDED
data/README.markdown
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
FixtureBuilder
|
2
2
|
==============
|
3
3
|
|
4
|
+
[![Build Status](https://secure.travis-ci.org/rdy/fixture_builder.png)](http://travis-ci.org/rdy/fixture_builder)
|
5
|
+
|
4
6
|
Based on the code from fixture_scenarios, by Chris Wanstrath. Allows you to build file fixtures from an object mother factory.
|
5
7
|
|
6
8
|
Installing
|
@@ -15,12 +17,12 @@ Example
|
|
15
17
|
=======
|
16
18
|
|
17
19
|
When using an object mother such as factory_girl it can be setup like the following:
|
18
|
-
|
20
|
+
|
19
21
|
# I usually put this file in spec/support/fixture_builder.rb
|
20
22
|
FixtureBuilder.configure do |fbuilder|
|
21
23
|
# rebuild fixtures automatically when these files change:
|
22
24
|
fbuilder.files_to_check += Dir["spec/factories/*.rb", "spec/support/fixture_builder.rb"]
|
23
|
-
|
25
|
+
|
24
26
|
# now declare objects
|
25
27
|
fbuilder.factory do
|
26
28
|
david = Factory(:user, :unique_name => "david")
|
@@ -32,16 +34,16 @@ When using an object mother such as factory_girl it can be setup like the follow
|
|
32
34
|
The block passed to the factory method initiates the creation of the fixture files. Before yielding to the block, FixtureBuilder cleans out the test database completely. When the block finishes, it dumps the state of the database into fixtures, like this:
|
33
35
|
|
34
36
|
# users.yml
|
35
|
-
david:
|
37
|
+
david:
|
36
38
|
created_at: 2010-09-18 17:21:23.926511 Z
|
37
39
|
unique_name: david
|
38
40
|
id: 1
|
39
|
-
|
41
|
+
|
40
42
|
# products.yml
|
41
43
|
i_pod:
|
42
44
|
name: iPod
|
43
45
|
id: 1
|
44
|
-
|
46
|
+
|
45
47
|
# purchases.yml
|
46
48
|
purchase_001:
|
47
49
|
product_id: 1
|
@@ -51,15 +53,15 @@ FixtureBuilder guesses about how to name fixtures based on a prioritized list of
|
|
51
53
|
|
52
54
|
fbuilder.name(:davids_ipod, Factory(:purchase, :user => david, :product => ipod))
|
53
55
|
@davids_ipod = Factory(:purchase, :user => david, :product => ipod)
|
54
|
-
|
56
|
+
|
55
57
|
Another way to name fixtures is to use the name_model_with. To use it you create a block that returns how you want a certain model name based on the record field.
|
56
58
|
|
57
59
|
fbuilder.name_model_with(User) do |record|
|
58
60
|
[record['first_name'], record['last_name']].join('_')
|
59
61
|
end
|
60
|
-
|
62
|
+
|
61
63
|
For all User fixture {first_name: 'foo', last_name: 'bar'} it would generate `foo_bar` as the fixture name.
|
62
|
-
|
64
|
+
|
63
65
|
There are also additional configuration options that can be changed to override the defaults:
|
64
66
|
|
65
67
|
* files_to_check: array of filenames that when changed cause fixtures to be rebuilt
|
@@ -86,8 +88,8 @@ One problem with generating your fixtures is that sequences can collide. When t
|
|
86
88
|
FixtureBuilder.configure do |fbuilder|
|
87
89
|
...
|
88
90
|
end
|
89
|
-
|
90
|
-
# Have factory girl generate non-colliding sequences starting at 1000 for data created after the fixtures
|
91
|
+
|
92
|
+
# Have factory girl generate non-colliding sequences starting at 1000 for data created after the fixtures
|
91
93
|
Factory.sequences.each do |name, seq|
|
92
94
|
seq.instance_variable_set(:@value, 1000)
|
93
95
|
end
|
data/fixture_builder.gemspec
CHANGED
@@ -22,9 +22,10 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.rubyforge_project = %q{fixture_builder}
|
23
23
|
s.summary = %q{Build YAML fixtures using object factories}
|
24
24
|
|
25
|
-
s.add_dependency
|
26
|
-
s.add_dependency
|
27
|
-
s.add_development_dependency
|
28
|
-
s.add_development_dependency
|
29
|
-
s.add_development_dependency
|
25
|
+
s.add_dependency %q{activerecord}, '>= 2'
|
26
|
+
s.add_dependency %q{activesupport}, '>= 2'
|
27
|
+
s.add_development_dependency %q{rake}, '0.8.7'
|
28
|
+
s.add_development_dependency %q{rails}, '>= 2'
|
29
|
+
s.add_development_dependency %q{test-unit}
|
30
|
+
s.add_development_dependency %q{sqlite3}
|
30
31
|
end
|
@@ -1,3 +1,8 @@
|
|
1
|
+
begin
|
2
|
+
require 'rails/test_help'
|
3
|
+
rescue LoadError, NameError
|
4
|
+
end
|
5
|
+
|
1
6
|
module FixtureBuilder
|
2
7
|
class Builder
|
3
8
|
include Delegations::Namer
|
@@ -13,6 +18,7 @@ module FixtureBuilder
|
|
13
18
|
say "Building fixtures"
|
14
19
|
clean_out_old_data
|
15
20
|
create_fixture_objects
|
21
|
+
names_from_ivars!
|
16
22
|
write_data_to_files
|
17
23
|
after_build.call if after_build
|
18
24
|
end
|
@@ -26,7 +32,9 @@ module FixtureBuilder
|
|
26
32
|
|
27
33
|
def load_legacy_fixtures
|
28
34
|
legacy_fixtures.each do |fixture_file|
|
29
|
-
|
35
|
+
# Rails 3.0 and 3.1+ support
|
36
|
+
fixtures_class = defined?(ActiveRecord::Fixtures) ? ActiveRecord::Fixtures : ::Fixtures
|
37
|
+
fixtures = fixtures_class.create_fixtures(File.dirname(fixture_file), File.basename(fixture_file, '.*'))
|
30
38
|
populate_custom_names(fixtures)
|
31
39
|
end
|
32
40
|
end
|
@@ -42,6 +50,12 @@ module FixtureBuilder
|
|
42
50
|
exit!
|
43
51
|
end
|
44
52
|
|
53
|
+
def names_from_ivars!
|
54
|
+
instance_values.each do |var, value|
|
55
|
+
name(var, value) if value.is_a? ActiveRecord::Base
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
45
59
|
def write_data_to_files
|
46
60
|
delete_yml_files
|
47
61
|
dump_empty_fixtures_for_all_tables
|
@@ -54,7 +68,9 @@ module FixtureBuilder
|
|
54
68
|
end
|
55
69
|
|
56
70
|
def delete_tables
|
57
|
-
|
71
|
+
ActiveRecord::Base.connection.disable_referential_integrity do
|
72
|
+
tables.each { |t| ActiveRecord::Base.connection.delete(delete_sql % ActiveRecord::Base.connection.quote_table_name(t)) }
|
73
|
+
end
|
58
74
|
end
|
59
75
|
|
60
76
|
def delete_yml_files
|
@@ -24,8 +24,15 @@ module FixtureBuilder
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def populate_custom_names(
|
28
|
-
|
27
|
+
def populate_custom_names(created_fixtures)
|
28
|
+
# Rails 3.1+, create_fixtures returns an array of Fixtures objects
|
29
|
+
if not created_fixtures.first.is_a? Array
|
30
|
+
# merge all fixtures hashes
|
31
|
+
created_fixtures = created_fixtures.inject({}) { |hash, fixtures| hash.merge(fixtures.fixtures) }
|
32
|
+
end
|
33
|
+
|
34
|
+
# Rails 3.0 and earlier, create_fixtures returns an array of tuples
|
35
|
+
created_fixtures.each do |fixture|
|
29
36
|
name = fixture[0]
|
30
37
|
id = fixture[1]['id'].to_i
|
31
38
|
table_name = fixture[1].model_class.table_name
|
@@ -54,7 +61,7 @@ module FixtureBuilder
|
|
54
61
|
record_name_fields.each do |try|
|
55
62
|
if name = record_hash[try]
|
56
63
|
inferred_name = name.underscore.gsub(/\W/, ' ').squeeze(' ').tr(' ', '_')
|
57
|
-
count = 0
|
64
|
+
count = 0
|
58
65
|
if @record_names[table_name]
|
59
66
|
count = @record_names[table_name].select {|name| name.to_s.starts_with?(inferred_name) }.size
|
60
67
|
end
|
@@ -25,6 +25,21 @@ class FixtureBuilderTest < Test::Unit::TestCase
|
|
25
25
|
assert_equal 'bob_001', FixtureBuilder.configuration.send(:record_name, hash, Model.table_name, '000')
|
26
26
|
end
|
27
27
|
|
28
|
+
def test_ivar_naming
|
29
|
+
create_and_blow_away_old_db
|
30
|
+
force_fixture_generation
|
31
|
+
|
32
|
+
FixtureBuilder.configure do |fbuilder|
|
33
|
+
fbuilder.files_to_check += Dir[test_path("*.rb")]
|
34
|
+
fbuilder.factory do
|
35
|
+
@king_of_gnomes = MagicalCreature.create(:name => 'robert', :species => 'gnome')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
generated_fixture = YAML.load(File.open(test_path("fixtures/magical_creatures.yml")))
|
39
|
+
assert_equal 'king_of_gnomes', generated_fixture.keys.first
|
40
|
+
end
|
41
|
+
|
42
|
+
|
28
43
|
def test_configure
|
29
44
|
FixtureBuilder.configure do |config|
|
30
45
|
assert config.is_a?(FixtureBuilder::Configuration)
|
@@ -1,17 +1,24 @@
|
|
1
1
|
require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
class LegacyFixtureModeFixtureGenerationTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
create_and_blow_away_old_db
|
7
|
+
force_fixture_generation
|
8
|
+
|
9
|
+
FixtureBuilder.configure do |fbuilder|
|
10
|
+
fbuilder.legacy_fixtures = Dir[test_path("legacy_fixtures/*.yml"), test_path("other_legacy_fixture_set/*.yml")]
|
11
|
+
fbuilder.factory do
|
12
|
+
MagicalCreature.create(:name => "frank", :species => "unicorn")
|
13
|
+
end
|
14
|
+
end
|
5
15
|
|
6
|
-
|
7
|
-
fbuilder.legacy_fixtures = Dir[test_path("legacy_fixtures/*.yml"), test_path("other_legacy_fixture_set/*.yml")]
|
8
|
-
fbuilder.factory do
|
9
|
-
MagicalCreature.create(:name => "frank", :species => "unicorn")
|
16
|
+
@@magical_creatures = YAML.load(File.open(test_path("fixtures/magical_creatures.yml")))
|
10
17
|
end
|
11
|
-
end
|
12
18
|
|
13
|
-
|
14
|
-
|
19
|
+
def teardown
|
20
|
+
FixtureBuilder.send(:remove_instance_variable, :@configuration)
|
21
|
+
end
|
15
22
|
|
16
23
|
def test_legacy_fixtures_created
|
17
24
|
alice = MagicalCreature.find_by_name("alice")
|
data/test/namer_test.rb
CHANGED
@@ -12,6 +12,16 @@ class AnotherModel
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
class MockFixture
|
16
|
+
def self.[](*args)
|
17
|
+
'1'
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.model_class
|
21
|
+
Model
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
15
25
|
class NamerTest < Test::Unit::TestCase
|
16
26
|
def setup
|
17
27
|
configuration = FixtureBuilder::Configuration.new
|
@@ -61,4 +71,12 @@ class NamerTest < Test::Unit::TestCase
|
|
61
71
|
assert_equal 'foo', @namer.record_name(hash, AnotherModel.table_name, '000')
|
62
72
|
assert_equal 'foo_1', @namer.record_name(hash_with_same_title, Model.table_name, '000')
|
63
73
|
end
|
74
|
+
|
75
|
+
def test_populate_custom_names_for_rails_30_and_earlier
|
76
|
+
mock_fixtures = {
|
77
|
+
'foo' => MockFixture
|
78
|
+
}
|
79
|
+
@namer.populate_custom_names(mock_fixtures)
|
80
|
+
assert_equal 'foo', @namer.record_name(MockFixture, Model.table_name, '1')
|
81
|
+
end
|
64
82
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'bundler/setup'
|
3
3
|
require 'test/unit'
|
4
|
-
require 'fixture_builder'
|
5
4
|
|
6
5
|
class Rails
|
7
6
|
def self.root
|
@@ -13,10 +12,17 @@ def test_path(glob)
|
|
13
12
|
File.join(Rails.root, 'test', glob)
|
14
13
|
end
|
15
14
|
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
15
|
+
require 'active_support/concern'
|
16
|
+
require 'active_record'
|
17
|
+
require 'active_record/test_case'
|
18
|
+
require 'active_record/fixtures'
|
19
|
+
|
20
|
+
def create_fixtures(*table_names, &block)
|
21
|
+
Fixtures.create_fixtures(ActiveSupport::TestCase.fixture_path, table_names, {}, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
require 'sqlite3'
|
25
|
+
require 'fixture_builder'
|
20
26
|
|
21
27
|
class MagicalCreature < ActiveRecord::Base
|
22
28
|
validates_presence_of :name, :species
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fixture_builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 2
|
10
|
+
version: 0.3.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ryan Dy
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2012-02-14 00:00:00 -08:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -64,9 +64,23 @@ dependencies:
|
|
64
64
|
type: :development
|
65
65
|
version_requirements: *id003
|
66
66
|
- !ruby/object:Gem::Dependency
|
67
|
-
name:
|
67
|
+
name: rails
|
68
68
|
prerelease: false
|
69
69
|
requirement: &id004 !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 7
|
75
|
+
segments:
|
76
|
+
- 2
|
77
|
+
version: "2"
|
78
|
+
type: :development
|
79
|
+
version_requirements: *id004
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: test-unit
|
82
|
+
prerelease: false
|
83
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
70
84
|
none: false
|
71
85
|
requirements:
|
72
86
|
- - ">="
|
@@ -76,11 +90,11 @@ dependencies:
|
|
76
90
|
- 0
|
77
91
|
version: "0"
|
78
92
|
type: :development
|
79
|
-
version_requirements: *
|
93
|
+
version_requirements: *id005
|
80
94
|
- !ruby/object:Gem::Dependency
|
81
95
|
name: sqlite3
|
82
96
|
prerelease: false
|
83
|
-
requirement: &
|
97
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
84
98
|
none: false
|
85
99
|
requirements:
|
86
100
|
- - ">="
|
@@ -90,7 +104,7 @@ dependencies:
|
|
90
104
|
- 0
|
91
105
|
version: "0"
|
92
106
|
type: :development
|
93
|
-
version_requirements: *
|
107
|
+
version_requirements: *id006
|
94
108
|
description: FixtureBuilder allows testers to use their existing factories, like FactoryGirl, to generate high performance fixtures that can be shared across all your tests
|
95
109
|
email: mail@ryandy.com
|
96
110
|
executables: []
|
@@ -103,6 +117,7 @@ files:
|
|
103
117
|
- .gitignore
|
104
118
|
- .pairs
|
105
119
|
- .rvmrc
|
120
|
+
- .travis.yml
|
106
121
|
- Gemfile
|
107
122
|
- MIT-LICENSE
|
108
123
|
- README.markdown
|