Пример #1
0
    def test_visit_call_macro(self):
        call = ast.Call(name="foo", arguments={})
        renderer = Renderer(context={}, transforms={})
        renderer.macros["foo"] = ([], ast.Text("foo text"))
        call.accept(renderer)
        self.assertEqual(renderer.result, "foo text")

        body = ast.Block([
            ast.Text('<input type="'),
            ast.Lookup("type", transforms=[]),
            ast.Text('" value="'),
            ast.Lookup("value", transforms=[]),
            ast.Text('">'),
        ])
        call = ast.Call(
            name="input",
            arguments={
                "type": "text",
                "value": ast.Lookup("val", transforms=[])
            },
        )
        renderer = Renderer(context={"val": "hi"}, transforms={})
        renderer.macros["input"] = (["type", "value"], body)
        call.accept(renderer)
        self.assertEqual(renderer.result, '<input type="text" value="hi">')
Пример #2
0
 def test_visit_macro(self):
     body = ast.Block([
         ast.Text('<input type="'),
         ast.Lookup("type", transforms=[]),
         ast.Text('" value="'),
         ast.Lookup("value", transforms=[]),
         ast.Text('">'),
     ])
     macro = ast.Macro(name="input",
                       parameters=["type", "value"],
                       body=body)
     renderer = self.render(macro, {})
     self.assertEqual(renderer.result, "")
     self.assertEqual(renderer.macros, {"input": (["type", "value"], body)})
Пример #3
0
    def test_visit_if(self):
        if_stmt = ast.If(
            condition="username",
            consequence=ast.Block([
                ast.Text("Hello, "),
                ast.Lookup("username", transforms=[]),
                ast.Text("!"),
            ]),
            alternative=ast.Block([ast.Text("Hello, Guest!")]),
        )
        renderer = self.render(if_stmt, {"username": "******"})
        self.assertEqual(renderer.result, "Hello, rsiemens!")

        renderer = self.render(if_stmt, {"username": None})
        self.assertEqual(renderer.result, "Hello, Guest!")
Пример #4
0
    def test_visit_lookup(self):
        lookup = ast.Lookup("foo", transforms=[])
        renderer = self.render(lookup, {"foo": "bar"})
        self.assertEqual(renderer.result, "bar")

        renderer = self.render(lookup, {"foo": 42})
        self.assertEqual(renderer.result, "42")

        lookup = ast.Lookup("foo.bar", transforms=[])
        renderer = self.render(lookup, {"foo": {"bar": "baz"}})
        self.assertEqual(renderer.result, "baz")

        lookup = ast.Lookup("foo.bar", transforms=[])
        Foo = type("Foo", (), {"bar": 42})
        renderer = self.render(lookup, {"foo": Foo()})
        self.assertEqual(renderer.result, "42")

        lookup = ast.Lookup("foo", transforms=["upper"])
        renderer = self.render(lookup, {"foo": "bar"})
        self.assertEqual(renderer.result, "BAR")

        lookup = ast.Lookup("foo", transforms=["upper", "lower"])
        renderer = self.render(lookup, {"foo": "BaR"})
        self.assertEqual(renderer.result, "bar")
Пример #5
0
    def test_visit_for(self):
        for_loop = ast.For(
            name="item",
            iterator="list",
            body=ast.Block([
                ast.Text("item="),
                ast.Lookup("item", transforms=[]),
                ast.Text("\n")
            ]),
        )
        renderer = self.render(
            for_loop, {"list": ["Bulbasaur", "Charmander", "Squirtle"]})
        self.assertEqual(renderer.result,
                         "item=Bulbasaur\nitem=Charmander\nitem=Squirtle\n")

        renderer = self.render(for_loop, {"list": []})
        self.assertEqual(renderer.result, "")
Пример #6
0
    def call_macro(self) -> ast.Call:
        self.match("!")
        self.eat_whitespace()
        name = self.word()
        self.eat_whitespace()

        args: Dict[str, Union[str, ast.Lookup]] = {}
        while self.current and self.current != "}":
            arg = self.word()
            self.eat_whitespace()
            self.match("=")
            self.eat_whitespace()
            # string literal
            if self.current in "\"'":
                args[arg] = self.string_literal()
            else:
                args[arg] = ast.Lookup(self.word(), transforms=[])
            self.eat_whitespace()

        self.match("}")
        return ast.Call(name, args)
Пример #7
0
    def lookup(self) -> Union[ast.Lookup, ast.Call]:
        """
        {variable | optional_transform}
        """
        self.match("{")
        self.eat_whitespace()

        if self.current == "!":
            return self.call_macro()

        word = self.word()
        self.eat_whitespace()

        transforms = []
        while self.current == "|":
            self.next()
            self.eat_whitespace()
            transforms.append(self.word())
            self.eat_whitespace()

        self.match("}")

        return ast.Lookup(word, transforms)