class Ki::VersionMetadataFile

Metadata

Public Class Methods

calculate_hashes(full_path, digester_ids) click to toggle source
# File lib/data_storage/version_metadata.rb, line 118
def VersionMetadataFile.calculate_hashes(full_path, digester_ids)
  digesters = {}
  digester_ids.each do |h|
    digesters[h] = KiCommand::KiExtensions.find!(File.join("/hashing", h)).digest
  end
  algos = digesters.values
  File.open(full_path, "r") do |io|
    while (!io.eof)
      buf = io.readpartial(1024)
      algos.each do |digester|
        digester.update(buf)
      end
    end
  end
  digesters.each_pair do |h, digester|
    digesters[h]=digester.hexdigest
  end
  digesters
end

Public Instance Methods

add_dependency(param_str, args={}) click to toggle source

Comma separated list of dependency arguments

  • dependency parameters can be given in the hash

TODO: version_id should be resolved through Version

# File lib/data_storage/version_metadata.rb, line 35
def add_dependency(param_str, args={})
  params = param_str.split(",")
  version_id = params.delete_at(0)
  dep_hash = {"version_id" => version_id}.merge(params.to_h("=")).merge(args)
  if dep_hash["internal"]
    dep_hash["internal"]=true
  end
  dep_hash.extend(DependencyMethods)
  dependencies << dep_hash
  dep_hash
end
add_file(root, full_path, parameters) click to toggle source
# File lib/data_storage/version_metadata.rb, line 77
def add_file(root, full_path, parameters)
  stat = File.stat(full_path)
  size = stat.size
  extra = {}
  if stat.executable?
    extra["executable"]=true
  end
  if parameters["tags"]
    tags = Array(parameters["tags"])
    if tags && tags.size > 0
      extra["tags"]= tags
    end
  end
  if parameters["hashes"].nil?
    parameters["hashes"]=["sha1"]
  end
  if parameters["hashes"].size > 0
    extra.merge!(VersionMetadataFile.calculate_hashes(full_path, parameters["hashes"]))
  end
  add_file_info(full_path[root.size+1..-1], size, extra)
end
add_file_info(name, size, *args) click to toggle source
# File lib/data_storage/version_metadata.rb, line 99
def add_file_info(name, size, *args)
  extra = (args.select { |arg| arg.kind_of?(Hash) }.size!(0..1).first or {})
  tags = (args - [extra]).flatten.uniq
  file_hash = {"path" => name, "size" => size}.merge(extra)
  if tags.size > 0
    file_hash["tags"]=tags
  end
  files.each do |f|
    if f["path"] == name
      if f == file_hash
        return
      else
        raise "'#{name}' has already been added to version, but with different attributes:\n- old: #{f.inspect}\n- new: #{file_hash.inspect}"
      end
    end
  end
  files << file_hash
end
add_files(source, patterns, default_parameters={}) click to toggle source

Processes all files from source that match patterns and for each file calculates hashes and stores tags based on default_parameters

# File lib/data_storage/version_metadata.rb, line 52
def add_files(source, patterns, default_parameters={})
  files_or_dirs = Array(patterns).map do |pattern|
    Dir.glob(File.join(source, pattern))
  end.flatten

  files = []

  files_or_dirs.each do |file_or_dir|
    if File.file?(file_or_dir)
      files << file_or_dir
    else
      Dir.glob(File.join(file_or_dir, "**/*")).each do |file|
        if File.file?(file)
          files << file
        end
      end
    end
  end

  files.sort.each do |file|
    add_file(source, file, default_parameters)
  end
  self
end
add_operation(args) click to toggle source
# File lib/data_storage/version_metadata.rb, line 47
def add_operation(args)
  operations << args
end