mixonic-seed-fu 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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