module KeyTree

Manage a tree of keys

Example:

kt=KeyTree[a: 1, b: { c: 2 }]
kt["a"]
-> 1
kt["b.c"]
-> 2

Constants

VERSION

Public Class Methods

[](contents = {}) click to toggle source
# File lib/key_tree.rb, line 21
def [](contents = {})
  contents.to_key_wood
end
load(type, serialization, prefix: nil) click to toggle source

Load a KeyTree from some external serialization

load type: serialization load key_prefix, type: serialization

type is upcased to form a class name that should provide a .load class method (like YAML or JSON does).

If a key_prefix is given, it will be prepended to the loaded data.

Examples:

load(:yaml, "---\na: 1\n")

> {“a” => 1}

load(:yaml, "---\nb: 2\n", prefix: 'a')

> {“a.b” => 2}

# File lib/key_tree.rb, line 42
def load(type, serialization, prefix: nil)
  type = type.to_sym unless type.nil?
  loader = Loader[type]
  contents = loader.load(serialization)
  contents = { prefix => contents } unless prefix.nil?

  contents.to_key_wood.with_meta_data do |meta_data|
    meta_data << { load: { type: type, loader: loader } }
    meta_data << { load: { prefix: prefix } } unless prefix.nil?
  end
end
open(file_name) { |keytree| ... } click to toggle source

Open an external file and load contents into a KeyTree When the file basename begins with 'prefix@', the prefix is prepended to all keys in the filee.

# File lib/key_tree.rb, line 57
def open(file_name)
  type = File.extname(file_name)[/[^.]+/]
  prefix = File.basename(file_name)[/(.+)@/, 1]

  keytree = File.open(file_name, mode: 'rb:utf-8') do |file|
    load_from_file(file, type, prefix)
  end

  return keytree unless block_given?

  yield keytree
end
open_all(dir_name, follow_links: false, recurse: false) click to toggle source

Open all files in a directory and load their contents into a Forest of Trees, optionally following symlinks, and recursing.

# File lib/key_tree.rb, line 72
def open_all(dir_name, follow_links: false, recurse: false)
  Dir.children(dir_name).reduce(KeyTree::Forest.new) do |result, file|
    path = File.join(dir_name, file)
    next result if File.symlink?(path) && !follow_links

    stat = File.stat(path)
    # rubocop:disable Security/Open
    next result << open(path) if stat.file?
    # rubocop:enable Security/Open
    next result unless recurse && stat.directory?

    result << open_all(path, follow_links: follow_links, recurse: true)
  end
end

Private Class Methods

load_from_file(file, type, prefix) click to toggle source
# File lib/key_tree.rb, line 89
def load_from_file(file, type, prefix)
  load(type, file.read, prefix: prefix).with_meta_data do |meta_data|
    file_path = file.path
    meta_data << { file: { path: file_path,
                           name: File.basename(file_path),
                           dir: File.dirname(file_path) } }
  end
end