Metadata-Version: 2.1
Name: muffin-jinja2
Version: 1.7.0
Summary: Support Jinja2 templates for Muffin Framework
Author-email: Kirill Klenov <horneds@gmail.com>
License: MIT License
Project-URL: homepage, https://github.com/klen/muffin-jinja2
Project-URL: repository, https://github.com/klen/muffin-jinja2
Keywords: asyncio,trio,asgi,web,muffin,jinja,jinja2
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Framework :: AsyncIO
Classifier: Framework :: Trio
Requires-Python: >=3.8
Description-Content-Type: text/x-rst
License-File: LICENSE
Requires-Dist: muffin (>=0.92)
Requires-Dist: jinja2 (>=3.1.1)
Provides-Extra: dev
Requires-Dist: pre-commit ; extra == 'dev'
Requires-Dist: refurb ; extra == 'dev'
Requires-Dist: bump2version ; extra == 'dev'
Provides-Extra: tests
Requires-Dist: pytest ; extra == 'tests'
Requires-Dist: pytest-aio[curio,trio] ; extra == 'tests'
Requires-Dist: pytest-mypy ; extra == 'tests'
Requires-Dist: ruff ; extra == 'tests'

Muffin-Jinja2
#############

.. _description:

**Muffin-Jinja2** -- Support Jinja2 templates for Muffin_ Framework

.. _badges:

.. image:: https://github.com/klen/muffin-jinja2/workflows/tests/badge.svg
    :target: https://github.com/klen/muffin-jinja2/actions
    :alt: Tests Status

.. image:: https://img.shields.io/pypi/v/muffin-jinja2
    :target: https://pypi.org/project/muffin-jinja2/
    :alt: PYPI Version

.. _contents:

.. contents::

.. _requirements:

Requirements
=============

- python >= 3.7

.. _installation:

Installation
=============

**Muffin-Jinja2** should be installed using pip: ::

    pip install muffin-jinja2

.. _usage:

Usage
=====

.. code-block:: python

    import muffin
    import muffin_jinja2

    # Create Muffin Application
    app = muffin.Application('example')

    # Initialize the plugin
    # As alternative: jinja2 = Jinja2(app, **options)
    jinja2 = muffin_jinja2.Plugin()
    jinja2.setup(app, template_folders=['src/templates'])

    # Use it inside your handlers
    @app.route('/')
    async def index(request):
        context = {'var': 42}
        return await jinja2.render('index.html', **context)


Options
-------

==================== ==================== ====================
Name                 Default value        Description
-------------------- -------------------- --------------------
**auto_reload**      ``False``            Auto reload changed templates
**cache_size**       ``50``               Cache templates
**extensions**       ``None``             Enable Jinja2 Extensions (``None | list``)
**loader**           ``FileSystemLoader`` Template loader
**encoding**         ``utf-8``            Default encoding for file loader
**template_folders** ``['templates']``    List of template folders
==================== ==================== ====================


You are able to provide the options when you are initiliazing the plugin:

.. code-block:: python

    jinja2.init(app, template_folders=['src/templates'], auto_reload=True)


Or setup it inside ``Muffin.Application`` config using the `jinja2_` prefix for example:

.. code-block:: python

   JINJA2_AUTO_RELOAD = True

   JINJA2_TEMPLATE_FOLDERS = ['tmpls']

``Muffin.Application`` configuration options are case insensitive


Tunning
-------

.. code-block:: python

    # Register custom context processor
    # could be a function/coroutine
    @jinja2.add_context
    def custom_context():
        return { 'VAR': 'VALUE' }

    # Register a function into global context
    @jinja2.add_global
    def sum(a, b):
        return a + b

    # Register a function with a different name
    @jinja2.add_global('div')
    def mod(a, b):
        return a // b

    # Register a filter
    @jinja2.add_filter
    def test(value, a, b=None):
        return a if value else b

    # Register a filter with a different name
    @jinja2.add_filter('bool')
    def boolean(value):
        return bool(value)

    @app.route('/')
    async def index(request):
        """ Check for user is admin. """
        local_context = {'key': 'value'}
        return await jinja2.render('index.html', **local_context)


.. _bugtracker:

Bug tracker
===========

If you have any suggestions, bug reports or
annoyances please report them to the issue tracker
at https://github.com/klen/muffin-jinja2/issues

.. _contributing:

Contributing
============

Development of Muffin-Jinja2 happens at: https://github.com/klen/muffin-jinja2


Contributors
=============

* klen_ (Kirill Klenov)

.. _license:

License
========

Licensed under a `MIT license`_.

.. _links:


.. _klen: https://github.com/klen
.. _Muffin: https://github.com/klen/muffin

.. _MIT license: http://opensource.org/licenses/MIT
