Skip to content

Commit 31a9672

Browse files
Refactor Value (#156)
1 parent 4e69c92 commit 31a9672

File tree

4 files changed

+93
-95
lines changed

4 files changed

+93
-95
lines changed

src/django_bird/components.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,9 @@ def render(self, context: Context):
135135
data_attrs = [
136136
Param(
137137
f"data-bird-{self.component.data_attribute_name}",
138-
Value(True, False),
138+
Value(True),
139139
),
140-
Param("data-bird-id", Value(f"{self.component.id}-{self.id}", True)),
140+
Param("data-bird-id", Value(f'"{self.component.id}-{self.id}"')),
141141
]
142142
self.params.attrs.extend(data_attrs)
143143

src/django_bird/params.py

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def render_props(self, component: Component, context: Context):
3636
if not isinstance(node, PropNode):
3737
continue
3838

39-
value = Value(node.default, quoted=False)
39+
value = Value(node.default)
4040

4141
for idx, attr in enumerate(self.attrs):
4242
if node.name == attr.name:
@@ -78,11 +78,7 @@ def render_prop(self, context: Context) -> str | bool | None:
7878
def from_bit(cls, bit: str) -> Param:
7979
if "=" in bit:
8080
name, raw_value = bit.split("=", 1)
81-
# Check if the value is quoted
82-
if raw_value.startswith(("'", '"')) and raw_value.endswith(raw_value[0]):
83-
value = Value(raw_value[1:-1], quoted=True)
84-
else:
85-
value = Value(raw_value.strip(), quoted=False)
81+
value = Value(raw_value.strip())
8682
else:
8783
name, value = bit, Value(True)
8884
return cls(name, value)
@@ -91,18 +87,32 @@ def from_bit(cls, bit: str) -> Param:
9187
@dataclass
9288
class Value:
9389
raw: str | bool | None
94-
quoted: bool = False
9590

9691
def resolve(self, context: Context | dict[str, Any]) -> Any:
97-
if self.raw is None or (isinstance(self.raw, str) and self.raw == "False"):
98-
return None
99-
if (isinstance(self.raw, bool) and self.raw) or (
100-
isinstance(self.raw, str) and self.raw == "True"
101-
):
102-
return True
103-
if isinstance(self.raw, str) and not self.quoted:
104-
try:
105-
return template.Variable(str(self.raw)).resolve(context)
106-
except template.VariableDoesNotExist:
107-
return self.raw
108-
return self.raw
92+
match (self.raw, self.is_quoted):
93+
case (None, _):
94+
return None
95+
96+
case (str(raw_str), False) if raw_str == "False":
97+
return None
98+
case (str(raw_str), False) if raw_str == "True":
99+
return True
100+
101+
case (bool(b), _):
102+
return b if b else None
103+
104+
case (str(raw_str), False):
105+
try:
106+
return template.Variable(raw_str).resolve(context)
107+
except template.VariableDoesNotExist:
108+
return raw_str
109+
110+
case (_, True):
111+
return str(self.raw)[1:-1]
112+
113+
@property
114+
def is_quoted(self) -> bool:
115+
if self.raw is None or isinstance(self.raw, bool):
116+
return False
117+
118+
return self.raw.startswith(("'", '"')) and self.raw.endswith(self.raw[0])

tests/templatetags/test_bird.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,18 @@ def test_missing_name_do_bird(self):
5656
"params,expected_attrs",
5757
[
5858
(
59-
"class='btn'",
60-
[Param(name="class", value=Value("btn", quoted=True))],
59+
'class="btn"',
60+
[Param(name="class", value=Value('"btn"'))],
6161
),
6262
(
6363
'class="btn"',
64-
[Param(name="class", value=Value("btn", quoted=True))],
64+
[Param(name="class", value=Value('"btn"'))],
6565
),
6666
(
67-
"class='btn' id='my-btn'",
67+
'class="btn" id="my-btn"',
6868
[
69-
Param(name="class", value=Value("btn", quoted=True)),
70-
Param(name="id", value=Value("my-btn", quoted=True)),
69+
Param(name="class", value=Value('"btn"')),
70+
Param(name="id", value=Value('"my-btn"')),
7171
],
7272
),
7373
(
@@ -76,13 +76,13 @@ def test_missing_name_do_bird(self):
7676
),
7777
(
7878
"class=dynamic",
79-
[Param(name="class", value=Value("dynamic", quoted=False))],
79+
[Param(name="class", value=Value("dynamic"))],
8080
),
8181
(
8282
"class=item.name id=user.id",
8383
[
84-
Param(name="class", value=Value("item.name", quoted=False)),
85-
Param(name="id", value=Value("user.id", quoted=False)),
84+
Param(name="class", value=Value("item.name")),
85+
Param(name="id", value=Value("user.id")),
8686
],
8787
),
8888
],

0 commit comments

Comments
 (0)