Make error locations available for non-Liquid::Error exceptions.

This commit is contained in:
Dylan Thacker-Smith
2015-05-21 18:36:56 -04:00
parent d36c6822da
commit 8daaad3b76
5 changed files with 16 additions and 6 deletions

View File

@@ -50,6 +50,7 @@ require 'liquid/i18n'
require 'liquid/drop'
require 'liquid/extensions'
require 'liquid/errors'
require 'liquid/error_location'
require 'liquid/interrupts'
require 'liquid/strainer'
require 'liquid/expression'

View File

@@ -12,7 +12,7 @@ module Liquid
#
# context['bob'] #=> nil class Context
class Context
attr_reader :scopes, :errors, :registers, :environments, :resource_limits
attr_reader :scopes, :errors, :error_locations, :registers, :environments, :resource_limits
attr_accessor :exception_handler, :render_errors, :template_name
def initialize(environments = {}, outer_scope = {}, registers = {}, rethrow_errors = false, resource_limits = nil, render_errors = true)
@@ -20,6 +20,7 @@ module Liquid
@scopes = [(outer_scope || {})]
@registers = registers
@errors = []
@error_locations = []
@resource_limits = resource_limits || ResourceLimits.new(Template.default_resource_limits)
squash_instance_assigns_with_environments
@render_errors = render_errors
@@ -70,6 +71,7 @@ module Liquid
end
errors.push(e)
error_locations.push(ErrorLocation.from_token(template_name, token))
raise if exception_handler && exception_handler.call(e)
render_errors ? Liquid::Error.render(e) : ''
end

View File

@@ -0,0 +1,11 @@
module Liquid
ErrorLocation = Struct.new(:template_name, :line_number) do
def self.line_number_from_token(token)
token.respond_to?(:line_number) ? token.line_number : nil
end
def self.from_token(template_name, token)
new(template_name, line_number_from_token(token))
end
end
end

View File

@@ -18,9 +18,8 @@ module Liquid
end
def set_line_number_from_token(token)
return unless token.respond_to?(:line_number)
return if line_number
self.line_number = token.line_number
self.line_number = ErrorLocation.line_number_from_token(token)
end
def self.render(e)
@@ -60,5 +59,4 @@ module Liquid
StackLevelError = Class.new(Error)
TaintedError = Class.new(Error)
MemoryError = Class.new(Error)
ZeroDivisionError = Class.new(Error)
end

View File

@@ -279,8 +279,6 @@ module Liquid
# division
def divided_by(input, operand)
apply_operation(input, operand, :/)
rescue ::ZeroDivisionError => e
raise Liquid::ZeroDivisionError.new(e.message)
end
def modulo(input, operand)