planter 0.0.7 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 42b61a78b5034eadac54f7e5a570073851b4a9a6fc20c4fae71a1e49fb8d3df1
4
- data.tar.gz: c02538d3a776a89b221b135c4aa2d355a278df35e514d53872f200556bc720dd
3
+ metadata.gz: 9eab293e0cec74131351f8e1ff29919165da5e7eeb9cea2d305802f8cf5e1c8f
4
+ data.tar.gz: 6e06237482fb476e3a664fead3bfd64d15013f5570316964360161c9e05a25a4
5
5
  SHA512:
6
- metadata.gz: 119f4f0a790efd00eb4e537734ab51e9416b5017f0891a07698d291b44604b2a81e7ea73d1a8893da1e3f4c24b4790a4a18a352388240d9ed9de32a1f19206b5
7
- data.tar.gz: 3c066efbe8b1325bec3218de0840bf91688c6ed1da29e06446756603f370620d5a57af4afc57313fa42171ba977f1dab9cbe73a9578fcb3379e2433935c609b3
6
+ metadata.gz: 3d28919333f86c7e0d6be6e4a12a4dea558ec0d734ccb63457931af6c8070f71ff76a90c370d2e26a8500106dbb81585ca9685b829c2cf220cd770be229e274d
7
+ data.tar.gz: a40e5e9ae771224e486c8263d2194fc5de1256b6d6a0d9d880ef44aea01294160fbbe1f139b74a375f4adb3e6372e155700968de0d862918ad0662ce3a2fc80c
data/README.md CHANGED
@@ -7,23 +7,24 @@
7
7
 
8
8
  Seeds for Rails applications can get complicated fast, and Rails doesn't provide
9
9
  much for assisting with this process. This plugin seeks to rectify that by
10
- providing easy ways to seed specific tables by hooking into the existing `rails
11
- db:seed` task.
10
+ providing easy ways to seed specific tables.
12
11
 
13
12
  Features include:
14
13
 
15
14
  - Seed tables from CSV files, an array of hashes, or custom methods.
16
- - Call specific seeders with `rails db:seed SEEDERS=users,addresses`.
15
+ - Call specific seeders with `rails planter:seed SEEDERS=users,addresses`.
17
16
  - Control the number of records being created.
18
17
  - Seed associations.
19
18
 
20
19
  You can view the documentation [here](https://evanthegrayt.github.io/planter/).
21
20
 
22
21
  ## Installation
23
- Add this line to your application's Gemfile:
22
+ Add the following line to your application's Gemfile. Because this plugin is
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 patch level.
24
25
 
25
26
  ```ruby
26
- gem 'planter'
27
+ gem 'planter', '0.0.10'
27
28
  ```
28
29
 
29
30
  And then execute:
@@ -41,30 +42,69 @@ $ gem install planter
41
42
  ## Usage
42
43
  Let's assume you'd like to seed your `users` table.
43
44
 
44
- To get started, simply add the following to your `db/seeds.rb` file. Note that
45
- the `config.seeders` should be an array of the seeders to use. They should be in
46
- the correct order to successfully seed the tables when considering associations.
45
+ To get started, run `rails generate planter:initializer`, which will create
46
+ `config/initializers/planter.rb` with the following contents.
47
47
 
48
48
  ```ruby
49
49
  require 'planter'
50
50
 
51
51
  Planter.configure do |config|
52
- config.seeders = %i[ users ]
52
+ ##
53
+ # The list of seeders. These files are stored in the
54
+ # config.seeders_directory, which can be changed below. When a new
55
+ # seeder is generated, it will be appended to the bottom of this
56
+ # list. If the order is incorrect, you'll need to adjust it.
57
+ # Just be sure to keep the ending bracket on its own line, or the
58
+ # generator won't know where to put new elements.
59
+ config.seeders = %i[
60
+ ]
61
+
62
+ ##
63
+ # The directory where the seeder files are kept.
64
+ # config.seeders_directory = 'db/seeds'
65
+
66
+ ##
67
+ # The directory where CSVs are kept.
68
+ # config.csv_files_directory = 'db/seed_files'
53
69
  end
70
+ ```
71
+
72
+ By default, a `planter:seed` task is provided for seeding your application. This
73
+ allows you to use `db:seed` for other purposes. If you want Planter to hook
74
+ into the existing `db:seed` task, simply add the following to `db/seeds.rb`.
54
75
 
76
+ ```ruby
55
77
  Planter.seed
56
78
  ```
57
79
 
58
- Then, create a directory called `db/seeds`, and create a file called
59
- `db/seeds/users_seeder.rb`. In that file, create the following class. Note the
60
- name of the seeder is the name of the table, plus `Seeder`, and it inherits from
61
- `Planter::Seeder`.
80
+ To create a users seeder, run `rails generate planter:seeder users`. Usually,
81
+ seeders seed a specific table, so it's recommended to name your seeders after
82
+ the table. If you don't, you'll need to manually specify a few things. More on
83
+ that later. This will create a file named `db/seeds/users_seeder.rb` (the
84
+ directory will be created if it doesn't exist) with the following contents.
62
85
 
63
86
  ```ruby
64
87
  class UsersSeeder < Planter::Seeder
88
+ # TODO: Choose a seeding_method. For example:
89
+ # seeding_method :csv
90
+
91
+ # For now, we overload the seed method so no exception will be raised.
92
+ def seed
93
+ end
65
94
  end
66
95
  ```
67
96
 
97
+ This also adds `users` to the `config.seeders` array in our initializer. A few
98
+ things to note.
99
+
100
+ - The seeder will always be appended at the end of the array. If this is not the
101
+ correct order, you'll need to adjust the array manually.
102
+ - When adjusting the array, always keep the closing bracket on its own line, or
103
+ the generator won't know where to put the new seeders.
104
+
105
+ If you want to generate a seeder for every table currently in your database, run
106
+ `rails generate planter:seeder ALL`.
107
+
68
108
  You then need to choose a seeding method, of which there are currently three.
69
109
 
70
110
  ### Seeding from CSV
@@ -100,14 +140,14 @@ file name. For example, `users.csv.erb`. Note that lines starting with `<%` and
100
140
  ending with `%>` will not be considered rows, so you can use `ERB` rows to set
101
141
  values. For example:
102
142
 
103
- ```csv.erb
143
+ ```
104
144
  email,login_attempts
105
145
  <% count = 1 %>
106
146
  test2@example.com,<%= count += 1 %>
107
147
  test2@example.com,<%= count += 1 %>
108
148
  ```
109
149
 
110
- Running `rails db:seed` will now seed your `users` table.
150
+ Running `rails planter:seed` will now seed your `users` table.
111
151
 
112
152
  ## Seeding from a data array
113
153
  If you need dynamic seeds, you can add something similar to the following to
@@ -115,7 +155,7 @@ your seeder class. In this example, we'll use
115
155
  [faker](https://github.com/faker-ruby/faker).
116
156
 
117
157
  ```ruby
118
- require 'faker' # You should really just require this in `db/seeds.rb`.
158
+ require 'faker' # You could just require this in `db/seeds.rb`.
119
159
 
120
160
  class UsersSeeder < Planter::Seeder
121
161
  seeding_method :data_array, number_of_records: 10
@@ -135,7 +175,7 @@ ten elements to create ten records. It's also worth noting that setting an
135
175
  instance variable called `@data` from an `initialize` method would also work, as
136
176
  the `Planter::Seeder` parent class automatically provides `attr_reader :data`.
137
177
 
138
- Running `rails db:seed` should now seed your `users` table.
178
+ Running `rails planter:seed` should now seed your `users` table.
139
179
 
140
180
  You can also seed children records for every existing record of a parent model.
141
181
  For example, to seed an address for every user, you'd need to create an
@@ -180,26 +220,6 @@ class UsersSeeder < Planter::Seeder
180
220
  end
181
221
  ```
182
222
 
183
- ## Customization
184
- You can change the directories of both the seeder files and the CSV files. In
185
- your `configure` block in `db/seeds.rb`, you can add the following. Note that,
186
- in both instances, the path should be relative to `Rails.root`.
187
-
188
- ```ruby
189
- require 'planter'
190
-
191
- Planter.configure do |config|
192
- config.seeders_directory = 'db/seeder_classes'
193
- config.csv_files_directory = 'db/csvs'
194
- config.seeders = %i[
195
- users
196
- addresses
197
- ]
198
- end
199
-
200
- Planter.seed
201
- ```
202
-
203
223
  ## License
204
224
  The gem is available as open source under the terms of the [MIT
205
225
  License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,33 @@
1
+ module Planter
2
+ module Generators
3
+ class InitializerGenerator < Rails::Generators::Base
4
+ desc 'Genrates an initializer for Planter at config/initializers/planter.rb'
5
+
6
+ def create_initializer_file
7
+ create_file 'config/initializers/planter.rb', <<~EOF
8
+ require 'planter'
9
+
10
+ Planter.configure do |config|
11
+ ##
12
+ # The list of seeders. These files are stored in the
13
+ # config.seeders_directory, which can be changed below. When a new
14
+ # seeder is generated, it will be appended to the bottom of this
15
+ # list. If the order is incorrect, you'll need to adjust it.
16
+ # Just be sure to keep the ending bracket on its own line, or the
17
+ # generator won't know where to put new elements.
18
+ config.seeders = %i[
19
+ ]
20
+
21
+ ##
22
+ # The directory where the seeder files are kept.
23
+ # config.seeders_directory = 'db/seeds'
24
+
25
+ ##
26
+ # The directory where CSVs are kept.
27
+ # config.csv_files_directory = 'db/seed_files'
28
+ end
29
+ EOF
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,40 @@
1
+ module Planter
2
+ module Generators
3
+ class SeederGenerator < Rails::Generators::Base
4
+ argument :seeder, required: true
5
+
6
+ desc "This generator creates a seeder file at #{::Planter.config.seeders_directory}"
7
+
8
+ def generate_seeders
9
+ seeder == 'ALL' ? tables.each { |t| generate(t) } : generate(seeder)
10
+ end
11
+
12
+ private
13
+
14
+ def generate(seeder)
15
+ empty_directory ::Planter.config.seeders_directory
16
+
17
+ create_file "#{::Planter.config.seeders_directory}/#{seeder}_seeder.rb", <<~EOF
18
+ class #{seeder.camelize}Seeder < Planter::Seeder
19
+ # TODO: Choose a seeding_method. For example:
20
+ # seeding_method :csv
21
+
22
+ # For now, we overload the seed method so no exception will be raised.
23
+ def seed
24
+ end
25
+ end
26
+ EOF
27
+
28
+ inject_into_file 'config/initializers/planter.rb',
29
+ " #{seeder}\n",
30
+ before: /^\s*\]\s*$/
31
+ end
32
+
33
+ def tables
34
+ @tables ||= ActiveRecord::Base.connection.tables.reject do |table|
35
+ %w[ar_internal_metadata schema_migrations].include?(table)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -2,5 +2,13 @@
2
2
 
3
3
  module Planter
4
4
  class Railtie < ::Rails::Railtie # :nodoc:
5
+ rake_tasks do
6
+ load File.join(
7
+ File.expand_path(File.dirname(__FILE__)),
8
+ '..',
9
+ 'tasks',
10
+ 'planter_tasks.rake'
11
+ )
12
+ end
5
13
  end
6
14
  end
@@ -2,7 +2,88 @@
2
2
 
3
3
  module Planter
4
4
  ##
5
- # The class your seeder files should inherit from.
5
+ # Class that seeders should inherit from. Seeder files should be in
6
+ # +db/seeds+, and named +TABLE_seeder.rb+, where +TABLE+ is the name of the
7
+ # table being seeded (I.E. +users_seeder.rb+). If your seeder is named
8
+ # differently than the table, you'll need to specify the table with the
9
+ # +model+ option. The seeder's class name should be the same as the file
10
+ # name, but camelized. So, +UsersSeeder+. The directory where the seeder
11
+ # files are located can be changed via an initializer.
12
+ #
13
+ # The most basic way to seed is to have a CSV file with the same name as the
14
+ # table in +db/seed_files/+. So, +users.csv+. This CSV should have the
15
+ # table's column names as header. To seed using this method, your class
16
+ # should look like the following. Note that +:csv_name+ and +:model+ are only
17
+ # required if your seeder or csv are named differently than the table being
18
+ # seeded. The directory where the seed files are kept can be changed via an
19
+ # initializer.
20
+ # # db/seeds/users_seeder.rb
21
+ # require 'planter'
22
+ # class UsersSeeder < Planter::Seeder
23
+ # seeding_method :csv, csv_name: :users, model: 'User'
24
+ # end
25
+ #
26
+ # Another way to seed is to create records from a data array. To do this,
27
+ # your class must implement a +data+ attribute or method, which is an array
28
+ # of hashes. Note that this class already provides the +attr_reader+ for this
29
+ # attribute, so the most you have to do it create instance variables in your
30
+ # constructor. If if you want your data to be different for each new record
31
+ # (via Faker, +Array#sample+, etc.), you'll probably want to supply a method
32
+ # called data that returns an array of new data each time.
33
+ # require 'planter'
34
+ # class UsersSeeder < Planter::Seeder
35
+ # seeding_method :data_array
36
+ # def data
37
+ # [{foo: 'bar', baz: 'bar'}]
38
+ # end
39
+ # end
40
+ #
41
+ # In both of the above methods, you can specify +parent_model+ and
42
+ # +association+. If specified, records will be created via that parent
43
+ # model's association. If +association+ is not provided, it will be assumed
44
+ # to be the model name, pluralized and snake-cased (implying a +has_many+
45
+ # relationship). For example, if we're seeding the users table, and the
46
+ # model is +User+, the association will default to +users+.
47
+ # require 'planter'
48
+ # class UsersSeeder < Planter::Seeder
49
+ # seeding_method :data_array, parent_model: 'Person', association: :users
50
+ # def data
51
+ # [{foo: 'bar', baz: 'bar'}]
52
+ # end
53
+ # end
54
+ #
55
+ # You can also set +number_of_records+ to determine how many times each
56
+ # record in the +data+ array will get created. The default is 1. Note that if
57
+ # this attribute is set alongside +parent_model+ and +association+,
58
+ # +number_of_records+ will be how many records will be created for each
59
+ # record in the parent table.
60
+ # require 'planter'
61
+ # class UsersSeeder < Planter::Seeder
62
+ # seeding_method :data_array, number_of_records: 5
63
+ # def data
64
+ # [{foo: 'bar', baz: 'bar'}]
65
+ # end
66
+ # end
67
+ #
68
+ # By default, all fields are used to look up the record. If it already
69
+ # exists, it is not re-created. If you have specific fields that a record
70
+ # should be looked-up by, you can pass the +unique_columns+ option. This will
71
+ # attempt to look up the record by those fields only, and if one doesn't
72
+ # exist, one will be created with the rest of the attributes. An example of
73
+ # when this would be useful is with Devise; you can't pass +password+ in the
74
+ # create method, so specifying +unique_columns+ on everything except
75
+ # +password+ allows it to be passed as an attribute to the +first_or_create+
76
+ # call.
77
+ # require 'planter'
78
+ # class UsersSeeder < Planter::Seeder
79
+ # seeding_method :data_array, unique_columns: %i[username email]
80
+ # def data
81
+ # [{username: 'foo', email: 'bar', password: 'Example'}]
82
+ # end
83
+ # end
84
+ #
85
+ # If you need to seed a different way, put your own custom +seed+ method in
86
+ # your seeder class and do whatever needs to be done.
6
87
  class Seeder
7
88
  ##
8
89
  # The allowed seeding methods.
@@ -12,11 +93,10 @@ module Planter
12
93
 
13
94
  ##
14
95
  # Array of hashes used to create records. Your class must set this
15
- # attribute when using +data_hash+ seeding method, although it's probably
96
+ # attribute when using +data_array+ seeding method, although it's probably
16
97
  # more likely that you'll want to define a method that returns a new set of
17
- # data each time (via +Faker+, +Array#sample+, etc.). When using
18
- # +csv+, +data+ will be set to the data within the csv. You can
19
- # override this.
98
+ # data each time (via +Faker+, +Array#sample+, etc.). When using +csv+,
99
+ # +data+ will be set to the data within the csv. You can override this.
20
100
  #
21
101
  # @return [Array]
22
102
  attr_reader :data
@@ -38,6 +118,8 @@ module Planter
38
118
  #
39
119
  # @kwarg [Symbol, String] csv_name
40
120
  #
121
+ # @kwarg [Symbol, String] unique_columns
122
+ #
41
123
  # @example
42
124
  # require 'planter'
43
125
  # class UsersSeeder < Planter::Seeder
@@ -46,7 +128,8 @@ module Planter
46
128
  # model: 'User'
47
129
  # parent_model: 'Person',
48
130
  # association: :users,
49
- # csv_name: :awesome_users
131
+ # csv_name: :awesome_users,
132
+ # unique_columns %i[username email]
50
133
  # end
51
134
  def self.seeding_method(
52
135
  method,
@@ -54,7 +137,8 @@ module Planter
54
137
  model: to_s.delete_suffix('Seeder').singularize,
55
138
  parent_model: nil,
56
139
  association: nil,
57
- csv_name: nil
140
+ csv_name: nil,
141
+ unique_columns: nil
58
142
  )
59
143
  if !SEEDING_METHODS.include?(method.intern)
60
144
  raise ArgumentError, "Method must be one of #{SEEDING_METHODS.join(', ')}"
@@ -68,6 +152,11 @@ module Planter
68
152
  @parent_model = parent_model
69
153
  @association = @parent_model && (association || determine_association)
70
154
  @csv_file = determine_csv_filename(csv_name) if @seeding_method == :csv
155
+ @unique_columns =
156
+ case unique_columns
157
+ when String, Symbol then [unique_columns.intern]
158
+ when Array then unique_columns.map(&:intern)
159
+ end
71
160
  end
72
161
 
73
162
  def self.determine_association # :nodoc:
@@ -89,7 +178,7 @@ module Planter
89
178
  ).to_s + '.csv'
90
179
  [file, "#{file}.erb"].each do |f|
91
180
  fname = Rails.root.join(Planter.config.csv_files_directory, f).to_s
92
- return fname if File.file?(fname)
181
+ return fname if ::File.file?(fname)
93
182
  end
94
183
 
95
184
  raise ArgumentError, "Couldn't find csv for #{@model}"
@@ -162,14 +251,23 @@ module Planter
162
251
  @csv_file ||= self.class.instance_variable_get('@csv_file')
163
252
  end
164
253
 
254
+ ##
255
+ # When creating a record, the fields that will be used to look up the
256
+ # record. If it already exists, a new one will not be created.
257
+ #
258
+ # @return [Array]
259
+ def unique_columns
260
+ @unique_columns ||= self.class.instance_variable_get('@unique_columns')
261
+ end
262
+
165
263
  ##
166
264
  # Creates records from the +data+ attribute.
167
265
  def create_records
168
266
  data.each do |rec|
169
267
  number_of_records.times do
170
- model.constantize.where(
171
- rec.transform_values { |value| value == 'NULL' ? nil : value }
172
- ).first_or_create!
268
+ rec.transform_values { |value| value == 'NULL' ? nil : value }
269
+ unique, attrs = split_record(rec)
270
+ model.constantize.where(unique).first_or_create!(attrs)
173
271
  end
174
272
  end
175
273
  end
@@ -187,34 +285,47 @@ module Planter
187
285
 
188
286
  private
189
287
 
190
- def create_method
288
+ def create_method # :nodoc:
191
289
  parent_model.constantize.reflect_on_association(
192
290
  association
193
291
  ).macro.to_s.include?('many') ? :create_has_many : :create_has_one
194
292
  end
195
293
 
196
- def create_has_many(assoc_rec, association, rec)
197
- assoc_rec.public_send(association).where(rec).first_or_create!
294
+ def create_has_many(assoc_rec, association, rec) # :nodoc:
295
+ unique, attrs = split_record(rec)
296
+ assoc_rec.public_send(association).where(unique).first_or_create!(attrs)
198
297
  end
199
298
 
200
- def create_has_one(assoc_rec, association, rec)
201
- assoc_rec.public_send("create_#{association}", rec)
299
+ def create_has_one(assoc_rec, association, rec) # :nodoc:
300
+ if assoc_rec.public_send(association)
301
+ assoc_rec.public_send(association).update_attributes(rec)
302
+ else
303
+ assoc_rec.public_send("create_#{association}", rec)
304
+ end
202
305
  end
203
306
 
204
307
  def validate_attributes # :nodoc:
205
308
  case seeding_method.intern
206
309
  when :csv
207
- contents = File.read(csv_file)
310
+ contents = ::File.read(csv_file)
208
311
  if csv_file.end_with?('.erb')
209
312
  contents = ERB.new(contents, trim_mode: '<>').result(binding)
210
313
  end
211
314
 
212
- @data ||= ::CSV.parse(contents, headers: true).map(&:to_hash)
315
+ @data ||= ::CSV.parse(
316
+ contents, headers: true, header_converters: :symbol
317
+ ).map(&:to_hash)
213
318
  when :data_array
214
319
  raise "Must define '@data'" if public_send(:data).nil?
215
320
  else
216
321
  raise("Must set 'seeding_method'")
217
322
  end
218
323
  end
324
+
325
+ def split_record(rec) # :nodoc:
326
+ return [rec, {}] unless unique_columns
327
+ u = unique_columns.each_with_object({}) { |c, h| h[c] = rec.delete(c) }
328
+ [u, rec]
329
+ end
219
330
  end
220
331
  end
@@ -21,7 +21,7 @@ module Planter
21
21
  # Patch version.
22
22
  #
23
23
  # @return [Integer]
24
- PATCH = 7
24
+ PATCH = 11
25
25
 
26
26
  ##
27
27
  # Version as +[MAJOR, MINOR, PATCH]+
data/lib/planter.rb CHANGED
@@ -8,68 +8,21 @@ require 'planter/config'
8
8
  require 'planter/seeder'
9
9
 
10
10
  ##
11
- # Class that seeders should inherit from. Seeder files should be in +db/seeds+,
12
- # and named +TABLE_seeder.rb+, where +TABLE+ is the name of the table being
13
- # seeded (I.E. +users_seeder.rb+). The seeder's class name should be the same
14
- # as the file name, but camelized. So, +UsersSeeder+. The directory where the
15
- # seeder files are located can be changed via an initializer.
11
+ # The main module for the plugin. It nicely wraps the +Planter::Config+ class
12
+ # so that you can customize the plugin via an initializer or in the
13
+ # +db/seeds.rb+ file. This is how you'll specify your list of seeders to use,
14
+ # along with customizing the +seeders_directory+ and +csv_files_directory+.
16
15
  #
17
- # The most basic way to seed is to have a CSV file with the same name as the
18
- # table in +db/seed_files/+. So, +users.csv+. This CSV should have the table's
19
- # column names as header. To seed using this method, your class should look
20
- # like the following. Note that +:csv_name+ is not required; it defaults to the
21
- # table name with a +csv+ file extension. The directory where the seed files
22
- # are kept can be changed via an initializer.
23
- # # db/seeds/users_seeder.rb
24
- # require 'planter'
25
- # class UsersSeeder < Planter::Seeder
26
- # seeding_method :csv, csv_name: '/home/me/users.csv'
16
+ # Planter.configure do |config|
17
+ # config.seeders = %i[users]
18
+ # config.seeders_directory = 'db/seeds'
19
+ # config.csv_files_directory = 'db/seed_files'
27
20
  # end
28
21
  #
29
- # Another way to seed is to create records from a data array. To do this, your
30
- # class must implement a +data+ attribute or method, which is an array of
31
- # hashes. Note that this class already provides the +attr_reader+ for this
32
- # attribute, so the most you have to do it create instance variables in your
33
- # constructor. If if you want your data to be different for each new record
34
- # (via Faker, +Array#sample+, etc.), you'll probably want to supply a method
35
- # called data that returns an array of new data each time.
36
- # require 'planter'
37
- # class UsersSeeder < Planter::Seeder
38
- # seeding_method :data_array
39
- # def data
40
- # [{foo: 'bar', baz: 'bar'}]
41
- # end
42
- # end
43
- #
44
- # In both of the above methods, you can specify +parent_model+ and
45
- # +association+. If specified, records will be created via that parent model's
46
- # association. If +association+ is not provided, it will be assumed to be the
47
- # model name, pluralized and snake-cased (implying a +has_many+ relationship).
48
- # For example, if we're seeding the users table, and the model is +User+, the
49
- # association will default to +users+.
50
- # require 'planter'
51
- # class UsersSeeder < Planter::Seeder
52
- # seeding_method :data_array, parent_model: 'Person', association: :users
53
- # def data
54
- # [{foo: 'bar', baz: 'bar'}]
55
- # end
56
- # end
22
+ # To then seed your application, simply call the +seed+ method from your
23
+ # +db/seeds.rb+ file (or wherever you need to call it from).
57
24
  #
58
- # You can also set +number_of_records+ to determine how many times each record
59
- # in the +data+ array will get created. The default is 1. Note that if this
60
- # attribute is set alongside +parent_model+ and +association+,
61
- # +number_of_records+ will be how many records will be created for each record
62
- # in the parent table.
63
- # require 'planter'
64
- # class UsersSeeder < Planter::Seeder
65
- # seeding_method :data_array, number_of_records: 5
66
- # def data
67
- # [{foo: 'bar', baz: 'bar'}]
68
- # end
69
- # end
70
- #
71
- # If you need to seed a different way, put your own custom +seed+ method in
72
- # your seeder class and do whatever needs to be done.
25
+ # Planter.seed
73
26
  module Planter
74
27
  ##
75
28
  # The seeder configuration.
@@ -90,13 +43,14 @@ module Planter
90
43
  ##
91
44
  # Quick way of configuring the directories via an initializer.
92
45
  #
93
- # @return [self]
46
+ # @return [Planter::Config]
94
47
  #
95
48
  # @example
96
- # Planter.configure do |app_seeder|
97
- # app_seeder.seeders = %i[users]
98
- # app_seeder.seeders_directory = 'db/seeds'
99
- # app_seeder.csv_files_directory = 'db/seed_files'
49
+ # require 'planter'
50
+ # Planter.configure do |config|
51
+ # config.seeders = %i[users]
52
+ # config.seeders_directory = 'db/seeds'
53
+ # config.csv_files_directory = 'db/seed_files'
100
54
  # end
101
55
  def self.configure
102
56
  config.tap { |c| yield c }
@@ -104,20 +58,21 @@ module Planter
104
58
 
105
59
  ##
106
60
  # This is the method to call from your +db/seeds.rb+. It callse the seeders
107
- # listed in +Planter.config.seeders+. To call specific seeders at
108
- # runtime, you can set the +SEEDERS+ environmental variable to a
109
- # comma-separated list of seeders.
61
+ # listed in +Planter.config.seeders+. To call specific seeders at runtime,
62
+ # you can set the +SEEDERS+ environmental variable to a comma-separated list
63
+ # of seeders, like +rails db:seed SEEDERS=users,accounts+.
110
64
  #
111
65
  # @example
112
- # rails db:seed SEEDERS=users,accounts
66
+ # # db/seeds.rb, assuming your +configure+ block is in an initializer.
67
+ # Planter.seed
113
68
  def self.seed
114
69
  seeders = ENV['SEEDERS']&.split(',') || config.seeders&.map(&:to_s)
115
- raise RuntimeError, 'No seeders specified; nothing to do' unless seeders&.any?
70
+ raise RuntimeError, 'No seeders specified' unless seeders&.any?
116
71
 
117
- seeders.each do |table|
118
- require Rails.root.join(config.seeders_directory, "#{table}_seeder.rb").to_s
119
- puts "Seeding #{table}" unless config.quiet
120
- "#{table.camelize}Seeder".constantize.new.seed
72
+ seeders.each do |s|
73
+ require Rails.root.join(config.seeders_directory, "#{s}_seeder.rb").to_s
74
+ puts "Seeding #{s}" unless config.quiet
75
+ "#{s.camelize}Seeder".constantize.new.seed
121
76
  end
122
77
  end
123
78
  end
@@ -1,4 +1,13 @@
1
- # desc "Explaining what the task does"
2
- # task :planter do
3
- # # Task goes here
4
- # end
1
+ require 'planter'
2
+
3
+ namespace :planter do
4
+ desc 'Seed application. Use this to keep planter separate from db:seed'
5
+ task seed: :environment do
6
+ Planter.configure do |config|
7
+ # NOTE: the seed method already looks for ENV['SEEDERS']
8
+ ENV['SEEDERS_DIRECTORY'] && config.seeders_directory = ENV['SEEDERS_DIRECTORY']
9
+ ENV['CSV_FILES_DIRECTORY'] && config.csv_files_directory = ENV['CSV_FILES_DIRECTORY']
10
+ end
11
+ Planter.seed
12
+ end
13
+ end
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.7
4
+ version: 0.0.11
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-24 00:00:00.000000000 Z
11
+ date: 2021-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -41,6 +41,8 @@ files:
41
41
  - LICENSE
42
42
  - README.md
43
43
  - Rakefile
44
+ - lib/generators/planter/initializer_generator.rb
45
+ - lib/generators/planter/seeder_generator.rb
44
46
  - lib/planter.rb
45
47
  - lib/planter/config.rb
46
48
  - lib/planter/railtie.rb
@@ -70,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
70
72
  - !ruby/object:Gem::Version
71
73
  version: '0'
72
74
  requirements: []
73
- rubygems_version: 3.2.3
75
+ rubygems_version: 3.2.22
74
76
  signing_key:
75
77
  specification_version: 4
76
78
  summary: Framework for seeding rails applications.