Source code for PyFoam.Wrappers.Jinja2

"""Wrapper for the Jinja2-library

Adds PyFoam-specific  filters and tests to the environment"""

__all__ = ["get_jinja_environment"]

try:
    import jinja2
    _has_jinja = True
    _has_pass_context = hasattr(jinja2, "pass_context")

except ImportError:
    _has_jinja = False


_environments = {}


def parse_foam_file(name,
                    boundaryDict=False,
                    listDict=False,
                    listDictWithHeader=False,
                    noHeader=False,
                    noBody=False,
                    binaryMode=False):
    from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile

    pf = ParsedParameterFile(name,
                             boundaryDict=boundaryDict,
                             listDict=listDict,
                             listDictWithHeader=listDictWithHeader,
                             noBody=noBody,
                             noHeader=noHeader,
                             binaryMode=binaryMode)

    return pf


def parse_foam_string(content,
                      boundaryDict=False,
                      listDict=False,
                      listDictWithHeader=False,
                      noHeader=True,
                      noBody=False,
                      binaryMode=False):
    from PyFoam.RunDictionary.ParsedParameterFile import FoamFileParser

    pf = FoamFileParser(content,
                        boundaryDict=boundaryDict,
                        listDict=listDict,
                        listDictWithHeader=listDictWithHeader,
                        noBody=noBody,
                        noHeader=noHeader,
                        binaryMode=binaryMode)

    return pf


def format_foam(data):
    from PyFoam.Basics.FoamFileGenerator import makeString

    return makeString(data)


def solution_dir(location):
    from PyFoam.RunDictionary.SolutionDirectory import SolutionDirectory

    return SolutionDirectory(location)


def import_module(name):
    from importlib import import_module

    return import_module(name)


if _has_jinja:
    if _has_pass_context:
        @jinja2.pass_context
        def python_eval(ctx, code):
            return eval(code, ctx.parent, ctx.vars)


        @jinja2.pass_context
        def python_exec(ctx, code):
            from PyFoam.ThirdParty.six import exec_

            result = exec_(code, ctx.parent, ctx.vars)
            return result


[docs]def get_jinja_environment(strict_undefined=True, allow_execute=False): global _environments spec = (strict_undefined, allow_execute) if _has_jinja: # provoke raising the import error we had before import jinja2 if spec not in _environments: if strict_undefined: undefined = jinja2.StrictUndefined else: undefined = jinja2.Undefined _environment = jinja2.Environment(undefined=undefined) _environment.filters["parse_foam_file"] = parse_foam_file _environment.filters["parse_foam"] = parse_foam_string _environment.filters["format_foam"] = format_foam _environment.filters["import_module"] = import_module _environment.filters["solution_dir"] = solution_dir if _has_pass_context: _environment.filters["python_eval"] = python_eval if allow_execute: _environment.filters["python_exec"] = python_exec try: _environment.add_extension("jinja2.ext.do") except AttributeError: pass _environments[spec] = _environment return _environments[spec]