seed_dump 2.0.0 → 3.0.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.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/MIT-LICENSE +1 -1
- data/README.md +54 -38
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/lib/seed_dump.rb +4 -1
- data/lib/seed_dump/dump_methods.rb +62 -117
- data/lib/seed_dump/dump_methods/enumeration.rb +73 -0
- data/lib/seed_dump/environment.rb +33 -0
- data/lib/tasks/seed_dump.rake +1 -1
- data/seed_dump.gemspec +13 -6
- data/spec/dump_methods_spec.rb +111 -0
- data/spec/environment_spec.rb +136 -0
- data/spec/factories/another_samples.rb +14 -0
- data/spec/factories/samples.rb +14 -0
- data/spec/factories/yet_another_samples.rb +14 -0
- data/spec/helpers.rb +29 -10
- data/spec/spec_helper.rb +8 -2
- metadata +25 -7
- data/CHANGELOG.rdoc +0 -56
- data/lib/clip.rb +0 -6
- data/lib/true.rb +0 -9
- data/spec/seed_dump_spec.rb +0 -157
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 616a5857e516b0f3dbeacfa6ccc958481edd2af3
|
4
|
+
data.tar.gz: d92c064c2970dc8ea0743a57db2749721a9a501e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46f9fcdcb191fef7bfd6c880662bc3a4ac2b84ae29d82d8d2d5dc24095117d074c7d2d27c50670530ce929fd1b21d5a71297b0b3cc173eb3aa7745126991c093
|
7
|
+
data.tar.gz: d141c0da2700d4cf927f10ec7e46b64e2a53e5df7a85addc00ac4ead7fbebbc9feebe761d2d8460c3254278bcc893126a9e84e66be4aa98c70ca5ea818fe4aee
|
data/Gemfile
CHANGED
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -3,35 +3,51 @@ Seed Dump
|
|
3
3
|
|
4
4
|
Seed Dump is a Rails 4 plugin that adds a rake task named `db:seed:dump`.
|
5
5
|
|
6
|
-
It allows you to create
|
6
|
+
It allows you to create seed data files from the existing data in your database.
|
7
|
+
|
8
|
+
You can also use Seed Dump from the Rails console. See below for usage examples.
|
7
9
|
|
8
10
|
Note: if you want to use Seed Dump with Rails 3 or earlier, use [version 0.5.3](http://rubygems.org/gems/seed_dump/versions/0.5.3).
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
+
Installation
|
13
|
+
------------
|
14
|
+
|
15
|
+
Add it to your Gemfile with:
|
16
|
+
|
17
|
+
gem 'seed_dump'
|
18
|
+
|
19
|
+
Or install it by hand:
|
20
|
+
|
21
|
+
$ gem install seed_dump
|
22
|
+
|
23
|
+
Examples
|
24
|
+
--------
|
25
|
+
|
26
|
+
### Rake task
|
12
27
|
|
13
28
|
Dump all data directly to `db/seeds.rb`:
|
14
29
|
|
15
30
|
$ rake db:seed:dump
|
16
31
|
|
17
|
-
|
32
|
+
Result:
|
18
33
|
|
19
|
-
|
34
|
+
Product.create!([
|
35
|
+
{category_id: 1, description: "Long Sleeve Shirt", name: "Long Sleeve Shirt"},
|
36
|
+
{category_id: 3, description: "Plain White Tee Shirt", name: "Plain T-Shirt"}
|
37
|
+
])
|
38
|
+
User.create!([
|
39
|
+
{id: 1, password: "123456", username: "test_1"},
|
40
|
+
{id: 2, password: "234567", username: "test_2"}
|
41
|
+
])
|
20
42
|
|
21
|
-
|
43
|
+
Dump only data from the users table and dump a maximum amount of 1 record:
|
22
44
|
|
23
|
-
$
|
24
|
-
# Autogenerated by the db:seed:dump task
|
25
|
-
# Do not hesitate to tweak this to your needs
|
45
|
+
$ rake db:seed:dump MODELS=User,Product LIMIT=1
|
26
46
|
|
27
|
-
|
28
|
-
{ :category_id => 1, :description => "Long Sleeve Shirt", :name => "Long Sleeve Shirt" },
|
29
|
-
{ :category_id => 3, :description => "Plain White Tee Shirt", :name => "Plain T-Shirt" }
|
30
|
-
])
|
47
|
+
Result:
|
31
48
|
|
32
|
-
|
33
|
-
{
|
34
|
-
{ :id => 2, :password => "234567", :username => "tes2" }
|
49
|
+
User.create!([
|
50
|
+
{id: 1, password: "123456", username: "test_1"}
|
35
51
|
])
|
36
52
|
|
37
53
|
Append to `db/seeds.rb` instead of overwriting it:
|
@@ -40,42 +56,42 @@ Append to `db/seeds.rb` instead of overwriting it:
|
|
40
56
|
|
41
57
|
Use another output file instead of `db/seeds.rb`:
|
42
58
|
|
43
|
-
rake db:seed:dump FILE=db/
|
44
|
-
|
45
|
-
If you want the dump to use `create` rather than `create!`:
|
46
|
-
|
47
|
-
rake db:seed:dump CREATE_METHOD='create'
|
59
|
+
rake db:seed:dump FILE=db/seeds/users.rb
|
48
60
|
|
49
|
-
There are more
|
61
|
+
There are more options that can be set— see below for all of them.
|
50
62
|
|
63
|
+
### Console
|
51
64
|
|
52
|
-
|
53
|
-
------------
|
65
|
+
Output a dump of all User records:
|
54
66
|
|
55
|
-
|
67
|
+
irb(main):001:0> puts SeedDump.dump(User)
|
68
|
+
User.create!([
|
69
|
+
{id: 1, password: "123456", username: "test_1"},
|
70
|
+
{id: 2, password: "234567", username: "test_2"}
|
71
|
+
])
|
56
72
|
|
57
|
-
|
73
|
+
Write the dump to a file:
|
58
74
|
|
59
|
-
|
75
|
+
irb(main):002:0> SeedDump.dump(User, file: 'db/seeds.rb')
|
60
76
|
|
61
|
-
|
77
|
+
Append the dump to a file:
|
62
78
|
|
79
|
+
irb(main):003:0> puts SeedDump.dump(User, file: 'db/seeds.rb', append: true)
|
63
80
|
|
64
|
-
|
65
|
-
-------------------------
|
81
|
+
Options are specified as a Hash to the second argument.
|
66
82
|
|
67
|
-
|
83
|
+
Options
|
84
|
+
-------
|
68
85
|
|
69
|
-
|
86
|
+
Options are common to both the Rake task and the console, except where noted.
|
70
87
|
|
71
|
-
`
|
88
|
+
`append`: If set to `true`, append the data to the file instead of overwriting it. Default: `false`.
|
72
89
|
|
73
|
-
`
|
90
|
+
`exclude`: Attributes to be excluded from the dump. Default: `id, created_at, updated_at`.
|
74
91
|
|
75
|
-
`
|
92
|
+
`file`: Write to the specified output file. Default in Rake task is `db/seeds.rb`. Console returns the dump as a string by default.
|
76
93
|
|
77
|
-
`
|
94
|
+
`limit`: Dump no more then this amount of data. Default: no limit. Rake task only. In the console just pass in an ActiveRecord::Relation with the appropriate limit (e.g. `SeedDump.dump(User.limit(5))`).
|
78
95
|
|
79
|
-
`
|
96
|
+
`model[s]`: Restrict the dump to the specified comma-separated list of models. Default: all models. Rake task only.
|
80
97
|
|
81
|
-
`TIMESTAMPS`: If set to `true`, include the `:created_by` and `:updated_by` timestamps. Default: `true`.
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
3.0.0
|
data/lib/seed_dump.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
+
require 'seed_dump/dump_methods/enumeration'
|
1
2
|
require 'seed_dump/dump_methods'
|
3
|
+
require 'seed_dump/environment'
|
2
4
|
|
3
5
|
class SeedDump
|
4
|
-
|
6
|
+
extend Environment
|
7
|
+
extend DumpMethods
|
5
8
|
|
6
9
|
require 'seed_dump/railtie' if defined?(Rails)
|
7
10
|
end
|
@@ -1,151 +1,96 @@
|
|
1
|
-
require "true"
|
2
|
-
require "clip"
|
3
|
-
|
4
1
|
class SeedDump
|
5
2
|
module DumpMethods
|
3
|
+
include Enumeration
|
6
4
|
|
7
|
-
def
|
8
|
-
|
9
|
-
@ar_options = {}
|
10
|
-
@indent = ""
|
11
|
-
@models = []
|
12
|
-
@seed_rb = ""
|
13
|
-
@id_set_string = ""
|
14
|
-
end
|
5
|
+
def dump(records, options = {})
|
6
|
+
return nil if records.count == 0
|
15
7
|
|
16
|
-
|
17
|
-
# config
|
18
|
-
@opts['verbose'] = env["VERBOSE"].true? || env['VERBOSE'].nil?
|
19
|
-
@opts['debug'] = env["DEBUG"].true?
|
20
|
-
@opts['with_id'] = env["WITH_ID"].true?
|
21
|
-
@opts['timestamps'] = env["TIMESTAMPS"].true? || env["TIMESTAMPS"].nil?
|
22
|
-
@opts['models'] = env['MODELS'] || env['MODEL'] || ""
|
23
|
-
@opts['file'] = env['FILE'] || "#{Rails.root}/db/seeds.rb"
|
24
|
-
@opts['append'] = (env['APPEND'].true? && File.exists?(@opts['file']) )
|
25
|
-
@opts['max'] = env['MAX'] && env['MAX'].to_i > 0 ? env['MAX'].to_i : nil
|
26
|
-
@indent = " " * (env['INDENT'].nil? ? 2 : env['INDENT'].to_i)
|
27
|
-
@opts['create_method'] = env['CREATE_METHOD'] || 'create!'
|
28
|
-
|
29
|
-
@limit = (env['LIMIT'].to_i > 0) ? env['LIMIT'].to_i : nil
|
30
|
-
|
31
|
-
@models = @opts['models'].split(',').collect {|x| x.strip.underscore.singularize.camelize.constantize }
|
32
|
-
end
|
8
|
+
io = open_io(options)
|
33
9
|
|
34
|
-
|
35
|
-
puts msg if @opts['debug']
|
36
|
-
end
|
10
|
+
write_records_to_io(records, io, options)
|
37
11
|
|
38
|
-
|
39
|
-
|
12
|
+
ensure
|
13
|
+
io.close if io.present?
|
40
14
|
end
|
41
15
|
|
42
|
-
|
43
|
-
pushed = false
|
44
|
-
if v.is_a?(BigDecimal)
|
45
|
-
v = v.to_s
|
46
|
-
else
|
47
|
-
v = attribute_for_inspect(r,k)
|
48
|
-
end
|
16
|
+
private
|
49
17
|
|
50
|
-
|
51
|
-
|
52
|
-
a_s.push("#{k.to_sym.inspect} => #{v}")
|
53
|
-
pushed = true
|
54
|
-
end
|
55
|
-
end
|
56
|
-
pushed
|
57
|
-
end
|
18
|
+
def dump_record(record, options)
|
19
|
+
attribute_strings = []
|
58
20
|
|
59
|
-
|
60
|
-
@id_set_string = ''
|
61
|
-
create_hash = ""
|
62
|
-
rows = []
|
21
|
+
options[:exclude] ||= [:id, :created_at, :updated_at]
|
63
22
|
|
23
|
+
# We select only string attribute names to avoid conflict
|
24
|
+
# with the composite_primary_keys gem (it returns composite
|
25
|
+
# primary key attribute names as hashes).
|
26
|
+
record.attributes.select {|key| key.is_a?(String) }.each do |attribute, value|
|
27
|
+
attribute_strings << dump_attribute_new(attribute, value) unless options[:exclude].include?(attribute.to_sym)
|
28
|
+
end
|
64
29
|
|
65
|
-
|
66
|
-
|
30
|
+
"{#{attribute_strings.join(", ")}}"
|
31
|
+
end
|
67
32
|
|
68
|
-
|
69
|
-
|
70
|
-
|
33
|
+
def dump_attribute_new(attribute, value)
|
34
|
+
"#{attribute}: #{value_to_s(value)}"
|
35
|
+
end
|
71
36
|
|
72
|
-
|
37
|
+
def value_to_s(value)
|
38
|
+
value = case value
|
39
|
+
when BigDecimal
|
40
|
+
value.to_s
|
41
|
+
when Date, Time, DateTime
|
42
|
+
value.to_s(:db)
|
43
|
+
else
|
44
|
+
value
|
45
|
+
end
|
46
|
+
|
47
|
+
value.inspect
|
48
|
+
end
|
73
49
|
|
74
|
-
|
75
|
-
|
50
|
+
def open_io(options)
|
51
|
+
if options[:file].present?
|
52
|
+
mode = options[:append] ? 'a+' : 'w+'
|
76
53
|
|
77
|
-
|
78
|
-
splited_rows = rows.each_slice(@opts['max']).to_a
|
79
|
-
maxsarr = []
|
80
|
-
splited_rows.each do |sr|
|
81
|
-
maxsarr << "\n#{model}.#{@opts['create_method']}([\n" << sr.join(",\n") << "\n])\n"
|
82
|
-
end
|
83
|
-
maxsarr.join('')
|
54
|
+
File.open(options[:file], mode)
|
84
55
|
else
|
85
|
-
|
56
|
+
StringIO.new('', 'w+')
|
86
57
|
end
|
87
|
-
|
88
58
|
end
|
89
59
|
|
90
|
-
def
|
91
|
-
|
92
|
-
Rails.application.eager_load!
|
60
|
+
def write_records_to_io(records, io, options)
|
61
|
+
io.write("#{model_for(records)}.create!([\n ")
|
93
62
|
|
94
|
-
|
63
|
+
enumeration_method = if records.is_a?(ActiveRecord::Relation) || records.is_a?(Class)
|
64
|
+
:active_record_enumeration
|
65
|
+
else
|
66
|
+
:enumerable_enumeration
|
67
|
+
end
|
95
68
|
|
96
|
-
|
97
|
-
|
98
|
-
model.table_exists? && \
|
99
|
-
model.exists?
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
@models.sort! { |a, b| a.to_s <=> b.to_s }
|
69
|
+
send(enumeration_method, records, io, options) do |record_strings, last_batch|
|
70
|
+
io.write(record_strings.join(",\n "))
|
104
71
|
|
105
|
-
|
106
|
-
puts "Adding #{model} seeds." if @opts['verbose']
|
107
|
-
|
108
|
-
@seed_rb << dump_model(model) << "\n\n"
|
72
|
+
io.write(",\n ") unless last_batch
|
109
73
|
end
|
110
74
|
|
111
|
-
|
112
|
-
end
|
113
|
-
|
114
|
-
def write_file
|
115
|
-
File.open(@opts['file'], (@opts['append'] ? "a" : "w")) { |f|
|
116
|
-
f << "# encoding: utf-8\n"
|
117
|
-
f << "# Autogenerated by the db:seed:dump task\n# Do not hesitate to tweak this to your needs\n" unless @opts['append']
|
118
|
-
f << "#{@seed_rb}"
|
119
|
-
}
|
120
|
-
end
|
121
|
-
|
122
|
-
#override the rails version of this function to NOT truncate strings
|
123
|
-
def attribute_for_inspect(r,k)
|
124
|
-
value = r.attributes[k]
|
75
|
+
io.write("\n])\n")
|
125
76
|
|
126
|
-
if
|
127
|
-
|
128
|
-
elsif value.is_a?(Date) || value.is_a?(Time)
|
129
|
-
%("#{value.to_s(:db)}")
|
77
|
+
if options[:file].present?
|
78
|
+
nil
|
130
79
|
else
|
131
|
-
|
80
|
+
io.rewind
|
81
|
+
io.read
|
132
82
|
end
|
133
83
|
end
|
134
84
|
|
135
|
-
def
|
136
|
-
|
85
|
+
def model_for(records)
|
86
|
+
if records.is_a?(Class)
|
87
|
+
records
|
88
|
+
elsif records.respond_to?(:model)
|
89
|
+
records.model
|
90
|
+
else
|
91
|
+
records[0].class
|
92
|
+
end
|
137
93
|
end
|
138
94
|
|
139
|
-
def run(env)
|
140
|
-
setup env
|
141
|
-
|
142
|
-
puts "Appending seeds to #{@opts['file']}." if @opts['append']
|
143
|
-
dump_models
|
144
|
-
|
145
|
-
puts "Writing #{@opts['file']}."
|
146
|
-
write_file
|
147
|
-
|
148
|
-
puts "Done."
|
149
|
-
end
|
150
95
|
end
|
151
96
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
class SeedDump
|
2
|
+
module DumpMethods
|
3
|
+
module Enumeration
|
4
|
+
def active_record_enumeration(records, io, options)
|
5
|
+
# If the records don't already have an order,
|
6
|
+
# order them by primary key ascending.
|
7
|
+
if !records.respond_to?(:arel) || records.arel.orders.blank?
|
8
|
+
records.order("#{records.quoted_table_name}.#{records.quoted_primary_key} ASC")
|
9
|
+
end
|
10
|
+
|
11
|
+
num_of_batches, batch_size, last_batch_size = batch_params_from(records, options)
|
12
|
+
|
13
|
+
# Loop through each batch
|
14
|
+
(1..num_of_batches).each do |batch_number|
|
15
|
+
|
16
|
+
record_strings = []
|
17
|
+
|
18
|
+
last_batch = (batch_number == num_of_batches)
|
19
|
+
|
20
|
+
cur_batch_size = if last_batch
|
21
|
+
last_batch_size
|
22
|
+
else
|
23
|
+
batch_size
|
24
|
+
end
|
25
|
+
|
26
|
+
# Loop through the records of the current batch
|
27
|
+
records.offset((num_of_batches - 1) * batch_size).limit(cur_batch_size).each do |record|
|
28
|
+
record_strings << dump_record(record, options)
|
29
|
+
end
|
30
|
+
|
31
|
+
yield record_strings, last_batch
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def enumerable_enumeration(records, io, options)
|
36
|
+
num_of_batches, batch_size = batch_params_from(records, options)
|
37
|
+
|
38
|
+
record_strings = []
|
39
|
+
|
40
|
+
batch_number = 1
|
41
|
+
|
42
|
+
records.each_with_index do |record, i|
|
43
|
+
record_strings << dump_record(record, options)
|
44
|
+
|
45
|
+
last_batch = (i == records.length - 1)
|
46
|
+
|
47
|
+
if (record_strings.length == batch_size) || last_batch
|
48
|
+
yield record_strings, last_batch
|
49
|
+
|
50
|
+
record_strings = []
|
51
|
+
batch_number += 1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def batch_params_from(records, options)
|
57
|
+
batch_size = batch_size_from(records, options)
|
58
|
+
|
59
|
+
count = records.count
|
60
|
+
|
61
|
+
[((count / batch_size) + 1), batch_size, (count % batch_size)]
|
62
|
+
end
|
63
|
+
|
64
|
+
def batch_size_from(records, options)
|
65
|
+
if options[:batch_size].present?
|
66
|
+
options[:batch_size].to_i
|
67
|
+
else
|
68
|
+
1000
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class SeedDump
|
2
|
+
module Environment
|
3
|
+
|
4
|
+
def dump_using_environment(env = {})
|
5
|
+
Rails.application.eager_load!
|
6
|
+
|
7
|
+
models = if env['MODEL'] || env['MODELS']
|
8
|
+
(env['MODEL'] || env['MODELS']).split(',').collect {|x| x.strip.underscore.singularize.camelize.constantize }
|
9
|
+
else
|
10
|
+
ActiveRecord::Base.descendants.select do |model|
|
11
|
+
(model.to_s != 'ActiveRecord::SchemaMigration') && \
|
12
|
+
model.table_exists? && \
|
13
|
+
model.exists?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
append = (env['APPEND'] == 'true')
|
18
|
+
|
19
|
+
models.each do |model|
|
20
|
+
model = model.limit(env['LIMIT'].to_i) if env['LIMIT']
|
21
|
+
|
22
|
+
SeedDump.dump(model,
|
23
|
+
append: append,
|
24
|
+
batch_size: (env['BATCH_SIZE'] ? env['BATCH_SIZE'].to_i : nil),
|
25
|
+
exclude: (env['EXCLUDE'] ? env['EXCLUDE'].split(',').map {|e| e.strip.to_sym} : nil),
|
26
|
+
file: (env['FILE'] || 'db/seeds.rb'))
|
27
|
+
|
28
|
+
append = true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
data/lib/tasks/seed_dump.rake
CHANGED
data/seed_dump.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "seed_dump"
|
8
|
-
s.version = "
|
8
|
+
s.version = "3.0.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", "Ryan Oblak"]
|
12
|
-
s.date = "2013-
|
12
|
+
s.date = "2013-12-07"
|
13
13
|
s.description = "Dump (parts) of your database to db/seeds.rb to get a headstart creating a meaningful seeds.rb file"
|
14
14
|
s.email = "rroblak@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -17,24 +17,28 @@ Gem::Specification.new do |s|
|
|
17
17
|
]
|
18
18
|
s.files = [
|
19
19
|
".rspec",
|
20
|
-
"CHANGELOG.rdoc",
|
21
20
|
"Gemfile",
|
22
21
|
"MIT-LICENSE",
|
23
22
|
"README.md",
|
24
23
|
"Rakefile",
|
25
24
|
"VERSION",
|
26
|
-
"lib/clip.rb",
|
27
25
|
"lib/seed_dump.rb",
|
28
26
|
"lib/seed_dump/dump_methods.rb",
|
27
|
+
"lib/seed_dump/dump_methods/enumeration.rb",
|
28
|
+
"lib/seed_dump/environment.rb",
|
29
29
|
"lib/seed_dump/railtie.rb",
|
30
30
|
"lib/tasks/seed_dump.rake",
|
31
|
-
"lib/true.rb",
|
32
31
|
"seed_dump.gemspec",
|
32
|
+
"spec/dump_methods_spec.rb",
|
33
|
+
"spec/environment_spec.rb",
|
34
|
+
"spec/factories/another_samples.rb",
|
35
|
+
"spec/factories/samples.rb",
|
36
|
+
"spec/factories/yet_another_samples.rb",
|
33
37
|
"spec/helpers.rb",
|
34
|
-
"spec/seed_dump_spec.rb",
|
35
38
|
"spec/spec_helper.rb"
|
36
39
|
]
|
37
40
|
s.homepage = "https://github.com/rroblak/seed_dump"
|
41
|
+
s.licenses = ["MIT"]
|
38
42
|
s.require_paths = ["lib"]
|
39
43
|
s.rubygems_version = "2.0.3"
|
40
44
|
s.summary = "{Seed Dumper for Rails}"
|
@@ -46,17 +50,20 @@ Gem::Specification.new do |s|
|
|
46
50
|
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
47
51
|
s.add_runtime_dependency(%q<activerecord>, [">= 0"])
|
48
52
|
s.add_development_dependency(%q<byebug>, [">= 0"])
|
53
|
+
s.add_development_dependency(%q<factory_girl>, [">= 0"])
|
49
54
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
50
55
|
else
|
51
56
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
52
57
|
s.add_dependency(%q<activerecord>, [">= 0"])
|
53
58
|
s.add_dependency(%q<byebug>, [">= 0"])
|
59
|
+
s.add_dependency(%q<factory_girl>, [">= 0"])
|
54
60
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
55
61
|
end
|
56
62
|
else
|
57
63
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
58
64
|
s.add_dependency(%q<activerecord>, [">= 0"])
|
59
65
|
s.add_dependency(%q<byebug>, [">= 0"])
|
66
|
+
s.add_dependency(%q<factory_girl>, [">= 0"])
|
60
67
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
61
68
|
end
|
62
69
|
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SeedDump do
|
4
|
+
|
5
|
+
describe '.dump' do
|
6
|
+
before do
|
7
|
+
Rails.application.eager_load!
|
8
|
+
|
9
|
+
create_db
|
10
|
+
|
11
|
+
3.times { FactoryGirl.create(:sample) }
|
12
|
+
|
13
|
+
@expected_output = "Sample.create!([\n {string: \"string\", text: \"text\", integer: 42, float: 3.14, decimal: \"2.72\", datetime: \"1776-07-04 19:14:00\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false},\n {string: \"string\", text: \"text\", integer: 42, float: 3.14, decimal: \"2.72\", datetime: \"1776-07-04 19:14:00\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false},\n {string: \"string\", text: \"text\", integer: 42, float: 3.14, decimal: \"2.72\", datetime: \"1776-07-04 19:14:00\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false}\n])\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'without file option' do
|
17
|
+
it 'should return the dump of the models passed in' do
|
18
|
+
SeedDump.dump(Sample).should eq(@expected_output)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'with file option' do
|
23
|
+
before do
|
24
|
+
@filename = Dir::Tmpname.make_tmpname(File.join(Dir.tmpdir, 'foo'), nil)
|
25
|
+
end
|
26
|
+
|
27
|
+
after do
|
28
|
+
File.unlink(@filename)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should dump the models to the specified file' do
|
32
|
+
SeedDump.dump(Sample, file: @filename)
|
33
|
+
|
34
|
+
File.open(@filename) { |file| file.read.should eq(@expected_output) }
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'with append option' do
|
38
|
+
it 'should append to the file rather than overwriting it' do
|
39
|
+
SeedDump.dump(Sample, file: @filename)
|
40
|
+
SeedDump.dump(Sample, file: @filename, append: true)
|
41
|
+
|
42
|
+
File.open(@filename) { |file| file.read.should eq(@expected_output + @expected_output) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'ActiveRecord relation' do
|
48
|
+
it 'should return nil if the count is 0' do
|
49
|
+
SeedDump.dump(EmptyModel).should be(nil)
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'with an order parameter' do
|
53
|
+
it 'should dump the models in the specified order' do
|
54
|
+
Sample.delete_all
|
55
|
+
samples = 3.times {|i| FactoryGirl.create(:sample, integer: i) }
|
56
|
+
|
57
|
+
SeedDump.dump(Sample.order('integer DESC')).should eq("Sample.create!([\n {string: \"string\", text: \"text\", integer: 2, float: 3.14, decimal: \"2.72\", datetime: \"1776-07-04 19:14:00\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false},\n {string: \"string\", text: \"text\", integer: 1, float: 3.14, decimal: \"2.72\", datetime: \"1776-07-04 19:14:00\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false},\n {string: \"string\", text: \"text\", integer: 0, float: 3.14, decimal: \"2.72\", datetime: \"1776-07-04 19:14:00\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false}\n])\n")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'without an order parameter' do
|
62
|
+
it 'should dump the models sorted by primary key ascending' do
|
63
|
+
Sample.delete_all
|
64
|
+
samples = 3.times {|i| FactoryGirl.create(:sample, integer: i) }
|
65
|
+
|
66
|
+
SeedDump.dump(Sample).should eq("Sample.create!([\n {string: \"string\", text: \"text\", integer: 0, float: 3.14, decimal: \"2.72\", datetime: \"1776-07-04 19:14:00\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false},\n {string: \"string\", text: \"text\", integer: 1, float: 3.14, decimal: \"2.72\", datetime: \"1776-07-04 19:14:00\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false},\n {string: \"string\", text: \"text\", integer: 2, float: 3.14, decimal: \"2.72\", datetime: \"1776-07-04 19:14:00\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false}\n])\n")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'with a limit parameter' do
|
71
|
+
it 'should dump the number of models specified by the limit when the limit is smaller than the batch size' do
|
72
|
+
expected_output = "Sample.create!([\n {string: \"string\", text: \"text\", integer: 42, float: 3.14, decimal: \"2.72\", datetime: \"1776-07-04 19:14:00\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false}\n])\n"
|
73
|
+
|
74
|
+
SeedDump.dump(Sample.limit(1)).should eq(expected_output)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should dump the number of models specified by the limit when the limit is larger than the batch size but not a multiple of the batch size' do
|
78
|
+
Sample.delete_all
|
79
|
+
4.times { FactoryGirl.create(:sample) }
|
80
|
+
|
81
|
+
SeedDump.dump(Sample.limit(3), batch_size: 2).should eq(@expected_output)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'with a batch_size parameter' do
|
87
|
+
it 'should not raise an exception' do
|
88
|
+
|
89
|
+
SeedDump.dump(Sample, batch_size: 100)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'Array' do
|
94
|
+
it 'should return the dump of the models passed in' do
|
95
|
+
SeedDump.dump(Sample.all.to_a, batch_size: 2).should eq(@expected_output)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should return nil if the array is empty' do
|
99
|
+
SeedDump.dump([]).should be(nil)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'with an exclude parameter' do
|
104
|
+
it 'should exclude the specified attributes from the dump' do
|
105
|
+
expected_output = "Sample.create!([\n {text: \"text\", integer: 42, decimal: \"2.72\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false},\n {text: \"text\", integer: 42, decimal: \"2.72\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false},\n {text: \"text\", integer: 42, decimal: \"2.72\", time: \"2000-01-01 03:15:00\", date: \"1863-11-19\", binary: \"binary\", boolean: false}\n])\n"
|
106
|
+
|
107
|
+
SeedDump.dump(Sample, exclude: [:id, :created_at, :updated_at, :string, :float, :datetime]).should eq(expected_output)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SeedDump do
|
4
|
+
describe '.dump_using_environment' do
|
5
|
+
before(:all) do
|
6
|
+
create_db
|
7
|
+
end
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
Rails.application.eager_load!
|
11
|
+
|
12
|
+
FactoryGirl.create(:sample)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'APPEND' do
|
16
|
+
it "should specify append as true if the APPEND env var is 'true'" do
|
17
|
+
SeedDump.should_receive(:dump).with(anything, include(append: true))
|
18
|
+
|
19
|
+
SeedDump.dump_using_environment('APPEND' => 'true')
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should specify append as false the first time if the APPEND env var is not 'true' (and true after that)" do
|
23
|
+
FactoryGirl.create(:another_sample)
|
24
|
+
|
25
|
+
SeedDump.should_receive(:dump).with(anything, include(append: false)).ordered
|
26
|
+
SeedDump.should_receive(:dump).with(anything, include(append: true)).ordered
|
27
|
+
|
28
|
+
SeedDump.dump_using_environment('APPEND' => 'false')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'BATCH_SIZE' do
|
33
|
+
it 'should pass along the specified batch size' do
|
34
|
+
SeedDump.should_receive(:dump).with(anything, include(batch_size: 17))
|
35
|
+
|
36
|
+
SeedDump.dump_using_environment('BATCH_SIZE' => '17')
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should pass along a nil batch size if BATCH_SIZE is not specified' do
|
40
|
+
SeedDump.should_receive(:dump).with(anything, include(batch_size: nil))
|
41
|
+
|
42
|
+
SeedDump.dump_using_environment
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'EXCLUDE' do
|
47
|
+
it 'should pass along any attributes to be excluded' do
|
48
|
+
SeedDump.should_receive(:dump).with(anything, include(exclude: [:baggins, :saggins]))
|
49
|
+
|
50
|
+
SeedDump.dump_using_environment('EXCLUDE' => 'baggins,saggins')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'FILE' do
|
55
|
+
it 'should pass the FILE parameter to the dump method correctly' do
|
56
|
+
SeedDump.should_receive(:dump).with(anything, include(file: 'blargle'))
|
57
|
+
|
58
|
+
SeedDump.dump_using_environment('FILE' => 'blargle')
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should pass db/seeds.rb as the file parameter if no FILE is specified' do
|
62
|
+
SeedDump.should_receive(:dump).with(anything, include(file: 'db/seeds.rb'))
|
63
|
+
|
64
|
+
SeedDump.dump_using_environment
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'LIMIT' do
|
69
|
+
it 'should apply the specified limit to the records' do
|
70
|
+
relation_double = double('ActiveRecord relation double')
|
71
|
+
Sample.should_receive(:limit).with(5).and_return(relation_double)
|
72
|
+
|
73
|
+
SeedDump.should_receive(:dump).with(relation_double, anything)
|
74
|
+
SeedDump.stub(:dump)
|
75
|
+
|
76
|
+
SeedDump.dump_using_environment('LIMIT' => '5')
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe 'MODEL' do
|
81
|
+
it 'if MODEL is not specified it should dump all non-empty models' do
|
82
|
+
FactoryGirl.create(:another_sample)
|
83
|
+
|
84
|
+
[Sample, AnotherSample].each do |model|
|
85
|
+
SeedDump.should_receive(:dump).with(model, anything)
|
86
|
+
end
|
87
|
+
|
88
|
+
SeedDump.dump_using_environment
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'if MODEL is specified it should only dump the specified model' do
|
92
|
+
FactoryGirl.create(:another_sample)
|
93
|
+
|
94
|
+
SeedDump.should_receive(:dump).with(Sample, anything)
|
95
|
+
|
96
|
+
SeedDump.dump_using_environment('MODEL' => 'Sample')
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe 'MODELS' do
|
101
|
+
it 'if MODELS is not specified it should dump all non-empty models' do
|
102
|
+
FactoryGirl.create(:another_sample)
|
103
|
+
|
104
|
+
[Sample, AnotherSample].each do |model|
|
105
|
+
SeedDump.should_receive(:dump).with(model, anything)
|
106
|
+
end
|
107
|
+
|
108
|
+
SeedDump.dump_using_environment
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'if MODELS is specified it should only dump those models' do
|
112
|
+
FactoryGirl.create(:another_sample)
|
113
|
+
FactoryGirl.create(:yet_another_sample)
|
114
|
+
|
115
|
+
SeedDump.should_receive(:dump).with(Sample, anything)
|
116
|
+
SeedDump.should_receive(:dump).with(AnotherSample, anything)
|
117
|
+
|
118
|
+
SeedDump.dump_using_environment('MODELS' => 'Sample, AnotherSample')
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'should run ok without ActiveRecord::SchemaMigration being set (needed for Rails Engines)' do
|
123
|
+
schema_migration = ActiveRecord::SchemaMigration
|
124
|
+
|
125
|
+
ActiveRecord.send(:remove_const, :SchemaMigration)
|
126
|
+
|
127
|
+
SeedDump.stub(:dump)
|
128
|
+
|
129
|
+
begin
|
130
|
+
SeedDump.dump_using_environment
|
131
|
+
ensure
|
132
|
+
ActiveRecord.const_set(:SchemaMigration, schema_migration)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :another_sample do
|
3
|
+
string 'string'
|
4
|
+
text 'text'
|
5
|
+
integer 42
|
6
|
+
float 3.14
|
7
|
+
decimal 2.72
|
8
|
+
datetime DateTime.parse('July 4, 1776 7:14pm UTC')
|
9
|
+
time Time.parse('3:15am UTC')
|
10
|
+
date Date.parse('November 19, 1863')
|
11
|
+
binary 'binary'
|
12
|
+
boolean false
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :sample do
|
3
|
+
string 'string'
|
4
|
+
text 'text'
|
5
|
+
integer 42
|
6
|
+
float 3.14
|
7
|
+
decimal 2.72
|
8
|
+
datetime DateTime.parse('July 4, 1776 7:14pm UTC')
|
9
|
+
time Time.parse('3:15am UTC')
|
10
|
+
date Date.parse('November 19, 1863')
|
11
|
+
binary 'binary'
|
12
|
+
boolean false
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :yet_another_sample do
|
3
|
+
string 'string'
|
4
|
+
text 'text'
|
5
|
+
integer 42
|
6
|
+
float 3.14
|
7
|
+
decimal 2.72
|
8
|
+
datetime DateTime.parse('July 4, 1776 7:14pm UTC')
|
9
|
+
time Time.parse('3:15am UTC')
|
10
|
+
date Date.parse('November 19, 1863')
|
11
|
+
binary 'binary'
|
12
|
+
boolean false
|
13
|
+
end
|
14
|
+
end
|
data/spec/helpers.rb
CHANGED
@@ -11,16 +11,12 @@ class Rails
|
|
11
11
|
if !@already_called
|
12
12
|
Object.const_set('Sample', Class.new(ActiveRecord::Base))
|
13
13
|
|
14
|
-
Object.const_set('
|
15
|
-
AbstractSample.abstract_class = true
|
14
|
+
Object.const_set('AnotherSample', Class.new(ActiveRecord::Base))
|
16
15
|
|
17
|
-
Object.const_set('
|
16
|
+
Object.const_set('YetAnotherSample', Class.new(ActiveRecord::Base))
|
18
17
|
|
19
18
|
Object.const_set('NoTableModel', Class.new(ActiveRecord::Base))
|
20
19
|
|
21
|
-
Object.const_set('Nested', Module.new)
|
22
|
-
Nested.const_set('Sample', Class.new(ActiveRecord::Base))
|
23
|
-
|
24
20
|
Object.const_set('EmptyModel', Class.new(ActiveRecord::Base))
|
25
21
|
|
26
22
|
@already_called = true
|
@@ -33,20 +29,43 @@ module Helpers
|
|
33
29
|
ActiveRecord::Migration.verbose = false
|
34
30
|
|
35
31
|
ActiveRecord::Schema.define(:version => 1) do
|
36
|
-
create_table '
|
37
|
-
t.string '
|
32
|
+
create_table 'samples', :force => true do |t|
|
33
|
+
t.string 'string'
|
34
|
+
t.text 'text'
|
35
|
+
t.integer 'integer'
|
36
|
+
t.float 'float'
|
37
|
+
t.decimal 'decimal'
|
38
|
+
t.datetime 'datetime'
|
39
|
+
t.time 'time'
|
40
|
+
t.date 'date'
|
41
|
+
t.binary 'binary'
|
42
|
+
t.boolean 'boolean'
|
38
43
|
t.datetime 'created_at', :null => false
|
39
44
|
t.datetime 'updated_at', :null => false
|
40
45
|
end
|
41
46
|
|
42
|
-
create_table '
|
47
|
+
create_table 'another_samples', :force => true do |t|
|
48
|
+
t.string 'string'
|
49
|
+
t.text 'text'
|
50
|
+
t.integer 'integer'
|
51
|
+
t.float 'float'
|
52
|
+
t.decimal 'decimal'
|
53
|
+
t.datetime 'datetime'
|
54
|
+
t.time 'time'
|
55
|
+
t.date 'date'
|
56
|
+
t.binary 'binary'
|
57
|
+
t.boolean 'boolean'
|
58
|
+
t.datetime 'created_at', :null => false
|
59
|
+
t.datetime 'updated_at', :null => false
|
60
|
+
end
|
61
|
+
|
62
|
+
create_table 'yet_another_samples', :force => true do |t|
|
43
63
|
t.string 'string'
|
44
64
|
t.text 'text'
|
45
65
|
t.integer 'integer'
|
46
66
|
t.float 'float'
|
47
67
|
t.decimal 'decimal'
|
48
68
|
t.datetime 'datetime'
|
49
|
-
t.datetime 'timestamp'
|
50
69
|
t.time 'time'
|
51
70
|
t.date 'date'
|
52
71
|
t.binary 'binary'
|
data/spec/spec_helper.rb
CHANGED
@@ -1,13 +1,19 @@
|
|
1
1
|
require 'seed_dump'
|
2
|
-
|
3
|
-
require 'active_support
|
2
|
+
|
3
|
+
require 'active_support'
|
4
4
|
require 'active_record'
|
5
|
+
|
5
6
|
require 'byebug'
|
7
|
+
|
6
8
|
require 'database_cleaner'
|
9
|
+
require 'factory_girl'
|
10
|
+
|
7
11
|
require './spec/helpers'
|
8
12
|
|
9
13
|
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
|
10
14
|
|
15
|
+
FactoryGirl.find_definitions
|
16
|
+
|
11
17
|
RSpec.configure do |config|
|
12
18
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
13
19
|
|
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:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Halff
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-12-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -53,6 +53,20 @@ dependencies:
|
|
53
53
|
- - '>='
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: factory_girl
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
56
70
|
- !ruby/object:Gem::Dependency
|
57
71
|
name: jeweler
|
58
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -76,24 +90,28 @@ extra_rdoc_files:
|
|
76
90
|
- README.md
|
77
91
|
files:
|
78
92
|
- .rspec
|
79
|
-
- CHANGELOG.rdoc
|
80
93
|
- Gemfile
|
81
94
|
- MIT-LICENSE
|
82
95
|
- README.md
|
83
96
|
- Rakefile
|
84
97
|
- VERSION
|
85
|
-
- lib/clip.rb
|
86
98
|
- lib/seed_dump.rb
|
87
99
|
- lib/seed_dump/dump_methods.rb
|
100
|
+
- lib/seed_dump/dump_methods/enumeration.rb
|
101
|
+
- lib/seed_dump/environment.rb
|
88
102
|
- lib/seed_dump/railtie.rb
|
89
103
|
- lib/tasks/seed_dump.rake
|
90
|
-
- lib/true.rb
|
91
104
|
- seed_dump.gemspec
|
105
|
+
- spec/dump_methods_spec.rb
|
106
|
+
- spec/environment_spec.rb
|
107
|
+
- spec/factories/another_samples.rb
|
108
|
+
- spec/factories/samples.rb
|
109
|
+
- spec/factories/yet_another_samples.rb
|
92
110
|
- spec/helpers.rb
|
93
|
-
- spec/seed_dump_spec.rb
|
94
111
|
- spec/spec_helper.rb
|
95
112
|
homepage: https://github.com/rroblak/seed_dump
|
96
|
-
licenses:
|
113
|
+
licenses:
|
114
|
+
- MIT
|
97
115
|
metadata: {}
|
98
116
|
post_install_message:
|
99
117
|
rdoc_options: []
|
data/CHANGELOG.rdoc
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
== Seed Dump
|
2
|
-
|
3
|
-
== 0.4.3 / 2013-05-11
|
4
|
-
|
5
|
-
* Handle abstract_class setting in ActiveRecord [craigjackson]
|
6
|
-
* added MAX option [OlegPasko]
|
7
|
-
|
8
|
-
== 0.4.2 / 2012-11-02
|
9
|
-
|
10
|
-
* Fix for bug resulting from top-level class redefinition [rroblak]
|
11
|
-
|
12
|
-
== 0.4.1 / 2012-08-01
|
13
|
-
|
14
|
-
* include TIMESTAMPS by default
|
15
|
-
* add TIMESTAMP flag and checks against attr_accessible [limratana].
|
16
|
-
* modifications for better testing
|
17
|
-
* make MODEL_DIR actually work
|
18
|
-
|
19
|
-
== 0.4.0 / 2012-07-28
|
20
|
-
|
21
|
-
* fix rdoc issue.
|
22
|
-
* automatically use :without_protection if created_at, updated_at are present.
|
23
|
-
* Properly dump decimal columns
|
24
|
-
* support nested models [h6y3]
|
25
|
-
* add WITHOUT_PROTECTION flag [Alexey Yurchenko]
|
26
|
-
* add utf-8 encoding comment [Alexey Yurchenko, Alexey Poimtsev, n0b0dy]
|
27
|
-
* add SKIP_CALLBACKS flag [Alexey Yurchenko]
|
28
|
-
* fixed typo in README [Andrey Ognevsky]
|
29
|
-
* add PG_SCHEMA flag [Luka Novsak]
|
30
|
-
|
31
|
-
== 0.3.4 / 2011-07-14
|
32
|
-
|
33
|
-
* Skip models that aren't Derived from ActiveRecord [iconoclast]
|
34
|
-
* override the AR version of attribute_for_inspect to NOT truncate strings [sc0ttman]
|
35
|
-
|
36
|
-
== 0.3.3 / 2011-07-14
|
37
|
-
|
38
|
-
* solve sorting issue
|
39
|
-
|
40
|
-
== 0.3.2 / 2011-04-22
|
41
|
-
|
42
|
-
* fix broken APPEND option
|
43
|
-
|
44
|
-
== 0.3.1 / 2011-04-22
|
45
|
-
|
46
|
-
* use different syntax for multiple rows
|
47
|
-
|
48
|
-
== 0.3.0 / 2011-04-22
|
49
|
-
|
50
|
-
* refactor to make testing possible
|
51
|
-
|
52
|
-
== 0.2.4 / 2011-04-22
|
53
|
-
|
54
|
-
* properly quote any value (also fixes Time value generation)
|
55
|
-
* solve issue when specifying WITH_ID [David Guthu]
|
56
|
-
|
data/lib/clip.rb
DELETED
data/lib/true.rb
DELETED
@@ -1,9 +0,0 @@
|
|
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/spec/seed_dump_spec.rb
DELETED
@@ -1,157 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe SeedDump do
|
4
|
-
describe '#dump_models' do
|
5
|
-
before(:all) do
|
6
|
-
create_db
|
7
|
-
end
|
8
|
-
|
9
|
-
before(:each) do
|
10
|
-
@sd = SeedDump.new
|
11
|
-
|
12
|
-
@env = {'FILE' => Dir.pwd + '/spec/db/seeds.rb',
|
13
|
-
'VERBOSE' => false,
|
14
|
-
'DEBUG' => false}
|
15
|
-
|
16
|
-
ActiveSupport::DescendantsTracker.clear
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'should not include timestamps if the TIMESTAMPS parameter is false' do
|
20
|
-
Rails.application.eager_load!
|
21
|
-
|
22
|
-
@env['MODELS'] = 'Sample'
|
23
|
-
@env['TIMESTAMPS'] = false
|
24
|
-
|
25
|
-
@sd.setup @env
|
26
|
-
|
27
|
-
load_sample_data
|
28
|
-
|
29
|
-
@sd.dump_models.should match(/^\nSample\.create!\(\[\n { :string => nil, :text => nil, :integer => nil, :float => nil, :decimal => nil, :datetime => nil, :timestamp => nil, :time => nil, :date => nil, :binary => nil, :boolean => nil }\n\]\)\n\n\n$/)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'should include timestamps if the TIMESTAMPS parameter is true' do
|
33
|
-
Rails.application.eager_load!
|
34
|
-
|
35
|
-
@env['MODELS'] = 'Sample'
|
36
|
-
@env['TIMESTAMPS'] = true
|
37
|
-
|
38
|
-
load_sample_data
|
39
|
-
|
40
|
-
@sd.setup @env
|
41
|
-
|
42
|
-
@sd.dump_models.should match(/^\nSample\.create!\(\[\n { :string => nil, :text => nil, :integer => nil, :float => nil, :decimal => nil, :datetime => nil, :timestamp => nil, :time => nil, :date => nil, :binary => nil, :boolean => nil, :created_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}", :updated_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" }\n\]\)\n\n\n$/)
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should include ids if the WITH_ID parameter is true' do
|
46
|
-
Rails.application.eager_load!
|
47
|
-
|
48
|
-
@env['MODELS'] = 'Sample'
|
49
|
-
@env['WITH_ID'] = true
|
50
|
-
|
51
|
-
@sd.setup @env
|
52
|
-
|
53
|
-
load_sample_data
|
54
|
-
|
55
|
-
@sd.dump_models.should match(/^\nSample\.create!\(\[\n { :id => \d+, :string => nil, :text => nil, :integer => nil, :float => nil, :decimal => nil, :datetime => nil, :timestamp => nil, :time => nil, :date => nil, :binary => nil, :boolean => nil, :created_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}", :updated_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" }\n\]\)\n\n\n$/)
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'should respect the MODELS parameter' do
|
59
|
-
Rails.application.eager_load!
|
60
|
-
|
61
|
-
@env['MODELS'] = 'Sample'
|
62
|
-
|
63
|
-
@sd.setup @env
|
64
|
-
|
65
|
-
load_sample_data
|
66
|
-
|
67
|
-
@sd.dump_models.should match(/\nSample\.create!\(\[\n { :string => nil, :text => nil, :integer => nil, :float => nil, :decimal => nil, :datetime => nil, :timestamp => nil, :time => nil, :date => nil, :binary => nil, :boolean => nil, :created_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}", :updated_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" }\n\]\)\n\n\n/)
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'should use the create method specified in the CREATE_METHOD parameter' do
|
71
|
-
load_sample_data
|
72
|
-
|
73
|
-
@env['MODELS'] = 'Sample'
|
74
|
-
@env['CREATE_METHOD'] = 'create'
|
75
|
-
|
76
|
-
@sd.setup @env
|
77
|
-
|
78
|
-
@sd.dump_models.should match(/\nSample\.create\(\[\n { :string => nil, :text => nil, :integer => nil, :float => nil, :decimal => nil, :datetime => nil, :timestamp => nil, :time => nil, :date => nil, :binary => nil, :boolean => nil, :created_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}", :updated_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" }\n\]\)\n\n\n/)
|
79
|
-
end
|
80
|
-
|
81
|
-
it "should use 'create!' as the default create method" do
|
82
|
-
load_sample_data
|
83
|
-
|
84
|
-
@env['MODELS'] = 'Sample'
|
85
|
-
|
86
|
-
@sd.setup @env
|
87
|
-
|
88
|
-
@sd.dump_models.should match(/\nSample\.create!\(\[\n { :string => nil, :text => nil, :integer => nil, :float => nil, :decimal => nil, :datetime => nil, :timestamp => nil, :time => nil, :date => nil, :binary => nil, :boolean => nil, :created_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}", :updated_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" }\n\]\)\n\n\n/)
|
89
|
-
end
|
90
|
-
|
91
|
-
it "should return the contents of the dump" do
|
92
|
-
load_sample_data
|
93
|
-
|
94
|
-
@env['MODELS'] = 'Sample'
|
95
|
-
|
96
|
-
@sd.setup @env
|
97
|
-
|
98
|
-
@sd.dump_models.should match(/\nSample\.create!\(\[\n { :string => nil, :text => nil, :integer => nil, :float => nil, :decimal => nil, :datetime => nil, :timestamp => nil, :time => nil, :date => nil, :binary => nil, :boolean => nil, :created_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}", :updated_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" }\n\]\)\n\n\n/)
|
99
|
-
end
|
100
|
-
|
101
|
-
it 'should run ok without ActiveRecord::SchemaMigration being set (needed for Rails Engines)' do
|
102
|
-
schema_migration = ActiveRecord::SchemaMigration
|
103
|
-
|
104
|
-
ActiveRecord.send(:remove_const, :SchemaMigration)
|
105
|
-
|
106
|
-
begin
|
107
|
-
@sd.setup @env
|
108
|
-
|
109
|
-
@sd.dump_models
|
110
|
-
ensure
|
111
|
-
ActiveRecord.const_set(:SchemaMigration, schema_migration)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
it "should skip any models whose tables don't exist" do
|
116
|
-
@sd.setup @env
|
117
|
-
|
118
|
-
load_sample_data
|
119
|
-
|
120
|
-
@sd.dump_models.should match(/\nSample\.create!\(\[\n { :string => nil, :text => nil, :integer => nil, :float => nil, :decimal => nil, :datetime => nil, :timestamp => nil, :time => nil, :date => nil, :binary => nil, :boolean => nil, :created_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}", :updated_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" }\n\]\)\n\n\n/)
|
121
|
-
end
|
122
|
-
|
123
|
-
it "should skip any models that don't have have any rows" do
|
124
|
-
@sd.setup @env
|
125
|
-
|
126
|
-
@sd.dump_models.should_not include('EmptyModel')
|
127
|
-
end
|
128
|
-
|
129
|
-
it 'should respect the LIMIT parameter' do
|
130
|
-
load_sample_data
|
131
|
-
load_sample_data
|
132
|
-
|
133
|
-
@env['MODELS'] = 'Sample'
|
134
|
-
@env['LIMIT'] = '1'
|
135
|
-
|
136
|
-
@sd.setup @env
|
137
|
-
|
138
|
-
@sd.dump_models.should match(/\nSample\.create!\(\[\n { :string => nil, :text => nil, :integer => nil, :float => nil, :decimal => nil, :datetime => nil, :timestamp => nil, :time => nil, :date => nil, :binary => nil, :boolean => nil, :created_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}", :updated_at => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}" }\n\]\)\n\n\n/)
|
139
|
-
end
|
140
|
-
|
141
|
-
it 'should only pull attributes that are returned as strings' do
|
142
|
-
load_sample_data
|
143
|
-
|
144
|
-
@env['MODELS'] = 'Sample'
|
145
|
-
@env['LIMIT'] = '1'
|
146
|
-
|
147
|
-
@sd.setup @env
|
148
|
-
|
149
|
-
original_attributes = Sample.new.attributes
|
150
|
-
attributes = original_attributes.merge(['col1', 'col2', 'col3'] => 'ABC')
|
151
|
-
|
152
|
-
Sample.any_instance.stub(:attributes).and_return(attributes)
|
153
|
-
|
154
|
-
@sd.dump_models.should eq("\nSample.create!([\n { :string => nil, :text => nil, :integer => nil, :float => nil, :decimal => nil, :datetime => nil, :timestamp => nil, :time => nil, :date => nil, :binary => nil, :boolean => nil, :created_at => nil, :updated_at => nil }\n])\n\n\n")
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|