From 2f0a2c66f32195ad1dc376863041af8263ac5b47 Mon Sep 17 00:00:00 2001 From: Justin Li Date: Thu, 13 Sep 2018 17:14:18 -0400 Subject: [PATCH 1/2] Add sort_numeric filter --- lib/liquid/standardfilters.rb | 17 +++++++++++++++++ test/integration/standard_filter_test.rb | 11 +++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index c5dbcb81d..51ecd70b3 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -151,6 +151,23 @@ def sort_natural(input, property = nil) end end + # Sort elements of an array in numeric order + # provide optional property with which to sort an array of hashes or drops + def sort_numeric(input, property = nil) + ary = InputIterator.new(input) + if property.nil? + ary.sort do |a, b| + Utils.to_number(a) <=> Utils.to_number(b) + end + elsif ary.empty? # The next two cases assume a non-empty array. + [] + elsif ary.first.respond_to?(:[]) && !ary.first[property].nil? + ary.sort do |a, b| + Utils.to_number(a[property]) <=> Utils.to_number(b[property]) + end + end + end + # Remove duplicate elements from an array # provide optional property with which to determine uniqueness def uniq(input, property = nil) diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index d39472e08..025908d4f 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -190,6 +190,13 @@ def test_sort assert_equal [{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }], @filters.sort([{ "a" => 4 }, { "a" => 3 }, { "a" => 1 }, { "a" => 2 }], "a") end + def test_sort_numeric + assert_equal ['1', '2', '3', '10'], @filters.sort_numeric(['10', '3', '2', '1']) + + assert_equal [{ "a" => '1' }, { "a" => '2' }, { "a" => '3' }, { "a" => '10' }], + @filters.sort_numeric([{ "a" => '10' }, { "a" => '3' }, { "a" => '1' }, { "a" => '2' }], "a") + end + def test_sort_when_property_is_sometimes_missing_puts_nils_last input = [ { "price" => 4, "handle" => "alpha" }, @@ -216,6 +223,10 @@ def test_sort_natural_empty_array assert_equal [], @filters.sort_natural([], "a") end + def test_sort_numeric_empty_array + assert_equal [], @filters.sort_numeric([], "a") + end + def test_legacy_sort_hash assert_equal [{ a: 1, b: 2 }], @filters.sort({ a: 1, b: 2 }) end From 9bb533985eb37bab23702a2b967be8745d6180c4 Mon Sep 17 00:00:00 2001 From: Mike Angell Date: Fri, 4 Oct 2019 15:25:06 +1000 Subject: [PATCH 2/2] styling fixes --- test/integration/standard_filter_test.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index 8cc7dc3ae..855514d49 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -202,8 +202,8 @@ def test_sort_numeric assert_equal ['1', '2', '3', '10'], @filters.sort_numeric(['10', '3', '2', '1']) assert_equal [{ "a" => '1' }, { "a" => '2' }, { "a" => '3' }, { "a" => '10' }], @filters.sort_numeric([{ "a" => '10' }, { "a" => '3' }, { "a" => '1' }, { "a" => '2' }], "a") - end - + end + def test_sort_with_nils assert_equal [1, 2, 3, 4, nil], @filters.sort([nil, 4, 3, 2, 1]) assert_equal [{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }, {}], @filters.sort([{ "a" => 4 }, { "a" => 3 }, {}, { "a" => 1 }, { "a" => 2 }], "a") @@ -301,7 +301,7 @@ def test_sort_natural_empty_array def test_sort_numeric_empty_array assert_equal [], @filters.sort_numeric([], "a") end - + def test_sort_natural_invalid_property foo = [ [1],