Class: FakedCSV::Generator
- Inherits:
-
Object
- Object
- FakedCSV::Generator
- Defined in:
- lib/faked_csv/generator.rb
Instance Attribute Summary collapse
-
#config ⇒ Object
readonly
Returns the value of attribute config.
-
#rows ⇒ Object
readonly
Returns the value of attribute rows.
Class Method Summary collapse
- .fake(type) ⇒ Object
-
.rand_char(length) ⇒ Object
individual random generators.
- .rand_float(min, max, precision) ⇒ Object
- .rand_formatted_char(format) ⇒ Object
- .rand_int(min, max) ⇒ Object
- .single_rand_char(format) ⇒ Object
Instance Method Summary collapse
- #_loop ⇒ Object
- #_random_distribution(total, parts) ⇒ Object
-
#_random_inject(values, injects) ⇒ Object
inject <injects> into <values>.
- #_random_value(field) ⇒ Object
- #generate ⇒ Object
- #headers ⇒ Object
-
#initialize(config) ⇒ Generator
constructor
A new instance of Generator.
- #prepare_values ⇒ Object
Constructor Details
#initialize(config) ⇒ Generator
Returns a new instance of Generator.
5 6 7 |
# File 'lib/faked_csv/generator.rb', line 5 def initialize(config) @config = config end |
Instance Attribute Details
#config ⇒ Object (readonly)
Returns the value of attribute config.
3 4 5 |
# File 'lib/faked_csv/generator.rb', line 3 def config @config end |
#rows ⇒ Object (readonly)
Returns the value of attribute rows.
3 4 5 |
# File 'lib/faked_csv/generator.rb', line 3 def rows @rows end |
Class Method Details
.fake(type) ⇒ Object
220 221 222 |
# File 'lib/faked_csv/generator.rb', line 220 def self.fake(type) Fakerer.new(type).fake end |
.rand_char(length) ⇒ Object
individual random generators
170 171 172 173 |
# File 'lib/faked_csv/generator.rb', line 170 def self.rand_char(length) o = [('a'..'z'), ('A'..'Z'), (0..9)].map { |i| i.to_a }.flatten string = (0...length).map { o[rand(o.length)] }.join end |
.rand_float(min, max, precision) ⇒ Object
215 216 217 218 |
# File 'lib/faked_csv/generator.rb', line 215 def self.rand_float(min, max, precision) raise "min > max" if min > max (rand * (max - min) + min).round(precision) end |
.rand_formatted_char(format) ⇒ Object
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
# File 'lib/faked_csv/generator.rb', line 175 def self.rand_formatted_char(format) res = [] i = 0 while i < format.size case a = format[i] when '/' i += 1 res << single_rand_char(format[i]) else res << a end i += 1 end return res.join("") end |
.rand_int(min, max) ⇒ Object
210 211 212 213 |
# File 'lib/faked_csv/generator.rb', line 210 def self.rand_int(min, max) raise "min > max" if min > max min + rand(max - min + 1) end |
.single_rand_char(format) ⇒ Object
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
# File 'lib/faked_csv/generator.rb', line 191 def self.single_rand_char(format) aa = nil case format when 'W' # A-Z aa = ('A'..'Z').to_a when 'w' # a-z aa = ('a'..'z').to_a when 'd' # 0-9 aa = (0..9).to_a when 'D' # A-Za-z aa = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten when '@' aa = [('a'..'z'), ('A'..'Z'), (0..9)].map { |i| i.to_a }.flatten else raise "invalid format: #{format} in single_rand_char" end return aa[rand(aa.size)] end |
Instance Method Details
#_loop ⇒ Object
158 159 160 161 162 163 164 165 166 |
# File 'lib/faked_csv/generator.rb', line 158 def _loop max_attempts = 1000_000_000_000 i = 0 (0...max_attempts).each do |j| yield i += 1 end raise "max attempts reached" if i == max_attempts end |
#_random_distribution(total, parts) ⇒ Object
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/faked_csv/generator.rb', line 100 def _random_distribution(total, parts) raise "parts has to be greater than 0" unless parts > 0 raise "parts should not be greater than total" if total < parts cuts = {} _loop do break if cuts.size == parts - 1 cuts[rand(total - 1)] = true end arr = [] part_index = 0 (0...total).each do |i| arr << part_index part_index += 1 if cuts.has_key? i end arr.shuffle.each_with_index do |v, i| yield(i, v) end end |
#_random_inject(values, injects) ⇒ Object
inject <injects> into <values>
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/faked_csv/generator.rb', line 120 def _random_inject(values, injects) used_indexes = {} count = injects.size > values.size ? values.size : injects.size (0...count).each do |i| inj = injects[i] times_inject = rand(values.size / injects.size / 10) times_inject = 1 if times_inject < 1 times_inject.times do rand_index = rand(values.size) _loop do break unless used_indexes.has_key? rand_index rand_index = rand(values.size) end used_indexes[rand_index] = true values[rand_index] = inj end end end |
#_random_value(field) ⇒ Object
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/faked_csv/generator.rb', line 139 def _random_value(field) case field[:type] when :rand_int return Generator.rand_int field[:min], field[:max] when :rand_float return Generator.rand_float field[:min], field[:max], field[:precision] when :rand_char if field[:format].nil? return Generator.rand_char field[:length] else return Generator.rand_formatted_char field[:format] end when :fixed return field[:values].sample else # faker return Generator.fake field[:type] end end |
#generate ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/faked_csv/generator.rb', line 26 def generate puts "preparing values ..." prepare_values @config.fields.each do |field| puts "generating random data for #{field} ..." field[:data] = [] # let's get some data! if field[:type] == :inc_int puts "generating increment values ..." i = field[:start] @config.row_count.times do field[:data] << i i += field[:step] end elsif field[:rotate].nil? || field[:type] == :fixed # not rotating? or fixed values? generate random value each time puts "calling generator ..." @config.row_count.times do field[:data] << _random_value(field) end # inject user values if given and not fixed type puts "injecting values ..." unless field[:type] == :fixed || field[:inject].nil? _random_inject(field[:data], field[:inject]) end else # rotating? pick from prepared values puts "selecting data from rotation ..." _random_distribution(@config.row_count, field[:values].size) do |i, j| field[:data][i] = field[:values][j] end end end end |
#headers ⇒ Object
9 10 11 |
# File 'lib/faked_csv/generator.rb', line 9 def headers @config.headers end |
#prepare_values ⇒ Object
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/faked_csv/generator.rb', line 64 def prepare_values @config.fields.each do |field| puts "prepare value for #{field} ..." # if it's fixed values or no rotate # we don't want to prepare values for this field if [:inc_int, :fixed].include?(field[:type]) || field[:rotate].nil? next end # we don't have enough integers for the rotate if field[:type] == :rand_int && field[:rotate] > field[:max] - field[:min] + 1 raise "rotate should not be greater than the size of the range" end values = {} # let's first inject all user values if given puts "injecting user values ..." unless field[:inject].nil? field[:inject].each do |inj| values[inj] = true # truncate more inject values if we go over the rows count break if values.size == @config.row_count end end # then generate as many data as we need puts "looping to get enough values ..." _loop do # we want to get <rotate> unique values. stop when we got enough break if values.size >= field[:rotate] v = _random_value(field) values[v] = true end field[:values] = values.keys end end |