Source code for jinja2schema.core

# coding: utf-8
"""
jinja2schema.core
~~~~~~~~~~~~~~~~~
"""
import jinja2

from .config import Config
from .model import Dictionary
from .visitors import visit
from . import _compat


[docs]def parse(template, jinja2_env=None): """Parses Jinja2 template and returns it's AST. :type template: basestring :type jinja2_env: :class:`jinja2.Environment` :rtype: :class:`jinja2.nodes.Template` """ if jinja2_env is None: jinja2_env = jinja2.Environment() return jinja2_env.parse(template)
def _ignore_constants(var): if isinstance(var, Dictionary): for k, v in list(_compat.iteritems(var)): if v.constant and not v.may_be_defined: del var[k] else: _ignore_constants(v) return var
[docs]def infer_from_ast(ast, ignore_constants=True, config=Config()): """Returns a :class:`.model.Dictionary` which reflects a structure of variables used within ``ast``. :param ast: AST :type ast: :class:`jinja2.nodes.Node` :param ignore_constants: excludes constant variables from a resulting structure :param config: a config :type config: :class:`.config.Config` :rtype: :class:`.model.Dictionary` :raises: :class:`.exceptions.MergeException`, :class:`.exceptions.InvalidExpression`, :class:`.exceptions.UnexpectedExpression` """ rv = visit(ast, config) if ignore_constants: rv = _ignore_constants(rv) return rv
[docs]def infer(template, config=Config()): """Returns a :class:`.model.Dictionary` which reflects a structure of the context required by ``template``. :param template: a template :type template: string :param config: a config :type config: :class:`.config.Config` :rtype: :class:`.model.Dictionary` :raises: :class:`.exceptions.MergeException`, :class:`.exceptions.InvalidExpression`, :class:`.exceptions.UnexpectedExpression` """ return infer_from_ast(parse(template), config=config, ignore_constants=True)