Sha256: 78b513d39ce63f373f209b5bc28bcd39492d0654796a7e93a7b2af77acde071b
Contents?: true
Size: 1.79 KB
Versions: 15
Compression:
Stored size: 1.79 KB
Contents
# frozen_string_literal: true module ActiveSupport # Reads a YAML configuration file, evaluating any ERB, then # parsing the resulting YAML. # # Warns in case of YAML confusing characters, like invisible # non-breaking spaces. class ConfigurationFile # :nodoc: class FormatError < StandardError; end def initialize(content_path) @content_path = content_path.to_s @content = read content_path end def self.parse(content_path, **options) new(content_path).parse(**options) end def parse(context: nil, **options) source = @content.include?("<%") ? render(context) : @content if source == @content if YAML.respond_to?(:unsafe_load) YAML.unsafe_load_file(@content_path, **options) || {} else YAML.load_file(@content_path, **options) || {} end else if YAML.respond_to?(:unsafe_load) YAML.unsafe_load(source, **options) || {} else YAML.load(source, **options) || {} end end rescue Psych::SyntaxError => error raise "YAML syntax error occurred while parsing #{@content_path}. " \ "Please note that YAML must be consistently indented using spaces. Tabs are not allowed. " \ "Error: #{error.message}" end private def read(content_path) require "yaml" unless defined?(YAML) File.read(content_path).tap do |content| if content.include?("\u00A0") warn "#{content_path} contains invisible non-breaking spaces, you may want to remove those" end end end def render(context) require "erb" unless defined?(ERB) erb = ERB.new(@content).tap { |e| e.filename = @content_path } context ? erb.result(context) : erb.result end end end
Version data entries
15 entries across 15 versions & 3 rubygems