From aa1640035f172bcbd064959d8e7d00aac07243d7 Mon Sep 17 00:00:00 2001 From: Marco Concetto Rudilosso Date: Wed, 19 Mar 2025 18:50:01 +0100 Subject: [PATCH] Always stringify properties in all array filters (#1936) * Always stringify sum property. * Add test * always stringify properties in all array filters * fix syntax error * up version --------- Co-authored-by: Dominic Petrick --- lib/liquid/standardfilters.rb | 7 +++++++ lib/liquid/version.rb | 2 +- test/integration/standard_filter_test.rb | 11 +++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index 63d080dd..4771b242 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -387,6 +387,7 @@ module Liquid end elsif ary.all? { |el| el.respond_to?(:[]) } begin + property = Utils.to_s(property) ary.sort { |a, b| nil_safe_compare(a[property], b[property]) } rescue TypeError raise_property_error(property) @@ -416,6 +417,7 @@ module Liquid end elsif ary.all? { |el| el.respond_to?(:[]) } begin + property = Utils.to_s(property) ary.sort { |a, b| nil_safe_casecmp(a[property], b[property]) } rescue TypeError raise_property_error(property) @@ -503,6 +505,7 @@ module Liquid elsif ary.empty? # The next two cases assume a non-empty array. [] else + property = Utils.to_s(property) ary.uniq do |item| item[property] rescue TypeError @@ -534,6 +537,7 @@ module Liquid # @liquid_syntax array | map: string # @liquid_return [array[untyped]] def map(input, property) + property = Utils.to_s(property) InputIterator.new(input, context).map do |e| e = e.call if e.is_a?(Proc) @@ -563,6 +567,7 @@ module Liquid elsif ary.empty? # The next two cases assume a non-empty array. [] else + property = Liquid::Utils.to_s(property) ary.reject do |item| item[property].nil? rescue TypeError @@ -952,6 +957,8 @@ module Liquid # @liquid_syntax array | sum # @liquid_return [number] def sum(input, property = nil) + property = property.nil? ? nil : Utils.to_s(property) + ary = InputIterator.new(input, context) return 0 if ary.empty? diff --git a/lib/liquid/version.rb b/lib/liquid/version.rb index 24600c63..7d261e99 100644 --- a/lib/liquid/version.rb +++ b/lib/liquid/version.rb @@ -2,5 +2,5 @@ # frozen_string_literal: true module Liquid - VERSION = "5.8.1" + VERSION = "5.8.2" end diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index 913dfa25..5c80fe3c 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -1281,6 +1281,17 @@ class StandardFiltersTest < Minitest::Test 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)