dirty_seed 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -2
- data/lib/dirty_seed.rb +15 -11
- data/lib/dirty_seed/assigners/assigner.rb +73 -0
- data/lib/dirty_seed/assigners/base.rb +86 -0
- data/lib/dirty_seed/assigners/{dirty_boolean.rb → boolean.rb} +2 -2
- data/lib/dirty_seed/assigners/{dirty_date.rb → date.rb} +2 -2
- data/lib/dirty_seed/assigners/fakers.yml +64 -1
- data/lib/dirty_seed/assigners/float.rb +21 -0
- data/lib/dirty_seed/assigners/integer.rb +20 -0
- data/lib/dirty_seed/assigners/min_max_helper.rb +115 -0
- data/lib/dirty_seed/assigners/{dirty_number.rb → number.rb} +2 -2
- data/lib/dirty_seed/assigners/string.rb +39 -0
- data/lib/dirty_seed/assigners/{dirty_time.rb → time.rb} +2 -2
- data/lib/dirty_seed/{dirty_association.rb → association.rb} +6 -17
- data/lib/dirty_seed/attribute.rb +62 -0
- data/lib/dirty_seed/data_model.rb +17 -18
- data/lib/dirty_seed/method_missing_helper.rb +1 -1
- data/lib/dirty_seed/{dirty_model.rb → model.rb} +81 -33
- data/lib/dirty_seed/version.rb +1 -1
- data/spec/dummy/app/models/bravo.rb +2 -1
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +2 -0
- data/spec/dummy/log/test.log +62192 -0
- data/spec/lib/dirty_seed/assigners/assigner_spec.rb +19 -0
- data/spec/lib/dirty_seed/assigners/base_spec.rb +81 -0
- data/spec/lib/dirty_seed/assigners/boolean_spec.rb +13 -0
- data/spec/lib/dirty_seed/assigners/date_spec.rb +15 -0
- data/spec/lib/dirty_seed/assigners/float_spec.rb +43 -0
- data/spec/lib/dirty_seed/assigners/integer_spec.rb +43 -0
- data/spec/lib/dirty_seed/assigners/string_spec.rb +47 -0
- data/spec/lib/dirty_seed/assigners/time_spec.rb +15 -0
- data/spec/lib/dirty_seed/association_spec.rb +64 -0
- data/spec/lib/dirty_seed/attribute_spec.rb +49 -0
- data/spec/lib/dirty_seed/data_model_spec.rb +8 -36
- data/spec/lib/dirty_seed/{dirty_model_spec.rb → model_spec.rb} +13 -13
- data/spec/support/helpers.rb +5 -5
- metadata +37 -33
- data/lib/dirty_seed/assigners/dirty_assigner.rb +0 -95
- data/lib/dirty_seed/assigners/dirty_float.rb +0 -35
- data/lib/dirty_seed/assigners/dirty_integer.rb +0 -16
- data/lib/dirty_seed/assigners/dirty_string.rb +0 -74
- data/lib/dirty_seed/dirty_attribute.rb +0 -75
- data/spec/lib/dirty_seed/assigners/dirty_assigner_spec.rb +0 -68
- data/spec/lib/dirty_seed/assigners/dirty_boolean_spec.rb +0 -13
- data/spec/lib/dirty_seed/assigners/dirty_date_spec.rb +0 -15
- data/spec/lib/dirty_seed/assigners/dirty_float_spec.rb +0 -43
- data/spec/lib/dirty_seed/assigners/dirty_integer_spec.rb +0 -43
- data/spec/lib/dirty_seed/assigners/dirty_string_spec.rb +0 -53
- data/spec/lib/dirty_seed/assigners/dirty_time_spec.rb +0 -15
- data/spec/lib/dirty_seed/dirty_association_spec.rb +0 -64
- data/spec/lib/dirty_seed/dirty_attribute_spec.rb +0 -49
@@ -0,0 +1,115 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DirtySeed
|
4
|
+
module Assigners
|
5
|
+
# Helps with min and max validations
|
6
|
+
module MinMaxHelper
|
7
|
+
# Returns the minimal value
|
8
|
+
# @return [Integer, Float]
|
9
|
+
def min
|
10
|
+
@min ||= define_min_and_max && @min
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns the maximal value
|
14
|
+
# @return [Integer, Float]
|
15
|
+
def max
|
16
|
+
@max ||= define_min_and_max && @max
|
17
|
+
end
|
18
|
+
|
19
|
+
# Defines min and max depending on validator
|
20
|
+
# @return [void]
|
21
|
+
def define_min_and_max
|
22
|
+
@min = acceptable_min
|
23
|
+
@max = acceptable_max
|
24
|
+
|
25
|
+
# If necessary, adjust a value depending on the other
|
26
|
+
@min ||= floor
|
27
|
+
@max ||= @min + ceiling || ceiling # rubocop:disable Naming/MemoizedInstanceVariableName
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns default min depending on type
|
31
|
+
# @return [Integer, Float]
|
32
|
+
def floor # rubocop:disable Metrics/CyclomaticComplexity
|
33
|
+
case type
|
34
|
+
when :string then 1
|
35
|
+
when :integer then @max&.negative? ? @max * 2 : 0
|
36
|
+
when :float then @max&.negative? ? @max * 2 : 0.0
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns default max depending on type
|
41
|
+
# @return [Integer, Float]
|
42
|
+
def ceiling
|
43
|
+
case type
|
44
|
+
when :string then 50
|
45
|
+
when :integer then 42
|
46
|
+
when :float then 42.0
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns the validator that validate min and/or max
|
51
|
+
def min_max_validator
|
52
|
+
validators.find { |validator| validator.is_a? validator_class }
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns the validator class depending on the type
|
56
|
+
def validator_class
|
57
|
+
case type
|
58
|
+
when :string then ActiveRecord::Validations::LengthValidator
|
59
|
+
when :integer, :float then ActiveModel::Validations::NumericalityValidator
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns a value representing the minimal acceptable value
|
64
|
+
# @return [Integer, Float]
|
65
|
+
def acceptable_min
|
66
|
+
return unless min_max_validator
|
67
|
+
|
68
|
+
min_max_validator.options[:in]&.min || type_related_acceptable_min
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns a value representing the minimal acceptable value depending on type
|
72
|
+
# @return [Integer, Float]
|
73
|
+
def type_related_acceptable_min
|
74
|
+
case type
|
75
|
+
when :string
|
76
|
+
min_max_validator.options[:minimum] || min_max_validator.options[:is]
|
77
|
+
when :integer, :float
|
78
|
+
min_max_validator.options[:greater_than]&.+(gap) ||
|
79
|
+
min_max_validator.options[:greater_than_or_equal_to]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns a value representing the maximal acceptable value
|
84
|
+
# @return [Integer, Float]
|
85
|
+
def acceptable_max
|
86
|
+
return unless min_max_validator
|
87
|
+
|
88
|
+
min_max_validator.options[:in]&.max || type_related_acceptable_max
|
89
|
+
end
|
90
|
+
|
91
|
+
# Returns a value representing the maximal acceptable value depending on type
|
92
|
+
# @return [Integer, Float]
|
93
|
+
def type_related_acceptable_max
|
94
|
+
case type
|
95
|
+
when :string
|
96
|
+
min_max_validator.options[:maximum] || min_max_validator.options[:is]
|
97
|
+
when :integer, :float
|
98
|
+
min_max_validator.options[:less_than]&.-(gap) ||
|
99
|
+
min_max_validator.options[:less_than_or_equal_to]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Defines the gap to add to min when "greater_than" or to substract to max when "less_than"
|
104
|
+
# For example if type is :float and value should be greater_than 0, then the min is 0.01
|
105
|
+
# and if the value should be lesser_than 1, then the max is 0.99
|
106
|
+
# @return [Integer, Float]
|
107
|
+
def gap
|
108
|
+
case type
|
109
|
+
when :integer then 1
|
110
|
+
when :float then 0.01
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -3,12 +3,12 @@
|
|
3
3
|
module DirtySeed
|
4
4
|
module Assigners
|
5
5
|
# Draws an integer matching validators
|
6
|
-
class
|
6
|
+
class Number < Assigner
|
7
7
|
attr_reader :min, :max
|
8
8
|
|
9
9
|
# Returns an value matching all validators
|
10
10
|
# @return [Integer, Float]
|
11
|
-
def
|
11
|
+
def value
|
12
12
|
unless min && max
|
13
13
|
define_min_and_max
|
14
14
|
adjust_values
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DirtySeed
|
4
|
+
module Assigners
|
5
|
+
# Draws a String matching validators
|
6
|
+
class String < Assigner
|
7
|
+
include MinMaxHelper
|
8
|
+
|
9
|
+
# Returns a value matching all validators
|
10
|
+
# @return [String]
|
11
|
+
def value
|
12
|
+
regex_value || default
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# Returns a standard string
|
18
|
+
# @return [String]
|
19
|
+
def default
|
20
|
+
faker_value(
|
21
|
+
category: :Lorem,
|
22
|
+
method: :paragraph_by_chars,
|
23
|
+
options: { number: rand(min..max), supplemental: false }
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns a value matching the pattern
|
28
|
+
# @note Rescue from unreadable regex
|
29
|
+
# @return [String]
|
30
|
+
def regex_value
|
31
|
+
return unless regex
|
32
|
+
|
33
|
+
regex.random_example
|
34
|
+
rescue RegexpExamples::IllegalSyntaxError
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -3,10 +3,10 @@
|
|
3
3
|
module DirtySeed
|
4
4
|
module Assigners
|
5
5
|
# Draws a value matching validators
|
6
|
-
class
|
6
|
+
class Time < Assigner
|
7
7
|
# Returns a value matching all validators
|
8
8
|
# @return [Time]
|
9
|
-
def
|
9
|
+
def value
|
10
10
|
::Faker::Time.between(from: DateTime.now - 42, to: DateTime.now + 42)
|
11
11
|
end
|
12
12
|
end
|
@@ -2,32 +2,21 @@
|
|
2
2
|
|
3
3
|
module DirtySeed
|
4
4
|
# Represents an Active Record association
|
5
|
-
class
|
5
|
+
class Association
|
6
6
|
extend ::DirtySeed::MethodMissingHelper
|
7
7
|
forward_missing_methods_to :reflections
|
8
8
|
|
9
|
-
attr_reader :
|
9
|
+
attr_reader :model, :reflection
|
10
10
|
|
11
11
|
# Initializes an instance
|
12
|
-
# @param
|
12
|
+
# @param model [DirtySeed::Model]
|
13
13
|
# @param reflection [ActiveRecord::Reflection::BelongsToReflection]
|
14
|
-
# @return [DirtySeed::
|
15
|
-
def initialize(
|
16
|
-
@
|
14
|
+
# @return [DirtySeed::Association]
|
15
|
+
def initialize(model, reflection)
|
16
|
+
@model = model
|
17
17
|
@reflection = reflection
|
18
18
|
end
|
19
19
|
|
20
|
-
# Assigns a random value to the association
|
21
|
-
# @param instance [Object] an instance of a class inheriting from ApplicationRecord
|
22
|
-
# @return [void]
|
23
|
-
def assign_value(instance)
|
24
|
-
return if associated_models.empty?
|
25
|
-
|
26
|
-
instance.public_send(:"#{name}=", value)
|
27
|
-
rescue ArgumentError => e
|
28
|
-
@errors << e
|
29
|
-
end
|
30
|
-
|
31
20
|
# Returns a random instance matching the reflection
|
32
21
|
# @return [Object] an instance of a class inheriting from ApplicationRecord
|
33
22
|
def value
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DirtySeed
|
4
|
+
# Represents an Active Record attribute
|
5
|
+
class Attribute
|
6
|
+
extend ::DirtySeed::MethodMissingHelper
|
7
|
+
forward_missing_methods_to :column
|
8
|
+
|
9
|
+
attr_reader :model, :column
|
10
|
+
|
11
|
+
TYPE_SYMMETRIES = {
|
12
|
+
binary: :integer,
|
13
|
+
datetime: :time,
|
14
|
+
decimal: :float,
|
15
|
+
text: :string
|
16
|
+
}.freeze
|
17
|
+
private_constant :TYPE_SYMMETRIES
|
18
|
+
|
19
|
+
# Initializes an instance
|
20
|
+
# @param model [DirtySeed::Model]
|
21
|
+
# @param column [ActiveRecord::ConnectionAdapters::Column]
|
22
|
+
# @return [DirtySeed::Attribute]
|
23
|
+
def initialize(model, column)
|
24
|
+
@model = model
|
25
|
+
@column = column
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns a value matching type and validators
|
29
|
+
# @return [Object, nil]
|
30
|
+
def value
|
31
|
+
assigner.value
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns the attribute assigner
|
35
|
+
# @return [DirtySeed::Assigners::Assigner]
|
36
|
+
def assigner
|
37
|
+
@assigner ||= DirtySeed::Assigners::Base.new(self)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns attribute name
|
41
|
+
# @return [Symbol]
|
42
|
+
def name
|
43
|
+
@name ||= column.name.to_sym
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns attribute type
|
47
|
+
# @return [Symbol]
|
48
|
+
def type
|
49
|
+
@type ||=
|
50
|
+
TYPE_SYMMETRIES[column.sql_type_metadata.type] || column.sql_type_metadata.type
|
51
|
+
end
|
52
|
+
|
53
|
+
# Returns an validators related to the current attribute
|
54
|
+
# @return [Array<ActiveModel::Validations::EachValidators>]
|
55
|
+
def validators
|
56
|
+
@validators ||=
|
57
|
+
model.validators.select do |validator|
|
58
|
+
validator.attributes.include? name
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -4,11 +4,10 @@ module DirtySeed
|
|
4
4
|
# Represents the data model
|
5
5
|
class DataModel
|
6
6
|
include Singleton
|
7
|
-
attr_accessor :logs
|
8
7
|
|
9
8
|
class << self
|
10
9
|
# Defines class methods forwarding to instance methods
|
11
|
-
%i[
|
10
|
+
%i[active_record_models models print_logs reset].each do |method_name|
|
12
11
|
define_method(method_name) { instance.public_send(method_name) }
|
13
12
|
end
|
14
13
|
|
@@ -20,19 +19,19 @@ module DirtySeed
|
|
20
19
|
end
|
21
20
|
|
22
21
|
# Returns dirty model if method_name matches its name
|
23
|
-
# @return [DirtySeed::
|
22
|
+
# @return [DirtySeed::Model]
|
24
23
|
# @raise [NoMethodError] if method_name does not match any dirty model
|
25
24
|
def method_missing(method_name, *args, &block)
|
26
|
-
|
27
|
-
|
25
|
+
models.find do |model|
|
26
|
+
model.name.underscore.to_sym == method_name
|
28
27
|
end || super
|
29
28
|
end
|
30
29
|
|
31
30
|
# Returns true if method_name matches a dirty model name
|
32
31
|
# @return [Boolean]
|
33
32
|
def respond_to_missing?(method_name, include_private = false)
|
34
|
-
|
35
|
-
|
33
|
+
models.any? do |model|
|
34
|
+
model.name.underscore.to_sym == method_name
|
36
35
|
end || super
|
37
36
|
end
|
38
37
|
end
|
@@ -41,7 +40,6 @@ module DirtySeed
|
|
41
40
|
# @return [DirtySeed::DataModel]
|
42
41
|
def initialize
|
43
42
|
Rails.application.eager_load!
|
44
|
-
@logs = {}
|
45
43
|
end
|
46
44
|
|
47
45
|
# Seeds the database with dirty instances
|
@@ -50,16 +48,16 @@ module DirtySeed
|
|
50
48
|
def seed(count)
|
51
49
|
# check if ApplicationRecord is defined first (or raise error)
|
52
50
|
::ApplicationRecord &&
|
53
|
-
|
51
|
+
models.each { |model| model.seed(count) }
|
54
52
|
print_logs
|
55
53
|
end
|
56
54
|
|
57
55
|
# Returns dirty models
|
58
|
-
# @return [Array<DirtySeed::
|
59
|
-
def
|
60
|
-
@
|
56
|
+
# @return [Array<DirtySeed::Model>]
|
57
|
+
def models
|
58
|
+
@models ||=
|
61
59
|
active_record_models.map do |active_record_model|
|
62
|
-
DirtySeed::
|
60
|
+
DirtySeed::Model.new(active_record_model)
|
63
61
|
end
|
64
62
|
end
|
65
63
|
|
@@ -79,10 +77,11 @@ module DirtySeed
|
|
79
77
|
# Prints logs in the console
|
80
78
|
# @return [void]
|
81
79
|
def print_logs
|
82
|
-
|
83
|
-
|
84
|
-
puts
|
85
|
-
puts "
|
80
|
+
puts ''
|
81
|
+
models.sort_by(&:name).each do |model|
|
82
|
+
puts model.name
|
83
|
+
puts " seeded: #{model.instances.count}"
|
84
|
+
puts " errors: #{model.errors.join(', ')}" if model.errors.any?
|
86
85
|
end
|
87
86
|
end
|
88
87
|
|
@@ -90,7 +89,7 @@ module DirtySeed
|
|
90
89
|
# @return [void]
|
91
90
|
def reset
|
92
91
|
@logs = nil
|
93
|
-
@
|
92
|
+
@models = nil
|
94
93
|
@active_record_models = nil
|
95
94
|
end
|
96
95
|
end
|
@@ -24,7 +24,7 @@ module DirtySeed
|
|
24
24
|
|
25
25
|
# Defines missing_method method so it returns the adressee or calls super
|
26
26
|
# @example
|
27
|
-
# calling #name on a
|
27
|
+
# calling #name on a Model instance will call name on its @model object
|
28
28
|
# @return [void]
|
29
29
|
def define_method_missing
|
30
30
|
define_method :method_missing do |method_name, *args, &block|
|
@@ -2,12 +2,11 @@
|
|
2
2
|
|
3
3
|
module DirtySeed
|
4
4
|
# Represents an Active Record model
|
5
|
-
class
|
5
|
+
class Model
|
6
6
|
extend ::DirtySeed::MethodMissingHelper
|
7
7
|
forward_missing_methods_to :model
|
8
8
|
|
9
|
-
attr_reader :model, :instances
|
10
|
-
attr_writer :errors
|
9
|
+
attr_reader :model, :instances
|
11
10
|
|
12
11
|
PROTECTED_COLUMNS = %w[
|
13
12
|
id
|
@@ -23,41 +22,105 @@ module DirtySeed
|
|
23
22
|
|
24
23
|
# Initializes an instance
|
25
24
|
# @param model [Class] a class inheriting from ApplicationRecord
|
26
|
-
# @return [DirtySeed::
|
25
|
+
# @return [DirtySeed::Model]
|
27
26
|
def initialize(model)
|
28
27
|
@model = model
|
29
28
|
@instances = []
|
30
|
-
@seeded = 0
|
31
29
|
@errors = []
|
32
30
|
end
|
33
31
|
|
34
|
-
# Creates
|
32
|
+
# Creates records
|
35
33
|
# @param count [Integer]
|
36
|
-
# @return [
|
34
|
+
# @return [Array<Object>]
|
37
35
|
def seed(count)
|
38
|
-
|
39
|
-
@
|
36
|
+
puts "Seeding #{name.underscore.pluralize}"
|
37
|
+
@count = count
|
38
|
+
create_records
|
39
|
+
rescue ActiveRecord::ActiveRecordError => e
|
40
|
+
@errors << e
|
41
|
+
ensure
|
42
|
+
instances
|
43
|
+
end
|
44
|
+
|
45
|
+
# Creates records
|
46
|
+
# @return [void]
|
47
|
+
def create_records
|
48
|
+
data = params_collection
|
49
|
+
@count.times do |i|
|
50
|
+
instance = model.new(data[i])
|
51
|
+
save(instance)
|
52
|
+
end
|
53
|
+
puts ''
|
54
|
+
end
|
55
|
+
|
56
|
+
# Tries to save instance in database
|
57
|
+
# Populates instances and errors and log message
|
58
|
+
# @return [void]
|
59
|
+
def save(instance)
|
60
|
+
if instance.save
|
61
|
+
print '.'
|
62
|
+
@instances << instance
|
63
|
+
else
|
64
|
+
print '!'
|
65
|
+
@errors << instance.errors.full_messages
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Generate records params
|
70
|
+
# @return [Array<Hash>] where Hash is params for one record
|
71
|
+
def params_collection
|
72
|
+
data = Hash[attributes_collection + associations_collection]
|
73
|
+
data.values.transpose.map { |vs| data.keys.zip(vs).to_h }
|
74
|
+
end
|
75
|
+
|
76
|
+
# Generate attributes params
|
77
|
+
# Each sub-array contains the attribute name and a collection of values
|
78
|
+
# @return [Array<Array>]
|
79
|
+
# @example
|
80
|
+
# [
|
81
|
+
# ["a_string", ["foo", "bar"]],
|
82
|
+
# [an_integer, [1, 2]]
|
83
|
+
# ]
|
84
|
+
def attributes_collection
|
85
|
+
attributes.map do |attribute|
|
86
|
+
Faker::UniqueGenerator.clear
|
87
|
+
[attribute.name, @count.times.map { attribute.value }]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Generate associations params
|
92
|
+
# Each sub-array contains the association name and a collection of values
|
93
|
+
# @return [Array<Array>]
|
94
|
+
# @example
|
95
|
+
# [
|
96
|
+
# ["alfa", [#<Alfa>, #<Alfa>]],
|
97
|
+
# ["bravo", [#<Bravo>, #<Bravo>]]
|
98
|
+
# ]
|
99
|
+
def associations_collection
|
100
|
+
associations.map do |association|
|
101
|
+
[association.name, @count.times.map { association.value }]
|
102
|
+
end
|
40
103
|
end
|
41
104
|
|
42
105
|
# Returns models where models are associated to the current model through a has_many or has_one associations
|
43
106
|
# @return [Array<Class>] ActiveRecord models
|
44
107
|
def associated_models
|
45
|
-
|
108
|
+
associations.map(&:associated_models).flatten
|
46
109
|
end
|
47
110
|
|
48
111
|
# Returns an dirty associations representing the self.model belongs_to associations
|
49
|
-
# @return [Array<DirtySeed::
|
50
|
-
def
|
112
|
+
# @return [Array<DirtySeed::Association>]
|
113
|
+
def associations
|
51
114
|
included_reflections.map do |reflection|
|
52
|
-
DirtySeed::
|
115
|
+
DirtySeed::Association.new(self, reflection)
|
53
116
|
end
|
54
117
|
end
|
55
118
|
|
56
119
|
# Returns model attributes
|
57
|
-
# @return [Array<DirtySeed::
|
58
|
-
def
|
120
|
+
# @return [Array<DirtySeed::Attribute>]
|
121
|
+
def attributes
|
59
122
|
included_columns.map do |column|
|
60
|
-
DirtySeed::
|
123
|
+
DirtySeed::Attribute.new(self, column)
|
61
124
|
end
|
62
125
|
end
|
63
126
|
|
@@ -69,21 +132,6 @@ module DirtySeed
|
|
69
132
|
|
70
133
|
private
|
71
134
|
|
72
|
-
# Creates an instance
|
73
|
-
# @return [void]
|
74
|
-
def create_instance
|
75
|
-
@instances << instance = model.new
|
76
|
-
dirty_associations.each { |dirty_association| dirty_association.assign_value(instance) }
|
77
|
-
dirty_attributes.each { |dirty_attribute| dirty_attribute.assign_value(instance) }
|
78
|
-
if instance.save
|
79
|
-
@seeded += 1
|
80
|
-
else
|
81
|
-
@errors << instance.errors.full_messages
|
82
|
-
end
|
83
|
-
rescue ActiveRecord::ActiveRecordError => e
|
84
|
-
errors << e
|
85
|
-
end
|
86
|
-
|
87
135
|
# Returns columns that should be treated as regular attributes
|
88
136
|
# @return [Array<ActiveRecord::ConnectionAdapters::Column>]
|
89
137
|
def included_columns
|
@@ -99,8 +147,8 @@ module DirtySeed
|
|
99
147
|
# @return [Array<String>]
|
100
148
|
def reflection_related_attributes
|
101
149
|
all_reflection_related_attributes =
|
102
|
-
|
103
|
-
[
|
150
|
+
associations.map do |association|
|
151
|
+
[association.attribute, association.type_key].compact
|
104
152
|
end
|
105
153
|
all_reflection_related_attributes.flatten.map(&:to_s)
|
106
154
|
end
|