class PipeFitter::YamlLoader

Public Class Methods

new() click to toggle source
# File lib/pipe_fitter/yaml_loader.rb, line 8
def initialize
  @search_path = [Pathname.new(".")]
end

Public Instance Methods

include_template(filename, context = {}) click to toggle source
# File lib/pipe_fitter/yaml_loader.rb, line 26
def include_template(filename, context = {})
  path = search_filepath(filename)
  eval_erb(File.read(path), context)
    .gsub("\n", "\n" + " " * (context[:indent] || 0))
end
load(filename) click to toggle source
# File lib/pipe_fitter/yaml_loader.rb, line 12
def load(filename)
  @search_path.unshift(Pathname.new(filename).dirname)
  text = eval_erb(grep_v(filename, /^\s*#/))
  YAML.load(text, aliases: true) || {}
rescue ArgumentError
  YAML.load(text) || {}
rescue Psych::SyntaxError => e
  text.split("\n").each_with_index do |l, i|
    mark = (e.line == i + 1) ? "*" : " "
    $stderr.puts format("%s%4d| %s", mark, i + 1, l)
  end
  raise e
end
search_filepath(filename) click to toggle source
# File lib/pipe_fitter/yaml_loader.rb, line 32
def search_filepath(filename)
  dir = @search_path.find { |p| p.join(filename).exist? }
  if dir
    dir.join(filename)
  elsif File.exists?(filename)
    filename
  end
end

Private Instance Methods

eval_erb(data, context = {}) click to toggle source
# File lib/pipe_fitter/yaml_loader.rb, line 43
def eval_erb(data, context = {})
  ERB.new(data, trim_mode: "-").result(binding).strip
end
grep_v(filename, pattern) click to toggle source
# File lib/pipe_fitter/yaml_loader.rb, line 47
def grep_v(filename, pattern)
  File.open(filename).select { |l| l !~ pattern }.join
end