seed_dump 0.3.4 → 0.4.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/CHANGELOG.rdoc +12 -0
- data/README.rdoc +13 -1
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/seed_dump/perform.rb +55 -19
- data/lib/true.rb +9 -0
- data/seed_dump.gemspec +11 -9
- data/test/fixtures/samples.yml +54 -10
- data/test/models/nested/sample.rb +3 -0
- data/test/models/sample.rb +3 -0
- data/test/seed_dump_test.rb +25 -3
- data/test/test_helper.rb +27 -0
- metadata +6 -6
- data/contents.yml +0 -22
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
== Seed Dump
|
2
2
|
|
3
|
+
== 0.4.0 / 2012-07-28
|
4
|
+
|
5
|
+
* fix rdoc issue.
|
6
|
+
* automatically use :without_protection if created_at, updated_at are present.
|
7
|
+
* Properly dump decimal columns
|
8
|
+
* support nested models [h6y3]
|
9
|
+
* add WITHOUT_PROTECTION flag [Alexey Yurchenko]
|
10
|
+
* add utf-8 encoding comment [Alexey Yurchenko, Alexey Poimtsev, n0b0dy]
|
11
|
+
* add SKIP_CALLBACKS flag [Alexey Yurchenko]
|
12
|
+
* fixed typo in README [Andrey Ognevsky]
|
13
|
+
* add PG_SCHEMA flag [Luka Novsak]
|
14
|
+
|
3
15
|
== 0.3.4 / 2011-07-14
|
4
16
|
|
5
17
|
* Skip models that aren't Derived from ActiveRecord [iconoclast]
|
data/README.rdoc
CHANGED
@@ -14,7 +14,7 @@ Dump all data directly to db/seeds.rb:
|
|
14
14
|
|
15
15
|
rake db:seed:dump
|
16
16
|
|
17
|
-
Dump only data from the users and products table and dump a maximum amount of
|
17
|
+
Dump only data from the users and products table and dump a maximum amount of 2 records:
|
18
18
|
|
19
19
|
$ rake db:seed:dump MODELS=User,Product LIMIT=2
|
20
20
|
|
@@ -78,5 +78,17 @@ NO_DATA:
|
|
78
78
|
WITH_ID:
|
79
79
|
Inlcude the +:id+ in the create options
|
80
80
|
|
81
|
+
SKIP_CALLBACKS:
|
82
|
+
Deactivate callbacks while importing.
|
83
|
+
|
84
|
+
PG_SCHEMA:
|
85
|
+
Postgres schema support
|
86
|
+
|
87
|
+
WITHOUT_PROTECTION:
|
88
|
+
Skip protection for columns that are protected by default. (Automatically activated if such columns are present)
|
89
|
+
|
90
|
+
MODEL_DIR:
|
91
|
+
Specify an alternative model dir
|
92
|
+
|
81
93
|
|
82
94
|
Copyright (c) 2010 Rob Halff, released under the MIT license
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/seed_dump/perform.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "true"
|
2
|
+
|
1
3
|
module SeedDump
|
2
4
|
class Perform
|
3
5
|
|
@@ -9,58 +11,76 @@ module SeedDump
|
|
9
11
|
@seed_rb = ""
|
10
12
|
@id_set_string = ""
|
11
13
|
@verbose = true
|
12
|
-
@model_dir = 'app/models
|
14
|
+
@model_dir = 'app/models/**/*.rb'
|
13
15
|
end
|
14
16
|
|
15
17
|
def setup(env)
|
16
18
|
# config
|
17
|
-
@opts['
|
18
|
-
@opts['
|
19
|
+
@opts['debug'] = env["DEBUG"].true?
|
20
|
+
@opts['with_id'] = env["WITH_ID"].true?
|
21
|
+
@opts['no-data'] = env['NO_DATA'].true?
|
22
|
+
@opts['without_protection'] = env['WITHOUT_PROTECTION'].true?
|
23
|
+
@opts['skip_callbacks'] = env['SKIP_CALLBACKS'].true?
|
19
24
|
@opts['models'] = env['MODELS'] || (env['MODEL'] ? env['MODEL'] : "")
|
20
25
|
@opts['file'] = env['FILE'] || "#{Rails.root}/db/seeds.rb"
|
21
|
-
@opts['append'] = (
|
26
|
+
@opts['append'] = (env['APPEND'].true? && File.exists?(@opts['file']) )
|
22
27
|
@ar_options = env['LIMIT'].to_i > 0 ? { :limit => env['LIMIT'].to_i } : {}
|
23
28
|
@indent = " " * (env['INDENT'].nil? ? 2 : env['INDENT'].to_i)
|
24
29
|
@opts['models'] = @opts['models'].split(',').collect {|x| x.underscore.singularize.camelize }
|
30
|
+
@opts['schema'] = env['PG_SCHEMA']
|
31
|
+
@opts['model_dir'] = env['MODEL_DIR'] || @model_dir
|
25
32
|
end
|
26
33
|
|
27
34
|
def loadModels
|
28
|
-
|
29
|
-
|
35
|
+
puts "Searching in #{@opts['model_dir']} for models" if @opts['debug']
|
36
|
+
Dir[@opts['model_dir']].sort.each do |f|
|
37
|
+
puts "Processing file #{f}" if @opts['debug']
|
38
|
+
# parse file name and path leading up to file name and assume the path is a module
|
39
|
+
f =~ /models\/(.*).rb/
|
40
|
+
# split path by /, camelize the constituents, and then reform as a formal class name
|
41
|
+
model = $1.split("/").map {|x| x.camelize}.join("::")
|
42
|
+
puts "Detected model #{model}" if @opts['debug']
|
30
43
|
@models.push model if @opts['models'].include?(model) || @opts['models'].empty?
|
31
44
|
end
|
32
45
|
end
|
33
46
|
|
47
|
+
def models
|
48
|
+
@models
|
49
|
+
end
|
50
|
+
|
34
51
|
def dumpAttribute(a_s,r,k,v)
|
35
|
-
v
|
36
|
-
|
37
|
-
@id_set_string = "{ |c| c.#{k} = #{v} }.save"
|
52
|
+
if v.is_a?(BigDecimal)
|
53
|
+
v = v.to_s
|
38
54
|
else
|
39
|
-
|
55
|
+
v = attribute_for_inspect(r,k)
|
56
|
+
end
|
57
|
+
|
58
|
+
unless k == 'id' && !@opts['with_id']
|
59
|
+
@opts['without_protection'] = true if ["id", "created_at", "updated_at"].include?(k)
|
60
|
+
a_s.push("#{k.to_sym.inspect} => #{v}")
|
40
61
|
end
|
41
62
|
end
|
42
63
|
|
43
64
|
def dumpModel(model)
|
44
65
|
@id_set_string = ''
|
45
66
|
create_hash = ""
|
67
|
+
options = ''
|
46
68
|
rows = []
|
47
69
|
arr = []
|
48
70
|
arr = model.find(:all, @ar_options) unless @opts['no-data']
|
49
71
|
arr = arr.empty? ? [model.new] : arr
|
72
|
+
|
50
73
|
arr.each_with_index { |r,i|
|
51
74
|
attr_s = [];
|
52
75
|
r.attributes.each { |k,v| dumpAttribute(attr_s,r,k,v) }
|
53
|
-
|
54
|
-
rows.push "#{@indent}{ " << attr_s.join(', ') << " }"
|
55
|
-
else
|
56
|
-
create_hash << "\n#{model}.create" << '( ' << attr_s.join(', ') << ' )' << @id_set_string
|
57
|
-
end
|
76
|
+
rows.push "#{@indent}{ " << attr_s.join(', ') << " }"
|
58
77
|
}
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
create_hash
|
78
|
+
|
79
|
+
if @opts['without_protection']
|
80
|
+
options = ', :without_protection => true '
|
63
81
|
end
|
82
|
+
|
83
|
+
"\n#{model}.create([\n" << rows.join(",\n") << "\n]#{options})\n"
|
64
84
|
end
|
65
85
|
|
66
86
|
def dumpModels
|
@@ -69,15 +89,24 @@ module SeedDump
|
|
69
89
|
m = model.constantize
|
70
90
|
if m.ancestors.include?(ActiveRecord::Base)
|
71
91
|
puts "Adding #{model} seeds." if @verbose
|
92
|
+
|
93
|
+
if @opts['skip_callbacks']
|
94
|
+
@seed_rb << "#{model}.reset_callbacks :save\n"
|
95
|
+
@seed_rb << "#{model}.reset_callbacks :create\n"
|
96
|
+
puts "Callbacks are disabled." if @verbose
|
97
|
+
end
|
98
|
+
|
72
99
|
@seed_rb << dumpModel(m) << "\n\n"
|
73
100
|
else
|
74
101
|
puts "Skipping non-ActiveRecord model #{model}..." if @verbose
|
75
102
|
end
|
103
|
+
puts "Protection is disabled." if @verbose && @opts['without_protection']
|
76
104
|
end
|
77
105
|
end
|
78
106
|
|
79
107
|
def writeFile
|
80
108
|
File.open(@opts['file'], (@opts['append'] ? "a" : "w")) { |f|
|
109
|
+
f << "# encoding: utf-8\n"
|
81
110
|
f << "# Autogenerated by the db:seed:dump task\n# Do not hesitate to tweak this to your needs\n" unless @opts['append']
|
82
111
|
f << "#{@seed_rb}"
|
83
112
|
}
|
@@ -96,10 +125,17 @@ module SeedDump
|
|
96
125
|
end
|
97
126
|
end
|
98
127
|
|
128
|
+
def setSearchPath(path, append_public=true)
|
129
|
+
path_parts = [path.to_s, ('public' if append_public)].compact
|
130
|
+
ActiveRecord::Base.connection.schema_search_path = path_parts.join(',')
|
131
|
+
end
|
132
|
+
|
99
133
|
def run(env)
|
100
134
|
|
101
135
|
setup env
|
102
136
|
|
137
|
+
setSearchPath @opts['schema'] if @opts['schema']
|
138
|
+
|
103
139
|
loadModels
|
104
140
|
|
105
141
|
puts "Appending seeds to #{@opts['file']}." if @opts['append']
|
data/lib/true.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# http://veerasundaravel.wordpress.com/2010/10/26/string-to-boolean-conversion-in-ruby/
|
2
|
+
class Object
|
3
|
+
def true? # to boolean
|
4
|
+
return false if self.nil?
|
5
|
+
return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
|
6
|
+
return false if self == false || self.nil? || self =~ (/(false|f|no|n|0)$/i)
|
7
|
+
raise ArgumentError.new('invalid value for Boolean: "#{self}"')
|
8
|
+
end
|
9
|
+
end
|
data/seed_dump.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
7
|
+
s.name = "seed_dump"
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Rob Halff"]
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
12
|
+
s.date = "2012-07-28"
|
13
|
+
s.description = "Dump (parts) of your database to db/seeds.rb to get a headstart creating a meaningful seeds.rb file"
|
14
|
+
s.email = "rob.halff@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"README.rdoc"
|
17
17
|
]
|
@@ -21,20 +21,22 @@ Gem::Specification.new do |s|
|
|
21
21
|
"README.rdoc",
|
22
22
|
"Rakefile",
|
23
23
|
"VERSION",
|
24
|
-
"contents.yml",
|
25
24
|
"lib/seed_dump.rb",
|
26
25
|
"lib/seed_dump/perform.rb",
|
27
26
|
"lib/seed_dump/railtie.rb",
|
28
27
|
"lib/tasks/seed_dump.rake",
|
28
|
+
"lib/true.rb",
|
29
29
|
"seed_dump.gemspec",
|
30
30
|
"test/fixtures/samples.yml",
|
31
|
+
"test/models/nested/sample.rb",
|
32
|
+
"test/models/sample.rb",
|
31
33
|
"test/seed_dump_test.rb",
|
32
34
|
"test/test_helper.rb"
|
33
35
|
]
|
34
|
-
s.homepage =
|
36
|
+
s.homepage = "http://github.com/rhalff/seed_dump"
|
35
37
|
s.require_paths = ["lib"]
|
36
|
-
s.rubygems_version =
|
37
|
-
s.summary =
|
38
|
+
s.rubygems_version = "1.8.24"
|
39
|
+
s.summary = "{Seed Dumper for Rails}"
|
38
40
|
|
39
41
|
if s.respond_to? :specification_version then
|
40
42
|
s.specification_version = 3
|
data/test/fixtures/samples.yml
CHANGED
@@ -1,10 +1,54 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
|
2
|
+
|
3
|
+
bharathiyar:
|
4
|
+
string: Poetry of Subramaniya Bharathiyar
|
5
|
+
text: யாமறிந்த மொழிகளிலே தமிழ்மொழி போல் இனிதாவது எங்கும் காணோம்,
|
6
|
+
பாமரராய் விலங்குகளாய், உலகனைத்தும் இகழ்ச்சிசொலப் பான்மை கெட்டு,
|
7
|
+
நாமமது தமிழரெனக் கொண்டு இங்கு வாழ்ந்திடுதல் நன்றோ? சொல்லீர்!
|
8
|
+
தேமதுரத் தமிழோசை உலகமெலாம் பரவும்வகை செய்தல் வேண்டும்.
|
9
|
+
integer: 1
|
10
|
+
float: 3.3333
|
11
|
+
decimal: 9.99
|
12
|
+
datetime: 1902-07-21 17:01:31
|
13
|
+
timestamp: 1900-07-21 17:01:31
|
14
|
+
time: 1903-07-21 17:01:31
|
15
|
+
date: 1904-07-21
|
16
|
+
binary:
|
17
|
+
boolean: false
|
18
|
+
|
19
|
+
pushkin:
|
20
|
+
string: Pushkin's Bronze Horseman
|
21
|
+
text: На берегу пустынных волн
|
22
|
+
Стоял он, дум великих полн,
|
23
|
+
И вдаль глядел. Пред ним широко
|
24
|
+
Река неслася; бедный чёлн
|
25
|
+
По ней стремился одиноко.
|
26
|
+
По мшистым, топким берегам
|
27
|
+
Чернели избы здесь и там,
|
28
|
+
Приют убогого чухонца;
|
29
|
+
И лес, неведомый лучам
|
30
|
+
В тумане спрятанного солнца,
|
31
|
+
Кругом шумел.
|
32
|
+
integer: 1
|
33
|
+
float: 1.5
|
34
|
+
decimal: 9.99
|
35
|
+
datetime: 2012-07-21 17:01:31
|
36
|
+
timestamp: 2012-07-21 17:01:31
|
37
|
+
time: 2012-07-21 17:01:31
|
38
|
+
date: 2012-07-21
|
39
|
+
binary:
|
40
|
+
boolean: false
|
41
|
+
poem:
|
42
|
+
string: Anglo-Saxon Rune Poem
|
43
|
+
text: ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ
|
44
|
+
ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ
|
45
|
+
ᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ
|
46
|
+
integer: 1
|
47
|
+
float: 1.9
|
48
|
+
decimal: 4.55
|
49
|
+
datetime: 2012-07-21 17:01:31
|
50
|
+
timestamp: 2012-07-21 17:01:31
|
51
|
+
time: 2012-07-21 17:01:31
|
52
|
+
date: 2012-07-21
|
53
|
+
binary:
|
54
|
+
boolean: false
|
data/test/seed_dump_test.rb
CHANGED
@@ -1,8 +1,30 @@
|
|
1
1
|
require 'test_helper'
|
2
|
+
require "seed_dump/perform"
|
2
3
|
|
3
4
|
class SeedDumpTest < ActiveSupport::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
5
|
+
|
6
|
+
setup do
|
7
|
+
@sd = SeedDump::Perform.new
|
8
|
+
# universial options for every test
|
9
|
+
@env = {
|
10
|
+
"MODEL_DIR" => Dir.pwd + '/test/models/**.rb',
|
11
|
+
"FILE" => Dir.pwd + '/test/db/seeds.rb',
|
12
|
+
"DEBUG" => true
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
test "load sample model" do
|
17
|
+
@env['MODEL_DIR'] = Dir.pwd + '/test/models/*.rb'
|
18
|
+
@sd.setup @env
|
19
|
+
@sd.loadModels
|
20
|
+
assert_equal ["Sample"], @sd.models
|
7
21
|
end
|
22
|
+
|
23
|
+
test "support nested models" do
|
24
|
+
@env['MODEL_DIR'] = Dir.pwd + '/test/models/**/*.rb'
|
25
|
+
@sd.setup @env
|
26
|
+
@sd.loadModels
|
27
|
+
assert_equal ["Nested::Sample", "Sample"], @sd.models
|
28
|
+
end
|
29
|
+
|
8
30
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,3 +1,30 @@
|
|
1
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
|
1
2
|
require 'rubygems'
|
2
3
|
require 'test/unit'
|
3
4
|
require 'active_support'
|
5
|
+
require 'active_record'
|
6
|
+
|
7
|
+
#require 'your_thing'
|
8
|
+
|
9
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
10
|
+
|
11
|
+
ActiveRecord::Schema.define(:version => 1) do
|
12
|
+
create_table "samples", :force => true do |t|
|
13
|
+
t.string "string"
|
14
|
+
t.text "text"
|
15
|
+
t.integer "integer"
|
16
|
+
t.float "float"
|
17
|
+
t.decimal "decimal"
|
18
|
+
t.datetime "datetime"
|
19
|
+
t.datetime "timestamp"
|
20
|
+
t.time "time"
|
21
|
+
t.date "date"
|
22
|
+
t.binary "binary"
|
23
|
+
t.boolean "boolean"
|
24
|
+
t.datetime "created_at", :null => false
|
25
|
+
t.datetime "updated_at", :null => false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
#class Sample < ActiveRecord::Base
|
30
|
+
#end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seed_dump
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
default_executable:
|
12
|
+
date: 2012-07-28 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
15
14
|
description: Dump (parts) of your database to db/seeds.rb to get a headstart creating
|
16
15
|
a meaningful seeds.rb file
|
@@ -25,16 +24,17 @@ files:
|
|
25
24
|
- README.rdoc
|
26
25
|
- Rakefile
|
27
26
|
- VERSION
|
28
|
-
- contents.yml
|
29
27
|
- lib/seed_dump.rb
|
30
28
|
- lib/seed_dump/perform.rb
|
31
29
|
- lib/seed_dump/railtie.rb
|
32
30
|
- lib/tasks/seed_dump.rake
|
31
|
+
- lib/true.rb
|
33
32
|
- seed_dump.gemspec
|
34
33
|
- test/fixtures/samples.yml
|
34
|
+
- test/models/nested/sample.rb
|
35
|
+
- test/models/sample.rb
|
35
36
|
- test/seed_dump_test.rb
|
36
37
|
- test/test_helper.rb
|
37
|
-
has_rdoc: true
|
38
38
|
homepage: http://github.com/rhalff/seed_dump
|
39
39
|
licenses: []
|
40
40
|
post_install_message:
|
@@ -55,7 +55,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
55
|
version: '0'
|
56
56
|
requirements: []
|
57
57
|
rubyforge_project:
|
58
|
-
rubygems_version: 1.
|
58
|
+
rubygems_version: 1.8.24
|
59
59
|
signing_key:
|
60
60
|
specification_version: 3
|
61
61
|
summary: ! '{Seed Dumper for Rails}'
|
data/contents.yml
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
|
2
|
-
article1:
|
3
|
-
id: 1
|
4
|
-
title: Article one
|
5
|
-
body: body
|
6
|
-
extended: extended content
|
7
|
-
created_at: 2011-06-01 00:00:01
|
8
|
-
updated_at: 2011-06-01 00:00:02
|
9
|
-
some_id: 1
|
10
|
-
author: Johnny Johnson
|
11
|
-
published: true
|
12
|
-
|
13
|
-
article2:
|
14
|
-
id: 2
|
15
|
-
title: This is a very long title and it should not be truncated
|
16
|
-
body: body
|
17
|
-
extended: extended content
|
18
|
-
created_at: 2010-06-01 20:00:01
|
19
|
-
updated_at: 2010-06-01 20:00:02
|
20
|
-
some_id: 2
|
21
|
-
author: Bob
|
22
|
-
published: true
|