From 45d6bb5f6489c68cb0d3e7ebd9afc6bcd59dd745 Mon Sep 17 00:00:00 2001 From: Sergi Pons Freixes Date: Sun, 22 Oct 2023 09:42:54 -0700 Subject: [PATCH 1/5] Support Quart>=19.0.0 Quart changed how it is initializing signals, removing the AsyncNamespace class jinja2-fragments was relying on. Hence, the library was not usable with Quart>=0.19.0, which is when this change became effective. This commit adds support for both Quart<=19.0.0 and Quart>=19.0.0. Ref: https://github.com/sponsfreixes/jinja2-fragments/issues/19 --- setup.py | 2 +- src/jinja2_fragments/quart.py | 44 ++++++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/setup.py b/setup.py index 8578177..34bb22c 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ ] tests_requires = [ - "quart >= 0.18.0, < 0.19.0", + "quart >= 0.18.0", "flask >= 2.1.0", "fastapi", "sanic", diff --git a/src/jinja2_fragments/quart.py b/src/jinja2_fragments/quart.py index 77fb3a4..2cbf068 100644 --- a/src/jinja2_fragments/quart.py +++ b/src/jinja2_fragments/quart.py @@ -7,11 +7,21 @@ "Install quart before using jinja2_fragments.quart" ) from e -from quart.signals import AsyncNamespace +try: + # Quart >= 0.19.0 + from quart.signals import Namespace + + CUSTOM_SIGNALj = False +except ImportError: + # Quart < 0.19.0 + from quart.signals import AsyncNamespace as Namespace + + CUSTOM_SIGNAL = True + from . import render_block_async -jinja2_fragments_signals = AsyncNamespace() +jinja2_fragments_signals = Namespace() before_render_template_block = jinja2_fragments_signals.signal( "before-render-template-block" ) @@ -30,13 +40,31 @@ async def render_block( """ app = current_app # type: ignore[attr-defined] await app.update_template_context(context) - await before_render_template_block.send( - app, template_name=template_name, block_name=block_name, context=context - ) + if CUSTOM_SIGNAL: + await before_render_template_block.send( + app, template_name=template_name, block_name=block_name, context=context + ) + else: + await before_render_template_block.send_async( + app, + _sync_wrapper=app.ensure_async, + template_name=template_name, + block_name=block_name, + context=context, + ) rendered = await render_block_async( app.jinja_env, template_name, block_name, **context ) - await template_block_rendered.send( - app, template_name=template_name, block_name=block_name, context=context - ) + if CUSTOM_SIGNAL: + await template_block_rendered.send( + app, template_name=template_name, block_name=block_name, context=context + ) + else: + await template_block_rendered.send_async( + app, + _sync_wrapper=app.ensure_async, + template_name=template_name, + block_name=block_name, + context=context, + ) return rendered From ecc66641c67172d6b31de653dfc99f9417137479 Mon Sep 17 00:00:00 2001 From: Sergi Pons Freixes Date: Sun, 22 Oct 2023 09:46:22 -0700 Subject: [PATCH 2/5] Fix typo --- src/jinja2_fragments/quart.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jinja2_fragments/quart.py b/src/jinja2_fragments/quart.py index 2cbf068..14f2c66 100644 --- a/src/jinja2_fragments/quart.py +++ b/src/jinja2_fragments/quart.py @@ -11,7 +11,7 @@ # Quart >= 0.19.0 from quart.signals import Namespace - CUSTOM_SIGNALj = False + CUSTOM_SIGNAL = False except ImportError: # Quart < 0.19.0 from quart.signals import AsyncNamespace as Namespace From 46c358aba43b8724e0aae887fb115ce9bcf10e11 Mon Sep 17 00:00:00 2001 From: Sergi Pons Freixes Date: Sun, 22 Oct 2023 11:12:44 -0700 Subject: [PATCH 3/5] Skip Quart tests with Python<=3.7 --- tests/test_quart.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test_quart.py b/tests/test_quart.py index a96da4a..b01e3df 100644 --- a/tests/test_quart.py +++ b/tests/test_quart.py @@ -1,3 +1,5 @@ +import sys + import pytest from jinja2_fragments import BlockNotFoundError @@ -12,7 +14,8 @@ class TestQuartRenderBlock: (True, "simple_page_content.html"), ], ) - @pytest.mark.asyncio + @pytest.mark.asynci + @pytest.mark.skipif(sys.version_info <= (3, 7)) async def test_simple_page(self, quart_client, get_html, only_content, html_name): response = await quart_client.get( "/simple_page", query_string={"only_content": only_content} @@ -30,6 +33,7 @@ async def test_simple_page(self, quart_client, get_html, only_content, html_name ], ) @pytest.mark.asyncio + @pytest.mark.skipif(sys.version_info <= (3, 7)) async def test_nested_page(self, quart_client, get_html, route, html_name): response = await quart_client.get(route) response_text = await response.get_data(True) From 1190ecc387c8daa13d34a2621df695b59675e101 Mon Sep 17 00:00:00 2001 From: Sergi Pons Freixes Date: Sun, 22 Oct 2023 11:17:12 -0700 Subject: [PATCH 4/5] Add tests skip reason --- tests/test_quart.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/test_quart.py b/tests/test_quart.py index b01e3df..50c6052 100644 --- a/tests/test_quart.py +++ b/tests/test_quart.py @@ -14,8 +14,10 @@ class TestQuartRenderBlock: (True, "simple_page_content.html"), ], ) - @pytest.mark.asynci - @pytest.mark.skipif(sys.version_info <= (3, 7)) + @pytest.mark.asyncio + @pytest.mark.skipif( + sys.version_info < (3, 8), reason="Quart requires Python 3.8.0 or higher" + ) async def test_simple_page(self, quart_client, get_html, only_content, html_name): response = await quart_client.get( "/simple_page", query_string={"only_content": only_content} @@ -33,7 +35,9 @@ async def test_simple_page(self, quart_client, get_html, only_content, html_name ], ) @pytest.mark.asyncio - @pytest.mark.skipif(sys.version_info <= (3, 7)) + @pytest.mark.skipif( + sys.version_info < (3, 8), reason="Quart requires Python 3.8.0 or higher" + ) async def test_nested_page(self, quart_client, get_html, route, html_name): response = await quart_client.get(route) response_text = await response.get_data(True) From 9969720c6c6d620cd44e7a43a8075d3284cd5f73 Mon Sep 17 00:00:00 2001 From: Sergi Pons Freixes Date: Sun, 22 Oct 2023 11:21:45 -0700 Subject: [PATCH 5/5] Skip Quart test with Python<3.8 --- tests/test_quart.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_quart.py b/tests/test_quart.py index 50c6052..8af6b4b 100644 --- a/tests/test_quart.py +++ b/tests/test_quart.py @@ -46,6 +46,9 @@ async def test_nested_page(self, quart_client, get_html, route, html_name): assert html == response_text @pytest.mark.asyncio + @pytest.mark.skipif( + sys.version_info < (3, 8), reason="Quart requires Python 3.8.0 or higher" + ) async def test_exception(self, quart_app): with pytest.raises(BlockNotFoundError) as exc: async with quart_app.app_context():