planter 0.1.2 → 0.1.3
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 +35 -2
- data/lib/planter/seeder.rb +53 -3
- 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: a542b8919dda44137996b078e0ac3f773fc8b85bed2225193de3f2a36bdfe099
|
|
4
|
+
data.tar.gz: '058271874209001fd8de03630c2e3f162959621769225bb354060f1ed8848354'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c9728b99a23877a7f96f4267b963dd7f4e15f4c385303759476937f7f3f33bd6335ec0e6b89fde733ecfd7f5380386ba86ca26bfbdb9ac70f587b8a05efc8812
|
|
7
|
+
data.tar.gz: 1af8f9af55ca77f91f2ef7c01b8cb2c1919166be12f8785d779137d68237050b1ab259726da9546dea7dd2184f85431930e9ec8785d269c16ee1ba6add884b92
|
data/README.md
CHANGED
|
@@ -21,10 +21,10 @@ You can view the documentation [here](https://evanthegrayt.github.io/planter/).
|
|
|
21
21
|
## Installation
|
|
22
22
|
Add the following line to your application's Gemfile. Because this plugin is
|
|
23
23
|
currently a pre-release version, it's recommended to lock it to a specific
|
|
24
|
-
version, as breaking changes may occur, even at the
|
|
24
|
+
version, as breaking changes may occur, even at the minor level.
|
|
25
25
|
|
|
26
26
|
```ruby
|
|
27
|
-
gem 'planter', '0.
|
|
27
|
+
gem 'planter', '0.1.3'
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
And then execute:
|
|
@@ -83,6 +83,7 @@ allows you to use `db:seed` for other purposes. If you want Planter to hook
|
|
|
83
83
|
into the existing `db:seed` task, simply add the following to `db/seeds.rb`.
|
|
84
84
|
|
|
85
85
|
```ruby
|
|
86
|
+
# db/seeds.rb
|
|
86
87
|
Planter.seed
|
|
87
88
|
```
|
|
88
89
|
|
|
@@ -175,6 +176,38 @@ end
|
|
|
175
176
|
|
|
176
177
|
For help with `erb_trim_mode`, see the help documentation for `ERB::new`.
|
|
177
178
|
|
|
179
|
+
Lastly, it's worth mentioning `transformations` under the CSV section, as that's
|
|
180
|
+
usually the pace where they're needed most, but it will work with any method.
|
|
181
|
+
|
|
182
|
+
If you're seeding with a CSV, and it contains values that need to have code
|
|
183
|
+
executed on them before it's imported into the database, you can define an
|
|
184
|
+
instance variable called `@transformations`, or a method called
|
|
185
|
+
`transformations`, that returns a Hash of field names, and Procs to run on the
|
|
186
|
+
value. For example, if you have an `admin` column, and the CSV contains "true",
|
|
187
|
+
it will come through as a String, but you probably want it to be a Boolean. This
|
|
188
|
+
can be solved with the following.
|
|
189
|
+
|
|
190
|
+
```ruby
|
|
191
|
+
class UsersSeeder < Planter::Seeder
|
|
192
|
+
seeding_method :csv
|
|
193
|
+
|
|
194
|
+
def transformations
|
|
195
|
+
{
|
|
196
|
+
admin: ->(value) { value == 'true' },
|
|
197
|
+
last_name: ->(value, row) { "#{value} #{row[:suffix]}".squish }
|
|
198
|
+
}
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
When defining a Proc/Lambda, you can make it accept 0, 1, or 2 arguments.
|
|
204
|
+
- When `0`, the value is replaced by the result of the Lambda
|
|
205
|
+
- When `1`, the value is passed to the Lambda, and is subsequently replaced by
|
|
206
|
+
the result of the Lambda
|
|
207
|
+
- When `2`, the value is the first argument, and the entire row, as a Hash, is
|
|
208
|
+
the second argument. This allows for more complicated transformations that can
|
|
209
|
+
be dependent on other fields and values in the record.
|
|
210
|
+
|
|
178
211
|
Running `rails planter:seed` will now seed your `users` table.
|
|
179
212
|
|
|
180
213
|
## Seeding from a data array
|
data/lib/planter/seeder.rb
CHANGED
|
@@ -102,6 +102,35 @@ module Planter
|
|
|
102
102
|
# @return [Array]
|
|
103
103
|
attr_reader :data
|
|
104
104
|
|
|
105
|
+
##
|
|
106
|
+
# A hash of user-defined column names and procs to be run on values. This
|
|
107
|
+
# is most useful for when seeding from csv, and you need to transform, say,
|
|
108
|
+
# 'true' (String) into true (Boolean). The user may define this as an
|
|
109
|
+
# instance variable, or define a method that returns the hash.
|
|
110
|
+
#
|
|
111
|
+
# When defining a Proc/Lambda, you can make it accept 0, 1, or 2 arguments.
|
|
112
|
+
# - When 0, the value is replaced by the result of the Lambda.
|
|
113
|
+
# - When 1, the value is passed to the Lambda, and is subsequently
|
|
114
|
+
# replaced by the result of the Lambda.
|
|
115
|
+
# - When 2, the value is the first argument, and the entire row, as a
|
|
116
|
+
# Hash, is the second argument. This allows for more complicated
|
|
117
|
+
# transformations that can be dependent on other fields and values in the
|
|
118
|
+
# record.
|
|
119
|
+
#
|
|
120
|
+
# @return [Hash, nil]
|
|
121
|
+
#
|
|
122
|
+
# @example
|
|
123
|
+
# class UsersSeeder < Planter::Seeder
|
|
124
|
+
# seeding_method :csv
|
|
125
|
+
# def transformations
|
|
126
|
+
# {
|
|
127
|
+
# admin: ->(v) { v == 'true' },
|
|
128
|
+
# last_name: ->(value, row) { "#{value} #{row[:suffix]}".squish }
|
|
129
|
+
# }
|
|
130
|
+
# end
|
|
131
|
+
# end
|
|
132
|
+
attr_reader :transformations
|
|
133
|
+
|
|
105
134
|
##
|
|
106
135
|
# What trim mode should ERB use?
|
|
107
136
|
#
|
|
@@ -189,7 +218,7 @@ module Planter
|
|
|
189
218
|
unique_columns: nil,
|
|
190
219
|
erb_trim_mode: nil
|
|
191
220
|
)
|
|
192
|
-
|
|
221
|
+
unless SEEDING_METHODS.include?(seed_method.intern)
|
|
193
222
|
raise ArgumentError, "Method must be: #{SEEDING_METHODS.join(', ')}"
|
|
194
223
|
end
|
|
195
224
|
|
|
@@ -216,7 +245,7 @@ module Planter
|
|
|
216
245
|
parent ? create_records_from_parent : create_records
|
|
217
246
|
end
|
|
218
247
|
|
|
219
|
-
|
|
248
|
+
private
|
|
220
249
|
|
|
221
250
|
##
|
|
222
251
|
# Creates records from the +data+ attribute.
|
|
@@ -234,7 +263,7 @@ module Planter
|
|
|
234
263
|
|
|
235
264
|
def create_record(record, parent_id: nil)
|
|
236
265
|
number_of_records.times do
|
|
237
|
-
unique, attrs = split_record(record)
|
|
266
|
+
unique, attrs = split_record(apply_transformations(record))
|
|
238
267
|
model.constantize.where(
|
|
239
268
|
unique.tap { |u| u[foreign_key] = parent_id if parent_id }
|
|
240
269
|
).first_or_create!(attrs)
|
|
@@ -252,6 +281,27 @@ module Planter
|
|
|
252
281
|
end
|
|
253
282
|
end
|
|
254
283
|
|
|
284
|
+
def apply_transformations(record)
|
|
285
|
+
return record if public_send(:transformations).nil?
|
|
286
|
+
|
|
287
|
+
Hash[record.map { |field, value| map_record(field, value, record) }]
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def map_record(field, value, record)
|
|
291
|
+
[
|
|
292
|
+
field,
|
|
293
|
+
transformations.key?(field) ? transform(field, value, record) : value
|
|
294
|
+
]
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def transform(field, value, record)
|
|
298
|
+
case transformations[field].arity
|
|
299
|
+
when 0 then transformations[field].call
|
|
300
|
+
when 1 then transformations[field].call(value)
|
|
301
|
+
when 2 then transformations[field].call(value, record)
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
|
|
255
305
|
def split_record(rec) # :nodoc:
|
|
256
306
|
return [rec, {}] unless unique_columns
|
|
257
307
|
|
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.1.
|
|
4
|
+
version: 0.1.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Evan Gray
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-01-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|