class MiGA::Metadata

Metadata associated to objects like MiGA::Project, MiGA::Dataset, and MiGA::Result.

Attributes

path[R]

Path to the JSON file describing the metadata

saved_hash[R]

Hash (Integer) of the last saved data Hash (object)

Public Class Methods

exist?(path) click to toggle source

Does the metadata described in path already exist?

# File lib/miga/metadata.rb, line 12
def self.exist?(path) File.exist? path end
load(path) click to toggle source

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
new(path, defaults = {}) click to toggle source

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

Public Instance Methods

[](k) click to toggle source

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
[]=(k, v) click to toggle source

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
create() click to toggle source

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
created() click to toggle source

Time of creation

# File lib/miga/metadata.rb, line 159
def created
  Time.parse(self[:created]) unless self[:created].nil?
end
data() click to toggle source

Parsed data as a Hash

# File lib/miga/metadata.rb, line 49
def data
  self.load if @data.nil?
  @data
end
each(&blk) click to toggle source

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
load() click to toggle source

(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() click to toggle source

Lock file for the metadata

# File lib/miga/metadata.rb, line 112
def lock_file
  "#{path}.lock"
end
remove!() click to toggle source

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() click to toggle source

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
save!() click to toggle source

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
to_json() click to toggle source

Show contents in JSON format as a String

# File lib/miga/metadata.rb, line 165
def to_json
  MiGA::Json.generate(data)
end
updated() click to toggle source

Time of last update

# File lib/miga/metadata.rb, line 153
def updated
  Time.parse(self[:updated]) unless self[:updated].nil?
end