From 19e287dda27ac38ad28c0c53f661def3ce331297 Mon Sep 17 00:00:00 2001 From: Ian Ker-Seymer Date: Thu, 3 Apr 2025 15:39:14 -0400 Subject: [PATCH] Gracefully empty property in map filter --- lib/liquid/standardfilters.rb | 8 ++--- test/integration/standard_filter_test.rb | 42 +++++++++++++++++++++--- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index c7a841cc..4d69f5bc 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -536,11 +536,11 @@ module Liquid # @liquid_syntax array | map: string # @liquid_return [array[untyped]] def map(input, property) - if property.nil? - raise_property_error(property) - end - property = Utils.to_s(property) + + # Return the input array if property is empty (no-op) + return InputIterator.new(input, context).to_a if property.empty? + InputIterator.new(input, context).map do |e| e = e.call if e.is_a?(Proc) diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index 86cdadaa..ddf66333 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -560,15 +560,47 @@ class StandardFiltersTest < Minitest::Test end end - def test_map_returns_empty_with_no_property - foo = [ + def test_map_with_nil_property + array = [ + { "handle" => "alpha", "value" => "A" }, + { "handle" => "beta", "value" => "B" }, + { "handle" => "gamma", "value" => "C" } + ] + + assert_template_result("alpha beta gamma", "{{ array | map: nil | map: 'handle' | join: ' ' }}", { "array" => array }) + end + + def test_map_with_empty_string_property + array = [ + { "handle" => "alpha", "value" => "A" }, + { "handle" => "beta", "value" => "B" }, + { "handle" => "gamma", "value" => "C" } + ] + + assert_template_result("alpha beta gamma", "{{ array | map: '' | map: 'handle' | join: ' ' }}", { "array" => array }) + end + + def test_map_with_value_property + array = [ + { "handle" => "alpha", "value" => "A" }, + { "handle" => "beta", "value" => "B" }, + { "handle" => "gamma", "value" => "C" } + ] + + assert_template_result("A B C", "{{ array | map: 'value' | join: ' ' }}", { "array" => array }) + end + + def test_map_returns_input_with_no_property + input = [ [1], [2], [3], ] - assert_raises(Liquid::ArgumentError) do - @filters.map(foo, nil) - end + result = @filters.map(input, nil) + assert_equal(input.flatten, result) + + result = @filters.map(input, '') + assert_equal(input.flatten, result) end def test_sort_works_on_enumerables