class DbAgent::Seeder

Attributes

handler[R]

Public Class Methods

new(handler) click to toggle source
# File lib/db_agent/seeder.rb, line 4
def initialize(handler)
  @handler = handler
end

Public Instance Methods

each_seed(install = true) { |self, file| ... } click to toggle source
# File lib/db_agent/seeder.rb, line 70
def each_seed(install = true)
  handler.data_folder.glob('**/*') do |file|
    next unless file.directory?
    next unless (file/"metadata.json").exists?

    base = file.relative_to(handler.data_folder)
    begin
      Seeder.new(handler).install(base)
      puts "#{base} OK"
      yield(self, file) if block_given?
    rescue => ex
      puts "KO on #{file}"
      puts ex.message
    end if install
  end
end
flush(to) click to toggle source
# File lib/db_agent/seeder.rb, line 42
    def flush(to)
      target = (handler.data_folder/to).rm_rf.mkdir_p
      source = (handler.data_folder/"empty")
      (target/"metadata.json").write <<-JSON.strip
        { "inherits": "empty" }
      JSON
      seed_files(source).each do |f|
        flush_seed_file(f, to)
      end
    end
flush_empty(to = "empty") click to toggle source
# File lib/db_agent/seeder.rb, line 32
    def flush_empty(to = "empty")
      target = (handler.data_folder/to).rm_rf.mkdir_p
      (target/"metadata.json").write <<-JSON.strip
        {}
      JSON
      TableOrderer.new(handler).tsort.each_with_index do |table_name, index|
        (target/"#{(index*10).to_s.rjust(5,"0")}-#{table_name}.json").write("[]")
      end
    end
flush_seed_file(f, to) click to toggle source
# File lib/db_agent/seeder.rb, line 53
def flush_seed_file(f, to)
  target = (handler.data_folder/to)
  table = file2table(f)
  flush_table(table, target, f.basename, true)
end
flush_table(table_name, target_folder, file_name, skip_empty) click to toggle source
# File lib/db_agent/seeder.rb, line 59
def flush_table(table_name, target_folder, file_name, skip_empty)
  data = viewpoint.send(table_name.to_sym).to_a
  if data.empty? && skip_empty
    LOGGER.info("Skipping table `#{table_name}` since empty")
  else
    LOGGER.info("Flushing table `#{table_name}`")
    json = JSON.pretty_generate(data)
    (target_folder/file_name).write(json)
  end
end
install(from) click to toggle source
# File lib/db_agent/seeder.rb, line 9
def install(from)
  handler.sequel_db.transaction do
    folder = handler.data_folder/from

    # load files in order
    pairs = merged_data(from)
    names = pairs.keys.sort{|p1,p2|
      pairs[p1].basename <=> pairs[p2].basename
    }

    # Truncate tables then fill them
    names.reverse.each do |name|
      LOGGER.info("Emptying table `#{name}`")
      handler.sequel_db[name.to_sym].delete
    end
    names.each do |name|
      LOGGER.info("Filling table `#{name}`")
      file = pairs[name]
      handler.sequel_db[name.to_sym].multi_insert(file.load)
    end
  end
end

Private Instance Methods

file2table(f) click to toggle source
# File lib/db_agent/seeder.rb, line 112
def file2table(f)
  f.basename.rm_ext.to_s[/^\d+-(.*)/, 1]
end
merged_data(from) click to toggle source
# File lib/db_agent/seeder.rb, line 89
def merged_data(from)
  folder = handler.data_folder/from
  data   = {}

  # load metadata and install parent dataset if any
  metadata = (folder/"metadata.json").load
  if parent = metadata["inherits"]
    data = merged_data(parent)
  end

  seed_files(folder).each do |f|
    data[file2table(f)] = f
  end

  data
end
seed_files(folder) click to toggle source
# File lib/db_agent/seeder.rb, line 106
def seed_files(folder)
  folder
    .glob("*.json")
    .reject{|f| f.basename.to_s =~ /^metadata/ }
end
viewpoint() click to toggle source
# File lib/db_agent/seeder.rb, line 116
def viewpoint
  @viewpoint ||= if vp = ENV['DBAGENT_VIEWPOINT']
    Kernel.const_get(vp).new(handler.sequel_db)
  else
    Viewpoint::Base.new(handler.sequel_db)
  end
end