seedie 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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