module Synthetic

Public Class Methods

generate(rules_file) click to toggle source
# File lib/synthetic/data.rb, line 11
def self.generate(rules_file)

    Faker::Config.locale = 'en-CA'

    definition = YAML.load_file(rules_file)
    
    headers = []
    for field in definition['fields'].keys do
        headers.push(field)
    end
    
    options = {
        :write_headers => true,
        :headers => headers.join(',')
    }
    
    start = Time.now.to_i
    
    CSV.open(definition['output'], "wb", options) do |csv|
    
        for i in 1..definition['records'] do
    
            row = []
            for f in definition['fields'].keys do
                field = definition['fields'][f]
    
                type = field['type'].split '.'
    
                args = {}
                for key in field.keys do
                    if not ['type','unique'].include? key then
    
                        if field[key].is_a? String and field[key].start_with? '@' then
                            args[:"#{key}"] = row[headers.index(field[key][1..-1])]
                        else
                            args[:"#{key}"] = field[key]
                        end
                    end
                end
    
                obj = Faker.const_get(type[0])
                if field['unique'] then
                    obj = obj.public_send('unique')
                end
    
                if field.keys.length == 1 then
                    row.push(obj.public_send(type[1]))
                else
                    row.push(obj.public_send(type[1], args))
                end
            end
            csv.puts(row)
    
            if i % 1000 == 0 then
                elapsed = Time.now.to_i - start
                puts("Completed #{i} records.  Total elapsed #{elapsed} seconds.")
            end
        end
    end
    
    print "CSV file written (#{definition['output']})"
end