From f9027d54abdab21a25eb4003d3b11edbe6a98cd2 Mon Sep 17 00:00:00 2001 From: Florian Weingarten Date: Wed, 24 Jul 2013 14:53:10 -0400 Subject: [PATCH] Use invoke_drop in map filter --- lib/liquid/standardfilters.rb | 6 ++---- test/liquid/drop_test.rb | 12 +++++++++--- test/liquid/standard_filter_test.rb | 5 +++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index 77bb945..080fc97 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -100,10 +100,8 @@ module Liquid # map/collect on a given property def map(input, property) ary = [input].flatten - if ary.first.respond_to?('[]') and !ary.first[property].nil? - ary.map {|e| e[property] } - elsif ary.first.respond_to?(property) - ary.map {|e| e.send(property) } + ary.map do |e| + e.respond_to?('[]') ? e[property] : nil end end diff --git a/test/liquid/drop_test.rb b/test/liquid/drop_test.rb index 7819f64..235a52f 100644 --- a/test/liquid/drop_test.rb +++ b/test/liquid/drop_test.rb @@ -71,23 +71,29 @@ class DropsTest < Test::Unit::TestCase include Liquid def test_product_drop - assert_nothing_raised do tpl = Liquid::Template.parse( ' ' ) tpl.render('product' => ProductDrop.new) end end + def test_drop_does_only_respond_to_whitelisted_methods + assert_equal "", Liquid::Template.parse("{{ product.inspect }}").render('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse("{{ product.pretty_inspect }}").render('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse("{{ product.whatever }}").render('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse('{{ product | map: "inspect" }}').render('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse('{{ product | map: "pretty_inspect" }}').render('product' => ProductDrop.new) + assert_equal "", Liquid::Template.parse('{{ product | map: "whatever" }}').render('product' => ProductDrop.new) + end + def test_text_drop output = Liquid::Template.parse( ' {{ product.texts.text }} ' ).render('product' => ProductDrop.new) assert_equal ' text1 ', output - end def test_unknown_method output = Liquid::Template.parse( ' {{ product.catchall.unknown }} ' ).render('product' => ProductDrop.new) assert_equal ' method: unknown ', output - end def test_integer_argument_drop diff --git a/test/liquid/standard_filter_test.rb b/test/liquid/standard_filter_test.rb index f971e72..1542139 100644 --- a/test/liquid/standard_filter_test.rb +++ b/test/liquid/standard_filter_test.rb @@ -97,6 +97,11 @@ class StandardFiltersTest < Test::Unit::TestCase 'ary' => [{'foo' => {'bar' => 'a'}}, {'foo' => {'bar' => 'b'}}, {'foo' => {'bar' => 'c'}}] end + def test_map_doesnt_call_arbitrary_stuff + assert_equal "", Liquid::Template.parse('{{ "foo" | map: "__id__" }}').render + assert_equal "", Liquid::Template.parse('{{ "foo" | map: "inspect" }}').render + 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")