Util::Errors class to parse errors from YML and render them via ERB

This commit is contained in:
Mitchell Hashimoto 2010-03-17 20:42:53 -07:00
parent 88cfaf8f27
commit ac6c3a4892
3 changed files with 86 additions and 0 deletions

View File

@ -0,0 +1,33 @@
require 'yaml'
module Vagrant
module Util
# This class is responsible for outputting errors. It retrieves the errors,
# based on their key, from the error file, and then outputs it.
class Errors
@@errors = nil
class <<self
def reset!
@@errors = nil
end
# Returns the hash of errors from the error YML files. This only loads once,
# then returns a cached value until {reset!} is called.
#
# @return [Hash]
def errors
@@errors ||= YAML.load_file(File.join(PROJECT_ROOT, "templates", "errors.yml"))
end
# Renders the error with the given key and data parameters and returns
# the rendered result.
#
# @return [String]
def error_string(key, data = {})
TemplateRenderer.render_string(errors[key], data)
end
end
end
end
end

1
templates/errors.yml Normal file
View File

@ -0,0 +1 @@
:foo: bar

View File

@ -0,0 +1,52 @@
require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
class ErrorsUtilTest < Test::Unit::TestCase
include Vagrant::Util
context "loading the errors from the YML" do
setup do
YAML.stubs(:load_file)
Errors.reset!
end
should "load the file initially, then never again unless reset" do
YAML.expects(:load_file).with(File.join(PROJECT_ROOT, "templates", "errors.yml")).once
Errors.errors
Errors.errors
Errors.errors
Errors.errors
end
should "reload if reset! is called" do
YAML.expects(:load_file).with(File.join(PROJECT_ROOT, "templates", "errors.yml")).twice
Errors.errors
Errors.reset!
Errors.errors
end
end
context "getting the error string" do
setup do
@errors = {}
@errors[:foo] = "foo bar baz"
Errors.stubs(:errors).returns(@errors)
end
should "render the error string" do
TemplateRenderer.expects(:render_string).with(@errors[:foo], anything).once
Errors.error_string(:foo)
end
should "pass in any data entries" do
data = mock("data")
TemplateRenderer.expects(:render_string).with(@errors[:foo], data).once
Errors.error_string(:foo, data)
end
should "return the result of the render" do
result = mock("result")
TemplateRenderer.expects(:render_string).returns(result)
assert_equal result, Errors.error_string(:foo)
end
end
end