minijinja-lua 0.1.14

lua bindings for minijinja
Documentation
local minijinja = require("minijinja")
local Environment = minijinja.Environment

describe("State tests", function()
    local function state_func(state, _)
        assert.Equal("my_template", state:name())
        assert.Equal("none", state:auto_escape())
        assert.Equal("lenient", state:undefined_behavior())
        assert.Equal("test_block", state:current_block())
        assert.Equal(true, state:lookup("bar").baz)
        assert.Equal(42, state:lookup("func")())
        assert.Equal("my macro", state:call_macro("my_macro"))
        assert.Same({ "my_macro" }, state:exports())

        local known = state:known_variables()
        table.sort(known)
        assert.Same({ "bar", "foo", "func", "lua", "my_macro" }, known)

        assert.Equal("HELLO", state:apply_filter("state_filter", "hello"))
        assert.Equal(false, state:perform_test("state_test", "foo", "bar"))
        assert.Equal("[1, 2, 3]", state:format({ 1, 2, 3 }))

        local c, r = table.unpack(state:fuel_levels())
        local total = c + r
        assert.Equal(1000, total)
        assert.True(c < total)

        return true
    end

    local function setup(src)
        local env = Environment:empty()

        env.fuel = 1000

        env:add_global("lua", state_func)
        env:add_filter("state_filter", function(val)
            return val:upper()
        end, false)
        env:add_test("state_test", function(val, arg)
            return val == arg
        end, false)

        local name = "my_template"
        local source = "{% macro my_macro() %}my macro{% endmacro %}{% block test_block %}"
            .. src
            .. "{% endblock test_block %}"

        local ctx = {
            foo = "foo",
            func = function()
                return 42
            end,
            bar = { baz = true },
        }

        return env, name, source, ctx
    end

    it("filter#State", function()
        local env, name, source, ctx = setup("{{ foo | lua }}")
        env:add_filter("lua", state_func)

        env:render_str(source, ctx, name)
    end)

    it("test#State", function()
        local env, name, source, ctx = setup("{{ foo is lua }}")
        env:add_test("lua", state_func)

        env:render_str(source, ctx, name)
    end)

    it("global#State", function()
        local env, name, source, ctx = setup("{{ lua() }}")

        env:render_str(source, ctx, name)
    end)

    it("temps#State", function()
        local env = Environment:empty()

        local first = true

        local function inc(state)
            if first then
                assert.Nil(state:get_temp("counter"))
                first = false
            end

            local new = state:get_or_set_temp("counter", function()
                return 0
            end) + 1
            state:set_temp("counter", new)
            return new
        end

        env:add_global("inc", inc)
        local rv = env:render_str("{{ inc() }} {{ inc() }} {{ inc() }}")
        assert.Equal("1 2 3", rv)
    end)
end)