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)
 | 
			
		||||
      case item
 | 
			
		||||
      when String, Numeric, true, false, nil
 | 
			
		||||
        item.to_liquid
 | 
			
		||||
      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
 | 
			
		||||
        item.map{ |i| as_liquid(i) }
 | 
			
		||||
      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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -160,14 +160,70 @@ class TestFilters < Test::Unit::TestCase
 | 
			
		|||
      end
 | 
			
		||||
 | 
			
		||||
      should "call #to_liquid " do
 | 
			
		||||
        expected = "[{\"name\":\"Jeremiah\",\"v\":1,\"thing\":[{\"kay\":\"jewelers\"}],\"stuff\":true},{\"name\":\"Smathers\",\"v\":1,\"thing\":[{\"kay\":\"jewelers\"}],\"stuff\":true}]"
 | 
			
		||||
        assert_equal expected, @filter.jsonify([T.new("Jeremiah"), T.new("Smathers")])
 | 
			
		||||
        expected = [
 | 
			
		||||
          {
 | 
			
		||||
            "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
 | 
			
		||||
 | 
			
		||||
      should "handle hashes with all sorts of weird keys and values" do
 | 
			
		||||
        my_hash = { "posts" => Array.new(5) { |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}]}"
 | 
			
		||||
        assert_equal expected, @filter.jsonify(my_hash)
 | 
			
		||||
        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
 | 
			
		||||
            }
 | 
			
		||||
          ]
 | 
			
		||||
        }
 | 
			
		||||
        result = @filter.jsonify(my_hash)
 | 
			
		||||
        assert_equal expected, JSON.parse(result)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue