Metadata associated to objects like MiGA::Project, MiGA::Dataset, and MiGA::Result.
Path to the JSON file describing the metadata
Hash (Integer) of the last saved data Hash (object)
Does the metadata described in path
already exist?
# File lib/miga/metadata.rb, line 12 def self.exist?(path) File.exist? path end
Load the metadata described in path
and return MiGA::Metadata if it exists, or nil otherwise.
# File lib/miga/metadata.rb, line 17 def self.load(path) return nil unless Metadata.exist? path MiGA::Metadata.new(path) end
Initiate a MiGA::Metadata object with
description in path
. It will create it if it doesn't
exist.
# File lib/miga/metadata.rb, line 36 def initialize(path, defaults = {}) @data = nil @path = File.absolute_path(path) @saved_hash = nil unless File.exist? path @data = {} defaults.each { |k, v| self[k] = v } create end end
Return the value of k
in data
# File lib/miga/metadata.rb, line 118 def [](k) if k.to_s =~ /^([^:]+):(.+)$/ data[$1.to_sym]&.fetch($2) else data[k.to_sym] end end
Set the value of k
to v
# File lib/miga/metadata.rb, line 128 def []=(k, v) self.load if @data.nil? k = k.to_sym return @data.delete(k) if v.nil? case k when :name # Protect the special field :name v = v.miga_name when :type # Symbolize the special field :type v = v.to_sym if k == :type end @data[k] = v end
Reset :created field and save the current data
# File lib/miga/metadata.rb, line 56 def create self[:created] = Time.now.to_s save end
Time of creation
# File lib/miga/metadata.rb, line 159 def created Time.parse(self[:created]) unless self[:created].nil? end
Parsed data as a Hash
# File lib/miga/metadata.rb, line 49 def data self.load if @data.nil? @data end
Iterate blk
for each data with 2 arguments: key and value
# File lib/miga/metadata.rb, line 147 def each(&blk) data.each { |k, v| blk.call(k, v) } end
(Re-)load metadata stored in path
# File lib/miga/metadata.rb, line 94 def load wait_for_lock tmp = MiGA::Json.parse(path, additions: true) @data = {} tmp.each { |k, v| self[k] = v } @saved_hash = data.hash end
Lock file for the metadata
# File lib/miga/metadata.rb, line 112 def lock_file "#{path}.lock" end
Delete file at path
# File lib/miga/metadata.rb, line 104 def remove! MiGA.DEBUG "Metadata.remove! #{path}" File.unlink(path) if File.exist?(path) nil end
Save the metadata into path
# File lib/miga/metadata.rb, line 63 def save return if self[:never_save] return if !saved_hash.nil? && saved_hash == data.hash MiGA::MiGA.DEBUG "Metadata.save #{path}" path_tmp = "#{path}.tmp" self[:updated] = Time.now.to_s @saved_hash = data.hash json = to_json wait_for_lock FileUtils.touch(lock_file) File.open(path_tmp, 'w') { |ofh| ofh.puts json } unless File.exist?(path_tmp) && File.exist?(lock_file) raise "Lock-racing detected for #{path}" end File.rename(path_tmp, path) File.unlink(lock_file) end
Force save
even if nothing has changed since the last save or
load. However, it doesn't save if :never_save
is true.
# File lib/miga/metadata.rb, line 87 def save! @saved_hash = nil save end
Show contents in JSON format as a String
# File lib/miga/metadata.rb, line 165 def to_json MiGA::Json.generate(data) end
Time of last update
# File lib/miga/metadata.rb, line 153 def updated Time.parse(self[:updated]) unless self[:updated].nil? end