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 ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
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
@@ -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(%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{test-unit})
29
- s.add_development_dependency(%q{sqlite3})
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
- fixtures = ::Fixtures.create_fixtures(File.dirname(fixture_file), File.basename(fixture_file, '.*'))
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
- tables.each { |t| ActiveRecord::Base.connection.delete(delete_sql % ActiveRecord::Base.connection.quote_table_name(t)) }
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(fixtures)
28
- fixtures.each do |fixture|
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
@@ -1,3 +1,3 @@
1
1
  module FixtureBuilder
2
- VERSION = '0.3.1'
2
+ VERSION = '0.3.2'
3
3
  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
- create_and_blow_away_old_db
4
- force_fixture_generation
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
- FixtureBuilder.configure do |fbuilder|
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
- class LegacyFixtureModeFixtureGenerationTest < Test::Unit::TestCase
14
- @@magical_creatures = YAML.load(File.open(test_path("fixtures/magical_creatures.yml")))
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 "active_support/concern"
17
- require "active_record"
18
- require "sqlite3"
19
- require "active_record/fixtures"
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: 17
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 1
10
- version: 0.3.1
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: 2011-09-19 00:00:00 -07:00
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: test-unit
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: *id004
93
+ version_requirements: *id005
80
94
  - !ruby/object:Gem::Dependency
81
95
  name: sqlite3
82
96
  prerelease: false
83
- requirement: &id005 !ruby/object:Gem::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: *id005
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