class Filecamo::Generator

Attributes

stats[R]

Public Class Methods

new(logger: Logger.new($stdout), txt_workers: {count: 4, queue_size: 5000}, bin_workers: {count: 4, queue_size: 5000}) click to toggle source
# File lib/filecamo/generator.rb, line 10
def initialize(logger: Logger.new($stdout),
               txt_workers: {count: 4, queue_size: 5000},
               bin_workers: {count: 4, queue_size: 5000})
  @gen = Random.new
  @logger = logger
  @words_generated = {}
  @stats = {txt: 0, bin: 0}

  @txt_work_q = SizedQueue.new(txt_workers[:queue_size])
  @txt_workers = start_workers(:txt, @txt_work_q, txt_workers[:count]) do |file, len|
    while len > 0
      line = (LiterateRandomizer.sentence + $/)
      line.slice!(len..-1)
      len -= file.write(line)
    end
    @stats[:txt] += 1
  end

  @bin_work_q = SizedQueue.new(bin_workers[:queue_size])
  @bin_workers = start_workers(:bin, @bin_work_q, bin_workers[:count]) do |file, len|
    while len > 0
      len -= file.write(@gen.bytes(len < 32768 ? len : 32768))
    end
    @stats[:bin] += 1
  end
end

Public Instance Methods

generate(min, max, count, depth, percent_text: 0, destination_path: nil, &block) click to toggle source
# File lib/filecamo/generator.rb, line 39
def generate(min, max, count, depth, percent_text: 0, destination_path: nil, &block)
  min = BetterBytes.dehumanize(min)
  max = BetterBytes.dehumanize(max)
  count = count.to_i
  depth = depth.to_i
  percent_text = percent_text.to_f / 100
  dst_pn = Pathname.new(destination_path || '.')
  feed_workers(min, max, count, depth, percent_text, dst_pn, &block)
end
kill() click to toggle source
# File lib/filecamo/generator.rb, line 57
def kill
  (@txt_workers + @bin_workers).each{|th| th.kill}
  ThreadsWait.all_waits(@txt_workers + @bin_workers) do |th|
    th.join
  end
end
wait(sleep_interval: 0.3) { |size, size| ... } click to toggle source
# File lib/filecamo/generator.rb, line 49
def wait(sleep_interval: 0.3)
  until @txt_work_q.empty? && @bin_work_q.empty?
    block_given? and
      yield(@txt_work_q.size, @bin_work_q.size)
    sleep(sleep_interval)
  end
end

Private Instance Methods

feed_workers(min, max, count, depth, percent_text, dst_pn) { |fn, len| ... } click to toggle source
# File lib/filecamo/generator.rb, line 85
def feed_workers(min, max, count, depth, percent_text, dst_pn)
  paths = {}

  count.times do |i|
    d = Random.rand(depth)
    if d < 1
      pn = Pathname.new('')
    else
      pn = nil
      pns = paths[d] and pn = pns[@gen.rand(pns.size)]
      unless pn
        pn = Pathname.new(gen_name)
        d.times{ pn += gen_name }
        (paths[d] ||= []) << pn
      end
    end

    fn = dst_pn + pn + (gen_name + (@gen.rand > percent_text ? '.bin' : '.txt'))
    fn.parent.mkpath
    len = @gen.rand(min..max).round

    block_given? and
      yield(fn, len)

    if fn.extname == '.txt'
      @txt_work_q.push([len, fn])
    else
      @bin_work_q.push([len, fn])
    end
  end
end
gen_name() click to toggle source
# File lib/filecamo/generator.rb, line 117
def gen_name
  # guarantee the same capitalization is used for the same word
  word = LiterateRandomizer.word
  lword = word.downcase
  prev_word = @words_generated[lword] and
    return prev_word
  return @words_generated[lword] = word
end
start_workers(name, queue, count) { |file, len| ... } click to toggle source
# File lib/filecamo/generator.rb, line 67
def start_workers(name, queue, count)
  count.times.map do
    Thread.new do
      begin
        loop do
          len, fn = queue.pop
          fn.open('wb') do |file|
            yield file, len
          end
        end
      rescue Exception => ex
        @logger.fatal "#{Thread.current} failed (#{name})"
        @logger.fatal ex
      end
    end
  end
end