mirror of
https://github.com/kemko/liquid.git
synced 2026-01-01 15:55:40 +03:00
Changed sort_natural filter to use casecmp. Strings only.
This commit is contained in:
@@ -127,19 +127,12 @@ module Liquid
|
||||
def sort_natural(input, property = nil)
|
||||
ary = InputIterator.new(input)
|
||||
|
||||
# Quick function that returns the downcased object if it has a downcase,
|
||||
# otherwise it returns the object itself.
|
||||
insensitive = lambda do |obj|
|
||||
obj = obj.downcase if obj.respond_to? :downcase
|
||||
obj
|
||||
end
|
||||
|
||||
if property.nil?
|
||||
ary.sort {|a,b| insensitive.call(a) <=> insensitive.call(b) }
|
||||
ary.sort {|a,b| a.casecmp b }
|
||||
elsif ary.first.respond_to?(:[]) && !ary.first[property].nil?
|
||||
ary.sort {|a,b| insensitive.call(a[property]) <=> insensitive.call(b[property]) }
|
||||
ary.sort {|a,b| a[property].casecmp b[property] }
|
||||
elsif ary.first.respond_to?(property)
|
||||
ary.sort {|a,b| insensitive.call(a.send(property)) <=> insensitive.call(b.send(property)) }
|
||||
ary.sort {|a,b| a.send(property).casecmp b.send(property) }
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -84,16 +84,13 @@ class FiltersTest < Minitest::Test
|
||||
end
|
||||
|
||||
def test_sort_natural
|
||||
@context['value'] = 3
|
||||
@context['numbers'] = [2,1,4,3]
|
||||
@context['words'] = ['case', 'Assert', 'Insensitive']
|
||||
# This specific syntax forces hashes to have string keys. Colons won't work.
|
||||
@context['hashes'] = [{ 'a' => 'A'}, { 'a' => 'b'}, { 'a' => 'C' }]
|
||||
@context['objects'] = [TestObject.new('A'), TestObject.new('b'), TestObject.new('C')]
|
||||
|
||||
assert_equal [1,2,3,4], Variable.new("numbers | sort_natural").render(@context)
|
||||
# Test strings
|
||||
assert_equal ['Assert', 'case', 'Insensitive'], Variable.new("words | sort_natural").render(@context)
|
||||
assert_equal [3], Variable.new("value | sort_natural").render(@context)
|
||||
|
||||
# Test hashes
|
||||
sorted = Variable.new("hashes | sort_natural: 'a'").render(@context)
|
||||
@@ -164,7 +161,7 @@ class FiltersInTemplate < Minitest::Test
|
||||
end
|
||||
end # FiltersTest
|
||||
|
||||
# Simple object that may be passed into a filter.
|
||||
# Simple object that gmay be passed into a filter.
|
||||
# Note to test subjects: do not smuggle test objects out of the testing area.
|
||||
class TestObject
|
||||
attr_accessor :a
|
||||
|
||||
Reference in New Issue
Block a user