From 98ce25cb402e74f708f724ef43b3d680511b1450 Mon Sep 17 00:00:00 2001 From: Adam Klingbaum Date: Thu, 22 Jun 2023 16:25:11 +0000 Subject: [PATCH] Ensure `sum` filter calls `to_liquid` --- lib/liquid/standardfilters.rb | 25 +++++++++++++----------- test/integration/standard_filter_test.rb | 12 ++++++++++++ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index aee43034..d9764304 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -878,19 +878,22 @@ module Liquid # @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 diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index dd15ff4e..b2405f7f 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -982,6 +982,18 @@ class StandardFiltersTest < Minitest::Test 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)