Skip to content

Commit 2f078c9

Browse files
move param parsing from BirdNode to Params constructor (#159)
1 parent edbc45b commit 2f078c9

File tree

4 files changed

+26
-54
lines changed

4 files changed

+26
-54
lines changed

src/django_bird/params.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
from django.utils.safestring import SafeString
1111
from django.utils.safestring import mark_safe
1212

13+
from .templatetags.tags.bird import BirdNode
1314
from .templatetags.tags.prop import PropNode
1415

1516
if TYPE_CHECKING:
1617
from django_bird.components import Component
17-
from django_bird.templatetags.tags.bird import BirdNode
1818

1919

2020
@dataclass
@@ -54,7 +54,10 @@ def render_attrs(self, context: Context) -> SafeString:
5454

5555
@classmethod
5656
def from_node(cls, node: BirdNode) -> Params:
57-
return cls(attrs=node.attrs.copy(), props=[])
57+
return cls(
58+
attrs=[Param.from_bit(bit) for bit in node.attrs],
59+
props=[],
60+
)
5861

5962

6063
@dataclass

src/django_bird/templatetags/tags/bird.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# pyright: reportAny=false
22
from __future__ import annotations
33

4+
from typing import final
5+
46
from django import template
57
from django.template.base import NodeList
68
from django.template.base import Parser
@@ -9,31 +11,29 @@
911

1012
from django_bird._typing import TagBits
1113
from django_bird._typing import override
12-
from django_bird.params import Param
1314

1415
TAG = "bird"
1516
END_TAG = "endbird"
1617

1718

1819
def do_bird(parser: Parser, token: Token) -> BirdNode:
19-
bits = token.split_contents()
20-
if len(bits) == 1:
20+
_tag, *bits = token.split_contents()
21+
if not bits:
2122
msg = f"{TAG} tag requires at least one argument"
2223
raise template.TemplateSyntaxError(msg)
2324

24-
name = bits[1]
25-
attrs = []
25+
name = bits.pop(0)
26+
attrs: TagBits = []
2627
isolated_context = False
2728

28-
for bit in bits[2:]:
29+
for bit in bits:
2930
match bit:
3031
case "only":
3132
isolated_context = True
3233
case "/":
3334
continue
3435
case _:
35-
param = Param.from_bit(bit)
36-
attrs.append(param)
36+
attrs.append(bit)
3737

3838
nodelist = parse_nodelist(bits, parser)
3939
return BirdNode(name, attrs, nodelist, isolated_context)
@@ -50,11 +50,12 @@ def parse_nodelist(bits: TagBits, parser: Parser) -> NodeList | None:
5050
return nodelist
5151

5252

53+
@final
5354
class BirdNode(template.Node):
5455
def __init__(
5556
self,
5657
name: str,
57-
attrs: list[Param],
58+
attrs: TagBits,
5859
nodelist: NodeList | None,
5960
isolated_context: bool = False,
6061
) -> None:

tests/templatetags/test_bird.py

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
from django.template.exceptions import TemplateSyntaxError
1313

1414
from django_bird.components import Component
15-
from django_bird.params import Param
16-
from django_bird.params import Value
1715
from django_bird.templatetags.tags.bird import END_TAG
1816
from django_bird.templatetags.tags.bird import TAG
1917
from django_bird.templatetags.tags.bird import BirdNode
@@ -55,36 +53,12 @@ def test_missing_name_do_bird(self):
5553
@pytest.mark.parametrize(
5654
"params,expected_attrs",
5755
[
58-
(
59-
'class="btn"',
60-
[Param(name="class", value=Value('"btn"'))],
61-
),
62-
(
63-
'class="btn"',
64-
[Param(name="class", value=Value('"btn"'))],
65-
),
66-
(
67-
'class="btn" id="my-btn"',
68-
[
69-
Param(name="class", value=Value('"btn"')),
70-
Param(name="id", value=Value('"my-btn"')),
71-
],
72-
),
73-
(
74-
"disabled",
75-
[Param(name="disabled", value=Value(True))],
76-
),
77-
(
78-
"class=dynamic",
79-
[Param(name="class", value=Value("dynamic"))],
80-
),
81-
(
82-
"class=item.name id=user.id",
83-
[
84-
Param(name="class", value=Value("item.name")),
85-
Param(name="id", value=Value("user.id")),
86-
],
87-
),
56+
('class="btn"', ['class="btn"']),
57+
("class='btn'", ["class='btn'"]),
58+
('class="btn" id="my-btn"', ['class="btn"', 'id="my-btn"']),
59+
("disabled", ["disabled"]),
60+
("class=dynamic", ["class=dynamic"]),
61+
("class=item.name id=user.id", ["class=item.name", "id=user.id"]),
8862
],
8963
)
9064
def test_attrs_do_bird(self, params, expected_attrs):

tests/test_params.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -269,14 +269,11 @@ def test_render_attrs(self, params, context, expected):
269269
"attrs,expected",
270270
[
271271
(
272-
[Param(name="class", value=Value('"btn"'))],
272+
['class="btn"'],
273273
Params(attrs=[Param(name="class", value=Value('"btn"'))]),
274274
),
275275
(
276-
[
277-
Param(name="class", value=Value('"btn"')),
278-
Param(name="id", value=Value('"my-btn"')),
279-
],
276+
['class="btn"', 'id="my-btn"'],
280277
Params(
281278
attrs=[
282279
Param(name="class", value=Value('"btn"')),
@@ -285,18 +282,15 @@ def test_render_attrs(self, params, context, expected):
285282
),
286283
),
287284
(
288-
[Param(name="disabled", value=Value(True))],
285+
["disabled"],
289286
Params(attrs=[Param(name="disabled", value=Value(True))]),
290287
),
291288
(
292-
[Param(name="class", value=Value("dynamic"))],
289+
["class=dynamic"],
293290
Params(attrs=[Param(name="class", value=Value("dynamic"))]),
294291
),
295292
(
296-
[
297-
Param(name="class", value=Value("item.name")),
298-
Param(name="id", value=Value("user.id")),
299-
],
293+
["class=item.name", "id=user.id"],
300294
Params(
301295
attrs=[
302296
Param(name="class", value=Value("item.name")),

0 commit comments

Comments
 (0)