Source code for jinja2schema.visitors.util
# coding: utf-8
"""
jinja2schema.visitors.util
~~~~~~~~~~~~~~~~~~~~~~~~~~
"""
import jinja2.nodes
from ..mergers import merge
from ..model import Dictionary, Scalar, Unknown
def visit(node, macroses, config, predicted_struct_cls=Scalar, return_struct_cls=Unknown):
if isinstance(node, jinja2.nodes.Stmt):
structure = visit_stmt(node, macroses, config)
elif isinstance(node, jinja2.nodes.Expr):
ctx = Context(predicted_struct=predicted_struct_cls.from_ast(node, order_nr=config.ORDER_OBJECT.get_next()),
return_struct_cls=return_struct_cls)
_, structure = visit_expr(node, ctx, macroses, config)
elif isinstance(node, jinja2.nodes.Template):
structure = visit_many(node.body, macroses, config)
return structure
[docs]def visit_many(nodes, macroses, config, predicted_struct_cls=Scalar, return_struct_cls=Unknown):
"""Visits ``nodes`` and merges results.
:param nodes: list of :class:`jinja2.nodes.Node`
:param predicted_struct_cls: ``predicted_struct`` for expression visitors will be constructed
using this class by calling :meth:`from_ast` method
:return: :class:`Dictionary`
"""
rv = Dictionary()
for node in nodes:
if isinstance(node, jinja2.nodes.Extends):
structure = visit_extends(node, macroses, config, [x for x in nodes if isinstance(x, jinja2.nodes.Block)])
else:
structure = visit(node, macroses, config, predicted_struct_cls, return_struct_cls)
rv = merge(rv, structure)
return rv
# keep these at the end of file to avoid circular imports
from .expr import Context, visit_expr
from .stmt import visit_stmt, visit_extends