Merge pull request #3158 from afeld/as-liquid-refactor
This commit is contained in:
commit
49115dbdab
|
@ -328,14 +328,23 @@ module Jekyll
|
||||||
|
|
||||||
def as_liquid(item)
|
def as_liquid(item)
|
||||||
case item
|
case item
|
||||||
when String, Numeric, true, false, nil
|
|
||||||
item.to_liquid
|
|
||||||
when Hash
|
when Hash
|
||||||
Hash[item.map { |k, v| [as_liquid(k), as_liquid(v)] }]
|
pairs = item.map { |k, v| as_liquid([k, v]) }
|
||||||
|
Hash[pairs]
|
||||||
when Array
|
when Array
|
||||||
item.map{ |i| as_liquid(i) }
|
item.map{ |i| as_liquid(i) }
|
||||||
else
|
else
|
||||||
item.respond_to?(:to_liquid) ? as_liquid(item.to_liquid) : item
|
if item.respond_to?(:to_liquid)
|
||||||
|
liquidated = item.to_liquid
|
||||||
|
# prevent infinite recursion for simple types (which return `self`)
|
||||||
|
if liquidated == item
|
||||||
|
item
|
||||||
|
else
|
||||||
|
as_liquid(liquidated)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
item
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -160,14 +160,70 @@ class TestFilters < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
should "call #to_liquid " do
|
should "call #to_liquid " do
|
||||||
expected = "[{\"name\":\"Jeremiah\",\"v\":1,\"thing\":[{\"kay\":\"jewelers\"}],\"stuff\":true},{\"name\":\"Smathers\",\"v\":1,\"thing\":[{\"kay\":\"jewelers\"}],\"stuff\":true}]"
|
expected = [
|
||||||
assert_equal expected, @filter.jsonify([T.new("Jeremiah"), T.new("Smathers")])
|
{
|
||||||
|
"name" => "Jeremiah",
|
||||||
|
"v" => 1,
|
||||||
|
"thing" => [
|
||||||
|
{
|
||||||
|
"kay" => "jewelers"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stuff" => true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" => "Smathers",
|
||||||
|
"v" => 1,
|
||||||
|
"thing" => [
|
||||||
|
{
|
||||||
|
"kay" => "jewelers"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stuff" => true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
result = @filter.jsonify([T.new("Jeremiah"), T.new("Smathers")])
|
||||||
|
assert_equal expected, JSON.parse(result)
|
||||||
end
|
end
|
||||||
|
|
||||||
should "handle hashes with all sorts of weird keys and values" do
|
should "handle hashes with all sorts of weird keys and values" do
|
||||||
my_hash = { "posts" => Array.new(5) { |i| T.new(i) } }
|
my_hash = { "posts" => Array.new(3) { |i| T.new(i) } }
|
||||||
expected = "{\"posts\":[{\"name\":0,\"v\":1,\"thing\":[{\"kay\":\"jewelers\"}],\"stuff\":true},{\"name\":1,\"v\":1,\"thing\":[{\"kay\":\"jewelers\"}],\"stuff\":true},{\"name\":2,\"v\":1,\"thing\":[{\"kay\":\"jewelers\"}],\"stuff\":true},{\"name\":3,\"v\":1,\"thing\":[{\"kay\":\"jewelers\"}],\"stuff\":true},{\"name\":4,\"v\":1,\"thing\":[{\"kay\":\"jewelers\"}],\"stuff\":true}]}"
|
expected = {
|
||||||
assert_equal expected, @filter.jsonify(my_hash)
|
"posts" => [
|
||||||
|
{
|
||||||
|
"name" => 0,
|
||||||
|
"v" => 1,
|
||||||
|
"thing" => [
|
||||||
|
{
|
||||||
|
"kay" => "jewelers"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stuff" => true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" => 1,
|
||||||
|
"v" => 1,
|
||||||
|
"thing" => [
|
||||||
|
{
|
||||||
|
"kay" => "jewelers"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stuff" => true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" => 2,
|
||||||
|
"v" => 1,
|
||||||
|
"thing" => [
|
||||||
|
{
|
||||||
|
"kay" => "jewelers"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stuff" => true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
result = @filter.jsonify(my_hash)
|
||||||
|
assert_equal expected, JSON.parse(result)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue