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] 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)