mixonic-seed-fu 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -10,8 +10,8 @@ If you have suggestions or come across problems, please report them on
10
10
  the Lighthouse project for Seed Fu:
11
11
  http://mbleigh.lighthouseapp.com/projects/10223-seed-fu/overview
12
12
 
13
- Usage
14
- =======
13
+ Simple Usage
14
+ ============
15
15
 
16
16
  Seed data is taken from the db/fixtures directory. Simply make descriptive .rb
17
17
  files in that directory (they can be named anything, but users.rb for the User
@@ -63,4 +63,72 @@ duplication. By default, seed data will constrain to the id like so:
63
63
  Note that any constraints that are passed in must be present in the subsequent
64
64
  seed data setting.
65
65
 
66
- Copyright (c) 2008 Michael Bleigh, released under the MIT license
66
+ Seed-many Usage
67
+ ===============
68
+
69
+ Seed files can get pretty large. One way to keep down the file size is to use
70
+ the seed_many syntax. An example re-using the first seed usage example above:
71
+
72
+ User.seed_many(:login, :email, [
73
+ { :login => "bob", :email => "bob@bobson.com", :first_name => "Bob", :last_name = "Bobson" },
74
+ { :login => "bob", :email => "bob@stevenson.com", :first_name => "Bob", :last_name = "Stevenson" }
75
+ ])
76
+
77
+ Not as pretty, but much more concise.
78
+
79
+ Generating SeedFu Files
80
+ =======================
81
+
82
+ Say you have a CSV you need to massage and store as seed files. You can create
83
+ an import script using SeedFu::Writer.
84
+
85
+ # script/generate_cities_seed_from_csv
86
+ require 'rubygems'
87
+ require 'fastercsv'
88
+ require File.join( File.dirname(__FILE__), '..', 'vendor/plugins/seed-fu/lib/seed-fu/writer' )
89
+
90
+ CITY_CSV = File.join( File.dirname(__FILE__), '..', 'city.csv' )
91
+ SEED_FILE = File.join( File.dirname(__FILE__), '..', 'db', 'fixtures', 'cities.rb' )
92
+
93
+ # Create a seed_writer, walk the CSV, add to the file.
94
+ #
95
+
96
+ seed_writer = SeedFu::Writer::SeedMany.new(
97
+ :seed_file => SEED_FILE,
98
+ :seed_model => 'City',
99
+ :seed_by => [ :city, :state ]
100
+ )
101
+
102
+ FasterCSV.foreach( CITY_CSV,
103
+ :return_headers => false,
104
+ :headers => :first_row
105
+ ) do |row|
106
+
107
+ # Skip all but the US
108
+ #
109
+ next unless row['country_code'] == 'US'
110
+
111
+ unless us_state
112
+ puts "No State Match for #{row['region_name']}"
113
+ next
114
+ end
115
+
116
+ # Write the seed
117
+ #
118
+ seed_writer.add_seed({
119
+ :zip => row['zipcode'],
120
+ :state => row['state'],
121
+ :city => row['city'],
122
+ :latitude => row['latitude'],
123
+ :longitude => row['longitude']
124
+ })
125
+
126
+ end
127
+
128
+ seed_writer.finish
129
+
130
+ There is also a SeedFu::Writer::Seed in case you don't want to seed_many syntax.
131
+ Easy-peasy.
132
+
133
+
134
+ Copyright (c) 2008 Michael Bleigh, Matthew Beale released under the MIT license
@@ -31,7 +31,7 @@ module SeedFu
31
31
  @data.each do |k, v|
32
32
  record.send("#{k}=", v)
33
33
  end
34
- record.save!
34
+ raise "Error Saving: #{record.inspect}" unless record.save(false)
35
35
  puts " - #{@model_class} #{condition_hash.inspect}"
36
36
  record
37
37
  end
@@ -0,0 +1,3 @@
1
+ require File.join( File.dirname(__FILE__), 'writer', 'abstract' )
2
+ require File.join( File.dirname(__FILE__), 'writer', 'seed' )
3
+ require File.join( File.dirname(__FILE__), 'writer', 'seed_many' )
@@ -0,0 +1,57 @@
1
+ module SeedFu
2
+
3
+ module Writer
4
+
5
+ class Abstract
6
+ attr_accessor :seed_handle, :config, :after_first_line
7
+
8
+ def initialize(options={})
9
+ self.config = options
10
+
11
+ self.seed_handle = File.new(self.config[:seed_file], 'w')
12
+
13
+ write_header
14
+ end
15
+
16
+ def header
17
+ <<-END
18
+ # DO NOT MODIFY THIS FILE, it was auto-generated.
19
+ #
20
+ # Date: #{DateTime.now}
21
+ # Using #{self.class} to seed #{config[:seed_model]}
22
+ # Written with the command:
23
+ #
24
+ # #{$0} #{$*.join}
25
+ #
26
+ END
27
+ end
28
+
29
+ def footer
30
+ <<-END
31
+ # End auto-generated file.
32
+ END
33
+ end
34
+
35
+ def add_seed(hash)
36
+ $stdout.puts "Added #{hash.inspect}" unless config[:quiet]
37
+ self.after_first_line = true
38
+ end
39
+
40
+ def write_header
41
+ seed_handle.syswrite header
42
+ end
43
+
44
+ def write_footer
45
+ seed_handle.syswrite footer
46
+ end
47
+
48
+ def finish
49
+ write_footer
50
+ seed_handle.close
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,23 @@
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
+ end
18
+
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,33 @@
1
+ module SeedFu
2
+
3
+ module Writer
4
+
5
+ class SeedMany < Abstract
6
+
7
+ def add_seed(hash)
8
+ seed_handle.syswrite( (<<-END
9
+ #{',' if self.after_first_line}
10
+ { #{hash.collect{|k,v| ":#{k} => '#{v.to_s.gsub("'", "\'")}'"}.join(', ')} }
11
+ END
12
+ ).chomp )
13
+ super(hash)
14
+ end
15
+
16
+ def write_header
17
+ super
18
+ seed_handle.syswrite( (<<-END
19
+ #{config[:seed_model]}.seed_many(#{config[:seed_by].collect{|s| ":#{s}"}.join(',')},[
20
+ END
21
+ ).chomp )
22
+ end
23
+
24
+ def write_footer
25
+ seed_handle.syswrite "\n])\n"
26
+ super
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'seed-fu'
3
- s.version = '1.1.0'
4
- s.date = '2009-07-29'
3
+ s.version = '1.2.0'
4
+ s.date = '2009-08-14'
5
5
 
6
6
  s.summary = "Allows easier database seeding of tables."
7
7
  s.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."
@@ -20,6 +20,10 @@ Gem::Specification.new do |s|
20
20
  "Rakefile",
21
21
  "init.rb",
22
22
  "lib/seed-fu.rb",
23
+ "lib/seed-fu/writer.rb",
24
+ "lib/seed-fu/writer/abstract.rb",
25
+ "lib/seed-fu/writer/seed.rb",
26
+ "lib/seed-fu/writer/seed_many.rb",
23
27
  "rails/init.rb",
24
28
  "seed-fu.gemspec",
25
29
  "spec/schema.rb",
@@ -41,13 +41,11 @@ namespace :db do
41
41
 
42
42
  old_level = ActiveRecord::Base.logger.level
43
43
  begin
44
- ActiveRecord::Base.validation_disabled = true
45
44
  ActiveRecord::Base.logger.level = 7
46
45
  ActiveRecord::Base.transaction do
47
46
  load file
48
47
  end
49
48
  ensure
50
- ActiveRecord::Base.validation_disabled = false
51
49
  ActiveRecord::Base.logger.level = old_level
52
50
  end
53
51
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mixonic-seed-fu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Bleigh
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-07-29 00:00:00 -07:00
13
+ date: 2009-08-14 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -36,6 +36,10 @@ files:
36
36
  - Rakefile
37
37
  - init.rb
38
38
  - lib/seed-fu.rb
39
+ - lib/seed-fu/writer.rb
40
+ - lib/seed-fu/writer/abstract.rb
41
+ - lib/seed-fu/writer/seed.rb
42
+ - lib/seed-fu/writer/seed_many.rb
39
43
  - rails/init.rb
40
44
  - seed-fu.gemspec
41
45
  - spec/schema.rb