seedie 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa80b46ccb1727a4451598e8f94657bc15b43dbb0b2b0e58e8bd744db0636af6
4
- data.tar.gz: b8e49e8fecdbc3c63f62b55384e3860428c9eb579114552cc2da7212c1e4b92c
3
+ metadata.gz: 7b22e6527a57385dbb0b5fc616cf632b84550a3ce8237f286a64b931670bd34a
4
+ data.tar.gz: edeb838fb02090e02a9434260e08f6cb376b4b9d1e16a75e7dc3bd97c6d0a14a
5
5
  SHA512:
6
- metadata.gz: fd0263009e5cd4b9d2287d56bde4ee2eb93337019218e018960efb9e5c9206b9f0323ccec95eaa986ddb9257d4acc9ccf684906f3f56319e1536fb6018201c4a
7
- data.tar.gz: '0808e17b7a47e12367491571ade529974202d48eb0d93a0885143dba3e4b2982db13cac4a2196e478e39770d120cf4cd632b4436934d649f23e9f2f651263684'
6
+ metadata.gz: 85ae796fa177098ac721addf4e4da3a10f12e26613318fb8f3fe8d126d008ec3de310115b877848fa607a91ad69e51c7c10a531322100050e76e45e89a2f2b72
7
+ data.tar.gz: cb9fe8d4333e9a80f32fc33bab4e8fbe5066832121ab5c49bb3701691e8a07147115819f13ee41e58eb91d90d03a247e6bfe5f5280cc600b4c307c251b0e98fc
data/.rubocop.yml CHANGED
@@ -1,16 +1,98 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.6
3
- DisabledByDefault: true
4
-
2
+ TargetRubyVersion: 2.7
3
+ NewCops: disable
4
+ SuggestExtensions: false
5
+ Exclude:
6
+ - "spec/dummy/bin/*"
7
+
8
+ Style/HashSyntax:
9
+ EnforcedStyle: ruby19_no_mixed_keys
10
+ EnforcedShorthandSyntax: never
11
+
12
+ Style/GuardClause:
13
+ Enabled: false
14
+
15
+ # Configuration parameters: EnforcedStyle, SingleLineConditionsOnly, IncludeTernaryExpressions.
16
+ # SupportedStyles: assign_to_condition, assign_inside_condition
17
+ Style/ConditionalAssignment:
18
+ Enabled: false
19
+
20
+ # Configuration parameters: AllowedConstants.
21
+ Style/Documentation:
22
+ Enabled: false
23
+
24
+ Style/IfUnlessModifier:
25
+ Enabled: false
26
+
27
+ # Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
28
+ # SupportedStyles: single_quotes, double_quotes
5
29
  Style/StringLiterals:
6
- Enabled: true
7
30
  EnforcedStyle: double_quotes
31
+ ConsistentQuotesInMultiline: true
8
32
 
9
- Style/StringLiteralsInInterpolation:
10
- Enabled: true
11
- EnforcedStyle: double_quotes
33
+ # Configuration parameters: EnforcedStyle.
34
+ # SupportedStyles: both, prefix, postfix
35
+ Style/NegatedIf:
36
+ Enabled: false
37
+
38
+ Style/RedundantBegin:
39
+ Enabled: false
40
+
41
+ # Configuration parameters: MinDigits, Strict, AllowedNumbers, AllowedPatterns.
42
+ Style/NumericLiterals:
43
+ Exclude:
44
+ - 'spec/dummy/db/*.rb'
12
45
 
46
+ Style/RedundantInterpolation:
47
+ Exclude:
48
+ - 'lib/seedie/reporters/console_reporter.rb'
49
+
50
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
51
+ # URISchemes: http, https
13
52
  Layout/LineLength:
14
- Max: 120
53
+ Max: 150
54
+
55
+ # Configuration parameters: NamePrefix, ForbiddenPrefixes, AllowedMethods, MethodDefinitionMacros.
56
+ # NamePrefix: is_, has_, have_
57
+ # ForbiddenPrefixes: is_, has_, have_
58
+ # AllowedMethods: is_a?
59
+ # MethodDefinitionMacros: define_method, define_singleton_method
60
+ Naming/PredicateName:
15
61
  Exclude:
16
- - "spec/dummy/**/*"
62
+ - 'spec/**/*'
63
+ - 'lib/seedie/field_values/faker_builder.rb'
64
+ - 'lib/seedie/polymorphic_association_helper.rb'
65
+
66
+ Metrics/AbcSize:
67
+ Max: 30
68
+ Exclude:
69
+ - "lib/generators/seedie/install_generator.rb"
70
+
71
+ # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
72
+ # AllowedMethods: refine
73
+ Metrics/BlockLength:
74
+ CountComments: false
75
+ Max: 30
76
+ Exclude:
77
+ - "spec/integration/*.rb"
78
+ - "spec/seedie/**/*.rb"
79
+ - "spec/generators/*.rb"
80
+ - "spec/dummy/**/*.rb"
81
+
82
+ # Configuration parameters: CountComments, CountAsOne.
83
+ Metrics/ClassLength:
84
+ Exclude:
85
+ - "lib/generators/seedie/install_generator.rb"
86
+ - "lib/seedie/field_values/faker_builder.rb"
87
+
88
+ # Configuration parameters: AllowedMethods, AllowedPatterns.
89
+ Metrics/CyclomaticComplexity:
90
+ Max: 17
91
+
92
+ # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
93
+ Metrics/MethodLength:
94
+ Max: 52
95
+
96
+ # Configuration parameters: AllowedMethods, AllowedPatterns.
97
+ Metrics/PerceivedComplexity:
98
+ Max: 15
data/CHANGELOG.md CHANGED
@@ -1,3 +1,74 @@
1
+ ## Version 0.4.0
2
+
3
+ ### New Features
4
+
5
+ #### Added HasAndBelongsToMany Association support
6
+
7
+ * [GitHub PR](https://github.com/keshavbiswa/seedie/pull/43)
8
+
9
+ You can now add `has_and_belongs_to_many` associations to your seedie.yml file:
10
+
11
+ ```yaml
12
+ has_and_belongs_to_many:
13
+ posts:
14
+ count: 5
15
+ attributes:
16
+ title: "{{Faker::Lorem.sentence}}"
17
+ body: "{{Faker::Lorem.paragraph}}"
18
+ ```
19
+
20
+ #### Added the ability to generate nested BelongsTo Associations
21
+
22
+ * [GitHub PR](https://github.com/keshavbiswa/seedie/pull/34)
23
+
24
+ Before, Models had no ability to add assocations to the child_model.
25
+
26
+ ```yaml
27
+ parent_model:
28
+ attributes:
29
+ some_attribute: 'hello'
30
+ associations:
31
+ has_many:
32
+ child_model: 2
33
+ ```
34
+
35
+ Now you can add associations to the child_model:
36
+
37
+ ```yaml
38
+ parent_model:
39
+ attributes:
40
+ some_attribute: 'hello'
41
+ associations:
42
+ has_many:
43
+ child_model:
44
+ attributes:
45
+ title: 'some title'
46
+ associations:
47
+ belongs_to:
48
+ another_parent_model: 'random'
49
+ ```
50
+
51
+ ### Enhancements
52
+
53
+ #### Complete Rubocop Integration with CI
54
+
55
+ * [Rubocop Integration](https://github.com/keshavbiswa/seedie/pull/33) by [@giovannism20](https://github.com/giovannism20)
56
+ * Rubocop cleanups:
57
+ - https://github.com/keshavbiswa/seedie/pull/37
58
+ - https://github.com/keshavbiswa/seedie/pull/38
59
+ - https://github.com/keshavbiswa/seedie/pull/39
60
+ - https://github.com/keshavbiswa/seedie/pull/40
61
+ - https://github.com/keshavbiswa/seedie/pull/41
62
+ - https://github.com/keshavbiswa/seedie/pull/42
63
+
64
+ #### Added Zeitwerk Support
65
+
66
+ * [GitHub PR](https://github.com/keshavbiswa/seedie/pull/35)
67
+
68
+ #### Added Rails 7.1 Support
69
+
70
+ * [GitHub PR](https://github.com/keshavbiswa/seedie/pull/36)
71
+
1
72
  ## Version 0.3.0
2
73
 
3
74
  ### New Features
data/Gemfile CHANGED
@@ -6,10 +6,13 @@ source "https://rubygems.org"
6
6
  gemspec
7
7
 
8
8
  gem "rake", "~> 13.0"
9
- gem "rubocop", "~> 1.21"
10
9
 
11
10
  gem "pry", "~> 0.14.2"
12
11
 
13
12
  group :test do
14
13
  gem "simplecov", "~> 0.22.0", require: false
15
14
  end
15
+
16
+ group :development, :test do
17
+ gem "rubocop", require: false
18
+ end
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Seedie
2
2
 
3
- Seedie is a Ruby gem designed to streamline the seeding of your database.
3
+ Seedie is a Ruby gem designed to make it easy to seed your database with realistic data.
4
4
  Utilizing the Faker library, Seedie generates realistic data for ActiveRecord models.
5
5
  Currently supports only PostrgreSQL and SQLite3 databases.
6
6
  The gem includes a Rake task for seeding models and a Rails generator for easy setup.
@@ -144,6 +144,11 @@ models:
144
144
  post_metadatum:
145
145
  attributes:
146
146
  seo_text: "{{Faker::Lorem.paragraph}}"
147
+ has_and_belongs_to_many:
148
+ tags:
149
+ count: 3
150
+ attributes:
151
+ name: "{{Faker::Lorem.word}}"
147
152
  disabled_fields: []
148
153
  comment:
149
154
  attributes:
@@ -165,7 +170,7 @@ In this file:
165
170
  - Additionally, we can use placeholders like `{{Faker::Internet.email}}` to generate dynamic and unique data for each record using Faker.
166
171
  - We can also specify an array of values that can be picked from randomly or sequentially using the `values` and `pick_strategy` options.
167
172
  - `disabled_fields` is an array of fields that should not be automatically filled by Seedie.
168
- - `associations` specify how associated models should be generated. Here, `has_many`, `belongs_to`, and `has_one` are supported.
173
+ - `associations` specify how associated models should be generated. Here, `has_many`, `belongs_to`, `has_one` and `has_and_belongs_to_many` are supported.
169
174
  - The specified number for `has_many` represents the number of associated records to create.
170
175
  - For `belongs_to`, the value `random` means that a random existing record will be associated. If there is a unique index associated, then `unique` will be set or else `random` is the default.
171
176
  - If attributes are specified under an association, those attributes will be used when creating the associated record(s)
data/Rakefile CHANGED
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/gem_tasks"
3
4
  require "rspec/core/rake_task"
4
5
 
5
-
6
6
  desc "Run all examples"
7
7
  RSpec::Core::RakeTask.new(:spec) do |t|
8
8
  t.ruby_opts = %w[-w]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "rails/generators/base"
2
4
  require "seedie"
3
5
 
@@ -5,7 +7,7 @@ module Seedie
5
7
  module Generators
6
8
  class InstallGenerator < Rails::Generators::Base
7
9
  include PolymorphicAssociationHelper
8
-
10
+
9
11
  EXCLUDED_MODELS = %w[
10
12
  ActiveRecord::SchemaMigration
11
13
  ActiveRecord::InternalMetadata
@@ -15,25 +17,24 @@ module Seedie
15
17
  ActionText::RichText
16
18
  ActionMailbox::InboundEmail
17
19
  ActionText::EncryptedRichText
18
- ]
20
+ ].freeze
19
21
 
20
22
  source_root File.expand_path("templates", __dir__)
21
23
 
22
24
  class_option :blank, type: :boolean, default: false, desc: "Generate a blank seedie.yml with examples"
23
25
  class_option :excluded_models, type: :array, default: [], desc: "Models to exclude from seedie.yml"
24
- class_option :include_only_models, type: :array, default: [],
25
- desc: "Models to be specifically included in seedie.yml. This will ignore all other models."
26
-
26
+ class_option :include_only_models, type: :array, default: [],
27
+ desc: "Models to be specifically included in seedie.yml. This will ignore all other models."
27
28
 
28
29
  desc "Creates a seedie.yml for your application."
29
- def generate_seedie_file(output = STDOUT)
30
+ def generate_seedie_file(output = $stdout)
30
31
  if options[:include_only_models].present? && options[:excluded_models].present?
31
- raise ArgumentError, "Cannot use both --include_only_models and --excluded_models together."
32
+ raise ArgumentError, "Cannot use both --include_only_models and --excluded_models together."
32
33
  end
33
-
34
+
34
35
  # This needs to be generated before anything else.
35
36
  template "seedie_initializer.rb", "config/initializers/seedie.rb"
36
-
37
+
37
38
  @excluded_models = options[:excluded_models] + EXCLUDED_MODELS
38
39
  @output = output
39
40
 
@@ -42,7 +43,7 @@ module Seedie
42
43
  else
43
44
  Rails.application.eager_load! # Load all models. This is required!!
44
45
 
45
- @models = get_models
46
+ @models = collect_models
46
47
  @models_config = build_models_config
47
48
  template "seedie.yml", "config/seedie.yml"
48
49
  end
@@ -57,9 +58,8 @@ module Seedie
57
58
 
58
59
  output_warning_for_extra_models(models)
59
60
 
60
- models.reduce({}) do |config, model|
61
+ models.each_with_object({}) do |model, config|
61
62
  config[model.name.underscore] = model_configuration(model)
62
- config
63
63
  end
64
64
  end
65
65
 
@@ -90,12 +90,12 @@ module Seedie
90
90
  if polymorphic_types.include?(column.name) || foreign_keys.include?(column.name)
91
91
  next
92
92
  end
93
-
93
+
94
94
  # Adding default columns to default_columns
95
95
  if column.default.present? || column.default_function.present?
96
96
  default_columns << column
97
- elsif column.null == false || has_presence_validator?(model, column.name)
98
- # Only add to active if its required or has presence validator
97
+ elsif column.null == false || presence_validator?(model, column.name)
98
+ # Only add to active if its required or has presence validator
99
99
  active_columns << column
100
100
  else
101
101
  disabled_columns << column
@@ -104,7 +104,7 @@ module Seedie
104
104
 
105
105
  # Add atleast one column to active columns
106
106
  active_columns << disabled_columns.pop if active_columns.empty? && disabled_columns.present?
107
-
107
+
108
108
  # Disable all default columns
109
109
  disabled_columns += default_columns
110
110
 
@@ -115,14 +115,13 @@ module Seedie
115
115
  end
116
116
 
117
117
  def active_columns_configuration(model, columns)
118
- columns.reduce({}) do |config, column|
118
+ columns.each_with_object({}) do |column, config|
119
119
  validations = model.validators_on(column.name)
120
120
  config[column.name] = if validations.present?
121
121
  FieldValues::FakerBuilder.new(column.name, column, validations).build_faker_constant
122
122
  else
123
123
  FieldValues::FakeValue.new(column.name, column).generate_fake_value
124
124
  end
125
- config
126
125
  end
127
126
  end
128
127
 
@@ -135,7 +134,7 @@ module Seedie
135
134
  "associations" => {
136
135
  "belongs_to" => belongs_to_associations_configuration(model),
137
136
  "has_one" => {}, # TODO: Add has_one associations
138
- "has_many" => {}, # TODO: Add has_many associations
137
+ "has_many" => {} # TODO: Add has_many associations
139
138
  }
140
139
  }
141
140
  end
@@ -147,17 +146,16 @@ module Seedie
147
146
 
148
147
  unique_indexes = model.connection.indexes(model.table_name).select(&:unique).flat_map(&:columns)
149
148
 
150
- belongs_to_associations.reduce({}) do |config, association|
149
+ belongs_to_associations.each_with_object({}) do |association, config|
151
150
  if association.polymorphic?
152
151
  config[association.name.to_s] = set_polymorphic_association_config(model, association)
153
152
  else
154
153
  association_has_unique_index = unique_indexes.include?(association.foreign_key.to_s)
155
154
  config[association.name.to_s] = association_has_unique_index ? "unique" : "random"
156
155
  end
157
- config
158
156
  end
159
- end
160
-
157
+ end
158
+
161
159
  def set_polymorphic_association_config(model, association)
162
160
  {
163
161
  "polymorphic" => find_polymorphic_types(model, association.name),
@@ -165,12 +163,12 @@ module Seedie
165
163
  }
166
164
  end
167
165
 
168
- def has_presence_validator?(model, column_name)
166
+ def presence_validator?(model, column_name)
169
167
  model.validators_on(column_name).any? { |v| v.kind == :presence }
170
168
  end
171
169
 
172
- def get_models
173
- @get_models ||= begin
170
+ def collect_models
171
+ @collect_models ||= begin
174
172
  all_models = ActiveRecord::Base.descendants
175
173
 
176
174
  if options[:include_only_models].present?
@@ -179,10 +177,10 @@ module Seedie
179
177
 
180
178
  all_models.reject do |model|
181
179
  @excluded_models.include?(model.name) || # Excluded Reserved Models
182
- model.abstract_class? || # Excluded Abstract Models
183
- model.table_exists? == false || # Excluded Models without tables
184
- model.name.blank? || # Excluded Anonymous Models
185
- model.name.start_with?("HABTM_") # Excluded HABTM Models
180
+ model.abstract_class? || # Excluded Abstract Models
181
+ model.table_exists? == false || # Excluded Models without tables
182
+ model.name.blank? || # Excluded Anonymous Models
183
+ model.name.start_with?("HABTM_") # Excluded HABTM Models
186
184
  end
187
185
  end
188
186
  end
@@ -5,4 +5,4 @@ Seedie.configure do |config|
5
5
 
6
6
  config.custom_attributes[:email] = "{{Faker::Internet.unique.email}}"
7
7
  # Add more custom attributes here
8
- end
8
+ end
@@ -1,44 +1,48 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Seedie
2
- class BaseAssociation
3
- include Reporters::Reportable
4
-
5
- DEFAULT_COUNT = 1
6
- INDEX = 0
4
+ module Associations
5
+ class BaseAssociation
6
+ include Reporters::Reportable
7
7
 
8
- attr_reader :record, :model, :association_config, :reporters
8
+ DEFAULT_COUNT = 1
9
+ INDEX = 0
9
10
 
10
- def initialize(record, model, association_config, reporters = [])
11
- @record = record
12
- @model = model
13
- @association_config = association_config
14
- @reporters = reporters
11
+ attr_reader :record, :model, :association_config, :reporters
15
12
 
16
- add_observers(@reporters)
17
- end
13
+ def initialize(record, model, association_config, reporters = [])
14
+ @record = record
15
+ @model = model
16
+ @association_config = association_config
17
+ @reporters = reporters
18
18
 
19
- def generate_associations
20
- raise NotImplementedError
21
- end
19
+ add_observers(@reporters)
20
+ end
22
21
 
23
- def generate_association
24
- raise NotImplementedError
25
- end
22
+ def generate_associations
23
+ raise NotImplementedError
24
+ end
26
25
 
27
- private
26
+ def generate_association
27
+ raise NotImplementedError
28
+ end
28
29
 
29
- def get_association_count(config)
30
- return config if only_count_given?(config)
31
- return config["count"] if config["count"].present?
30
+ private
32
31
 
33
- DEFAULT_COUNT
34
- end
32
+ def get_association_count(config)
33
+ return config if only_count_given?(config)
34
+ return config["count"] if config["count"].present?
35
35
 
36
- def only_count_given?(config)
37
- config.is_a?(Numeric) || config.is_a?(String)
38
- end
36
+ DEFAULT_COUNT
37
+ end
38
+
39
+ def only_count_given?(config)
40
+ config.is_a?(Numeric) || config.is_a?(String)
41
+ end
39
42
 
40
- def generate_associated_field(id, association_name)
41
- { "#{association_name}" => id }
43
+ def generate_associated_field(id, association_name)
44
+ { association_name.to_s => id }
45
+ end
42
46
  end
43
47
  end
44
- end
48
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Seedie
2
4
  module Associations
3
5
  class BelongsTo < BaseAssociation
@@ -11,7 +13,7 @@ module Seedie
11
13
 
12
14
  def generate_associations
13
15
  return if association_config["belongs_to"].nil?
14
-
16
+
15
17
  report(:belongs_to_start)
16
18
 
17
19
  association_config["belongs_to"].each do |association_name, association_config|
@@ -29,7 +31,7 @@ module Seedie
29
31
 
30
32
  private
31
33
 
32
- def handle_association_config_type(reflection, association_name, association_config)
34
+ def handle_association_config_type(reflection, _association_name, association_config)
33
35
  if reflection.polymorphic?
34
36
  handle_polymorphic_config_type(reflection, association_config)
35
37
  else
@@ -38,7 +40,6 @@ module Seedie
38
40
  handle_strategy(klass, reflection, strategy)
39
41
  end
40
42
  end
41
-
42
43
 
43
44
  def handle_polymorphic_config_type(reflection, association_config)
44
45
  type_name = get_polymorphic_class_name(association_config["polymorphic"])
@@ -48,7 +49,7 @@ module Seedie
48
49
 
49
50
  handle_strategy(klass, reflection, strategy)
50
51
  end
51
-
52
+
52
53
  # Handles the strategy for belongs_to associations
53
54
  # For polymorphic reflection, we might not add a strategy
54
55
  # so we need to default it to random
@@ -89,27 +90,25 @@ module Seedie
89
90
 
90
91
  def handle_new_config_type(klass, reflection)
91
92
  report(:belongs_to_associations, name: klass.to_s, parent_name: model.to_s)
92
-
93
+
93
94
  new_associated_record = generate_association(klass, {}, INDEX)
94
95
  associated_field_set.merge!(generate_associated_field(new_associated_record.id, reflection.foreign_key))
95
96
  end
96
97
 
97
98
  def handle_other_config_type(klass, reflection, association_config)
98
99
  report(:belongs_to_associations, name: klass.to_s, parent_name: model.to_s)
99
-
100
+
100
101
  new_associated_record = generate_association(klass, association_config, INDEX)
101
102
  associated_field_set.merge!(generate_associated_field(new_associated_record.id, reflection.foreign_key))
102
103
  end
103
104
 
104
105
  def get_type(association_config)
105
- if association_config.is_a?(String)
106
- raise InvalidAssociationConfigError, "Invalid association config" unless ["random", "new", "unique"].include?(association_config)
107
-
108
- return association_config
109
- else
110
- association_config
106
+ if association_config.is_a?(String) && !%w[random new unique].include?(association_config)
107
+ raise InvalidAssociationConfigError, "Invalid association config"
111
108
  end
109
+
110
+ association_config
112
111
  end
113
112
  end
114
113
  end
115
- end
114
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Seedie
4
+ module Associations
5
+ class HasAndBelongsToMany < BaseAssociation
6
+ def generate_associations
7
+ return if association_config["has_and_belongs_to_many"].nil?
8
+
9
+ report(:has_and_belongs_to_many_start)
10
+ association_config["has_and_belongs_to_many"].each do |association_name, association_config|
11
+ association_class = association_name.to_s.classify.constantize
12
+ count = get_association_count(association_config)
13
+ config = only_count_given?(association_config) ? {} : association_config
14
+
15
+ report(:associated_records, name: association_name, count: count, parent_name: model.to_s)
16
+ count.times do |index|
17
+ field_values_set = FieldValuesSet.new(association_class, config, index).generate_field_values_with_associations
18
+ record_creator = Model::Creator.new(record.send(association_name), reporters)
19
+
20
+ record_creator.create!(field_values_set)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,18 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Seedie
2
4
  module Associations
3
5
  class HasMany < BaseAssociation
4
6
  def generate_associations
5
7
  return if association_config["has_many"].nil?
6
-
8
+
7
9
  report(:has_many_start)
8
10
  association_config["has_many"].each do |association_name, association_config|
9
11
  association_class = association_name.to_s.classify.constantize
10
12
  count = get_association_count(association_config)
11
13
  config = only_count_given?(association_config) ? {} : association_config
12
-
14
+
13
15
  report(:associated_records, name: association_name, count: count, parent_name: model.to_s)
14
16
  count.times do |index|
15
- field_values_set = FieldValuesSet.new(association_class, config, index).generate_field_values
17
+ field_values_set = FieldValuesSet.new(association_class, config, index).generate_field_values_with_associations
16
18
  record_creator = Model::Creator.new(record.send(association_name), reporters)
17
19
 
18
20
  record_creator.create!(field_values_set)
@@ -21,4 +23,4 @@ module Seedie
21
23
  end
22
24
  end
23
25
  end
24
- end
26
+ end