formulary: handle ScriptError in formula

I added a new `FormulaUnreadableError` subclass of
`FormulaUnavailableError` so existing `rescue`s of
`FormulaUnavailableError` handle this as well.

The new subclass will output the name of the formula with the error
(because this isn't always obvious from the original exception message)
followed by the original error message.

Fixes #1927.
This commit is contained in:
Alyssa Ross 2017-02-01 18:30:55 +00:00
parent b6f3399cb3
commit ade8128a18
3 changed files with 23 additions and 1 deletions

View File

@ -131,6 +131,19 @@ class FormulaClassUnavailableError < FormulaUnavailableError
end end
end end
class FormulaUnreadableError < FormulaUnavailableError
attr_reader :formula_error
def initialize(name, error)
super(name)
@formula_error = error
end
def to_s
"#{name}: " + formula_error.to_s
end
end
class TapFormulaAmbiguityError < RuntimeError class TapFormulaAmbiguityError < RuntimeError
attr_reader :name, :paths, :formulae attr_reader :name, :paths, :formulae

View File

@ -22,7 +22,11 @@ class Formulary
mod = Module.new mod = Module.new
const_set(namespace, mod) const_set(namespace, mod)
mod.module_eval(contents, path) begin
mod.module_eval(contents, path)
rescue ScriptError => e
raise FormulaUnreadableError.new(name, e)
end
class_name = class_s(name) class_name = class_s(name)
begin begin

View File

@ -56,6 +56,11 @@ class ExceptionsTest < Homebrew::TestCase
FormulaClassUnavailableError.new("foo", "foo.rb", "Foo", list).to_s FormulaClassUnavailableError.new("foo", "foo.rb", "Foo", list).to_s
end end
def test_formula_unreadable_error
formula_error = LoadError.new("bar")
assert_equal "foo: bar", FormulaUnreadableError.new("foo", formula_error).to_s
end
def test_tap_unavailable_error def test_tap_unavailable_error
assert_equal "No available tap foo.\n", TapUnavailableError.new("foo").to_s assert_equal "No available tap foo.\n", TapUnavailableError.new("foo").to_s
end end