From eb89f22d9398a6c4584ec17497d978abdec56649 Mon Sep 17 00:00:00 2001 From: Dylan Thacker-Smith Date: Thu, 25 Aug 2022 12:03:56 -0400 Subject: [PATCH] Raise Liquid::SyntaxError instead of NoMethodError for invalid range (#1607) --- lib/liquid/range_lookup.rb | 12 +++++++++++- test/integration/expression_test.rb | 5 +++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/liquid/range_lookup.rb b/lib/liquid/range_lookup.rb index 7e159be6..fd208a67 100644 --- a/lib/liquid/range_lookup.rb +++ b/lib/liquid/range_lookup.rb @@ -8,7 +8,17 @@ module Liquid if start_obj.respond_to?(:evaluate) || end_obj.respond_to?(:evaluate) new(start_obj, end_obj) else - start_obj.to_i..end_obj.to_i + begin + start_obj.to_i..end_obj.to_i + rescue NoMethodError + invalid_expr = start_markup unless start_obj.respond_to?(:to_i) + invalid_expr ||= end_markup unless end_obj.respond_to?(:to_i) + if invalid_expr + raise Liquid::SyntaxError, "Invalid expression type '#{invalid_expr}' in range expression" + end + + raise + end end end diff --git a/test/integration/expression_test.rb b/test/integration/expression_test.rb index 91a0494c..62ff743d 100644 --- a/test/integration/expression_test.rb +++ b/test/integration/expression_test.rb @@ -29,6 +29,11 @@ class ExpressionTest < Minitest::Test def test_range assert_equal(1..2, parse_and_eval("(1..2)")) assert_equal(3..4, parse_and_eval(" ( 3 .. 4 ) ")) + + exc = assert_raises(Liquid::SyntaxError) { Liquid::Expression.parse("(false..true)") } + assert_equal("Liquid syntax error: Invalid expression type 'false' in range expression", exc.message) + exc = assert_raises(Liquid::SyntaxError) { Liquid::Expression.parse("((1..2)..3)") } + assert_equal("Liquid syntax error: Invalid expression type '(1..2)' in range expression", exc.message) end private