123456789_123456789_123456789_123456789_123456789_

Class: ActiveSupport::ConfigurationFile

Do not use. This class is for internal use only.
Relationships & Source Files
Namespace Children
Exceptions:
Inherits: Object
Defined in: activesupport/lib/active_support/configuration_file.rb

Overview

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 Method Summary

Instance Method Summary

Constructor Details

.new(content_path) ⇒ ConfigurationFile

[ GitHub ]

  
# File 'activesupport/lib/active_support/configuration_file.rb', line 12

def initialize(content_path)
  @content_path = content_path.to_s
  @content = read content_path
end

Class Method Details

.parse(content_path, **options)

[ GitHub ]

  
# File 'activesupport/lib/active_support/configuration_file.rb', line 17

def self.parse(content_path, **options)
  new(content_path).parse(**options)
end

Instance Method Details

#parse(context: nil, **options)

[ GitHub ]

  
# File 'activesupport/lib/active_support/configuration_file.rb', line 21

def parse(context: nil, **options)
  source = render(context)
  if YAML.respond_to?(:unsafe_load)
    YAML.unsafe_load(source, **options) || {}
  else
    YAML.load(source, **options) || {}
  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

#read(content_path) (private)

[ GitHub ]

  
# File 'activesupport/lib/active_support/configuration_file.rb', line 35

def read(content_path)
  require "yaml"
  require "erb"

  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

#render(context) (private)

[ GitHub ]

  
# File 'activesupport/lib/active_support/configuration_file.rb', line 46

def render(context)
  erb = ERB.new(@content).tap { |e| e.filename = @content_path }
  context ? erb.result(context) : erb.result
end