Skip to content

Commit 7f50704

Browse files
create Components dataclass (#62)
1 parent f5badbd commit 7f50704

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

src/django_bird/components.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from __future__ import annotations
2+
3+
from dataclasses import dataclass
4+
from typing import TYPE_CHECKING
5+
from typing import Any
6+
7+
from django.template.backends.django import Template
8+
from django.template.loader import select_template
9+
10+
from .templates import get_template_names
11+
12+
if TYPE_CHECKING:
13+
pass
14+
15+
16+
@dataclass(frozen=True, slots=True)
17+
class Component:
18+
name: str
19+
template: Template
20+
21+
def render(self, context: dict[str, Any]):
22+
return self.template.render(context)
23+
24+
@property
25+
def nodelist(self):
26+
return self.template.template.nodelist
27+
28+
@classmethod
29+
def from_name(cls, name: str):
30+
template_names = get_template_names(name)
31+
template = select_template(template_names)
32+
return cls(name=name, template=template)

src/django_bird/templatetags/tags/bird.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,15 @@
66
from django import template
77
from django.template.base import NodeList
88
from django.template.base import Parser
9-
from django.template.base import Template
109
from django.template.base import Token
1110
from django.template.context import Context
12-
from django.template.loader import select_template
13-
from django.utils.safestring import SafeString
1411

1512
from django_bird._typing import TagBits
1613
from django_bird._typing import override
14+
from django_bird.components import Component
1715
from django_bird.params import Params
1816
from django_bird.slots import DEFAULT_SLOT
1917
from django_bird.slots import Slots
20-
from django_bird.templates import get_template_names
2118

2219
TAG = "bird"
2320
END_TAG = "endbird"
@@ -60,12 +57,11 @@ def __init__(self, name: str, params: Params, nodelist: NodeList | None) -> None
6057
self.nodelist = nodelist
6158

6259
@override
63-
def render(self, context: Context) -> SafeString:
60+
def render(self, context: Context) -> str:
6461
component_name = self.get_component_name(context)
65-
template_names = get_template_names(component_name)
66-
template = select_template(template_names)
67-
component_context = self.get_component_context_data(template.template, context)
68-
return template.render(component_context)
62+
component = Component.from_name(component_name)
63+
component_context = self.get_component_context_data(component, context)
64+
return component.render(component_context)
6965

7066
def get_component_name(self, context: Context) -> str:
7167
try:
@@ -75,9 +71,9 @@ def get_component_name(self, context: Context) -> str:
7571
return name
7672

7773
def get_component_context_data(
78-
self, template: Template, context: Context
74+
self, component: Component, context: Context
7975
) -> dict[str, Any]:
80-
props = self.params.render_props(template.nodelist, context)
76+
props = self.params.render_props(component.nodelist, context)
8177
attrs = self.params.render_attrs(context)
8278
slots = Slots.collect(self.nodelist, context).render()
8379
default_slot = slots.get(DEFAULT_SLOT) or context.get("slot")

0 commit comments

Comments
 (0)