class Mortar::YamlFile

Reads YAML files and optionally performs ERB evaluation

Constants

ParseError

Attributes

content[R]
filename[R]

Public Class Methods

new(input, override_filename: nil) click to toggle source

@param input [String,IO] A IO/File object, a path to a file or string content @param override_filename [String] use string as the filename for parse errors

# File lib/mortar/yaml_file.rb, line 24
def initialize(input, override_filename: nil)
  @filename = override_filename
  if input.respond_to?(:read)
    @content = input.read
    @filename ||= input.respond_to?(:path) ? input.path : input.to_s
  else
    @filename ||= input.to_s
    @content = File.read(input)
  end
end

Public Instance Methods

basename() click to toggle source
# File lib/mortar/yaml_file.rb, line 51
def basename
  File.basename(@filename)
end
dirname() click to toggle source
# File lib/mortar/yaml_file.rb, line 47
def dirname
  File.dirname(@filename)
end
load(variables = {}) click to toggle source

@return [Array<Hash>]

# File lib/mortar/yaml_file.rb, line 36
def load(variables = {})
  result = YAML.load_stream(read(variables), @filename)
  if result.is_a?(String)
    raise ParseError, "File #{"#{@filename} " if @filename}does not appear to be in YAML format"
  end

  result
rescue Psych::SyntaxError => e
  raise ParseError, e.message
end
read(variables = {}) click to toggle source
# File lib/mortar/yaml_file.rb, line 55
def read(variables = {})
  Namespace.new(variables).with_binding do |ns_binding|
    ERB.new(@content, nil, '-').tap { |e| e.location = [@filename, nil] }.result(ns_binding)
  end
rescue StandardError, ScriptError => e
  raise ParseError, "#{e.class.name} : #{e.message} (#{e.backtrace.first.gsub(/:in `with_binding'/, '')})"
end