diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index 3f3730a..fa6d2a9 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -99,7 +99,14 @@ module Liquid # map/collect on a given property def map(input, property) - ary = [input].flatten + ary = if input.is_a?(Array) + input.flatten + elsif !input.class.include?(Enumerable) + [input].flatten + else + input + end + ary.map do |e| e = e.call if e.is_a?(Proc) e = e.to_liquid if e.respond_to?(:to_liquid) diff --git a/test/liquid/standard_filter_test.rb b/test/liquid/standard_filter_test.rb index a034c50..18938c3 100644 --- a/test/liquid/standard_filter_test.rb +++ b/test/liquid/standard_filter_test.rb @@ -27,6 +27,14 @@ class TestDrop < Liquid::Drop end end +class TestEnumerable < Liquid::Drop + include Enumerable + + def each(&block) + [ { "foo" => 1 }, { "foo" => 2 }, { "foo" => 3 } ].each(&block) + end +end + class StandardFiltersTest < Test::Unit::TestCase include Liquid @@ -135,6 +143,10 @@ class StandardFiltersTest < Test::Unit::TestCase assert_equal "testfoo", Liquid::Template.parse(templ).render("procs" => [p]) end + def test_map_works_on_enumerables + assert_equal "123", Liquid::Template.parse('{{ foo | map: "foo" }}').render!("foo" => TestEnumerable.new) + end + def test_date assert_equal 'May', @filters.date(Time.parse("2006-05-05 10:00:00"), "%B") assert_equal 'June', @filters.date(Time.parse("2006-06-05 10:00:00"), "%B")