seed-fu 1.2.3 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +38 -0
- data/LICENSE +20 -0
- data/README.md +149 -0
- data/lib/seed-fu.rb +29 -86
- data/lib/seed-fu/active_record_extension.rb +71 -0
- data/lib/seed-fu/block_hash.rb +21 -0
- data/lib/seed-fu/railtie.rb +14 -0
- data/lib/seed-fu/runner.rb +73 -0
- data/lib/seed-fu/seeder.rb +77 -0
- data/lib/seed-fu/version.rb +4 -0
- data/lib/seed-fu/writer.rb +132 -3
- data/lib/tasks/seed_fu.rake +43 -0
- metadata +75 -32
- data/README.rdoc +0 -125
- data/Rakefile +0 -34
- data/VERSION +0 -1
- data/lib/seed-fu/writer/abstract.rb +0 -58
- data/lib/seed-fu/writer/seed.rb +0 -26
- data/lib/seed-fu/writer/seed_many.rb +0 -52
- data/rails/init.rb +0 -1
- data/spec/schema.rb +0 -8
- data/spec/seed_fu_spec.rb +0 -116
- data/spec/spec_helper.rb +0 -8
data/Rakefile
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rake/rdoctask'
|
4
|
-
|
5
|
-
begin
|
6
|
-
require 'jeweler'
|
7
|
-
Jeweler::Tasks.new do |gemspec|
|
8
|
-
gemspec.name = "seed-fu"
|
9
|
-
gemspec.summary = "Allows easier database seeding of tables in Rails."
|
10
|
-
gemspec.email = "michael@intridea.com"
|
11
|
-
gemspec.homepage = "http://github.com/mblegih/seed-fu"
|
12
|
-
gemspec.description = "Seed Fu is an attempt to once and for all solve the problem of inserting and maintaining seed data in a database. It uses a variety of techniques gathered from various places around the web and combines them to create what is hopefully the most robust seed data system around."
|
13
|
-
gemspec.authors = ["Michael Bleigh"]
|
14
|
-
gemspec.add_dependency 'rails', '>= 2.1'
|
15
|
-
gemspec.files = FileList["[A-Z]*", "{lib,spec,rails}/**/*"] - FileList["**/*.log"]
|
16
|
-
end
|
17
|
-
Jeweler::GemcutterTasks.new
|
18
|
-
rescue LoadError
|
19
|
-
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
20
|
-
end
|
21
|
-
|
22
|
-
begin
|
23
|
-
require 'spec/rake/spectask'
|
24
|
-
|
25
|
-
Spec::Rake::SpecTask.new do |t|
|
26
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
27
|
-
end
|
28
|
-
rescue LoadError
|
29
|
-
puts "You need RSpec to run the spec suite."
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
desc 'Default: run specs.'
|
34
|
-
task :default => :spec
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.2.3
|
@@ -1,58 +0,0 @@
|
|
1
|
-
module SeedFu
|
2
|
-
|
3
|
-
module Writer
|
4
|
-
|
5
|
-
class Abstract
|
6
|
-
attr_accessor :seed_handle, :config, :number_of_seeds
|
7
|
-
|
8
|
-
def initialize(options={})
|
9
|
-
self.config = options
|
10
|
-
self.number_of_seeds = 0
|
11
|
-
|
12
|
-
self.seed_handle = File.new(self.config[:seed_file], 'w')
|
13
|
-
|
14
|
-
write_header
|
15
|
-
end
|
16
|
-
|
17
|
-
def header
|
18
|
-
<<-END
|
19
|
-
# DO NOT MODIFY THIS FILE, it was auto-generated.
|
20
|
-
#
|
21
|
-
# Date: #{DateTime.now}
|
22
|
-
# Using #{self.class} to seed #{config[:seed_model]}
|
23
|
-
# Written with the command:
|
24
|
-
#
|
25
|
-
# #{$0} #{$*.join}
|
26
|
-
#
|
27
|
-
END
|
28
|
-
end
|
29
|
-
|
30
|
-
def footer
|
31
|
-
<<-END
|
32
|
-
# End auto-generated file.
|
33
|
-
END
|
34
|
-
end
|
35
|
-
|
36
|
-
def add_seed(hash)
|
37
|
-
$stdout.puts "Added #{hash.inspect}" unless config[:quiet]
|
38
|
-
self.number_of_seeds += 1
|
39
|
-
end
|
40
|
-
|
41
|
-
def write_header
|
42
|
-
seed_handle.syswrite header
|
43
|
-
end
|
44
|
-
|
45
|
-
def write_footer
|
46
|
-
seed_handle.syswrite footer
|
47
|
-
end
|
48
|
-
|
49
|
-
def finish
|
50
|
-
write_footer
|
51
|
-
seed_handle.close
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
data/lib/seed-fu/writer/seed.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
module SeedFu
|
2
|
-
|
3
|
-
module Writer
|
4
|
-
|
5
|
-
class Seed < Abstract
|
6
|
-
|
7
|
-
# This method uses the :seed_by set earlier.
|
8
|
-
#
|
9
|
-
def add_seed(hash, seed_by=nil)
|
10
|
-
seed_by ||= config[:seed_by]
|
11
|
-
seed_handle.syswrite( <<-END
|
12
|
-
#{config[:seed_model]}.seed(#{seed_by.collect{|s| ":#{s}"}.join(',')}) { |s|
|
13
|
-
#{hash.collect{|k,v| " s.#{k} = '#{v.to_s.gsub("'", "\'")}'\n"}.join}}
|
14
|
-
END
|
15
|
-
)
|
16
|
-
super(hash)
|
17
|
-
if chunk_this_seed?
|
18
|
-
seed_handle.syswrite "# BREAK EVAL\n"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
module SeedFu
|
2
|
-
|
3
|
-
module Writer
|
4
|
-
|
5
|
-
class SeedMany < Abstract
|
6
|
-
|
7
|
-
def seed_many_header
|
8
|
-
"#{config[:seed_model]}.seed_many(#{config[:seed_by].collect{|s| ":#{s}"}.join(',')},["
|
9
|
-
end
|
10
|
-
|
11
|
-
def seed_many_footer
|
12
|
-
"\n])\n"
|
13
|
-
end
|
14
|
-
|
15
|
-
# Chunk in groups of 100 for performance
|
16
|
-
#
|
17
|
-
def chunk_this_seed?
|
18
|
-
0 == (self.number_of_seeds % (config[:chunk_size] || 100))
|
19
|
-
end
|
20
|
-
|
21
|
-
def add_seed(hash)
|
22
|
-
seed_handle.syswrite( (<<-END
|
23
|
-
#{',' unless self.number_of_seeds == 0 or chunk_this_seed?}
|
24
|
-
{ #{hash.collect{|k,v| ":#{k} => '#{v.to_s.gsub("'", "\'")}'"}.join(', ')} }
|
25
|
-
END
|
26
|
-
).chomp )
|
27
|
-
super(hash)
|
28
|
-
|
29
|
-
if chunk_this_seed?
|
30
|
-
seed_handle.syswrite(
|
31
|
-
self.seed_many_footer +
|
32
|
-
"# BREAK EVAL\n" +
|
33
|
-
self.seed_many_header
|
34
|
-
)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def write_header
|
39
|
-
super
|
40
|
-
seed_handle.syswrite self.seed_many_header
|
41
|
-
end
|
42
|
-
|
43
|
-
def write_footer
|
44
|
-
seed_handle.syswrite self.seed_many_footer
|
45
|
-
super
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
data/rails/init.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'seed-fu'
|
data/spec/schema.rb
DELETED
data/spec/seed_fu_spec.rb
DELETED
@@ -1,116 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
-
|
3
|
-
load(File.dirname(__FILE__) + '/schema.rb')
|
4
|
-
|
5
|
-
describe SeedFu::Seeder do
|
6
|
-
it "should create a model if one doesn't exist" do
|
7
|
-
SeededModel.seed(:id) do |s|
|
8
|
-
s.id = 1
|
9
|
-
s.login = "bob"
|
10
|
-
s.first_name = "Bob"
|
11
|
-
s.last_name = "Bobson"
|
12
|
-
s.title = "Peon"
|
13
|
-
end
|
14
|
-
|
15
|
-
bob = SeededModel.find_by_id(1)
|
16
|
-
bob.first_name.should == "Bob"
|
17
|
-
bob.last_name.should == "Bobson"
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should be able to handle multiple constraints" do
|
21
|
-
SeededModel.seed(:title, :login) do |s|
|
22
|
-
s.login = "bob"
|
23
|
-
s.title = "Peon"
|
24
|
-
s.first_name = "Bob"
|
25
|
-
end
|
26
|
-
|
27
|
-
SeededModel.count.should == 1
|
28
|
-
|
29
|
-
SeededModel.seed(:title, :login) do |s|
|
30
|
-
s.login = "frank"
|
31
|
-
s.title = "Peon"
|
32
|
-
s.first_name = "Frank"
|
33
|
-
end
|
34
|
-
|
35
|
-
SeededModel.count.should == 2
|
36
|
-
|
37
|
-
SeededModel.find_by_login("bob").first_name.should == "Bob"
|
38
|
-
SeededModel.seed(:title, :login) do |s|
|
39
|
-
s.login = "bob"
|
40
|
-
s.title = "Peon"
|
41
|
-
s.first_name = "Steve"
|
42
|
-
end
|
43
|
-
SeededModel.find_by_login("bob").first_name.should == "Steve"
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should be able to create models from an array of seed attributes" do
|
47
|
-
SeededModel.seed_many(:title, :login, [
|
48
|
-
{:login => "bob", :title => "Peon", :first_name => "Steve"},
|
49
|
-
{:login => "frank", :title => "Peasant", :first_name => "Francis"},
|
50
|
-
{:login => "harry", :title => "Noble", :first_name => "Harry"}
|
51
|
-
])
|
52
|
-
|
53
|
-
SeededModel.find_by_login("bob").first_name.should == "Steve"
|
54
|
-
SeededModel.find_by_login("frank").first_name.should == "Francis"
|
55
|
-
SeededModel.find_by_login("harry").first_name.should == "Harry"
|
56
|
-
end
|
57
|
-
|
58
|
-
it "should update, not create, if constraints are met" do
|
59
|
-
SeededModel.seed(:id) do |s|
|
60
|
-
s.id = 1
|
61
|
-
s.login = "bob"
|
62
|
-
s.first_name = "Bob"
|
63
|
-
s.last_name = "Bobson"
|
64
|
-
s.title = "Peon"
|
65
|
-
end
|
66
|
-
|
67
|
-
SeededModel.seed(:id) do |s|
|
68
|
-
s.id = 1
|
69
|
-
s.login = "bob"
|
70
|
-
s.first_name = "Robert"
|
71
|
-
s.last_name = "Bobson"
|
72
|
-
s.title = "Peon"
|
73
|
-
end
|
74
|
-
|
75
|
-
bob = SeededModel.find_by_id(1)
|
76
|
-
bob.first_name.should == "Robert"
|
77
|
-
bob.last_name.should == "Bobson"
|
78
|
-
end
|
79
|
-
|
80
|
-
it "should create but not update with seed_once" do
|
81
|
-
SeededModel.seed_once(:id) do |s|
|
82
|
-
s.id = 1
|
83
|
-
s.login = "bob"
|
84
|
-
s.first_name = "Bob"
|
85
|
-
s.last_name = "Bobson"
|
86
|
-
s.title = "Peon"
|
87
|
-
end
|
88
|
-
|
89
|
-
SeededModel.seed_once(:id) do |s|
|
90
|
-
s.id = 1
|
91
|
-
s.login = "bob"
|
92
|
-
s.first_name = "Robert"
|
93
|
-
s.last_name = "Bobson"
|
94
|
-
s.title = "Peon"
|
95
|
-
end
|
96
|
-
|
97
|
-
bob = SeededModel.find_by_id(1)
|
98
|
-
bob.first_name.should == "Bob"
|
99
|
-
bob.last_name.should == "Bobson"
|
100
|
-
end
|
101
|
-
|
102
|
-
#it "should raise an error if constraints are not unique" do
|
103
|
-
# SeededModel.create(:login => "bob", :first_name => "Bob", :title => "Peon")
|
104
|
-
# SeededModel.create(:login => "bob", :first_name => "Robert", :title => "Manager")
|
105
|
-
#
|
106
|
-
# SeededModel.seed(:login) do |s|
|
107
|
-
# s.login = "bob"
|
108
|
-
# s.title = "Overlord"
|
109
|
-
# end
|
110
|
-
#end
|
111
|
-
|
112
|
-
it "should default to an id constraint"
|
113
|
-
it "should require that all constraints are defined"
|
114
|
-
it "should raise an error if validation fails"
|
115
|
-
it "should retain fields that aren't specifically altered in the seeding"
|
116
|
-
end
|
data/spec/spec_helper.rb
DELETED