From ab7f3e0cdb7daac6e03ba47d4f03673060a7b6e6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:37:59 +0000 Subject: [PATCH] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/django_components/component.py | 11 ++++++++--- src/django_components/context.py | 2 +- src/django_components/slots.py | 15 ++++++++------- .../templatetags/component_tags.py | 2 +- tests/test_component.py | 17 +++++++++-------- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/django_components/component.py b/src/django_components/component.py index 5df37dfd..c419fb3f 100644 --- a/src/django_components/component.py +++ b/src/django_components/component.py @@ -20,19 +20,24 @@ from django.views import View # way the two modules depend on one another. from django_components.component_registry import registry # NOQA from django_components.component_registry import AlreadyRegistered, ComponentRegistry, NotRegistered, register # NOQA -from django_components.context import capture_root_context, set_root_context, get_root_context, set_slot_component_association +from django_components.context import ( + capture_root_context, + get_root_context, + set_root_context, + set_slot_component_association, +) from django_components.logger import logger, trace_msg from django_components.middleware import is_dependency_middleware_active from django_components.node import walk_nodelist from django_components.slots import ( + DEFAULT_SLOT_KEY, FillContent, FillNode, SlotName, SlotNode, render_component_template_with_slots, - DEFAULT_SLOT_KEY, ) -from django_components.utils import search, gen_id +from django_components.utils import gen_id, search RENDERED_COMMENT_TEMPLATE = "" diff --git a/src/django_components/context.py b/src/django_components/context.py index d486bcd2..1c3d0636 100644 --- a/src/django_components/context.py +++ b/src/django_components/context.py @@ -5,7 +5,7 @@ pass data across components, nodes, slots, and contexts. You can think of the Context as our storage system. """ -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING, Optional from django.template import Context diff --git a/src/django_components/slots.py b/src/django_components/slots.py index 58e60730..ddfe6cc7 100644 --- a/src/django_components/slots.py +++ b/src/django_components/slots.py @@ -9,15 +9,15 @@ else: from typing import TypeAlias from django.template import Context, Template -from django.template.base import FilterExpression, Node, NodeList, TextNode, Parser +from django.template.base import FilterExpression, Node, NodeList, Parser, TextNode from django.template.defaulttags import CommentNode from django.template.exceptions import TemplateSyntaxError from django.utils.safestring import SafeString, mark_safe from django_components.app_settings import SlotContextBehavior, app_settings -from django_components.context import get_root_context, get_slot_fill, set_slot_fill, get_slot_component_association -from django_components.node import nodelist_has_content +from django_components.context import get_root_context, get_slot_component_association, get_slot_fill, set_slot_fill from django_components.logger import trace_msg +from django_components.node import nodelist_has_content from django_components.utils import gen_id DEFAULT_SLOT_KEY = "_DJANGO_COMPONENTS_DEFAULT_SLOT" @@ -58,10 +58,11 @@ class UserSlotVar: class ComponentIdMixin: """ Mixin for classes use or pass through component ID. - + We use component IDs to identify which slots should be rendered with which fills for which components. """ + _component_id: str @property @@ -369,7 +370,7 @@ def render_component_template_with_slots( NOTE: The nodes in the template are mutated in the process! """ - # ---- Prepare slot fills ---- + # ---- Prepare slot fills ---- slot_name2fill_content = _collect_slot_fills_from_component_template(template, fill_content, registered_name) # Give slot nodes knowledge of their parent component. @@ -411,7 +412,7 @@ def _collect_slot_fills_from_component_template( # Type check so the rest of the logic has type of `node` is inferred if not isinstance(node, SlotNode): continue - + slot_name = node.name if slot_name in slot_name2fill_content: raise TemplateSyntaxError( @@ -440,7 +441,7 @@ def _collect_slot_fills_from_component_template( content_data = named_fills_content.get(node.name) slot_name2fill_content[slot_name] = content_data - + # Check: Only component templates that include a 'default' slot # can be invoked with implicit filling. if default_fill_content and not default_slot_encountered: diff --git a/src/django_components/templatetags/component_tags.py b/src/django_components/templatetags/component_tags.py index 018d5816..aeeb79f9 100644 --- a/src/django_components/templatetags/component_tags.py +++ b/src/django_components/templatetags/component_tags.py @@ -190,7 +190,7 @@ def do_fill(parser: Parser, token: Token) -> FillNode: alias_fexp = FilterExpression(alias, parser) else: raise TemplateSyntaxError(f"'{tag}' tag takes either 1 or 3 arguments: Received {len(args)}.") - + # Use a unique ID to be able to tie the fill nodes with components and slots # NOTE: MUST be called BEFORE `parser.parse()` to ensure predictable numbering fill_id = gen_id() diff --git a/tests/test_component.py b/tests/test_component.py index 3bc05264..eddb3e03 100644 --- a/tests/test_component.py +++ b/tests/test_component.py @@ -240,7 +240,7 @@ class ComponentTest(SimpleTestCase): ) # {{ name }} should be "Jannete" everywhere - rendered = self.template.render(Context({ "day": "Monday", "name": "Jannete" })) + rendered = self.template.render(Context({"day": "Monday", "name": "Jannete"})) self.assertHTMLEqual( rendered, """ @@ -537,6 +537,7 @@ class ComponentIsolationTests(SimpleTestCase): """, ) + class SlotBehaviorTests(SimpleTestCase): def setUp(self): class SlottedComponent(component.Component): @@ -578,7 +579,7 @@ class SlotBehaviorTests(SimpleTestCase): ) def test_slot_context_allow_override(self): # {{ name }} should be neither Jannete not empty, because overriden everywhere - rendered = self.template.render(Context({ "day": "Monday", "name": "Jannete" })) + rendered = self.template.render(Context({"day": "Monday", "name": "Jannete"})) self.assertHTMLEqual( rendered, """ @@ -597,7 +598,7 @@ class SlotBehaviorTests(SimpleTestCase): ) # {{ name }} should be effectively the same as before, because overriden everywhere - rendered2 = self.template.render(Context({ "day": "Monday" })) + rendered2 = self.template.render(Context({"day": "Monday"})) self.assertHTMLEqual(rendered2, rendered) @override_settings( @@ -605,7 +606,7 @@ class SlotBehaviorTests(SimpleTestCase): ) def test_slot_context_isolated(self): # {{ name }} should be "Jannete" everywhere - rendered = self.template.render(Context({ "day": "Monday", "name": "Jannete" })) + rendered = self.template.render(Context({"day": "Monday", "name": "Jannete"})) self.assertHTMLEqual( rendered, """ @@ -624,7 +625,7 @@ class SlotBehaviorTests(SimpleTestCase): ) # {{ name }} should be empty everywhere - rendered2 = self.template.render(Context({ "day": "Monday" })) + rendered2 = self.template.render(Context({"day": "Monday"})) self.assertHTMLEqual( rendered2, """ @@ -644,12 +645,12 @@ class SlotBehaviorTests(SimpleTestCase): @override_settings( COMPONENTS={ - "slot_context_behavior": "prefer_root", + "slot_context_behavior": "prefer_root", }, ) def test_slot_context_prefer_root(self): # {{ name }} should be "Jannete" everywhere - rendered = self.template.render(Context({ "day": "Monday", "name": "Jannete" })) + rendered = self.template.render(Context({"day": "Monday", "name": "Jannete"})) self.assertHTMLEqual( rendered, """ @@ -668,7 +669,7 @@ class SlotBehaviorTests(SimpleTestCase): ) # {{ name }} should be neither "Jannete" nor empty anywhere - rendered = self.template.render(Context({ "day": "Monday" })) + rendered = self.template.render(Context({"day": "Monday"})) self.assertHTMLEqual( rendered, """