diff --git a/lib/liquid/errors.rb b/lib/liquid/errors.rb index cac3910d..44f89bcc 100644 --- a/lib/liquid/errors.rb +++ b/lib/liquid/errors.rb @@ -1,22 +1,18 @@ module Liquid class Error < ::StandardError attr_accessor :line_number + attr_accessor :markup_context - def self.render(e) + def to_s(with_prefix=true) str = "" + str << message_prefix if with_prefix + str << super() - if e.is_a?(SyntaxError) - str << "Liquid syntax error" - else - str << "Liquid error" + if markup_context + str << " " + str << markup_context end - if e.respond_to?(:line_number) && e.line_number - str << " (line #{e.line_number})" - end - - str << ": " - str << e.message str end @@ -24,6 +20,32 @@ module Liquid return unless token.respond_to?(:line_number) self.line_number = token.line_number end + + def self.render(e) + if e.is_a?(Liquid::Error) + e.to_s + else + "Liquid error: #{e.to_s}" + end + end + + private + + def message_prefix + str = "" + if is_a?(SyntaxError) + str << "Liquid syntax error" + else + str << "Liquid error" + end + + if line_number + str << " (line #{line_number})" + end + + str << ": " + str + end end class ArgumentError < Error; end diff --git a/lib/liquid/parser_switching.rb b/lib/liquid/parser_switching.rb index 5c82063b..9dd19dbd 100644 --- a/lib/liquid/parser_switching.rb +++ b/lib/liquid/parser_switching.rb @@ -20,12 +20,12 @@ module Liquid def strict_parse_with_error_context(markup) strict_parse(markup) rescue SyntaxError => e - e.message << markup_context(markup) + e.markup_context = markup_context(markup) raise e end def markup_context(markup) - " in \"#{markup.strip}\"" + "in \"#{markup.strip}\"" end end end diff --git a/lib/liquid/variable.rb b/lib/liquid/variable.rb index 04d82fd8..1282a2be 100644 --- a/lib/liquid/variable.rb +++ b/lib/liquid/variable.rb @@ -30,7 +30,7 @@ module Liquid end def markup_context(markup) - " in \"{{#{markup}}}\"" + "in \"{{#{markup}}}\"" end def lax_parse(markup) diff --git a/test/integration/error_handling_test.rb b/test/integration/error_handling_test.rb index 61850fd7..ee072048 100644 --- a/test/integration/error_handling_test.rb +++ b/test/integration/error_handling_test.rb @@ -104,25 +104,28 @@ class ErrorHandlingTest < Minitest::Test err = assert_raises(SyntaxError) do Liquid::Template.parse(' {% if 1 =! 2 %}ok{% endif %} ', :error_mode => :strict) end - assert_equal 'Unexpected character = in "1 =! 2"', err.message + assert_equal 'Liquid syntax error: Unexpected character = in "1 =! 2"', err.message err = assert_raises(SyntaxError) do Liquid::Template.parse('{{%%%}}', :error_mode => :strict) end - assert_equal 'Unexpected character % in "{{%%%}}"', err.message + assert_equal 'Liquid syntax error: Unexpected character % in "{{%%%}}"', err.message end def test_warnings template = Liquid::Template.parse('{% if ~~~ %}{{%%%}}{% else %}{{ hello. }}{% endif %}', :error_mode => :warn) assert_equal 3, template.warnings.size - assert_equal 'Unexpected character ~ in "~~~"', template.warnings[0].message - assert_equal 'Unexpected character % in "{{%%%}}"', template.warnings[1].message - assert_equal 'Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].message + assert_equal 'Unexpected character ~ in "~~~"', template.warnings[0].to_s(false) + assert_equal 'Unexpected character % in "{{%%%}}"', template.warnings[1].to_s(false) + assert_equal 'Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].to_s(false) assert_equal '', template.render end def test_warning_line_numbers template = Liquid::Template.parse("{% if ~~~ %}\n{{%%%}}{% else %}\n{{ hello. }}{% endif %}", :error_mode => :warn, :line_numbers => true) + assert_equal 'Liquid syntax error (line 1): Unexpected character ~ in "~~~"', template.warnings[0].message + assert_equal 'Liquid syntax error (line 2): Unexpected character % in "{{%%%}}"', template.warnings[1].message + assert_equal 'Liquid syntax error (line 3): Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].message assert_equal 3, template.warnings.size assert_equal [1,2,3], template.warnings.map(&:line_number) end