From 8daaad3b76bda180b9b99ec11591d9ed43ee5851 Mon Sep 17 00:00:00 2001 From: Dylan Thacker-Smith Date: Thu, 21 May 2015 18:36:56 -0400 Subject: [PATCH] Make error locations available for non-Liquid::Error exceptions. --- lib/liquid.rb | 1 + lib/liquid/context.rb | 4 +++- lib/liquid/error_location.rb | 11 +++++++++++ lib/liquid/errors.rb | 4 +--- lib/liquid/standardfilters.rb | 2 -- 5 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 lib/liquid/error_location.rb diff --git a/lib/liquid.rb b/lib/liquid.rb index 9724aac..6a1c2ee 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -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' diff --git a/lib/liquid/context.rb b/lib/liquid/context.rb index d0e334d..5bb0778 100644 --- a/lib/liquid/context.rb +++ b/lib/liquid/context.rb @@ -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 diff --git a/lib/liquid/error_location.rb b/lib/liquid/error_location.rb new file mode 100644 index 0000000..dcb8fc4 --- /dev/null +++ b/lib/liquid/error_location.rb @@ -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 diff --git a/lib/liquid/errors.rb b/lib/liquid/errors.rb index af474e9..8ee9c1f 100644 --- a/lib/liquid/errors.rb +++ b/lib/liquid/errors.rb @@ -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 diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index e9cbd9a..4d10bb3 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -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)