class FilePathGenerator

Public Class Methods

new(max_entries_per_dir = 10_000) click to toggle source
# File lib/file_path_generator.rb, line 4
def initialize(max_entries_per_dir = 10_000)
  @max_entries_per_dir = max_entries_per_dir
  @entry_counts = [0]
  @dir_mask = "%0#{max_entries_per_dir.to_s.length}d"
end

Public Instance Methods

increment_dir_counter(dir_depth = 0) click to toggle source
# File lib/file_path_generator.rb, line 20
def increment_dir_counter(dir_depth = 0)
  if dir_depth > (@entry_counts.size - 1)
    @entry_counts << 2
    indent_dirs
    return
  end

  @entry_counts[dir_depth] += 1

  if @entry_counts[dir_depth] > @max_entries_per_dir
    @entry_counts[dir_depth] = 1
    increment_dir_counter(dir_depth + 1)
  end
end
indent_dirs() click to toggle source
# File lib/file_path_generator.rb, line 36
def indent_dirs
  tmp_dir_name = "tmp_#{@entry_counts.size}"
  FileUtils.mkdir tmp_dir_name
  Dir.entries(".").each do |existing_dir|
    next if existing_dir =~ %r(\.\.?)
    next if existing_dir == tmp_dir_name
    FileUtils.mv existing_dir, tmp_dir_name
  end
  new_dir_name = @dir_mask % [0]
  FileUtils.mv tmp_dir_name, new_dir_name
end
path_for_new_file(file_name) click to toggle source
# File lib/file_path_generator.rb, line 10
def path_for_new_file(file_name)
  increment_dir_counter
  return file_name if @entry_counts.size == 1

  dir_paths = @entry_counts[1..-1].reverse.map{|n| @dir_mask % [n - 1] }
  dir_path = File.join(".", *dir_paths)
  FileUtils.mkdir_p(dir_path)
  File.join(dir_path, file_name)
end
to_s() click to toggle source
# File lib/file_path_generator.rb, line 48
def to_s
  "[ #{@entry_counts.join(',')} ]"
end