Source code for evariste.plugins.renderer.jinja2.file

# Copyright Louis Paternault 2015-2022
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

"""Abstract utilities for file renderers using Jinja2.

.. autoclass:: Jinja2FileRenderer
   :members:

"""

# Can be removed starting with python3.11
from __future__ import annotations

import typing

import jinja2

from ... import Plugin

if typing.TYPE_CHECKING:
    from ...tree import Tree


[docs] class Jinja2FileRenderer(Plugin): """Renderer of file using jinja2. This is an abstract class that defines a default renderer for files. From within a template, the `macro <https://jinja.palletsprojects.com/en/3.0.x/templates/#macros>`__ ``render_file`` can be called, which: - looks for the first plugin that matches this file (that is, the first plugin where :meth:`Jinja2FileRenderer.match` returns ``True``; - calls :meth:`Jinja2FileRenderer.render`, and returns its return value. To implement such a renderer, you can: - write a :file:`file/default` template that defines a ``file()`` macro; - set the :attr:`Jinja2FileRenderer.extension`, and write a :file:`file/default.{extension}` template, that defines a ``file()`` macro; - overwrite the :meth:`Jinja2FileRenderer.render` method, if the default implementation does not pleas you. You can also overwrite :meth:`Jinja2FileRenderer.match`, so that your subplugin cannot be applied to *any* file, but only to some of them. """ keyword = None #: Extension that is automatically added at the end of the template name when searching them. extension: str | None = None priority = -float("inf") #: Name of the template rendering files. template: str = "default"
[docs] def match(self, filename: Tree) -> bool: """This is the default renderer, that matches everything.""" # pylint: disable=unused-argument, arguments-renamed return True
[docs] def render(self, filename: Tree, context: jinja2.runtime.Context) -> str: """Render ``tree``, which is a :class:`~evariste.tree.File` By default, call the ``file()`` `macro <https://jinja.palletsprojects.com/en/latest/templates/#macros>`__, with ``filename`` as argument, and returns its value. """ # pylint: disable=arguments-differ return context[f"file_{self.template}"](filename)