Skip to content

Commit 17a5ed4

Browse files
refactor and clean up prop templatetag (#160)
1 parent 2f078c9 commit 17a5ed4

File tree

2 files changed

+27
-25
lines changed

2 files changed

+27
-25
lines changed

src/django_bird/templatetags/tags/prop.py

Lines changed: 12 additions & 15 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 Parser
68
from django.template.base import Token
@@ -12,29 +14,24 @@
1214
TAG = "bird:prop"
1315

1416

15-
def do_prop(parser: Parser, token: Token) -> PropNode:
16-
bits = token.split_contents()
17-
name, default = parse_prop_name(bits)
18-
attrs = parse_attrs(bits)
19-
return PropNode(name, default, attrs)
20-
21-
22-
def parse_prop_name(bits: TagBits) -> tuple[str, str | None]:
23-
if len(bits) <= 1:
17+
def do_prop(_parser: Parser, token: Token) -> PropNode:
18+
_tag, *bits = token.split_contents()
19+
if not bits:
2420
msg = f"{TAG} tag requires at least one argument"
2521
raise template.TemplateSyntaxError(msg)
2622

23+
prop = bits.pop(0)
24+
2725
try:
28-
name, default = bits[1].split("=")
29-
return name, default.strip("'\"")
26+
name, default = prop.split("=")
3027
except ValueError:
31-
return bits[1], None
32-
28+
name = prop
29+
default = None
3330

34-
def parse_attrs(bits: TagBits) -> TagBits:
35-
return bits[2:]
31+
return PropNode(name, default, bits)
3632

3733

34+
@final
3835
class PropNode(template.Node):
3936
def __init__(self, name: str, default: str | None, attrs: TagBits):
4037
self.name = name

tests/templatetags/test_prop.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
from __future__ import annotations
22

33
import pytest
4-
from django.template.exceptions import TemplateSyntaxError
4+
from django.template.base import Parser
5+
from django.template.base import Token
6+
from django.template.base import TokenType
57

6-
from django_bird.templatetags.tags.prop import parse_prop_name
8+
from django_bird.templatetags.tags.prop import TAG
9+
from django_bird.templatetags.tags.prop import PropNode
10+
from django_bird.templatetags.tags.prop import do_prop
711

812

913
@pytest.mark.parametrize(
10-
"bits,expected",
14+
"contents,expected",
1115
[
12-
(["bird:prop", "id"], ("id", None)),
13-
(["bird:prop", "class='btn'", "foo"], ("class", "btn")),
16+
("id", PropNode(name="id", default=None, attrs=[])),
17+
("class='btn'", PropNode(name="class", default="'btn'", attrs=[])),
1418
],
1519
)
16-
def test_parse_prop_name(bits, expected):
17-
assert parse_prop_name(bits) == expected
20+
def test_do_prop(contents, expected):
21+
start_token = Token(TokenType.BLOCK, f"{TAG} {contents}")
1822

23+
node = do_prop(Parser([]), start_token)
1924

20-
def test_parse_prop_name_no_args():
21-
with pytest.raises(TemplateSyntaxError):
22-
parse_prop_name([])
25+
assert node.name == expected.name
26+
assert node.default == expected.default
27+
assert node.attrs == expected.attrs

0 commit comments

Comments
 (0)