The result from a task run. It can be project-wide or dataset-specific.
Hash with the result metadata
# File lib/miga/result/base.rb, line 3 def RESULT_DIRS @@RESULT_DIRS ||= MiGA::Dataset.RESULT_DIRS.merge(MiGA::Project.RESULT_DIRS) end
Check if path describes a result and otherwise create it using
the passed block. If force, ignore existing JSON in
path if any, but it can rescue the versions field from the
old one if it exists and the new one doesn't contain such field.
# File lib/miga/result.rb, line 39 def create(path, force = false) # Deal with old results first r_old = load(path) return r_old if r_old && !force # Create the new result using the block passed FileUtils.rm(path) if r_old yield # Load and return load(path).tap do |r_new| # Rescue versions and start (if any and if necessary) if r_old %[versions started].each { |i| r_new[i] ||= r_old[i] } r_new[:versions] = (r_old[:versions] || {}).merge(r_new[:versions]) end end end
Check if the result described by the JSON in path already
exists
# File lib/miga/result.rb, line 20 def exist?(path) File.exist? path end
Load the result described by the JSON in path. Returns MiGA::Result if it already exists, nil otherwise.
# File lib/miga/result.rb, line 27 def load(path) return nil unless MiGA::Result.exist? path MiGA::Result.new(path) end
Load or create the MiGA::Result described by the
JSON file path
# File lib/miga/result.rb, line 67 def initialize(path) @path = File.absolute_path(path) MiGA::Result.exist?(@path) ? load : create end
Entry with symbol k
# File lib/miga/result.rb, line 137 def [](k) data[k.to_sym] end
Adds value v to entry with symbol k
# File lib/miga/result.rb, line 143 def []=(k, v) data[k.to_sym] = v end
Register file (path relative to dir) with the symbol k. If
the file doesn't exist but the .gz extension does, the gzipped file is
registered instead. If neither exists, nothing is registered.
# File lib/miga/result.rb, line 151 def add_file(k, file) k = k.to_sym @data[:files] ||= {} @data[:files][k] = file if File.exist? File.expand_path(file, dir) @data[:files][k] = "#{file}.gz" if File.exist? File.expand_path("#{file}.gz", dir) end
#add_file for each key-value
pair in the files Hash
# File lib/miga/result.rb, line 161 def add_files(files) files.each { |k, v| add_file(k, v) } end
Register the result as cleaned, returns self
# File lib/miga/result.rb, line 80 def clean! self[:clean] = true self end
Is the result clean? Returns Boolean
# File lib/miga/result.rb, line 74 def clean? !!self[:clean] end
Initialize and save empty result
# File lib/miga/result.rb, line 167 def create @data = { created: Time.now.to_s, stats: {}, files: {}, versions: { 'MiGA' => MiGA::VERSION.join('.') } } save end
Directory containing the result; by default an absolute path, if
relative is true returns the path relative to the parent
project
# File lib/miga/result.rb, line 119 def dir(relative = false) relative ? relative_dir : File.dirname(path) end
Iterate blk for each registered file. Depending on the number
of arguments of blk (arity), it's called as:
blk[file_sym, file_rel]
blk[file_sym, file_rel, file_abs]
Note that multiple files may have the same symbol (file_sym), since arrays of files are supported.
# File lib/miga/result.rb, line 219 def each_file(&blk) return to_enum(:each_file) unless block_given? @data[:files] ||= {} self[:files].each do |k, files| files = [files] unless files.is_a? Array files.each do |file| case blk.arity when 1 then blk.call(file) when 2 then blk.call(k, file) when 3 then blk.call(k, file, File.expand_path(file, dir)) else raise "Wrong number of arguments: #{blk.arity} for 1..3" end end end end
Absolute path to the file(s) defined by symbol k, or relative
path if relative is true
# File lib/miga/result.rb, line 126 def file_path(k, relative = false) k = k.to_sym f = self[:files].nil? ? nil : self[:files][k] return nil if f.nil? return File.join(dir(relative), f) unless f.is_a? Array f.map { |fi| File.join(dir(relative), fi) } end
Load (or reload) result data in the JSON file path
# File lib/miga/result.rb, line 191 def load @data = MiGA::Json.parse(path) @data[:files] ||= {} end
Path to the standard files of the result. which must be one
of:
:json (default) : JSON file describing the result.
:start : File with the date when the processing started.
:done : File with the date when the processing ended.
# File lib/miga/result.rb, line 105 def path(which = :json) case which.to_sym when :json @path when :start @path.sub(/\.json$/, '.start') when :done @path.sub(/\.json$/, '.done') end end
Mark the result to be recalculated, returns self
# File lib/miga/result.rb, line 93 def recalculate!(reason = nil) self[:recalculate] = true self[:recalculate_why] = reason self[:recalculate_when] = Time.now.to_s self end
Is the result marked to be recalculated? Returns Boolean
# File lib/miga/result.rb, line 87 def recalculate? !!self[:recalculate] end
Remove result, including all associated files
# File lib/miga/result.rb, line 198 def remove! each_file { |file| FileUtils.rm_rf(File.join(dir, file)) } unlink end
Save the result persistently (in the JSON file path)
# File lib/miga/result.rb, line 178 def save @data[:updated] = Time.now.to_s s = path(:start) if File.exist? s @data[:started] = File.read(s).chomp File.unlink s end MiGA::Json.generate(data, path) load end
Unlink result by removing the .done and .start timestamps and the .json descriptor, but don't remove any other associated files
# File lib/miga/result.rb, line 205 def unlink %[start done json].each do |i| f = path(i) and File.exist?(f) and File.unlink(f) end end