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'