Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/wled/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,9 @@ class Segment(BaseModel):
255 indicates the coldest temperature
"""

name: str | None = field(default=None, metadata=field_options(alias="n"))
"""User-defined segment name (alias: "n")."""


@dataclass(kw_only=True)
class Leds:
Expand Down
85 changes: 85 additions & 0 deletions tests/fixtures/state_with_segment_name.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
{
"on": false,
"bri": 128,
"transition": 7,
"ps": -1,
"pl": -1,
"ledmap": 0,
"AudioReactive": { "on": true },
"nl": { "on": false, "dur": 60, "mode": 1, "tbri": 0, "rem": -1 },
"udpn": { "send": false, "recv": true, "sgrp": 1, "rgrp": 1 },
"lor": 0,
"mainseg": 0,
"seg": [
{
"id": 0,
"start": 0,
"stop": 29,
"len": 29,
"grp": 1,
"spc": 0,
"of": 0,
"on": false,
"frz": false,
"bri": 255,
"cct": 127,
"set": 0,
"n": "Curtain",
"col": [
[46, 255, 95, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
],
"fx": 0,
"sx": 128,
"ix": 128,
"pal": 0,
"c1": 128,
"c2": 128,
"c3": 16,
"sel": true,
"rev": false,
"mi": false,
"o1": false,
"o2": false,
"o3": false,
"si": 0,
"m12": 0
},
{
"id": 1,
"start": 29,
"stop": 55,
"len": 26,
"grp": 1,
"spc": 0,
"of": 0,
"on": false,
"frz": false,
"bri": 255,
"cct": 127,
"set": 0,
"n": "Wall",
"col": [
[46, 255, 95, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
],
"fx": 0,
"sx": 128,
"ix": 128,
"pal": 0,
"c1": 128,
"c2": 128,
"c3": 16,
"sel": true,
"rev": false,
"mi": false,
"o1": false,
"o2": false,
"o3": false,
"si": 0,
"m12": 0
}
]
}
49 changes: 49 additions & 0 deletions tests/fixtures/state_without_segment_name.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{
"on": false,
"bri": 128,
"transition": 7,
"ps": 1,
"pl": -1,
"ledmap": 0,
"AudioReactive": { "on": false },
"nl": { "on": false, "dur": 60, "mode": 1, "tbri": 0, "rem": -1 },
"udpn": { "send": false, "recv": true, "sgrp": 2, "rgrp": 2 },
"lor": 0,
"mainseg": 0,
"seg": [
{
"id": 0,
"start": 0,
"stop": 26,
"len": 26,
"grp": 1,
"spc": 0,
"of": 0,
"on": true,
"frz": false,
"bri": 255,
"cct": 127,
"set": 0,
"col": [
[4, 255, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
],
"fx": 0,
"sx": 128,
"ix": 128,
"pal": 0,
"c1": 128,
"c2": 128,
"c3": 16,
"sel": true,
"rev": false,
"mi": false,
"o1": false,
"o2": false,
"o3": false,
"si": 0,
"m12": 0
}
]
}
29 changes: 29 additions & 0 deletions tests/test_models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""Tests for WLED models."""
import json
from pathlib import Path

from wled.models import State

ROOT_DIR = Path(__file__).parent.parent
FIXTURE_DIR = ROOT_DIR / "tests" / "fixtures"

def load_fixture(file_name: str) -> dict:
"""Load a fixture file from the fixtures directory."""
fixture_path = FIXTURE_DIR / file_name
return json.loads(fixture_path.read_text())


def test_state_with_segment_name() -> None:
"""Test segment name is parsed correctly."""
data = load_fixture("state_with_segment_name.json")
model_instance = State.from_dict(data)

assert model_instance.segments[0].name == "Curtain"
assert model_instance.segments[1].name == "Wall"

def test_state_without_segment_name() -> None:
"""Test segment name is None when not provided."""
data = load_fixture("state_without_segment_name.json")
model_instance = State.from_dict(data)

assert model_instance.segments[0].name is None