planter 0.0.12 → 0.0.13
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/README.md +8 -3
- data/lib/generators/planter/initializer_generator.rb +7 -2
- data/lib/generators/planter/seeder_generator.rb +1 -1
- data/lib/planter/seeder.rb +128 -141
- data/lib/planter/version.rb +1 -1
- data/lib/planter.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 23a4116a1fe8a8d499e8522e5d4da4dadd76cb95ba917d54855f36adeaec519f
|
|
4
|
+
data.tar.gz: 523fcef8dd453614e4c1045aafd1ae57b54e7b6043c4fac3b3638ef35c577862
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: eb5d69e3807c0595c4a149cc0eeb487712a18381d86cad82a9e459ca28a19286c77e35b92820932b9be3ced37563632f7d8a27d1a85bf15c55621895bc5f923b
|
|
7
|
+
data.tar.gz: 9d32d66773a92b393fdac8a90a67ca410251588d61270a35ba8a21f8d1afe74963c5ef81702fffc33ffb59674b7fb953029f19d887f17a26bd7a5b7ae3522df3
|
data/README.md
CHANGED
|
@@ -60,7 +60,7 @@ Planter.configure do |config|
|
|
|
60
60
|
]
|
|
61
61
|
|
|
62
62
|
##
|
|
63
|
-
# The directory where the
|
|
63
|
+
# The directory where the seeders are kept.
|
|
64
64
|
# config.seeders_directory = 'db/seeds'
|
|
65
65
|
|
|
66
66
|
##
|
|
@@ -68,7 +68,12 @@ Planter.configure do |config|
|
|
|
68
68
|
# config.csv_files_directory = 'db/seed_files'
|
|
69
69
|
|
|
70
70
|
##
|
|
71
|
-
# The default trim mode for ERB.
|
|
71
|
+
# The default trim mode for ERB. Valid modes are:
|
|
72
|
+
# '%' enables Ruby code processing for lines beginning with %
|
|
73
|
+
# '<>' omit newline for lines starting with <% and ending in %>
|
|
74
|
+
# '>' omit newline for lines ending in %>
|
|
75
|
+
# '-' omit blank lines ending in -%>
|
|
76
|
+
# I recommend reading the help documentation for ERB::new()
|
|
72
77
|
# config.erb_trim_mode = nil
|
|
73
78
|
end
|
|
74
79
|
```
|
|
@@ -257,4 +262,4 @@ Request.
|
|
|
257
262
|
I do these projects for fun, and I enjoy knowing that they're helpful to people.
|
|
258
263
|
Consider starring [the repository](https://github.com/evanthegrayt/planter)
|
|
259
264
|
if you like it! If you love it, follow me [on
|
|
260
|
-
|
|
265
|
+
GitHub](https://github.com/evanthegrayt)!
|
|
@@ -19,7 +19,7 @@ module Planter
|
|
|
19
19
|
]
|
|
20
20
|
|
|
21
21
|
##
|
|
22
|
-
# The directory where the
|
|
22
|
+
# The directory where the seeders are kept.
|
|
23
23
|
# config.seeders_directory = 'db/seeds'
|
|
24
24
|
|
|
25
25
|
##
|
|
@@ -27,7 +27,12 @@ module Planter
|
|
|
27
27
|
# config.csv_files_directory = 'db/seed_files'
|
|
28
28
|
|
|
29
29
|
##
|
|
30
|
-
# The default trim mode for ERB.
|
|
30
|
+
# The default trim mode for ERB. Valid modes are:
|
|
31
|
+
# '%' enables Ruby code processing for lines beginning with %
|
|
32
|
+
# '<>' omit newline for lines starting with <% and ending in %>
|
|
33
|
+
# '>' omit newline for lines ending in %>
|
|
34
|
+
# '-' omit blank lines ending in -%>
|
|
35
|
+
# I recommend reading the help documentation for ERB::new()
|
|
31
36
|
# config.erb_trim_mode = nil
|
|
32
37
|
end
|
|
33
38
|
EOF
|
|
@@ -3,7 +3,7 @@ module Planter
|
|
|
3
3
|
class SeederGenerator < Rails::Generators::Base
|
|
4
4
|
argument :seeder, required: true
|
|
5
5
|
|
|
6
|
-
desc "
|
|
6
|
+
desc "Creates a seeder file at #{::Planter.config.seeders_directory}"
|
|
7
7
|
|
|
8
8
|
def generate_seeders
|
|
9
9
|
seeder == 'ALL' ? tables.each { |t| generate(t) } : generate(seeder)
|
data/lib/planter/seeder.rb
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
module Planter
|
|
4
4
|
##
|
|
5
|
-
# Class that seeders should inherit from.
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
5
|
+
# Class that seeders should inherit from. Seeders should be in +db/seeds+,
|
|
6
|
+
# and named +TABLE_seeder.rb+, where +TABLE+ is the name of the table being
|
|
7
|
+
# seeded (I.E. +users_seeder.rb+). If your seeder is named differently than
|
|
8
|
+
# the table, you'll need to specify the table with the +model+ option. The
|
|
9
|
+
# seeder's class name should be the same as the file name, but camelized. So,
|
|
10
|
+
# +UsersSeeder+. The directory where the seeder files are located can be
|
|
11
|
+
# changed via an initializer.
|
|
12
12
|
#
|
|
13
13
|
# The most basic way to seed is to have a CSV file with the same name as the
|
|
14
14
|
# table in +db/seed_files/+. So, +users.csv+. This CSV should have the
|
|
@@ -102,121 +102,24 @@ module Planter
|
|
|
102
102
|
attr_reader :data
|
|
103
103
|
|
|
104
104
|
##
|
|
105
|
-
#
|
|
106
|
-
# it which +seeding_method+ to use. The argument to this method must be
|
|
107
|
-
# included in the +SEEDING_METHODS+ array.
|
|
108
|
-
#
|
|
109
|
-
# @param [Symbol] seeding_method
|
|
110
|
-
#
|
|
111
|
-
# @kwarg [Integer] number_of_records
|
|
112
|
-
#
|
|
113
|
-
# @kwarg [String] model
|
|
114
|
-
#
|
|
115
|
-
# @kwarg [String] parent_model
|
|
116
|
-
#
|
|
117
|
-
# @kwarg [Symbol, String] association
|
|
118
|
-
#
|
|
119
|
-
# @kwarg [Symbol, String] csv_name
|
|
120
|
-
#
|
|
121
|
-
# @kwarg [Symbol, String] unique_columns
|
|
122
|
-
#
|
|
123
|
-
# @kwarg [String] erb_trim_mode
|
|
105
|
+
# What trim mode should ERB use?
|
|
124
106
|
#
|
|
125
|
-
# @
|
|
126
|
-
|
|
127
|
-
# class UsersSeeder < Planter::Seeder
|
|
128
|
-
# seeding_method :csv,
|
|
129
|
-
# number_of_records: 2,
|
|
130
|
-
# model: 'User'
|
|
131
|
-
# parent_model: 'Person',
|
|
132
|
-
# association: :users,
|
|
133
|
-
# csv_name: :awesome_users,
|
|
134
|
-
# unique_columns %i[username email],
|
|
135
|
-
# erb_trim_mode: '<>'
|
|
136
|
-
# end
|
|
137
|
-
def self.seeding_method(
|
|
138
|
-
method,
|
|
139
|
-
number_of_records: 1,
|
|
140
|
-
model: nil,
|
|
141
|
-
parent_model: nil,
|
|
142
|
-
association: nil,
|
|
143
|
-
csv_name: nil,
|
|
144
|
-
unique_columns: nil,
|
|
145
|
-
erb_trim_mode: nil
|
|
146
|
-
)
|
|
147
|
-
if !SEEDING_METHODS.include?(method.intern)
|
|
148
|
-
raise ArgumentError, "Method must be one of #{SEEDING_METHODS.join(', ')}"
|
|
149
|
-
elsif association && !parent_model
|
|
150
|
-
raise ArgumentError, "Must specify :parent_model with :association"
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
@seeding_method = method
|
|
154
|
-
@number_of_records = number_of_records
|
|
155
|
-
@model = model || to_s.delete_suffix('Seeder').singularize
|
|
156
|
-
@parent_model = parent_model
|
|
157
|
-
@association = @parent_model && (association || determine_association)
|
|
158
|
-
@csv_file = determine_csv_filename(csv_name) if @seeding_method == :csv
|
|
159
|
-
@erb_trim_mode = erb_trim_mode || Planter.config.erb_trim_mode
|
|
160
|
-
@unique_columns =
|
|
161
|
-
case unique_columns
|
|
162
|
-
when String, Symbol then [unique_columns.intern]
|
|
163
|
-
when Array then unique_columns.map(&:intern)
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
def self.determine_association # :nodoc:
|
|
168
|
-
associations =
|
|
169
|
-
@parent_model.constantize.reflect_on_all_associations.map(&:name)
|
|
170
|
-
table = to_s.delete_suffix('Seeder').underscore.split('/').last
|
|
171
|
-
|
|
172
|
-
[table, table.singularize].map(&:intern).each do |t|
|
|
173
|
-
return t if associations.include?(t)
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
raise ArgumentError, "Couldn't determine association name"
|
|
177
|
-
end
|
|
178
|
-
private_class_method :determine_association
|
|
179
|
-
|
|
180
|
-
def self.determine_csv_filename(csv_name) # :nodoc:
|
|
181
|
-
file = (
|
|
182
|
-
csv_name || "#{to_s.delete_suffix('Seeder').underscore}"
|
|
183
|
-
).to_s + '.csv'
|
|
184
|
-
[file, "#{file}.erb"].each do |f|
|
|
185
|
-
fname = Rails.root.join(Planter.config.csv_files_directory, f).to_s
|
|
186
|
-
return fname if ::File.file?(fname)
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
raise ArgumentError, "Couldn't find csv for #{@model}"
|
|
190
|
-
end
|
|
191
|
-
private_class_method :determine_csv_filename
|
|
192
|
-
|
|
193
|
-
##
|
|
194
|
-
# The default seed method. To use this method, your class must provide a
|
|
195
|
-
# valid +seeding_method+, and not implement its own +seed+ method.
|
|
196
|
-
def seed
|
|
197
|
-
validate_attributes
|
|
198
|
-
|
|
199
|
-
parent_model ? create_records_from_parent : create_records
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
protected
|
|
107
|
+
# @return [String]
|
|
108
|
+
class_attribute :erb_trim_mode
|
|
203
109
|
|
|
204
110
|
##
|
|
205
|
-
#
|
|
111
|
+
# When creating a record, the fields that will be used to look up the
|
|
112
|
+
# record. If it already exists, a new one will not be created.
|
|
206
113
|
#
|
|
207
|
-
# @return [
|
|
208
|
-
|
|
209
|
-
@seeding_method ||= self.class.instance_variable_get('@seeding_method')
|
|
210
|
-
end
|
|
114
|
+
# @return [Array]
|
|
115
|
+
class_attribute :unique_columns
|
|
211
116
|
|
|
212
117
|
##
|
|
213
118
|
# The model for the table being seeded. If the model name you need is
|
|
214
119
|
# different, change via +seeding_method+.
|
|
215
120
|
#
|
|
216
121
|
# @return [String]
|
|
217
|
-
|
|
218
|
-
@model ||= self.class.instance_variable_get('@model')
|
|
219
|
-
end
|
|
122
|
+
class_attribute :model
|
|
220
123
|
|
|
221
124
|
##
|
|
222
125
|
# The model of the parent. When provided with +association+, records in the
|
|
@@ -224,18 +127,7 @@ module Planter
|
|
|
224
127
|
# class must set this attribute via +seeding_method+.
|
|
225
128
|
#
|
|
226
129
|
# @return [String]
|
|
227
|
-
|
|
228
|
-
@parent_model ||= self.class.instance_variable_get('@parent_model')
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
##
|
|
232
|
-
# When using +parent_model+, the association name. Your class can set this
|
|
233
|
-
# attribute via +seeding_method+.
|
|
234
|
-
#
|
|
235
|
-
# @return [Symbol]
|
|
236
|
-
def association
|
|
237
|
-
@association ||= self.class.instance_variable_get('@association')
|
|
238
|
-
end
|
|
130
|
+
class_attribute :parent_model
|
|
239
131
|
|
|
240
132
|
##
|
|
241
133
|
# The number of records to create from each record in the +data+ array. If
|
|
@@ -243,36 +135,131 @@ module Planter
|
|
|
243
135
|
# +seeding_method+.
|
|
244
136
|
#
|
|
245
137
|
# @return [Integer]
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
138
|
+
class_attribute :number_of_records
|
|
139
|
+
|
|
140
|
+
##
|
|
141
|
+
# When using +parent_model+, the association name. Your class can set this
|
|
142
|
+
# attribute via +seeding_method+.
|
|
143
|
+
#
|
|
144
|
+
# @return [Symbol]
|
|
145
|
+
class_attribute :association
|
|
250
146
|
|
|
251
147
|
##
|
|
252
148
|
# The csv file corresponding to the model.
|
|
253
149
|
#
|
|
254
150
|
# @return [String]
|
|
255
|
-
|
|
256
|
-
@csv_file ||= self.class.instance_variable_get('@csv_file')
|
|
257
|
-
end
|
|
151
|
+
class_attribute :csv_file
|
|
258
152
|
|
|
259
153
|
##
|
|
260
|
-
#
|
|
261
|
-
# record. If it already exists, a new one will not be created.
|
|
154
|
+
# The seeding method specified.
|
|
262
155
|
#
|
|
263
|
-
# @return [
|
|
264
|
-
|
|
265
|
-
|
|
156
|
+
# @return [Symbol]
|
|
157
|
+
class_attribute :seeding_method
|
|
158
|
+
|
|
159
|
+
##
|
|
160
|
+
# Access the metaclass so we can define public and private class methods.
|
|
161
|
+
class << self
|
|
162
|
+
##
|
|
163
|
+
# If your class is going to use the inherited +seed+ method, you must tell
|
|
164
|
+
# it which +seeding_method+ to use. The argument to this method must be
|
|
165
|
+
# included in the +SEEDING_METHODS+ array.
|
|
166
|
+
#
|
|
167
|
+
# @param [Symbol] seeding_method
|
|
168
|
+
#
|
|
169
|
+
# @kwarg [Integer] number_of_records
|
|
170
|
+
#
|
|
171
|
+
# @kwarg [String] model
|
|
172
|
+
#
|
|
173
|
+
# @kwarg [String] parent_model
|
|
174
|
+
#
|
|
175
|
+
# @kwarg [Symbol, String] association
|
|
176
|
+
#
|
|
177
|
+
# @kwarg [Symbol, String] csv_name
|
|
178
|
+
#
|
|
179
|
+
# @kwarg [Symbol, String] unique_columns
|
|
180
|
+
#
|
|
181
|
+
# @kwarg [String] erb_trim_mode
|
|
182
|
+
#
|
|
183
|
+
# @example
|
|
184
|
+
# require 'planter'
|
|
185
|
+
# class UsersSeeder < Planter::Seeder
|
|
186
|
+
# seeding_method :csv,
|
|
187
|
+
# number_of_records: 2,
|
|
188
|
+
# model: 'User'
|
|
189
|
+
# parent_model: 'Person',
|
|
190
|
+
# association: :users,
|
|
191
|
+
# csv_name: :awesome_users,
|
|
192
|
+
# unique_columns %i[username email],
|
|
193
|
+
# erb_trim_mode: '<>'
|
|
194
|
+
# end
|
|
195
|
+
def seeding_method(
|
|
196
|
+
method,
|
|
197
|
+
number_of_records: 1,
|
|
198
|
+
model: nil,
|
|
199
|
+
parent_model: nil,
|
|
200
|
+
association: nil,
|
|
201
|
+
csv_name: nil,
|
|
202
|
+
unique_columns: nil,
|
|
203
|
+
erb_trim_mode: nil
|
|
204
|
+
)
|
|
205
|
+
if !SEEDING_METHODS.include?(method.intern)
|
|
206
|
+
raise ArgumentError, "Method must be: #{SEEDING_METHODS.join(', ')}"
|
|
207
|
+
elsif association && !parent_model
|
|
208
|
+
raise ArgumentError, "Must specify :parent_model with :association"
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
self.seeding_method = method
|
|
212
|
+
self.number_of_records = number_of_records
|
|
213
|
+
self.model = model || to_s.delete_suffix('Seeder').singularize
|
|
214
|
+
self.parent_model = parent_model
|
|
215
|
+
self.association = parent_model && (association || determine_association)
|
|
216
|
+
self.csv_file = determine_csv_filename(csv_name) if seeding_method == :csv
|
|
217
|
+
self.erb_trim_mode = erb_trim_mode || Planter.config.erb_trim_mode
|
|
218
|
+
self.unique_columns =
|
|
219
|
+
case unique_columns
|
|
220
|
+
when String, Symbol then [unique_columns.intern]
|
|
221
|
+
when Array then unique_columns.map(&:intern)
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
private
|
|
226
|
+
|
|
227
|
+
def determine_association # :nodoc:
|
|
228
|
+
associations =
|
|
229
|
+
parent_model.constantize.reflect_on_all_associations.map(&:name)
|
|
230
|
+
table = to_s.delete_suffix('Seeder').underscore.split('/').last
|
|
231
|
+
|
|
232
|
+
[table, table.singularize].map(&:intern).each do |t|
|
|
233
|
+
return t if associations.include?(t)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
raise ArgumentError, "Couldn't determine association name"
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def determine_csv_filename(csv_name) # :nodoc:
|
|
240
|
+
file = (
|
|
241
|
+
csv_name || "#{to_s.delete_suffix('Seeder').underscore}"
|
|
242
|
+
).to_s + '.csv'
|
|
243
|
+
[file, "#{file}.erb"].each do |f|
|
|
244
|
+
fname = Rails.root.join(Planter.config.csv_files_directory, f).to_s
|
|
245
|
+
return fname if ::File.file?(fname)
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
raise ArgumentError, "Couldn't find csv for #{model}"
|
|
249
|
+
end
|
|
266
250
|
end
|
|
267
251
|
|
|
268
252
|
##
|
|
269
|
-
#
|
|
270
|
-
#
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
253
|
+
# The default seed method. To use this method, your class must provide a
|
|
254
|
+
# valid +seeding_method+, and not implement its own +seed+ method.
|
|
255
|
+
def seed
|
|
256
|
+
validate_attributes
|
|
257
|
+
|
|
258
|
+
parent_model ? create_records_from_parent : create_records
|
|
274
259
|
end
|
|
275
260
|
|
|
261
|
+
protected
|
|
262
|
+
|
|
276
263
|
##
|
|
277
264
|
# Creates records from the +data+ attribute.
|
|
278
265
|
def create_records
|
data/lib/planter/version.rb
CHANGED
data/lib/planter.rb
CHANGED
|
@@ -67,7 +67,7 @@ module Planter
|
|
|
67
67
|
# Planter.seed
|
|
68
68
|
def self.seed
|
|
69
69
|
seeders = ENV['SEEDERS']&.split(',') || config.seeders&.map(&:to_s)
|
|
70
|
-
raise RuntimeError, 'No seeders specified'
|
|
70
|
+
raise RuntimeError, 'No seeders specified' if seeders.blank?
|
|
71
71
|
|
|
72
72
|
seeders.each do |s|
|
|
73
73
|
require Rails.root.join(config.seeders_directory, "#{s}_seeder.rb").to_s
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: planter
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.13
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Evan Gray
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-12-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|