From 8f978ecd1abe5e6da20d469d973d13b226e351a3 Mon Sep 17 00:00:00 2001 From: Florian Weingarten Date: Thu, 8 Aug 2013 11:47:26 -0400 Subject: [PATCH 1/2] Make sort filter work on Enumerable drops --- lib/liquid/standardfilters.rb | 22 ++++++++++++---------- test/liquid/standard_filter_test.rb | 6 +++++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index ef559f74..3c543e5f 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -81,7 +81,7 @@ module Liquid # Sort elements of the array # provide optional property with which to sort an array of hashes or drops def sort(input, property = nil) - ary = [input].flatten + ary = flatten_if_necessary(input) if property.nil? ary.sort elsif ary.first.respond_to?('[]') and !ary.first[property].nil? @@ -99,15 +99,7 @@ module Liquid # map/collect on a given property def map(input, property) - ary = if input.is_a?(Array) - input.flatten - elsif input.kind_of?(Enumerable) - input - else - [input].flatten - end - - ary.map do |e| + flatten_if_necessary(input).map do |e| e = e.call if e.is_a?(Proc) e = e.to_liquid if e.respond_to?(:to_liquid) @@ -256,6 +248,16 @@ module Liquid private + def flatten_if_necessary(input) + if input.is_a?(Array) + input.flatten + elsif input.kind_of?(Enumerable) + input + else + [input].flatten + end + end + def to_number(obj) case obj when Float diff --git a/test/liquid/standard_filter_test.rb b/test/liquid/standard_filter_test.rb index 18938c3d..1716442a 100644 --- a/test/liquid/standard_filter_test.rb +++ b/test/liquid/standard_filter_test.rb @@ -31,7 +31,7 @@ class TestEnumerable < Liquid::Drop include Enumerable def each(&block) - [ { "foo" => 1 }, { "foo" => 2 }, { "foo" => 3 } ].each(&block) + [ { "foo" => 1, "bar" => 2 }, { "foo" => 2, "bar" => 1 }, { "foo" => 3, "bar" => 3 } ].each(&block) end end @@ -147,6 +147,10 @@ class StandardFiltersTest < Test::Unit::TestCase assert_equal "123", Liquid::Template.parse('{{ foo | map: "foo" }}').render!("foo" => TestEnumerable.new) end + def test_sort_works_on_enumerables + assert_equal "213", Liquid::Template.parse('{{ foo | sort: "bar" | 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") From ed4b61bfd3d2372cc290240df68a2d292acf1d0f Mon Sep 17 00:00:00 2001 From: Florian Weingarten Date: Thu, 8 Aug 2013 11:53:52 -0400 Subject: [PATCH 2/2] Fix broken map test and add sort test --- lib/liquid/standardfilters.rb | 4 ++-- test/liquid/standard_filter_test.rb | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index 3c543e5f..b7f64185 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -101,7 +101,6 @@ module Liquid def map(input, property) flatten_if_necessary(input).map do |e| e = e.call if e.is_a?(Proc) - e = e.to_liquid if e.respond_to?(:to_liquid) if property == "to_liquid" e @@ -249,13 +248,14 @@ module Liquid private def flatten_if_necessary(input) - if input.is_a?(Array) + ary = if input.is_a?(Array) input.flatten elsif input.kind_of?(Enumerable) input else [input].flatten end + ary.map{ |e| e.respond_to?(:to_liquid) ? e.to_liquid : e } end def to_number(obj) diff --git a/test/liquid/standard_filter_test.rb b/test/liquid/standard_filter_test.rb index 1716442a..b317b68f 100644 --- a/test/liquid/standard_filter_test.rb +++ b/test/liquid/standard_filter_test.rb @@ -15,6 +15,10 @@ class TestThing "woot: #{@foo}" end + def [](whatever) + to_s + end + def to_liquid @foo += 1 self @@ -133,7 +137,12 @@ class StandardFiltersTest < Test::Unit::TestCase def test_map_calls_to_liquid t = TestThing.new - assert_equal "woot: 1", Liquid::Template.parse('{{ foo }}').render("foo" => t) + assert_equal "woot: 1", Liquid::Template.parse('{{ foo | map: "whatever" }}').render("foo" => [t]) + end + + def test_sort_calls_to_liquid + t = TestThing.new + assert_equal "woot: 1", Liquid::Template.parse('{{ foo | sort: "whatever" }}').render("foo" => [t]) end def test_map_over_proc