From dbe709c3bf2f8521764ae51b36dd551905dfad7e Mon Sep 17 00:00:00 2001 From: Ian Ker-Seymer Date: Wed, 9 Apr 2025 15:00:01 -0400 Subject: [PATCH] Use to_liquid_value in uniq filter (#1948) * Use to_liquid_value in uniq filter * Bump version to 5.8.4 --- lib/liquid/standardfilters.rb | 5 +++- lib/liquid/version.rb | 2 +- test/integration/standard_filter_test.rb | 16 +++++++++++++ test/test_helper.rb | 29 ++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index 4d69f5bc..daa2c580 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -1081,7 +1081,10 @@ module Liquid end def uniq(&block) - to_a.uniq(&block) + to_a.uniq do |item| + item = Utils.to_liquid_value(item) + block ? yield(item) : item + end end def compact diff --git a/lib/liquid/version.rb b/lib/liquid/version.rb index 3f0be7a1..854073d0 100644 --- a/lib/liquid/version.rb +++ b/lib/liquid/version.rb @@ -2,5 +2,5 @@ # frozen_string_literal: true module Liquid - VERSION = "5.8.3" + VERSION = "5.8.4" end diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index ddf66333..6a2737bb 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -1340,6 +1340,22 @@ class StandardFiltersTest < Minitest::Test assert_equal(0, @filters.sum(input, "")) end + def test_uniq_with_to_liquid_value + input = [StringDrop.new("foo"), StringDrop.new("bar"), "foo"] + expected = [StringDrop.new("foo"), StringDrop.new("bar")] + result = @filters.uniq(input) + + assert_equal(expected, result) + end + + def test_uniq_with_to_liquid_value_pick_correct_classes + input = ["foo", StringDrop.new("foo"), StringDrop.new("bar")] + expected = [String, StringDrop] + result = @filters.uniq(input).map(&:class) + + assert_equal(expected, result) + end + private def with_timezone(tz) diff --git a/test/test_helper.rb b/test/test_helper.rb index 184720b6..4f444738 100755 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -146,6 +146,35 @@ class BooleanDrop < Liquid::Drop end end +class StringDrop < Liquid::Drop + include Comparable + + def initialize(value) + super() + @value = value + end + + def to_liquid_value + @value + end + + def to_s + @value + end + + def to_str + @value + end + + def inspect + "#" + end + + def <=>(other) + to_liquid_value <=> Liquid::Utils.to_liquid_value(other) + end +end + class ErrorDrop < Liquid::Drop def standard_error raise Liquid::StandardError, 'standard error'