Class: Ki::VersionMetadataFile

Inherits:
KiJSONHashFile show all
Defined in:
lib/data_storage/version_metadata.rb

Overview

  • fileoperations

Constant Summary

Constants inherited from KiJSONHashFile

KiJSONHashFile::CachedData

Class Method Summary collapse

Instance Method Summary collapse

Methods included from KiEnumerable

#any_matches?, #find_first, #size!, #to_h

Methods inherited from KiJSONFile

#edit_data, #load_data_from_file, load_json, #reset_cached_data, #save, #size

Methods inherited from DirectoryBase

#child, #empty?, #exists?, find!, #go, #init_from_path, #initialize, #ki_path, #mkdir, #name, #path, #root, #root?

Constructor Details

This class inherits a constructor from Ki::DirectoryBase

Class Method Details

.calculate_hashes(full_path, digester_ids) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# 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

Instance Method Details

#add_dependency(param_str, args = {}) ⇒ Object

Comma separated list of dependency arguments

  • dependency parameters can be given in the hash

TODO: version_id should be resolved through Version



35
36
37
38
39
40
41
42
43
44
45
# 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) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# 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) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# 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 = {}) ⇒ Object

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



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 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) ⇒ Object



47
48
49
# File 'lib/data_storage/version_metadata.rb', line 47

def add_operation(args)
  operations << args
end