class AutoSeeding::Source
Constants
- CONSONANTS
- DAY_SECONDS
- MAX_FLOAT
- MAX_INT
- MIN_FLOAT
- MIN_INT
- MONTH_SECONDS
- VOWELS
Public Class Methods
new( column, type, rules, options = {} )
click to toggle source
# File lib/auto-seeding/source.rb, line 13 def initialize( column, type, rules, options = {} ) @column = column @type = type @rules = rules ? rules : {} @options = options || {} if @options[:source_model] && @options[:source_method] @source_class = Object.const_get @options[:source_model] @source_method = @options[:source_method].to_sym @source_args = @options[:source_args] else @source_class = AutoSeeding::Source @source_method = :random_string @source_args = nil end @uniqueness = {} self end
random_boolean()
click to toggle source
# File lib/auto-seeding/source.rb, line 36 def self.random_boolean [false, true].sample end
random_string( words = 10 )
click to toggle source
# File lib/auto-seeding/source.rb, line 40 def self.random_string( words = 10 ) (1..rand(words)+1).map do (0..rand(10)+1).map do |i| i % 2 == 0 ? CONSONANTS.sample : VOWELS.sample end.join end.join( ' ' ).capitalize end
Public Instance Methods
gen()
click to toggle source
# File lib/auto-seeding/source.rb, line 31 def gen @retry = 100 process @type end
Protected Instance Methods
process( type = nil )
click to toggle source
# File lib/auto-seeding/source.rb, line 50 def process( type = nil ) value = if @rules[:equal_to] @rules[:equal_to] elsif @rules[:in] @rules[:in].sample elsif @rules[:accept] @rules[:accept].sample else case type when :float, :decimal min = @rules[:num_gte] ? @rules[:num_gte].to_f : ( @rules[:num_gt] ? ( @rules[:num_gt].to_f + 0.1 ) : MIN_FLOAT ) max = @rules[:num_lte] ? @rules[:num_lte].to_f : ( @rules[:num_lt] ? ( @rules[:num_lt].to_f - 0.1 ) : MAX_FLOAT ) @source_class.send( @source_method, @source_args ? eval( @source_args ) : (min .. max) ) when :integer min = @rules[:num_gte] ? @rules[:num_gte].to_i : ( @rules[:num_gt] ? ( @rules[:num_gt].to_i + 1 ) : MIN_INT ) max = @rules[:num_lte] ? @rules[:num_lte].to_i : ( @rules[:num_lt] ? ( @rules[:num_lt].to_i - 1 ) : MAX_INT ) @source_class.send( @source_method, @source_args ? eval( @source_args ) : (min .. max) ) when :string, :text @source_class.send( @source_method, *@source_args ).to_s else @source_class.send( @source_method, *@source_args ) end end if @options[:post_process] post_process = eval @options[:post_process] value = post_process.call( value ) end # validations case type when :float, :decimal value = ( @rules[:num_gt].to_f + 0.1 ) if @rules[:num_gt] && ( value <= @rules[:num_gt].to_f ) value = @rules[:num_gte].to_f if @rules[:num_gte] && ( value < @rules[:num_gte].to_f ) value = ( @rules[:num_lt].to_f - 0.1 ) if @rules[:num_lt] && ( value >= @rules[:num_lt].to_f ) value = @rules[:num_lte].to_f if @rules[:num_lte] && ( value > @rules[:num_lte].to_f ) when :integer value = ( @rules[:num_gt].to_i + 1 ) if @rules[:num_gt] && ( value <= @rules[:num_gt].to_i ) value = @rules[:num_gte].to_i if @rules[:num_gte] && ( value < @rules[:num_gte].to_i ) value = ( @rules[:num_lt].to_i - 1 ) if @rules[:num_lt] && ( value >= @rules[:num_lt].to_i ) value = @rules[:num_lte].to_i if @rules[:num_lte] && ( value > @rules[:num_lte].to_i ) when :string, :text value = value.ljust( @rules[:length_minimum], '-' ) if @rules[:length_minimum] value = value.slice( 0..( @rules[:length_maximum] - 1 ) ) if @rules[:length_maximum] end if @rules[:not_in] && @rules[:not_in].include?( value ) @retry -= 1 return @retry > 0 ? process( type ) : raise( Exception.new( 'Reserved value' ) ) end if @rules[:uniqueness] @uniqueness[@column] ||= {} if @uniqueness[@column].has_key?( value ) return ( @retry -= 1 ) > 0 ? process( type ) : raise( Exception.new( 'Value already taken' ) ) else @uniqueness[@column][value] = true end end value end