minijinja-lua 0.1.24

a minijinja lua module using the minijinja rust crate
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)