class Metastore::Cabinet

Attributes

file[R]
separators[R]
storage_type[R]

Public Class Methods

new(file, separators: %w(. /), storage_type: :yaml) click to toggle source
# File lib/metastore/cabinet.rb, line 7
def initialize(file, separators: %w(. /), storage_type: :yaml)
  @file = Pathname.new(file).expand_path
  @separators = separators.map { |x| "\\#{x}" }.join('|')
  @storage_type = storage_type
end

Public Instance Methods

[](key)
Alias for: get
[]=(key, value)
Alias for: set
clear!() click to toggle source
# File lib/metastore/cabinet.rb, line 25
def clear!
  save!({})
end
contents() click to toggle source
# File lib/metastore/cabinet.rb, line 29
def contents
  storage.contents || {}
end
get(key) click to toggle source
# File lib/metastore/cabinet.rb, line 13
def get(key)
  split_key(key).inject(contents) do |c, k|
    c.is_a?(Hash) ? c[k] : nil
  end
end
Also aliased as: []
set(key, value) click to toggle source
# File lib/metastore/cabinet.rb, line 19
def set(key, value)
  current_contents = contents
  set_key_and_value(current_contents, split_key(key), value)
  save!(current_contents)
end
Also aliased as: []=

Private Instance Methods

save!(new_values) click to toggle source
# File lib/metastore/cabinet.rb, line 76
def save!(new_values)
  FileUtils.mkdir_p(file.dirname) unless file.exist?
  storage.save!(new_values)
  true
rescue => e
  raise Errors::CabinetCannotSet, e.message
end
set_key_and_value(input, key, value) click to toggle source
# File lib/metastore/cabinet.rb, line 48
def set_key_and_value(input, key, value)
  current_key = key.shift.to_s
  input[current_key] = {} unless input[current_key]

  if key.empty?
    input[current_key] = stringify_keys(value)
    input
  else
    input[current_key] = {} unless input[current_key].is_a?(Hash)
    set_key_and_value(input[current_key], key, value)
  end
end
split_key(key) click to toggle source
# File lib/metastore/cabinet.rb, line 44
def split_key(key)
  key.to_s.split(Regexp.new(separators))
end
storage() click to toggle source
# File lib/metastore/cabinet.rb, line 40
def storage
  @store || StorageFactory.from_sym(storage_type).new(file)
end
stringify_keys(input) click to toggle source
# File lib/metastore/cabinet.rb, line 61
def stringify_keys(input)
  case input
  when Hash
    Hash[
      input.map do |k, v|
        [ k.respond_to?(:to_s) ? k.to_s : k, stringify_keys(v) ]
      end
    ]
  when Enumerable
    input.map { |v| stringify_keys(v) }
  else
    input.is_a?(Symbol) ? input.to_s : input
  end
end