seedie 0.2.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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +91 -9
  3. data/CHANGELOG.md +123 -0
  4. data/Gemfile +4 -1
  5. data/README.md +77 -3
  6. data/Rakefile +1 -1
  7. data/lib/generators/seedie/install_generator.rb +84 -37
  8. data/lib/generators/seedie/templates/blank_seedie.yml +22 -0
  9. data/lib/generators/seedie/templates/seedie_initializer.rb +8 -0
  10. data/lib/seedie/associations/base_association.rb +35 -31
  11. data/lib/seedie/associations/belongs_to.rb +12 -13
  12. data/lib/seedie/associations/has_and_belongs_to_many.rb +26 -0
  13. data/lib/seedie/associations/has_many.rb +6 -4
  14. data/lib/seedie/associations/has_one.rb +13 -13
  15. data/lib/seedie/configuration.rb +12 -0
  16. data/lib/seedie/field_values/custom_value.rb +14 -83
  17. data/lib/seedie/field_values/fake_value.rb +85 -17
  18. data/lib/seedie/field_values/faker_builder.rb +29 -35
  19. data/lib/seedie/field_values/value_template_validator.rb +91 -0
  20. data/lib/seedie/field_values_set.rb +21 -4
  21. data/lib/seedie/model/creator.rb +7 -5
  22. data/lib/seedie/model/id_generator.rb +10 -8
  23. data/lib/seedie/model/model_sorter.rb +14 -19
  24. data/lib/seedie/model_fields.rb +5 -3
  25. data/lib/seedie/model_seeder.rb +11 -22
  26. data/lib/seedie/polymorphic_association_helper.rb +20 -16
  27. data/lib/seedie/railtie.rb +3 -2
  28. data/lib/seedie/reporters/base_reporter.rb +75 -68
  29. data/lib/seedie/reporters/console_reporter.rb +16 -12
  30. data/lib/seedie/reporters/reportable.rb +14 -10
  31. data/lib/seedie/seeder.rb +5 -3
  32. data/lib/seedie/version.rb +1 -1
  33. data/lib/seedie.rb +21 -27
  34. data/lib/tasks/seedie.rake +4 -2
  35. metadata +32 -13
@@ -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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Seedie
2
4
  module Associations
3
5
  class HasOne < BaseAssociation
@@ -5,25 +7,23 @@ module Seedie
5
7
  return if association_config["has_one"].nil?
6
8
 
7
9
  report(:has_one_start)
8
-
10
+
9
11
  association_config["has_one"].each do |association_name, association_config|
10
12
  reflection = model.reflect_on_association(association_name)
11
13
  association_class = reflection.klass
12
14
  count = get_association_count(association_config)
13
-
15
+
14
16
  report(:associated_records, count: count, name: association_name, parent_name: model.to_s)
15
- if count > 1
16
- raise InvalidAssociationConfigError, "has_one association cannot be more than 1"
17
- else
18
- config = only_count_given?(association_config) ? {} : association_config
19
- field_values_set = FieldValuesSet.new(association_class, config, INDEX).generate_field_values
20
- parent_field_set = generate_associated_field(record.id, reflection.foreign_key)
21
-
22
- record_creator = Model::Creator.new(association_class, reporters)
23
- record_creator.create!(field_values_set.merge!(parent_field_set))
24
- end
17
+ raise InvalidAssociationConfigError, "has_one association cannot be more than 1" if count > 1
18
+
19
+ config = only_count_given?(association_config) ? {} : association_config
20
+ field_values_set = FieldValuesSet.new(association_class, config, INDEX).generate_field_values
21
+ parent_field_set = generate_associated_field(record.id, reflection.foreign_key)
22
+
23
+ record_creator = Model::Creator.new(association_class, reporters)
24
+ record_creator.create!(field_values_set.merge!(parent_field_set))
25
25
  end
26
26
  end
27
27
  end
28
28
  end
29
- end
29
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Seedie
4
+ class Configuration
5
+ attr_accessor :default_count, :custom_attributes
6
+
7
+ def initialize
8
+ @default_count = nil
9
+ @custom_attributes = {}
10
+ end
11
+ end
12
+ end
@@ -1,9 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Seedie
2
4
  module FieldValues
3
5
  class CustomValue
4
- VALID_KEYS = ["values", "value", "options"].freeze
5
- PICK_STRATEGIES = ["random", "sequential"].freeze
6
-
7
6
  attr_reader :name, :parsed_value
8
7
 
9
8
  def initialize(name, value_template, index)
@@ -12,7 +11,7 @@ module Seedie
12
11
  @index = index
13
12
  @parsed_value = ""
14
13
 
15
- validate_value_template
14
+ ValueTemplateValidator.new(@value_template, @index, @name).validate
16
15
  end
17
16
 
18
17
  def generate_custom_field_value
@@ -27,89 +26,21 @@ module Seedie
27
26
 
28
27
  private
29
28
 
30
- def validate_value_template
31
- return unless @value_template.is_a?(Hash)
32
-
33
- validate_keys
34
- validate_values if @value_template.key?("values")
35
- validate_options if @value_template.key?("options")
36
- end
37
-
38
- def validate_values
39
- values = @value_template["values"]
40
- options = @value_template["options"]
41
-
42
- if values.is_a?(Array) || values.is_a?(Hash)
43
- validate_sequential_values_length
44
- else
45
- raise InvalidCustomFieldValuesError, "The values key for #{@name} must be an array or a hash with start and end keys."
46
- end
47
- end
48
-
49
- def validate_options
50
- options = @value_template["options"]
51
- pick_strategy = options["pick_strategy"]
52
-
53
- if pick_strategy.present? && !PICK_STRATEGIES.include?(pick_strategy)
54
- raise InvalidCustomFieldOptionsError,
55
- "The pick_strategy for #{@name} must be either 'sequential' or 'random'."
56
- end
57
- end
58
-
59
- ## If pick strategy is sequential, we need to ensure there is a value for each index
60
- # If there isn't sufficient values, we raise an error
61
- def validate_sequential_values_length
62
- return unless @value_template.key?("options")
63
- return unless @value_template["options"]["pick_strategy"] == "sequential"
64
-
65
- values = @value_template["values"]
66
-
67
- if values.is_a?(Hash) && values.keys.sort == ["end", "start"]
68
- # Assuming the values are an inclusive range
69
- values_length = values["end"] - values["start"] + 1
70
- else
71
- values_length = values.length
72
- end
73
-
74
- if values_length < @index + 1
75
- raise CustomFieldNotEnoughValuesError,
76
- "There are not enough values for #{@name}. Please add more values."
77
- end
78
- end
79
-
80
- def validate_keys
81
- invalid_keys = @value_template.keys - VALID_KEYS
82
-
83
- if invalid_keys.present?
84
- raise InvalidCustomFieldKeysError,
85
- "Invalid keys for #{@name}: #{invalid_keys.join(", ")}. Only #{VALID_KEYS} are allowed."
86
- end
87
-
88
- if @value_template.key?("values")
89
- if @value_template.key?("value")
90
- raise InvalidCustomFieldKeysError,
91
- "Invalid keys for #{@name}: values and value cannot be used together."
92
- end
93
-
94
- if @value_template["values"].is_a?(Hash)
95
- if !@value_template["values"].key?("start") || !@value_template["values"].key?("end")
96
- raise InvalidCustomFieldValuesError,
97
- "The values key for #{@name} must be an array or a hash with start and end keys."
98
- end
99
- end
100
- end
101
- end
102
-
103
29
  def generate_custom_value_from_string
104
30
  @parsed_value = @value_template.gsub("{{index}}", @index.to_s)
105
31
 
106
32
  @parsed_value.gsub!(/\{\{(.+?)\}\}/) do
107
- method_string = $1
33
+ method_string = ::Regexp.last_match(1)
108
34
 
109
- if method_string.start_with?("Faker::")
110
- eval($1)
111
- else
112
- raise InvalidFakerMethodError, "Invalid method: #{method_string}"
35
+ raise InvalidFakerMethodError, "Invalid method: #{method_string}" unless method_string.start_with?("Faker::")
36
+
37
+ method_chain = method_string.split(".")
38
+ # Faker::Name will be shifted off the array
39
+ faker_class = method_chain.shift.constantize
40
+
41
+ # For Faker::Internet.unique.email, there will be two methods in the array
42
+ method_chain.reduce(faker_class) do |current_class_or_value, method|
43
+ current_class_or_value.public_send(method)
113
44
  end
114
45
  end
115
46
  end
@@ -123,7 +54,7 @@ module Seedie
123
54
  generate_custom_values_from_range(@value_template["values"]["start"], @value_template["values"]["end"])
124
55
  end
125
56
  options = @value_template["options"]
126
-
57
+
127
58
  if options.present? && options["pick_strategy"] == "sequential"
128
59
  @parsed_value = values[@index]
129
60
  else
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Seedie
2
4
  module FieldValues
3
5
  class FakeValue
@@ -9,41 +11,107 @@ module Seedie
9
11
  def generate_fake_value
10
12
  case @column.type
11
13
  when :string, :text, :citext
12
- Faker::Lorem.word
14
+ generate_string
13
15
  when :uuid
14
- SecureRandom.uuid
16
+ generate_uuid
15
17
  when :integer, :bigint, :smallint
16
- Faker::Number.number(digits: 5)
18
+ generate_integer
17
19
  when :decimal, :float, :real
18
- Faker::Number.decimal(l_digits: 2, r_digits: 2)
20
+ generate_decimal
19
21
  when :datetime, :timestamp, :timestamptz
20
- Faker::Time.between(from: DateTime.now - 1, to: DateTime.now)
22
+ generate_datetime
21
23
  when :date
22
- Faker::Date.between(from: Date.today - 2, to: Date.today)
24
+ generate_date
23
25
  when :time, :timetz
24
- Faker::Time.forward(days: 23, period: :morning)
26
+ generate_time
25
27
  when :boolean
26
- Faker::Boolean.boolean
28
+ generate_boolean
27
29
  when :json, :jsonb
28
- { "value" => { "key1" => Faker::Lorem.word, "key2" => Faker::Number.number(digits: 2) } }
30
+ generate_json
29
31
  when :inet
30
- Faker::Internet.ip_v4_address
32
+ generate_inet
31
33
  when :cidr, :macaddr
32
- Faker::Internet.mac_address
34
+ generate_macaddr
33
35
  when :bytea
34
- Faker::Internet.password
36
+ generate_bytea
35
37
  when :bit, :bit_varying
36
- ["0","1"].sample
38
+ generate_bit
37
39
  when :money
38
- Faker::Commerce.price.to_s
40
+ generate_money
39
41
  when :hstore
40
- { "value" => { "key1" => Faker::Lorem.word, "key2" => Faker::Number.number(digits: 2) } }
42
+ generate_hstore
41
43
  when :year
42
- rand(1901..2155)
44
+ generate_year
43
45
  else
44
46
  raise UnknownColumnTypeError, "Unknown column type: #{@column.type}"
45
47
  end
46
48
  end
49
+
50
+ private
51
+
52
+ def generate_string
53
+ Faker::Lorem.word
54
+ end
55
+
56
+ def generate_uuid
57
+ SecureRandom.uuid
58
+ end
59
+
60
+ def generate_integer
61
+ Faker::Number.number(digits: 5)
62
+ end
63
+
64
+ def generate_decimal
65
+ Faker::Number.decimal(l_digits: 2, r_digits: 2)
66
+ end
67
+
68
+ def generate_datetime
69
+ Faker::Time.between(from: DateTime.now - 1, to: DateTime.now)
70
+ end
71
+
72
+ def generate_date
73
+ Faker::Date.between(from: Date.today - 2, to: Date.today)
74
+ end
75
+
76
+ def generate_time
77
+ Faker::Time.forward(days: 23, period: :morning)
78
+ end
79
+
80
+ def generate_boolean
81
+ Faker::Boolean.boolean
82
+ end
83
+
84
+ def generate_json
85
+ { "value" => { "key1" => Faker::Lorem.word, "key2" => Faker::Number.number(digits: 2) } }
86
+ end
87
+
88
+ def generate_inet
89
+ Faker::Internet.ip_v4_address
90
+ end
91
+
92
+ def generate_macaddr
93
+ Faker::Internet.mac_address
94
+ end
95
+
96
+ def generate_bytea
97
+ Faker::Internet.password
98
+ end
99
+
100
+ def generate_bit
101
+ %w[0 1].sample
102
+ end
103
+
104
+ def generate_money
105
+ Faker::Commerce.price.to_s
106
+ end
107
+
108
+ def generate_hstore
109
+ { "value" => { "key1" => Faker::Lorem.word, "key2" => Faker::Number.number(digits: 2) } }
110
+ end
111
+
112
+ def generate_year
113
+ rand(1901..2155)
114
+ end
47
115
  end
48
116
  end
49
- end
117
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Seedie
2
4
  module FieldValues
3
5
  class FakerBuilder
@@ -10,15 +12,18 @@ module Seedie
10
12
  @class_prefix = ""
11
13
  @method_prefix = ""
12
14
  @options = ""
15
+ @seedie_config_custom_attributes = Seedie.configuration.custom_attributes
13
16
  end
14
17
 
15
18
  def build_faker_constant
19
+ return @seedie_config_custom_attributes[@name.to_sym] if @seedie_config_custom_attributes.key?(@name.to_sym)
20
+
16
21
  @unique_prefix = "unique." if has_validation?(:uniqueness)
17
-
22
+
18
23
  add_faker_class_and_method(@column.type)
19
-
24
+
20
25
  if has_validation?(:inclusion)
21
- handle_inclusion_validation
26
+ handle_inclusion_validation
22
27
  else
23
28
  @options += handle_numericality_validation if has_validation?(:numericality)
24
29
  @options += handle_length_validation if has_validation?(:length)
@@ -37,58 +42,46 @@ module Seedie
37
42
  def add_faker_class_and_method(type)
38
43
  case type
39
44
  when :string, :text, :citext
40
- @class_prefix = "Lorem."
41
- @method_prefix = "word"
45
+ set_faker("Lorem.", "word")
42
46
  when :uuid
43
- @class_prefix = "Internet."
44
- @method_prefix = "uuid"
47
+ set_faker("Internet.", "uuid")
45
48
  when :integer, :bigint, :smallint
46
- @class_prefix = "Number."
47
- @method_prefix = "number"
48
- @options = "(digits: 5)"
49
+ set_faker("Number.", "number", "(digits: 5)")
49
50
  when :decimal, :float, :real
50
- @class_prefix = "Number."
51
- @method_prefix = "decimal"
52
- @options = "(l_digits: 2, r_digits: 2)"
51
+ set_faker("Number.", "decimal", "(l_digits: 2, r_digits: 2)")
53
52
  when :datetime, :timestamp, :timestamptz, :time, :timetz
54
- @class_prefix = "Time."
55
- @method_prefix = "between"
56
- @options = "(from: DateTime.now - 1, to: DateTime.now)"
53
+ set_faker("Time.", "between", "(from: DateTime.now - 1, to: DateTime.now)")
57
54
  when :date
58
- @class_prefix = "Date."
59
- @method_prefix = "between"
60
- @options = "(from: Date.today - 1, to: Date.today)"
55
+ set_faker("Date.", "between", "(from: Date.today - 1, to: Date.today)")
61
56
  when :boolean
62
- @class_prefix = "Boolean."
63
- @method_prefix = "boolean"
57
+ set_faker("Boolean.", "boolean")
64
58
  when :json, :jsonb
65
59
  @faker_expression = { "value" => "Json.shallow_json(width: 3, options: { key: 'Name.first_name', value: 'Number.number(digits: 2)' })" }
66
60
  when :inet
67
- @class_prefix = "Internet."
68
- @method_prefix = "ip_v4_address"
61
+ set_faker("Internet.", "ip_v4_address")
69
62
  when :cidr, :macaddr
70
- @class_prefix = "Internet."
71
- @method_prefix = "mac_address"
63
+ set_faker("Internet.", "mac_address")
72
64
  when :bytea
73
- @class_prefix = "Internet."
74
- @method_prefix = "password"
65
+ set_faker("Internet.", "password")
75
66
  when :bit, :bit_varying
76
- @class_prefix = "Internet."
77
- @method_prefix = "password"
67
+ set_faker("Internet.", "password")
78
68
  when :money
79
- @class_prefix = "Commerce."
80
- @method_prefix = "price.to_s"
69
+ set_faker("Commerce.", "price.to_s")
81
70
  when :hstore
82
71
  @faker_expression = { "value" => "Json.shallow_json(width: 3, options: { key: 'Name.first_name', value: 'Number.number(digits: 2)' })" }
83
72
  when :year
84
- @class_prefix = "Number."
85
- @method_prefix = "number"
86
- @options = "(digits: 4)"
73
+ set_faker("Number.", "number", "(digits: 4)")
87
74
  else
88
75
  raise UnknownColumnTypeError, "Unknown column type: #{type}"
89
76
  end
90
77
  end
91
78
 
79
+ def set_faker(class_prefix, method_prefix, options = "")
80
+ @class_prefix = class_prefix
81
+ @method_prefix = method_prefix
82
+ @options = options
83
+ end
84
+
92
85
  def has_validation?(kind)
93
86
  @validations.any? { |validation| validation.kind == kind }
94
87
  end
@@ -129,7 +122,8 @@ module Seedie
129
122
  @method_prefix = ""
130
123
  @options = ""
131
124
  if options[:in].is_a?(Range)
132
- @faker_expression = { "values" => { "start" => options[:in].first, "end" => options[:in].last }, "options" => { "pick_strategy" => "random" } }
125
+ @faker_expression = { "values" => { "start" => options[:in].first, "end" => options[:in].last },
126
+ "options" => { "pick_strategy" => "random" } }
133
127
  else
134
128
  @faker_expression = { "values" => options[:in], "options" => { "pick_strategy" => "random" } }
135
129
  end