From e3be6ed5421c647eaee348c01101a022efeb7158 Mon Sep 17 00:00:00 2001 From: Ian Ker-Seymer Date: Wed, 9 Apr 2025 14:54:25 -0400 Subject: [PATCH] Use to_liquid_value in uniq filter --- lib/liquid/standardfilters.rb | 5 +++- test/integration/standard_filter_test.rb | 16 +++++++++++++ test/test_helper.rb | 29 ++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) 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/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'