From d5df53da0a06a8446e9d6181181bb36bec5022d2 Mon Sep 17 00:00:00 2001 From: Dominic Petrick Date: Tue, 18 Mar 2025 16:52:46 +0100 Subject: [PATCH 1/2] Always stringify sum property. --- lib/liquid/standardfilters.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index 63d080dd1..1ec5636b3 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -952,11 +952,13 @@ def default(input, default_value = '', options = {}) # @liquid_syntax array | sum # @liquid_return [number] def sum(input, property = nil) + property = Liquid::Utils.to_s(property) + ary = InputIterator.new(input, context) return 0 if ary.empty? values_for_sum = ary.map do |item| - if property.nil? + if property.empty? item elsif item.respond_to?(:[]) item[property] From 88a38e391d9226da0c772227ad799492ace978a0 Mon Sep 17 00:00:00 2001 From: Dominic Petrick Date: Tue, 18 Mar 2025 17:35:16 +0100 Subject: [PATCH 2/2] Add test --- test/integration/standard_filter_test.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index 913dfa25b..5c80fe3ce 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -1281,6 +1281,17 @@ def test_sum_with_floats_and_indexable_map_values assert_template_result("0", "{{ input | sum: 'subtotal' }}", { "input" => input }) end + def test_sum_with_non_string_property + input = [{ "true" => 1 }, { "1.0" => 0.2, "1" => -0.3 }, { "1..5" => 0.4 }] + + assert_equal(1, @filters.sum(input, true)) + assert_equal(0.2, @filters.sum(input, 1.0)) + assert_equal(-0.3, @filters.sum(input, 1)) + assert_equal(0.4, @filters.sum(input, (1..5))) + assert_equal(0, @filters.sum(input, nil)) + assert_equal(0, @filters.sum(input, "")) + end + private def with_timezone(tz)