planter 0.0.6 → 0.0.7
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 +18 -6
- data/lib/planter.rb +3 -2
- data/lib/planter/seeder.rb +49 -24
- data/lib/planter/version.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: 42b61a78b5034eadac54f7e5a570073851b4a9a6fc20c4fae71a1e49fb8d3df1
|
4
|
+
data.tar.gz: c02538d3a776a89b221b135c4aa2d355a278df35e514d53872f200556bc720dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 119f4f0a790efd00eb4e537734ab51e9416b5017f0891a07698d291b44604b2a81e7ea73d1a8893da1e3f4c24b4790a4a18a352388240d9ed9de32a1f19206b5
|
7
|
+
data.tar.gz: 3c066efbe8b1325bec3218de0840bf91688c6ed1da29e06446756603f370620d5a57af4afc57313fa42171ba977f1dab9cbe73a9578fcb3379e2433935c609b3
|
data/README.md
CHANGED
@@ -72,7 +72,7 @@ To seed from CSV, you simply need to add the following to your seeder class.
|
|
72
72
|
|
73
73
|
```ruby
|
74
74
|
class UsersSeeder < Planter::Seeder
|
75
|
-
seeding_method :
|
75
|
+
seeding_method :csv
|
76
76
|
end
|
77
77
|
```
|
78
78
|
|
@@ -86,15 +86,27 @@ test1@example.com,test1
|
|
86
86
|
test2@example.com,test2
|
87
87
|
```
|
88
88
|
|
89
|
-
If the CSV
|
90
|
-
option. Note that the value
|
89
|
+
If the CSV file is named differently than the seeder, you can specify the
|
90
|
+
`:csv_name` option. Note that the value should not include the file extension.
|
91
91
|
|
92
92
|
```ruby
|
93
93
|
class UsersSeeder < Planter::Seeder
|
94
|
-
seeding_method :
|
94
|
+
seeding_method :csv, csv_name: :people
|
95
95
|
end
|
96
96
|
```
|
97
97
|
|
98
|
+
`ERB` can be used in the CSV files if you name it with `.erb` at the end of the
|
99
|
+
file name. For example, `users.csv.erb`. Note that lines starting with `<%` and
|
100
|
+
ending with `%>` will not be considered rows, so you can use `ERB` rows to set
|
101
|
+
values. For example:
|
102
|
+
|
103
|
+
```csv.erb
|
104
|
+
email,login_attempts
|
105
|
+
<% count = 1 %>
|
106
|
+
test2@example.com,<%= count += 1 %>
|
107
|
+
test2@example.com,<%= count += 1 %>
|
108
|
+
```
|
109
|
+
|
98
110
|
Running `rails db:seed` will now seed your `users` table.
|
99
111
|
|
100
112
|
## Seeding from a data array
|
@@ -148,7 +160,7 @@ end
|
|
148
160
|
|
149
161
|
Note that specifying `number_of_records` in this instance will create that many
|
150
162
|
records *for each record of the parent model*. You can also specify the
|
151
|
-
association if it's different from the table name, using the `
|
163
|
+
association if it's different from the table name, using the `:assocation`
|
152
164
|
option.
|
153
165
|
|
154
166
|
### Custom seeds
|
@@ -169,7 +181,7 @@ end
|
|
169
181
|
```
|
170
182
|
|
171
183
|
## Customization
|
172
|
-
You can change the directories of both the seeder files and the
|
184
|
+
You can change the directories of both the seeder files and the CSV files. In
|
173
185
|
your `configure` block in `db/seeds.rb`, you can add the following. Note that,
|
174
186
|
in both instances, the path should be relative to `Rails.root`.
|
175
187
|
|
data/lib/planter.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'csv'
|
4
|
+
require 'erb'
|
4
5
|
require 'planter/version'
|
5
6
|
require 'planter/railtie'
|
6
7
|
require 'planter/config'
|
@@ -16,13 +17,13 @@ require 'planter/seeder'
|
|
16
17
|
# The most basic way to seed is to have a CSV file with the same name as the
|
17
18
|
# table in +db/seed_files/+. So, +users.csv+. This CSV should have the table's
|
18
19
|
# column names as header. To seed using this method, your class should look
|
19
|
-
# like the following. Note that +:
|
20
|
+
# like the following. Note that +:csv_name+ is not required; it defaults to the
|
20
21
|
# table name with a +csv+ file extension. The directory where the seed files
|
21
22
|
# are kept can be changed via an initializer.
|
22
23
|
# # db/seeds/users_seeder.rb
|
23
24
|
# require 'planter'
|
24
25
|
# class UsersSeeder < Planter::Seeder
|
25
|
-
# seeding_method :
|
26
|
+
# seeding_method :csv, csv_name: '/home/me/users.csv'
|
26
27
|
# end
|
27
28
|
#
|
28
29
|
# Another way to seed is to create records from a data array. To do this, your
|
data/lib/planter/seeder.rb
CHANGED
@@ -8,14 +8,14 @@ module Planter
|
|
8
8
|
# The allowed seeding methods.
|
9
9
|
#
|
10
10
|
# @return [Array]
|
11
|
-
SEEDING_METHODS = %i[
|
11
|
+
SEEDING_METHODS = %i[csv data_array].freeze
|
12
12
|
|
13
13
|
##
|
14
14
|
# Array of hashes used to create records. Your class must set this
|
15
15
|
# attribute when using +data_hash+ seeding method, although it's probably
|
16
16
|
# more likely that you'll want to define a method that returns a new set of
|
17
17
|
# data each time (via +Faker+, +Array#sample+, etc.). When using
|
18
|
-
# +
|
18
|
+
# +csv+, +data+ will be set to the data within the csv. You can
|
19
19
|
# override this.
|
20
20
|
#
|
21
21
|
# @return [Array]
|
@@ -28,40 +28,49 @@ module Planter
|
|
28
28
|
#
|
29
29
|
# @param [Symbol] seeding_method
|
30
30
|
#
|
31
|
-
# @
|
31
|
+
# @kwarg [Integer] number_of_records
|
32
|
+
#
|
33
|
+
# @kwarg [String] model
|
34
|
+
#
|
35
|
+
# @kwarg [String] parent_model
|
36
|
+
#
|
37
|
+
# @kwarg [Symbol, String] association
|
38
|
+
#
|
39
|
+
# @kwarg [Symbol, String] csv_name
|
32
40
|
#
|
33
41
|
# @example
|
34
42
|
# require 'planter'
|
35
43
|
# class UsersSeeder < Planter::Seeder
|
36
|
-
# seeding_method :
|
44
|
+
# seeding_method :csv,
|
45
|
+
# number_of_records: 2,
|
37
46
|
# model: 'User'
|
38
47
|
# parent_model: 'Person',
|
39
48
|
# association: :users,
|
40
|
-
#
|
49
|
+
# csv_name: :awesome_users
|
41
50
|
# end
|
42
|
-
def self.seeding_method(
|
51
|
+
def self.seeding_method(
|
52
|
+
method,
|
53
|
+
number_of_records: 1,
|
54
|
+
model: to_s.delete_suffix('Seeder').singularize,
|
55
|
+
parent_model: nil,
|
56
|
+
association: nil,
|
57
|
+
csv_name: nil
|
58
|
+
)
|
43
59
|
if !SEEDING_METHODS.include?(method.intern)
|
44
60
|
raise ArgumentError, "Method must be one of #{SEEDING_METHODS.join(', ')}"
|
45
|
-
elsif
|
61
|
+
elsif association && !parent_model
|
46
62
|
raise ArgumentError, "Must specify :parent_model with :association"
|
47
63
|
end
|
48
64
|
|
49
65
|
@seeding_method = method
|
50
|
-
@number_of_records =
|
51
|
-
@model =
|
52
|
-
@parent_model =
|
53
|
-
@association = @parent_model &&
|
54
|
-
|
55
|
-
end
|
56
|
-
return unless @seeding_method == :standard_csv
|
57
|
-
|
58
|
-
@csv_file = options.fetch(:csv_file, Rails.root.join(
|
59
|
-
Planter.config.csv_files_directory,
|
60
|
-
"#{to_s.delete_suffix('Seeder').underscore}.csv"
|
61
|
-
).to_s)
|
66
|
+
@number_of_records = number_of_records
|
67
|
+
@model = model
|
68
|
+
@parent_model = parent_model
|
69
|
+
@association = @parent_model && (association || determine_association)
|
70
|
+
@csv_file = determine_csv_filename(csv_name) if @seeding_method == :csv
|
62
71
|
end
|
63
72
|
|
64
|
-
def self.determine_association
|
73
|
+
def self.determine_association # :nodoc:
|
65
74
|
associations =
|
66
75
|
@parent_model.constantize.reflect_on_all_associations.map(&:name)
|
67
76
|
table = to_s.delete_suffix('Seeder').underscore.split('/').last
|
@@ -70,10 +79,23 @@ module Planter
|
|
70
79
|
return t if associations.include?(t)
|
71
80
|
end
|
72
81
|
|
73
|
-
raise ArgumentError, '
|
82
|
+
raise ArgumentError, "Couldn't determine association name"
|
74
83
|
end
|
75
84
|
private_class_method :determine_association
|
76
85
|
|
86
|
+
def self.determine_csv_filename(csv_name) # :nodoc:
|
87
|
+
file = (
|
88
|
+
csv_name || "#{to_s.delete_suffix('Seeder').underscore}"
|
89
|
+
).to_s + '.csv'
|
90
|
+
[file, "#{file}.erb"].each do |f|
|
91
|
+
fname = Rails.root.join(Planter.config.csv_files_directory, f).to_s
|
92
|
+
return fname if File.file?(fname)
|
93
|
+
end
|
94
|
+
|
95
|
+
raise ArgumentError, "Couldn't find csv for #{@model}"
|
96
|
+
end
|
97
|
+
private_class_method :determine_csv_filename
|
98
|
+
|
77
99
|
##
|
78
100
|
# The default seed method. To use this method, your class must provide a
|
79
101
|
# valid +seeding_method+, and not implement its own +seed+ method.
|
@@ -181,10 +203,13 @@ module Planter
|
|
181
203
|
|
182
204
|
def validate_attributes # :nodoc:
|
183
205
|
case seeding_method.intern
|
184
|
-
when :
|
185
|
-
|
206
|
+
when :csv
|
207
|
+
contents = File.read(csv_file)
|
208
|
+
if csv_file.end_with?('.erb')
|
209
|
+
contents = ERB.new(contents, trim_mode: '<>').result(binding)
|
210
|
+
end
|
186
211
|
|
187
|
-
@data ||= ::CSV.
|
212
|
+
@data ||= ::CSV.parse(contents, headers: true).map(&:to_hash)
|
188
213
|
when :data_array
|
189
214
|
raise "Must define '@data'" if public_send(:data).nil?
|
190
215
|
else
|
data/lib/planter/version.rb
CHANGED
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.7
|
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-05-
|
11
|
+
date: 2021-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|