Skip to content

Commit

Permalink
Ensure sum filter calls to_liquid
Browse files Browse the repository at this point in the history
  • Loading branch information
adamklingbaum committed Jun 22, 2023
1 parent 77293d4 commit 98ce25c
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 11 deletions.
25 changes: 14 additions & 11 deletions lib/liquid/standardfilters.rb
Original file line number Diff line number Diff line change
Expand Up @@ -878,19 +878,22 @@ def default(input, default_value = '', options = {})
# @liquid_return [number]
def sum(input, property = nil)
ary = InputIterator.new(input, context)
return 0 if ary.empty?

if ary.empty?
0
elsif property.nil?
ary.sum do |item|
Utils.to_number(item)
end
else
ary.sum do |item|
item.respond_to?(:[]) ? Utils.to_number(item[property]) : 0
rescue TypeError
raise_property_error(property)
values_for_sum = ary.map do |item|
if property.nil?
item
elsif item.respond_to?(:[])
item[property]
else
0
end
rescue TypeError
raise_property_error(property)
end

InputIterator.new(values_for_sum, context).sum do |item|
Utils.to_number(item)
end
end

Expand Down
12 changes: 12 additions & 0 deletions test/integration/standard_filter_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -982,6 +982,18 @@ def test_sum_with_unindexable_values
end
end

def test_sum_without_property_calls_to_liquid
t = TestThing.new
Liquid::Template.parse('{{ foo | sum }}').render("foo" => [t])
assert(t.foo > 0)
end

def test_sum_with_property_calls_to_liquid_on_property_values
t = TestThing.new
Liquid::Template.parse('{{ foo | sum: "quantity" }}').render("foo" => [{ "quantity" => t }])
assert(t.foo > 0)
end

private

def with_timezone(tz)
Expand Down

0 comments on commit 98ce25c

Please sign in to comment.