mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-29 07:05:12 -07:00
Translate exceptions in filters to Liquid::FilterError errors.
This commit is contained in:
@@ -49,6 +49,10 @@ module Liquid
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class FilterError < Error
|
||||||
|
attr_accessor :original_exception
|
||||||
|
end
|
||||||
|
|
||||||
ArgumentError = Class.new(Error)
|
ArgumentError = Class.new(Error)
|
||||||
ContextError = Class.new(Error)
|
ContextError = Class.new(Error)
|
||||||
FileSystemError = Class.new(Error)
|
FileSystemError = Class.new(Error)
|
||||||
|
|||||||
+11
-3
@@ -47,12 +47,20 @@ module Liquid
|
|||||||
|
|
||||||
def invoke(method, *args)
|
def invoke(method, *args)
|
||||||
if self.class.invokable?(method)
|
if self.class.invokable?(method)
|
||||||
send(method, *args)
|
begin
|
||||||
|
send(method, *args)
|
||||||
|
rescue ::ArgumentError => e
|
||||||
|
raise Liquid::ArgumentError.new(e.message)
|
||||||
|
rescue Liquid::Error
|
||||||
|
raise
|
||||||
|
rescue ::StandardError => exception
|
||||||
|
error = Liquid::FilterError.new(exception.message)
|
||||||
|
error.original_exception = exception
|
||||||
|
raise error
|
||||||
|
end
|
||||||
else
|
else
|
||||||
args.first
|
args.first
|
||||||
end
|
end
|
||||||
rescue ::ArgumentError => e
|
|
||||||
raise Liquid::ArgumentError.new(e.message)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -22,6 +22,12 @@ module SubstituteFilter
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module ErrorFilter
|
||||||
|
def standard_error(input)
|
||||||
|
raise ::StandardError, 'standard error'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
class FiltersTest < Minitest::Test
|
class FiltersTest < Minitest::Test
|
||||||
include Liquid
|
include Liquid
|
||||||
|
|
||||||
@@ -158,7 +164,14 @@ class FiltersInTemplate < Minitest::Test
|
|||||||
assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, CanadianMoneyFilter)
|
assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, CanadianMoneyFilter)
|
||||||
assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, [CanadianMoneyFilter])
|
assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, [CanadianMoneyFilter])
|
||||||
end
|
end
|
||||||
end # FiltersTest
|
|
||||||
|
def test_filter_error
|
||||||
|
context = Context.new
|
||||||
|
context.add_filters(ErrorFilter)
|
||||||
|
assert_equal "Liquid error: standard error", Template.parse("{{'var' | standard_error}}").render(context)
|
||||||
|
assert_equal [Liquid::FilterError], context.errors.map(&:class)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
class TestObject
|
class TestObject
|
||||||
attr_accessor :a
|
attr_accessor :a
|
||||||
|
|||||||
@@ -201,14 +201,16 @@ class TemplateTest < Minitest::Test
|
|||||||
def test_exception_handler_doesnt_reraise_if_it_returns_false
|
def test_exception_handler_doesnt_reraise_if_it_returns_false
|
||||||
exception = nil
|
exception = nil
|
||||||
Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_handler: ->(e) { exception = e; false })
|
Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_handler: ->(e) { exception = e; false })
|
||||||
assert exception.is_a?(ZeroDivisionError)
|
assert exception.is_a?(Liquid::FilterError)
|
||||||
|
assert exception.original_exception.is_a?(ZeroDivisionError)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_exception_handler_does_reraise_if_it_returns_true
|
def test_exception_handler_does_reraise_if_it_returns_true
|
||||||
exception = nil
|
exception = nil
|
||||||
assert_raises(ZeroDivisionError) do
|
assert_raises(Liquid::FilterError) do
|
||||||
Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_handler: ->(e) { exception = e; true })
|
Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_handler: ->(e) { exception = e; true })
|
||||||
end
|
end
|
||||||
assert exception.is_a?(ZeroDivisionError)
|
assert exception.is_a?(Liquid::FilterError)
|
||||||
|
assert exception.original_exception.is_a?(ZeroDivisionError)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user