mirror of
https://github.com/Shopify/liquid.git
synced 2026-10-03 09:05:13 -07:00
Make error locations available for non-Liquid::Error exceptions.
This commit is contained in:
@@ -50,6 +50,7 @@ require 'liquid/i18n'
|
|||||||
require 'liquid/drop'
|
require 'liquid/drop'
|
||||||
require 'liquid/extensions'
|
require 'liquid/extensions'
|
||||||
require 'liquid/errors'
|
require 'liquid/errors'
|
||||||
|
require 'liquid/error_location'
|
||||||
require 'liquid/interrupts'
|
require 'liquid/interrupts'
|
||||||
require 'liquid/strainer'
|
require 'liquid/strainer'
|
||||||
require 'liquid/expression'
|
require 'liquid/expression'
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ module Liquid
|
|||||||
#
|
#
|
||||||
# context['bob'] #=> nil class Context
|
# context['bob'] #=> nil class Context
|
||||||
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
|
attr_accessor :exception_handler, :render_errors, :template_name
|
||||||
|
|
||||||
def initialize(environments = {}, outer_scope = {}, registers = {}, rethrow_errors = false, resource_limits = nil, render_errors = true)
|
def initialize(environments = {}, outer_scope = {}, registers = {}, rethrow_errors = false, resource_limits = nil, render_errors = true)
|
||||||
@@ -20,6 +20,7 @@ module Liquid
|
|||||||
@scopes = [(outer_scope || {})]
|
@scopes = [(outer_scope || {})]
|
||||||
@registers = registers
|
@registers = registers
|
||||||
@errors = []
|
@errors = []
|
||||||
|
@error_locations = []
|
||||||
@resource_limits = resource_limits || ResourceLimits.new(Template.default_resource_limits)
|
@resource_limits = resource_limits || ResourceLimits.new(Template.default_resource_limits)
|
||||||
squash_instance_assigns_with_environments
|
squash_instance_assigns_with_environments
|
||||||
@render_errors = render_errors
|
@render_errors = render_errors
|
||||||
@@ -70,6 +71,7 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
errors.push(e)
|
errors.push(e)
|
||||||
|
error_locations.push(ErrorLocation.from_token(template_name, token))
|
||||||
raise if exception_handler && exception_handler.call(e)
|
raise if exception_handler && exception_handler.call(e)
|
||||||
render_errors ? Liquid::Error.render(e) : ''
|
render_errors ? Liquid::Error.render(e) : ''
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -18,9 +18,8 @@ module Liquid
|
|||||||
end
|
end
|
||||||
|
|
||||||
def set_line_number_from_token(token)
|
def set_line_number_from_token(token)
|
||||||
return unless token.respond_to?(:line_number)
|
|
||||||
return if line_number
|
return if line_number
|
||||||
self.line_number = token.line_number
|
self.line_number = ErrorLocation.line_number_from_token(token)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.render(e)
|
def self.render(e)
|
||||||
@@ -60,5 +59,4 @@ module Liquid
|
|||||||
StackLevelError = Class.new(Error)
|
StackLevelError = Class.new(Error)
|
||||||
TaintedError = Class.new(Error)
|
TaintedError = Class.new(Error)
|
||||||
MemoryError = Class.new(Error)
|
MemoryError = Class.new(Error)
|
||||||
ZeroDivisionError = Class.new(Error)
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -279,8 +279,6 @@ module Liquid
|
|||||||
# division
|
# division
|
||||||
def divided_by(input, operand)
|
def divided_by(input, operand)
|
||||||
apply_operation(input, operand, :/)
|
apply_operation(input, operand, :/)
|
||||||
rescue ::ZeroDivisionError => e
|
|
||||||
raise Liquid::ZeroDivisionError.new(e.message)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def modulo(input, operand)
|
def modulo(input, operand)
|
||||||
|
|||||||
Reference in New Issue
Block a user